pointsSettings.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. <template>
  2. <view class="container">
  3. <Step :step="currentStep" :stepsData="currentText" />
  4. <scroll-view class="content" scroll-y>
  5. <!-- 客户积分设置列表 -->
  6. <view class="integral-section">
  7. <view class="section-header">
  8. <view class="section-title">客户姓名</view>
  9. <view class="section-subtitle">积分数值</view>
  10. </view>
  11. <view class="integral-list">
  12. <view class="integral-item" v-for="(customer, index) in customerList" :key="customer.id">
  13. <view class="customer-info">
  14. <view class="customer-name">{{ customer.name }}</view>
  15. </view>
  16. <view class="integral-input-wrapper">
  17. <input class="integral-input" type="number" :placeholder="customer.placeholder"
  18. v-model="customer.integral" :disabled="customer.disabled"
  19. @input="onIntegralInput(customer)" />
  20. <view v-if="customer.integral" class="clear-icon-wrapper"
  21. @click.stop="clearIntegral(customer)">
  22. <image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png"></image>
  23. </view>
  24. </view>
  25. </view>
  26. </view>
  27. </view>
  28. </scroll-view>
  29. <!-- 概览悬浮按钮 -->
  30. <view class="suspension" @click="showOverviewPopup">概览</view>
  31. <!-- 概览弹窗 -->
  32. <!-- :show="showOverview" -->
  33. <u-popup :show="showOverview" mode="bottom" @close="closeOverviewPopup" round="20" :safeAreaInsetBottom="true">
  34. <view class="overview-popup">
  35. <!-- 弹窗头部 -->
  36. <view class="popup-header">
  37. <text class="popup-title">概览</text>
  38. <view class="close-btn" @click="closeOverviewPopup">
  39. <image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_close.png"></image>
  40. </view>
  41. </view>
  42. <!-- 任务信息 -->
  43. <view class="overview-section">
  44. <view class="row">
  45. <text class="line"></text>
  46. <view class="section-title">任务信息</view>
  47. </view>
  48. <view class="info-list">
  49. <view class="info-item">
  50. <view class="info-label">项目归属:</view>
  51. <view class="info-value">{{ taskFormData.belongTypeDisplayText || '-' }}</view>
  52. </view>
  53. <view class="info-item">
  54. <view class="info-label">任务类型:</view>
  55. <view class="info-value">{{ taskFormData.taskTypeDisplayText || '-' }}</view>
  56. </view>
  57. <view class="info-item">
  58. <view class="info-label">项目时间:</view>
  59. <view class="info-value">{{ taskFormData.planStartTime ? taskFormData.planStartTime.replace(/-/g, '/') : '-' }} ~ {{ taskFormData.planEndTime ? taskFormData.planEndTime.replace(/-/g, '/') : '-' }}</view>
  60. </view>
  61. </view>
  62. </view>
  63. <!-- 客户信息 -->
  64. <view class="overview-section">
  65. <view class="row">
  66. <text class="line"></text>
  67. <view class="section-title">客户信息</view>
  68. </view>
  69. <view class="customer-table">
  70. <!-- 表头 -->
  71. <view class="table-header">
  72. <view class="table-cell" style="flex: 1.5;">姓名</view>
  73. <view class="table-cell" style="flex: 1;">级别</view>
  74. <view class="table-cell" style="flex: 1;">积分</view>
  75. <view class="table-cell" style="flex: 2;">联系方式</view>
  76. </view>
  77. <!-- 表格内容 -->
  78. <view class="table-body">
  79. <view class="table-row" v-for="(customer, index) in customerList" :key="customer.id">
  80. <view class="table-cell" style="flex: 1.5;">{{ customer.name }}</view>
  81. <view class="table-cell" style="flex: 1;">{{ customer.level || '-' }}</view>
  82. <view class="table-cell" style="flex: 1;">{{ customer.integral || '0' }}</view>
  83. <view class="table-cell" style="flex: 2;">{{ customer.phone || customer.phonenumber || '-' }}</view>
  84. </view>
  85. </view>
  86. </view>
  87. </view>
  88. <!-- 安全区域占位 -->
  89. <view class="safe-area"></view>
  90. </view>
  91. </u-popup>
  92. <!-- 底部操作栏 -->
  93. <view class="bottom-bar">
  94. <view class="del-box" @click="deleteSelected">
  95. <image class="w40 h40" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_delete.png"></image>
  96. <text>删除</text>
  97. </view>
  98. <view class="action-buttons">
  99. <view class="btn btn-cancel" @click="handlePrev">上一步</view>
  100. <view class="btn btn-submit" @click="submit">提交</view>
  101. </view>
  102. </view>
  103. </view>
  104. </template>
  105. <script>
  106. import { getCompanyIntegralRanges } from '@/api/task.js'
  107. import Step from '@/pages_task/components/step.vue'
  108. import { addInfo} from '@/api/task.js';
  109. export default {
  110. components: {
  111. Step
  112. },
  113. data() {
  114. return {
  115. currentText: [{
  116. id: 1,
  117. stepNumber: 1,
  118. title: '填写任务'
  119. },
  120. {
  121. id: 2,
  122. stepNumber: 2,
  123. title: '选择客户'
  124. },
  125. {
  126. id: 3,
  127. stepNumber: 3,
  128. title: '积分设置'
  129. }
  130. ],
  131. currentStep: 3,
  132. showOverview: false, // 控制概览弹窗显示
  133. customerList: [],
  134. userInfo: uni.getStorageSync('userInfo'),
  135. taskFormData: {}, // 任务表单数据
  136. selectedCustomers: [] // 选中的客户数据
  137. }
  138. },
  139. onLoad() {
  140. // 从本地存储中获取任务表单数据
  141. const taskFormDataStr = uni.getStorageSync('taskFormData')
  142. if (taskFormDataStr) {
  143. try {
  144. this.taskFormData = JSON.parse(taskFormDataStr)
  145. } catch (e) {
  146. console.error('解析任务表单数据失败:', e)
  147. }
  148. }
  149. // 从本地存储中获取选中的客户数据
  150. const selectedCustomersData = uni.getStorageSync('selectedCustomers')
  151. if (selectedCustomersData) {
  152. try {
  153. const selectedCustomers = typeof selectedCustomersData === 'string' ? JSON.parse(selectedCustomersData) : selectedCustomersData
  154. // 确保selectedCustomers是数组
  155. if (Array.isArray(selectedCustomers)) {
  156. // 保存原始选中的客户数据
  157. this.selectedCustomers = selectedCustomers
  158. // 将选中的客户数据转换为积分设置需要的格式
  159. this.customerList = selectedCustomers.map(customer => ({
  160. id: customer.id,
  161. name: customer.doctorName || '未知姓名',
  162. doctorName: customer.doctorName || '未知姓名',
  163. integral: '',
  164. placeholder: '请输入积分',
  165. disabled: false
  166. }))
  167. }
  168. this.getCompanyIntegralRanges();//检查积分是否超出限制
  169. } catch (e) {
  170. console.error('解析客户数据失败:', e)
  171. }
  172. }
  173. },
  174. computed: {
  175. totalIntegral() {
  176. let total = 0
  177. this.customerList.forEach(customer => {
  178. const integral = parseInt(customer.integral) || 0
  179. total += integral
  180. })
  181. return total
  182. }
  183. },
  184. methods: {
  185. getCompanyIntegralRanges(){
  186. // 提取所有客户的id作为doctorIds数组,并确保都是数字类型
  187. const doctorIds = this.customerList.map(customer => parseInt(customer.id) || 0);
  188. let params = {
  189. companyId: this.userInfo.companyId,
  190. projectId: this.taskFormData.projectId,
  191. doctorIds: doctorIds
  192. }
  193. console.log('传递的doctorIds:', doctorIds);
  194. getCompanyIntegralRanges(params).then(res => {
  195. if (res.code === 200) {
  196. const ranges = res.data || res.rows || [];
  197. // 建立 doctorId -> 范围配置 的映射
  198. const rangeMap = {};
  199. ranges.forEach(item => {
  200. const key = parseInt(item.doctorId || item.id);
  201. if (!isNaN(key)) {
  202. rangeMap[key] = item;
  203. }
  204. });
  205. // 合并到现有客户列表,保留已有积分值
  206. this.customerList = this.customerList.map(customer => {
  207. const id = parseInt(customer.id) || 0;
  208. const cfg = rangeMap[id] || {};
  209. const min = typeof cfg.minIntegral === 'number' ? cfg.minIntegral : customer.minIntegral;
  210. const max = typeof cfg.maxIntegral === 'number' ? cfg.maxIntegral : customer.maxIntegral;
  211. return {
  212. ...customer,
  213. level: cfg.levelName || customer.level,
  214. minIntegral: min,
  215. maxIntegral: max,
  216. placeholder: (typeof min === 'number' && typeof max === 'number')
  217. ? `请输入${min}-${max}`
  218. : (customer.placeholder || '请输入积分'),
  219. disabled: cfg.available === false ? true : customer.disabled
  220. }
  221. });
  222. }
  223. })
  224. },
  225. // 显示概览弹窗
  226. showOverviewPopup() {
  227. this.showOverview = true
  228. },
  229. // 关闭概览弹窗
  230. closeOverviewPopup() {
  231. this.showOverview = false
  232. },
  233. clearIntegral(customer) {
  234. // 使用 $set 确保响应式更新
  235. this.$set(customer, 'integral', '')
  236. },
  237. onIntegralInput(customer) {
  238. // 积分输入验证与范围限制
  239. let val = parseInt(customer.integral);
  240. if (isNaN(val)) {
  241. this.$set(customer, 'integral', '');
  242. return;
  243. }
  244. const hasMin = typeof customer.minIntegral === 'number';
  245. const hasMax = typeof customer.maxIntegral === 'number';
  246. if (hasMin && val < customer.minIntegral) {
  247. val = customer.minIntegral;
  248. uni.showToast({ icon: 'none', title: `不得少于${customer.minIntegral}` });
  249. }
  250. if (hasMax && val > customer.maxIntegral) {
  251. val = customer.maxIntegral;
  252. uni.showToast({ icon: 'none', title: `不得高于${customer.maxIntegral}` });
  253. }
  254. this.$set(customer, 'integral', String(val));
  255. },
  256. handlePrev() {
  257. uni.navigateBack()
  258. },
  259. submit() {
  260. // 验证所有客户积分是否已填写
  261. const emptyCustomers = this.customerList.filter(customer => !customer.integral || customer.integral === '')
  262. if (emptyCustomers.length > 0) {
  263. uni.showToast({
  264. icon: 'none',
  265. title: '请为所有客户设置积分'
  266. })
  267. return
  268. }
  269. // 验证积分是否为数字
  270. const invalidCustomers = this.customerList.filter(customer => {
  271. const integral = parseInt(customer.integral)
  272. return isNaN(integral)
  273. })
  274. if (invalidCustomers.length > 0) {
  275. uni.showToast({
  276. icon: 'none',
  277. title: '请输入有效的积分数值'
  278. })
  279. return
  280. }
  281. // 验证是否在范围内
  282. const outOfRange = this.customerList.find(customer => {
  283. const v = parseInt(customer.integral);
  284. if (typeof customer.minIntegral === 'number' && v < customer.minIntegral) return true;
  285. if (typeof customer.maxIntegral === 'number' && v > customer.maxIntegral) return true;
  286. return false;
  287. });
  288. if (outOfRange) {
  289. const min = outOfRange.minIntegral;
  290. const max = outOfRange.maxIntegral;
  291. uni.showToast({
  292. icon: 'none',
  293. title: `${outOfRange.name || '该客户'}积分需在${min}-${max}`
  294. });
  295. return;
  296. }
  297. // 获取所有三个页面的数据
  298. const taskFormDataStr = uni.getStorageSync('taskFormData')
  299. const selectedCustomersStr = uni.getStorageSync('selectedCustomers')
  300. const taskFormData = taskFormDataStr ? JSON.parse(taskFormDataStr) : {}
  301. const selectedCustomers = selectedCustomersStr ? JSON.parse(selectedCustomersStr) : []
  302. // 获取用户信息
  303. const userInfoData = uni.getStorageSync('userInfo')
  304. const userInfo = typeof userInfoData === 'string' ? JSON.parse(userInfoData) : userInfoData || {}
  305. // 获取当前时间
  306. const now = new Date()
  307. const applyTime = now.toISOString().slice(0, 19).replace('T', ' ')
  308. // 构建提交数据
  309. const taskData = {
  310. // 任务基本信息
  311. // taskName: taskFormData.taskName || '',
  312. deptId: taskFormData.deptId || 0,
  313. projectId: taskFormData.projectId || 0,
  314. costShareId: taskFormData.costShareId || 0,
  315. taskType: taskFormData.taskType || 0,
  316. taskIntegral: this.totalIntegral || 0,
  317. taskUnit: taskFormData.taskUnit || 0,
  318. productId: taskFormData.productId || 0,
  319. planStartTime: taskFormData.planStartTime || '',
  320. planEndTime: taskFormData.planEndTime || '',
  321. // applyTime: applyTime,
  322. belongType: taskFormData.belongType || 0,
  323. companyId: userInfo.companyId || 0,
  324. companyUserId: userInfo.userId || 0,
  325. remark: taskFormData.remark || '',
  326. // companyUserId: taskFormData.companyUserId || 0,
  327. // 构建doctorIds数组
  328. // doctorIds: this.customerList.map(customer => parseInt(customer.id) || 0),
  329. // 构建doctorTaskList数组
  330. doctorTaskList: this.customerList.map(customer => ({
  331. doctorId: parseInt(customer.id) || 0,
  332. taskIntegral: parseInt(customer.integral) || 0
  333. }))
  334. }
  335. console.log('提交的任务数据:', taskData)
  336. // 调用addInfo接口提交表单
  337. uni.showLoading({
  338. title: '提交中...'
  339. })
  340. addInfo(taskData).then(res => {
  341. uni.hideLoading()
  342. if (res.code === 200) {
  343. // 清除本地存储的数据
  344. uni.removeStorageSync('taskFormData')
  345. uni.removeStorageSync('selectedCustomers')
  346. // 显示提交成功提示
  347. uni.showToast({
  348. title: '任务创建成功',
  349. success: () => {
  350. // 延迟跳转,让用户看到成功提示
  351. setTimeout(() => {
  352. uni.navigateTo({
  353. url: '/pages_task/success'
  354. })
  355. }, 1500)
  356. }
  357. })
  358. } else {
  359. uni.showToast({
  360. icon: 'none',
  361. title: res.message || '提交失败'
  362. })
  363. }
  364. }).catch(err => {
  365. uni.hideLoading()
  366. uni.showToast({
  367. icon: 'none',
  368. title: '网络错误,请重试'
  369. })
  370. })
  371. },
  372. deleteSelected() {
  373. // 删除所有客户数据
  374. uni.showModal({
  375. title: '提示',
  376. content: '确定要删除所有客户数据吗?删除后不可恢复。',
  377. success: (res) => {
  378. if (res.confirm) {
  379. // 清空所有客户的积分数据
  380. this.customerList.forEach(customer => {
  381. this.$set(customer, 'integral', '')
  382. })
  383. uni.showToast({
  384. title: '已清空所有客户积分',
  385. icon: 'success'
  386. })
  387. }
  388. }
  389. })
  390. }
  391. }
  392. }
  393. </script>
  394. <style lang="scss" scoped>
  395. .container {
  396. min-height: 100vh;
  397. background: #F7F8FA;
  398. display: flex;
  399. flex-direction: column;
  400. &::before {
  401. content: '';
  402. position: absolute;
  403. top: 0;
  404. left: 0;
  405. right: 0;
  406. width: 100%;
  407. height: 544rpx;
  408. background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
  409. }
  410. }
  411. .content {
  412. flex: 1;
  413. padding: 24rpx;
  414. box-sizing: border-box;
  415. padding-bottom: 200rpx;
  416. position: relative;
  417. }
  418. .integral-section {
  419. background-color: #ffffff;
  420. border-radius: 24rpx;
  421. padding: 32rpx 24rpx;
  422. margin-bottom: 24rpx;
  423. .section-header {
  424. display: flex;
  425. justify-content: space-between;
  426. align-items: center;
  427. margin-bottom: 32rpx;
  428. padding: 32rpx 0;
  429. background: #F5F9FF;
  430. border-radius: 16rpx;
  431. font-size: 28rpx;
  432. color: #666666;
  433. text-align: center;
  434. font-weight: 600;
  435. .section-title {
  436. flex: 1;
  437. }
  438. .section-subtitle {
  439. flex: 1;
  440. }
  441. }
  442. .integral-list {
  443. .integral-item {
  444. display: flex;
  445. justify-content: space-between;
  446. align-items: center;
  447. padding: 32rpx 0;
  448. border-bottom: 1rpx solid #F2F3F5;
  449. &:last-child {
  450. border-bottom: none;
  451. }
  452. .customer-info {
  453. flex: 1;
  454. text-align: center;
  455. .customer-name {
  456. font-size: 32rpx;
  457. font-weight: 500;
  458. color: #333333;
  459. }
  460. }
  461. .integral-input-wrapper {
  462. flex: 1;
  463. display: flex;
  464. align-items: center;
  465. justify-content: center;
  466. position: relative;
  467. .integral-input {
  468. width: 100%;
  469. font-size: 32rpx;
  470. color: #333333;
  471. text-align: center;
  472. padding: 12rpx 60rpx 12rpx 16rpx;
  473. background: #F7F8FA;
  474. border-radius: 8rpx;
  475. &::placeholder {
  476. color: #C8C9CC;
  477. font-size: 28rpx;
  478. text-align: center;
  479. }
  480. &:disabled {
  481. background: transparent;
  482. opacity: 0.8;
  483. }
  484. }
  485. .clear-icon-wrapper {
  486. position: absolute;
  487. right: 8rpx;
  488. width: 48rpx;
  489. height: 48rpx;
  490. display: flex;
  491. align-items: center;
  492. justify-content: center;
  493. z-index: 10;
  494. cursor: pointer;
  495. &:active {
  496. opacity: 0.6;
  497. }
  498. .clear-icon {
  499. width: 28rpx;
  500. height: 28rpx;
  501. }
  502. }
  503. }
  504. }
  505. }
  506. }
  507. .suspension {
  508. position: fixed;
  509. text-align: center;
  510. line-height: 96rpx;
  511. right: 36rpx;
  512. top: 70%;
  513. width: 96rpx;
  514. height: 96rpx;
  515. background: linear-gradient(0deg, #388BFF 0%, #388BFF 100%);
  516. box-shadow: inset 0rpx 4rpx 8rpx 0rpx rgba(255, 255, 255, 0.25),
  517. inset 0rpx -6rpx 8rpx 0rpx rgba(255, 255, 255, 0.25),
  518. 4rpx 8rpx 12rpx 0rpx rgba(88, 144, 239, 0.29);
  519. border-radius: 110rpx;
  520. font-size: 28rpx;
  521. color: #FFFFFF;
  522. z-index: 999;
  523. cursor: pointer;
  524. &:active {
  525. opacity: 0.8;
  526. }
  527. }
  528. /* 概览弹窗样式 */
  529. .overview-popup {
  530. background-color: #fff;
  531. border-radius: 32rpx 32rpx 0 0;
  532. max-height: 80vh;
  533. overflow-y: auto;
  534. padding-bottom: env(safe-area-inset-bottom);
  535. }
  536. .popup-header {
  537. display: flex;
  538. justify-content: center;
  539. align-items: center;
  540. padding: 32rpx 40rpx;
  541. .popup-title {
  542. font-weight: 500;
  543. font-size: 32rpx;
  544. color: #333333;
  545. }
  546. .close-btn {
  547. width: 48rpx;
  548. height: 48rpx;
  549. display: flex;
  550. align-items: center;
  551. justify-content: center;
  552. cursor: pointer;
  553. position: absolute;
  554. right: 0;
  555. .close-icon {
  556. width: 44rpx;
  557. height: 44rpx;
  558. margin-right: 32rpx;
  559. flex-shrink: 0;
  560. }
  561. &:active {
  562. opacity: 0.6;
  563. }
  564. }
  565. }
  566. .overview-section {
  567. padding: 32rpx 40rpx;
  568. .row {
  569. display: flex;
  570. align-items: center;
  571. margin-bottom: 24rpx;
  572. &:last-child {
  573. border-bottom: none;
  574. }
  575. .line {
  576. width: 6rpx;
  577. height: 32rpx;
  578. background: #388BFF;
  579. border-radius: 36rpx;
  580. margin-right: 20rpx;
  581. }
  582. .section-title {
  583. font-size: 28rpx;
  584. font-weight: 600;
  585. color: #333333;
  586. }
  587. }
  588. .info-list {
  589. .info-item {
  590. display: flex;
  591. margin-bottom: 16rpx;
  592. align-items: flex-start;
  593. font-size: 28rpx;
  594. &:last-child {
  595. margin-bottom: 0;
  596. }
  597. .info-label {
  598. color: #999999;
  599. flex-shrink: 0;
  600. width: 140rpx;
  601. }
  602. .info-value {
  603. color: #333333;
  604. flex: 1;
  605. line-height: 1.4;
  606. }
  607. }
  608. }
  609. .customer-table {
  610. .table-header {
  611. display: flex;
  612. background: #F5F9FF;
  613. border-radius: 8rpx;
  614. padding: 20rpx 16rpx;
  615. margin-bottom: 8rpx;
  616. .table-cell {
  617. font-size: 24rpx;
  618. font-weight: 600;
  619. color: #666666;
  620. text-align: center;
  621. }
  622. }
  623. .table-body {
  624. .table-row {
  625. display: flex;
  626. padding: 20rpx 16rpx;
  627. border-bottom: 1rpx solid #F2F3F5;
  628. &:last-child {
  629. border-bottom: none;
  630. }
  631. .table-cell {
  632. font-size: 28rpx;
  633. color: #333333;
  634. text-align: center;
  635. &:first-child {
  636. font-weight: 500;
  637. }
  638. }
  639. }
  640. }
  641. }
  642. }
  643. .total-section {
  644. padding: 32rpx 40rpx;
  645. background: #F5F9FF;
  646. border-radius: 16rpx;
  647. margin: 24rpx 40rpx 40rpx;
  648. .total-item {
  649. display: flex;
  650. justify-content: space-between;
  651. align-items: center;
  652. margin-bottom: 16rpx;
  653. &:last-child {
  654. margin-bottom: 0;
  655. }
  656. .total-label {
  657. font-size: 28rpx;
  658. color: #666666;
  659. }
  660. .total-value {
  661. font-size: 28rpx;
  662. font-weight: 600;
  663. color: #388BFF;
  664. }
  665. }
  666. }
  667. .safe-area {
  668. height: env(safe-area-inset-bottom);
  669. }
  670. .bottom-bar {
  671. position: fixed;
  672. bottom: 0;
  673. left: 0;
  674. right: 0;
  675. background: #fff;
  676. padding: 24rpx 32rpx;
  677. border-top: 1rpx solid #F2F3F5;
  678. z-index: 100;
  679. display: flex;
  680. align-items: center;
  681. .del-box {
  682. display: flex;
  683. flex-direction: column;
  684. align-items: center;
  685. font-size: 24rpx;
  686. color: #666666;
  687. margin-right: 32rpx;
  688. cursor: pointer;
  689. &:active {
  690. opacity: 0.6;
  691. }
  692. }
  693. .action-buttons {
  694. display: flex;
  695. flex: 1;
  696. justify-content: space-between;
  697. .btn {
  698. width: 292rpx;
  699. height: 88rpx;
  700. display: flex;
  701. align-items: center;
  702. justify-content: center;
  703. font-size: 32rpx;
  704. font-weight: 500;
  705. border-radius: 200rpx 200rpx 200rpx 200rpx;
  706. cursor: pointer;
  707. &.btn-cancel {
  708. background: #fff;
  709. border: 2rpx solid #388BFF;
  710. color: #388BFF;
  711. }
  712. &.btn-submit {
  713. background: #388BFF;
  714. color: #fff;
  715. }
  716. }
  717. }
  718. }
  719. .w40 {
  720. width: 40rpx;
  721. }
  722. .h40 {
  723. height: 40rpx;
  724. }
  725. </style>