PageThree.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. <template>
  2. <view class="page-three-container">
  3. <!-- 支付信息卡片 -->
  4. <view class="info-card">
  5. <view class="info-card-title">支付信息</view>
  6. <u-row class="info-row" justify="space-between">
  7. <u-col span="5.8">
  8. <view class="info-label">开户人</view>
  9. <u-input
  10. v-model="paymentInfo.customName"
  11. placeholder="请输入开户人姓名"
  12. class="info-input"
  13. @blur="handleCustomNameInput"
  14. />
  15. </u-col>
  16. <u-col span="5.8">
  17. <view class="info-label">银行名称</view>
  18. <u-input
  19. v-model="paymentInfo.bankName"
  20. placeholder="请输入银行名称"
  21. class="info-input"
  22. @blur="handleBankNameInput"
  23. />
  24. </u-col>
  25. </u-row>
  26. <u-row class="info-row">
  27. <u-col span="12">
  28. <view class="info-label">银行账号</view>
  29. <u-input
  30. v-model="paymentInfo.bankAccount"
  31. placeholder="请输入银行账号"
  32. class="info-input"
  33. type="number"
  34. @input="handleBankAccountInput"
  35. />
  36. </u-col>
  37. </u-row>
  38. <u-row class="info-row">
  39. <u-col span="12">
  40. <view class="info-label">身份证号</view>
  41. <u-input
  42. v-model="paymentInfo.idNumber"
  43. placeholder="请输入身份证号"
  44. class="info-input"
  45. type="number"
  46. @input="handleIdNumberInput"
  47. />
  48. </u-col>
  49. </u-row>
  50. <u-row class="info-row">
  51. <u-col span="12">
  52. <view class="info-label">支付方式选择</view>
  53. <u-radio-group
  54. iconPlacement="left"
  55. v-model="paymentMethodRadio"
  56. placement="row"
  57. @change="handlePaymentMethodRadioChange"
  58. >
  59. <u-radio shape="circle" label="小葫芦线上支付" name="online" />
  60. <u-radio shape="circle" label="线下支付" name="offline" />
  61. </u-radio-group>
  62. </u-col>
  63. </u-row>
  64. <u-row class="info-row">
  65. <u-col span="12">
  66. <view class="info-label">支付方式</view>
  67. <u-input
  68. :disabled="paymentMethodRadio === 'online'"
  69. v-model="paymentMethod"
  70. placeholder="请输入支付方式"
  71. class="info-input"
  72. />
  73. </u-col>
  74. </u-row>
  75. </view>
  76. <!-- 高清实物图卡片 -->
  77. <view class="card-wrap">
  78. <view class="detail-image-section">
  79. <view class="detail-image-header">
  80. <text class="detail-image-title">高清实物图(拖拽排序)</text>
  81. </view>
  82. <view class="detail-image-content">
  83. <view class="detail-image-list">
  84. <view
  85. v-for="(item, index) in detailImages.slice(0, 6)"
  86. :key="`detail-${index}`"
  87. class="detail-image-item"
  88. :class="{
  89. 'dragging': draggingIndex === index,
  90. 'can-drop': canDropIndex === index
  91. }"
  92. @touchstart.stop="onTouchStart($event, index)"
  93. @touchmove.stop="onTouchMove($event)"
  94. @touchend.stop="onTouchEnd"
  95. >
  96. <PicComp
  97. :src="item.fileUrl"
  98. @needPreviewPic="previewImageDetail"
  99. />
  100. <view class="image-type-tag">{{ getImageType(index) }}</view>
  101. <view
  102. class="detail-delete-btn"
  103. @click.stop="handleHideImage(item, index)"
  104. >
  105. ×
  106. </view>
  107. </view>
  108. <view
  109. class="detail-upload-btn"
  110. @click="handleUploadImage"
  111. >
  112. <u-icon name="plus" size="40rpx" color="#999" />
  113. </view>
  114. </view>
  115. </view>
  116. </view>
  117. </view>
  118. <!-- 支付总额卡片 -->
  119. <view class="card-wrap payment-card">
  120. <view class="payment-section">
  121. <view class="payment-total-container">
  122. <text class="payment-label">支付总额</text>
  123. <u-input
  124. v-model="paymentAmount"
  125. class="payment-amount"
  126. type="number"
  127. decimal="2"
  128. prefix="¥"
  129. />
  130. </view>
  131. <view class="payment-buttons-row">
  132. <view class="payment-button" @click="handleUnpaidClick">
  133. <u-icon name="star" size="40rpx" color="#ff9500" />
  134. <text class="button-text">未收</text>
  135. </view>
  136. <view class="payment-button" @click="handleFollowUpClick">
  137. <u-icon name="chat" size="40rpx" color="#108cff" />
  138. <text class="button-text">待跟进</text>
  139. </view>
  140. </view>
  141. <view class="pay-now-button" @click="handlePayNowClick">
  142. <text class="button-text">立即支付</text>
  143. </view>
  144. </view>
  145. </view>
  146. <!-- 下一步按钮 -->
  147. <u-button
  148. class="next-btn"
  149. @click="handleNext"
  150. type="primary"
  151. size="middle"
  152. >
  153. 下一步
  154. </u-button>
  155. <!-- 未收评级模态窗 -->
  156. <u-modal
  157. showCancelButton
  158. showConfirmButton
  159. @confirm="confirmUnpaid"
  160. @cancel="unpaidModalVisible = false"
  161. :show="unpaidModalVisible"
  162. title="未收评级"
  163. >
  164. <view class="modal-content">
  165. <u-rate
  166. v-model="unpaidRating"
  167. :count="5"
  168. :size="50"
  169. active-color="#ff9500"
  170. />
  171. </view>
  172. </u-modal>
  173. <!-- 待跟进模态窗 -->
  174. <u-modal
  175. showCancelButton
  176. showConfirmButton
  177. @confirm="confirmFollowUp"
  178. @cancel="followUpModalVisible = false"
  179. :show="followUpModalVisible"
  180. title="填写跟进细节"
  181. >
  182. <view class="modal-content">
  183. <u--textarea
  184. v-model="followUpNotes"
  185. placeholder="请输入情况"
  186. confirm-type="done"
  187. style="width: 100%; margin-bottom: 30rpx;"
  188. />
  189. </view>
  190. </u-modal>
  191. <!-- 确认支付模态窗 -->
  192. <u-modal
  193. :show="payNowModalVisible"
  194. title="确认支付信息"
  195. :showConfirmButton="false"
  196. >
  197. <view class="modal-content">
  198. <view class="payment-amount-display">¥{{ paymentAmount }}</view>
  199. <view class="payment-info-section">
  200. <view class="info-item">
  201. <text class="info-label">收款姓名:</text>
  202. <text class="info-value">{{ paymentInfo.customName || '未填写' }}</text>
  203. </view>
  204. <view class="info-item">
  205. <text class="info-label">开户银行:</text>
  206. <text class="info-value">{{ paymentInfo.bankName || '未填写' }}</text>
  207. </view>
  208. <view class="info-item">
  209. <text class="info-label">银行卡号:</text>
  210. <text class="info-value">{{ paymentInfo.bankAccount || '未填写' }}</text>
  211. </view>
  212. <view class="info-item">
  213. <text class="info-label">支付方式:</text>
  214. <text class="info-value">{{ paymentMethod || '未填写' }}</text>
  215. </view>
  216. </view>
  217. <u-button
  218. type="primary"
  219. size="large"
  220. @click="confirmTransfer"
  221. style="margin-top: 40rpx;"
  222. >
  223. 确认转账
  224. </u-button>
  225. <u-button
  226. type="primary"
  227. :plain="true"
  228. @click="payNowModalVisible = false"
  229. size="large"
  230. style="margin-top: 20rpx;"
  231. >
  232. 取消
  233. </u-button>
  234. </view>
  235. </u-modal>
  236. </view>
  237. </template>
  238. <script>
  239. import PicComp from './PicComp.vue'
  240. import imageUpload from '../utils/imageUpload.js'
  241. export default {
  242. name: 'PageThree',
  243. components: {
  244. PicComp
  245. },
  246. props: {
  247. orderDetail: {
  248. type: Object,
  249. default: () => ({})
  250. },
  251. orderId: {
  252. type: String,
  253. default: ''
  254. },
  255. currentReceipt: {
  256. type: Object,
  257. default: () => ({})
  258. }
  259. },
  260. data() {
  261. return {
  262. paymentInfo: {
  263. customName: '',
  264. bankName: '',
  265. bankAccount: '',
  266. idNumber: ''
  267. },
  268. paymentMethodRadio: 'offline',
  269. paymentMethod: '',
  270. paymentAmount: '0.00',
  271. detailImages: [],
  272. // 拖拽相关
  273. draggingIndex: -1,
  274. canDropIndex: -1,
  275. startX: 0,
  276. startY: 0,
  277. // 模态窗
  278. unpaidModalVisible: false,
  279. followUpModalVisible: false,
  280. payNowModalVisible: false,
  281. unpaidRating: 0,
  282. followUpNotes: ''
  283. }
  284. },
  285. watch: {
  286. orderDetail: {
  287. handler(newVal) {
  288. if (newVal) {
  289. this.paymentInfo.customName = newVal.customName || ''
  290. this.paymentInfo.bankName = newVal.bankName || ''
  291. this.paymentInfo.bankAccount = newVal.bankCardNumber || ''
  292. this.paymentInfo.idNumber = newVal.idCard || ''
  293. this.initPaymentMethod(newVal.paymentMethod)
  294. }
  295. },
  296. deep: true,
  297. immediate: true
  298. },
  299. currentReceipt: {
  300. handler(newVal) {
  301. if (newVal) {
  302. this.paymentAmount = newVal.tableFee || '0.00'
  303. this.loadDetailImages()
  304. }
  305. },
  306. deep: true,
  307. immediate: true
  308. }
  309. },
  310. methods: {
  311. /**
  312. * 刷新图片列表(供父组件调用)
  313. */
  314. async refreshImageList() {
  315. await this.loadDetailImages()
  316. },
  317. /**
  318. * 加载细节图
  319. */
  320. async loadDetailImages() {
  321. if (!this.currentReceipt.id || !this.orderDetail.itemBrand) return
  322. try {
  323. const list = await imageUpload.getFileList(
  324. '2',
  325. '3',
  326. this.currentReceipt.id,
  327. this.orderDetail.itemBrand,
  328. this.currentReceipt.clueId
  329. )
  330. this.detailImages = list || []
  331. } catch (error) {
  332. console.error('加载细节图失败:', error)
  333. }
  334. },
  335. /**
  336. * 初始化支付方式
  337. */
  338. initPaymentMethod(value) {
  339. if (value === '小葫芦线上支付') {
  340. this.paymentMethod = '小葫芦线上支付'
  341. this.paymentMethodRadio = 'online'
  342. } else {
  343. this.paymentMethod = value || ''
  344. this.paymentMethodRadio = 'offline'
  345. }
  346. },
  347. /**
  348. * 支付方式选择改变
  349. */
  350. handlePaymentMethodRadioChange(value) {
  351. if (value === 'online') {
  352. this.paymentMethod = '小葫芦线上支付'
  353. } else {
  354. this.paymentMethod = ''
  355. }
  356. },
  357. /**
  358. * 开户人输入处理 - 只允许中文
  359. */
  360. handleCustomNameInput(value) {
  361. // 只保留中文字符(包括中文标点)
  362. const chineseReg = /[^\u4e00-\u9fa5]/g
  363. this.paymentInfo.customName = String(value || '').replace(chineseReg, '')
  364. },
  365. /**
  366. * 银行名称输入处理 - 只允许中文
  367. */
  368. handleBankNameInput(value) {
  369. // 只保留中文字符(包括中文标点)
  370. const chineseReg = /[^\u4e00-\u9fa5]/g
  371. this.paymentInfo.bankName = String(value || '').replace(chineseReg, '')
  372. },
  373. /**
  374. * 银行账号输入处理 - 只允许数字
  375. */
  376. handleBankAccountInput(value) {
  377. // 只保留数字
  378. const numberReg = /[^\d]/g
  379. this.paymentInfo.bankAccount = String(value || '').replace(numberReg, '')
  380. },
  381. /**
  382. * 身份证号输入处理 - 只允许数字
  383. */
  384. handleIdNumberInput(value) {
  385. // 只保留数字
  386. const numberReg = /[^\d]/g
  387. this.paymentInfo.idNumber = String(value || '').replace(numberReg, '')
  388. },
  389. /**
  390. * 获取图片类型
  391. */
  392. getImageType(index) {
  393. const types = ['正面', '反面', '侧面', '扣子', '编号']
  394. return types[index] || `细节${index - 4}`
  395. },
  396. /**
  397. * 触摸开始
  398. */
  399. onTouchStart(event, index) {
  400. if (this.draggingIndex !== -1) return
  401. this.draggingIndex = index
  402. this.startX = event.touches[0].clientX
  403. this.startY = event.touches[0].clientY
  404. },
  405. /**
  406. * 触摸移动
  407. */
  408. onTouchMove(event) {
  409. if (this.draggingIndex === -1) return
  410. const moveX = event.touches[0].clientX
  411. const moveY = event.touches[0].clientY
  412. this.findTargetIndex(moveX, moveY)
  413. },
  414. /**
  415. * 触摸结束
  416. */
  417. onTouchEnd() {
  418. if (this.draggingIndex === -1) return
  419. if (this.canDropIndex !== -1 && this.canDropIndex !== this.draggingIndex) {
  420. const temp = this.detailImages[this.draggingIndex]
  421. this.detailImages[this.draggingIndex] = this.detailImages[this.canDropIndex]
  422. this.detailImages[this.canDropIndex] = temp
  423. }
  424. this.resetDragState()
  425. },
  426. /**
  427. * 查找目标索引
  428. */
  429. findTargetIndex(x, y) {
  430. const query = uni.createSelectorQuery().in(this)
  431. query.selectAll('.detail-image-item').boundingClientRect(rects => {
  432. let targetIndex = -1
  433. for (let i = 0; i < rects.length; i++) {
  434. if (i === this.draggingIndex) continue
  435. const rect = rects[i]
  436. if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {
  437. targetIndex = i
  438. break
  439. }
  440. }
  441. this.canDropIndex = targetIndex
  442. }).exec()
  443. },
  444. /**
  445. * 重置拖拽状态
  446. */
  447. resetDragState() {
  448. this.draggingIndex = -1
  449. this.canDropIndex = -1
  450. this.startX = 0
  451. this.startY = 0
  452. },
  453. /**
  454. * 上传图片
  455. */
  456. async handleUploadImage() {
  457. try {
  458. const filePaths = await imageUpload.chooseImage(9)
  459. const uploadResults = await imageUpload.uploadFiles(filePaths)
  460. await imageUpload.bindOrderFile(
  461. this.currentReceipt.clueId,
  462. this.currentReceipt.id,
  463. '3',
  464. uploadResults
  465. )
  466. this.loadDetailImages()
  467. } catch (error) {
  468. console.error('上传失败:', error)
  469. }
  470. },
  471. /**
  472. * 隐藏图片
  473. */
  474. handleHideImage(item, index) {
  475. const itemIndex = this.detailImages.findIndex(img => img.fileUrl === item.fileUrl)
  476. if (itemIndex !== -1) {
  477. this.detailImages.splice(itemIndex, 1)
  478. uni.$u.toast('图片已隐藏')
  479. }
  480. },
  481. /**
  482. * 预览图片
  483. */
  484. previewImageDetail(src) {
  485. const urlList = this.detailImages.map(item => item.fileUrl)
  486. uni.previewImage({
  487. urls: urlList,
  488. current: src
  489. })
  490. },
  491. /**
  492. * 未收点击
  493. */
  494. handleUnpaidClick() {
  495. this.unpaidModalVisible = true
  496. },
  497. /**
  498. * 待跟进点击
  499. */
  500. handleFollowUpClick() {
  501. this.followUpModalVisible = true
  502. },
  503. /**
  504. * 立即支付点击
  505. */
  506. async handlePayNowClick() {
  507. // 保存支付信息
  508. await uni.$u.api.updateReceiptForm({
  509. id: this.currentReceipt.id,
  510. tableFee: this.paymentAmount,
  511. fileIds: this.detailImages.map(item => item.id).join(',')
  512. })
  513. await uni.$u.api.updateClueOrderForm({
  514. id: this.orderDetail.id,
  515. customName: this.paymentInfo.customName || '',
  516. bankName: this.paymentInfo.bankName || '',
  517. bankCardNumber: this.paymentInfo.bankAccount || '',
  518. idCard: this.paymentInfo.idNumber || '',
  519. paymentMethod: this.paymentMethod || ''
  520. })
  521. if (!this.paymentInfo.customName || !this.paymentInfo.bankName ||
  522. !this.paymentInfo.bankAccount || !this.paymentInfo.idNumber || !this.paymentMethod) {
  523. uni.$u.toast('请填写完整的支付信息')
  524. return
  525. }
  526. if (this.paymentAmount <= 0) {
  527. uni.$u.toast('请填写正确的支付总额')
  528. return
  529. }
  530. this.payNowModalVisible = true
  531. },
  532. /**
  533. * 确认转账
  534. */
  535. confirmTransfer() {
  536. this.payNowModalVisible = false
  537. this.$emit('confirm-pay')
  538. },
  539. /**
  540. * 确认未收
  541. */
  542. async confirmUnpaid() {
  543. try {
  544. await uni.$u.api.addOrderFollow({
  545. orderId: this.orderId,
  546. content: `未收评分_${this.unpaidRating}`
  547. })
  548. await uni.$u.api.oderForm({
  549. status: '4',
  550. id: this.orderId
  551. })
  552. uni.$u.toast('提交未收评级成功')
  553. this.unpaidModalVisible = false
  554. } catch (error) {
  555. console.error('提交失败:', error)
  556. uni.$u.toast('提交失败')
  557. }
  558. },
  559. /**
  560. * 确认跟进
  561. */
  562. async confirmFollowUp() {
  563. try {
  564. await uni.$u.api.addOrderFollow({
  565. orderId: this.orderId,
  566. content: `待跟进_${this.followUpNotes}`
  567. })
  568. uni.$u.toast('提交待跟进记录成功')
  569. this.followUpModalVisible = false
  570. this.followUpNotes = ''
  571. } catch (error) {
  572. console.error('提交失败:', error)
  573. uni.$u.toast('提交失败')
  574. }
  575. },
  576. /**
  577. * 下一步
  578. */
  579. async handleNext() {
  580. await uni.$u.api.updateReceiptForm({
  581. id: this.currentReceipt.id,
  582. tableFee: this.paymentAmount,
  583. fileIds: this.detailImages.map(item => item.id).join(',')
  584. })
  585. await uni.$u.api.updateClueOrderForm({
  586. id: this.orderDetail.id,
  587. customName: this.paymentInfo.customName || '',
  588. bankName: this.paymentInfo.bankName || '',
  589. bankCardNumber: this.paymentInfo.bankAccount || '',
  590. idCard: this.paymentInfo.idNumber || ''
  591. })
  592. this.$emit('save', {
  593. nowPage: 'formThree',
  594. form: {
  595. ...this.paymentInfo
  596. },
  597. fileIds: this.detailImages.map(item => item.id).join(',')
  598. })
  599. this.$emit('next', {
  600. nowPage: 'formThree',
  601. form: {
  602. ...this.paymentInfo
  603. }
  604. })
  605. }
  606. }
  607. }
  608. </script>
  609. <style scoped lang="scss">
  610. @import '../styles/common.scss';
  611. .page-three-container {
  612. @extend .page-container;
  613. padding-bottom: 100rpx;
  614. }
  615. .info-card {
  616. @extend .card-wrap;
  617. padding: 20rpx;
  618. margin-top: 20rpx;
  619. box-sizing: border-box;
  620. width: 100%;
  621. max-width: 100%;
  622. }
  623. .info-card-title {
  624. @include font-styles($size: title, $weight: bold, $color: primary);
  625. margin-bottom: 25rpx;
  626. padding-bottom: 15rpx;
  627. border-bottom: 1rpx solid map-get($colors, border);
  628. }
  629. .info-row {
  630. margin-bottom: 20rpx;
  631. }
  632. .info-label {
  633. @include font-styles($size: tiny, $weight: regular, $color: tertiary);
  634. margin-bottom: 8rpx;
  635. display: block;
  636. }
  637. .info-input {
  638. border-radius: 8rpx;
  639. border: 1rpx solid #e5e7eb;
  640. padding: 12rpx 16rpx;
  641. width: 100%;
  642. box-sizing: border-box;
  643. }
  644. .detail-image-section {
  645. padding: 20rpx;
  646. }
  647. .detail-image-header {
  648. display: flex;
  649. justify-content: space-between;
  650. align-items: center;
  651. margin-bottom: 20rpx;
  652. padding-bottom: 20rpx;
  653. border-bottom: 1rpx solid map-get($colors, border);
  654. }
  655. .detail-image-title {
  656. @include font-styles($size: content, $weight: bold, $color: primary);
  657. }
  658. .detail-image-list {
  659. display: flex;
  660. flex-wrap: wrap;
  661. gap: 20rpx;
  662. position: relative;
  663. }
  664. .detail-image-item {
  665. position: relative;
  666. width: 200rpx;
  667. height: 200rpx;
  668. touch-action: none;
  669. transition: all 0.2s ease;
  670. z-index: 1;
  671. cursor: move;
  672. &.dragging {
  673. opacity: 0.5;
  674. transform: scale(1.05);
  675. z-index: 100;
  676. }
  677. &.can-drop {
  678. border: 2rpx dashed #108cff;
  679. background-color: rgba(16, 140, 255, 0.1);
  680. }
  681. }
  682. .image-type-tag {
  683. position: absolute;
  684. top: 10rpx;
  685. left: 10rpx;
  686. background-color: rgba(0, 0, 0, 0.6);
  687. color: white;
  688. padding: 5rpx 10rpx;
  689. border-radius: 12rpx;
  690. font-size: 22rpx;
  691. z-index: 1;
  692. }
  693. .detail-delete-btn {
  694. position: absolute;
  695. top: -10rpx;
  696. right: -10rpx;
  697. width: 40rpx;
  698. height: 40rpx;
  699. background-color: #ff4d4f;
  700. color: #fff;
  701. border-radius: 50%;
  702. display: flex;
  703. align-items: center;
  704. justify-content: center;
  705. font-weight: bold;
  706. z-index: 10;
  707. cursor: pointer;
  708. }
  709. .detail-upload-btn {
  710. width: 200rpx;
  711. height: 200rpx;
  712. border: 8rpx dashed #ddd;
  713. border-radius: 30rpx;
  714. display: flex;
  715. align-items: center;
  716. justify-content: center;
  717. background-color: #f9f9f9;
  718. cursor: pointer;
  719. }
  720. .payment-card {
  721. margin-top: 20rpx;
  722. }
  723. .payment-section {
  724. padding: 20rpx;
  725. }
  726. .payment-total-container {
  727. background-color: #f5f7fa;
  728. border: 2rpx solid #e5e7eb;
  729. border-radius: 12rpx;
  730. padding: 0rpx 30rpx;
  731. display: flex;
  732. align-items: center;
  733. justify-content: space-between;
  734. margin-bottom: 24rpx;
  735. }
  736. .payment-label {
  737. font-size: 36rpx;
  738. font-weight: 700;
  739. min-width: 140rpx;
  740. }
  741. .payment-amount {
  742. font-size: 48rpx;
  743. font-weight: 600;
  744. color: #f53f3f;
  745. width: auto;
  746. min-width: 150rpx;
  747. border: none;
  748. text-align: right !important;
  749. }
  750. .payment-buttons-row {
  751. display: flex;
  752. gap: 20rpx;
  753. margin-bottom: 24rpx;
  754. }
  755. .payment-button {
  756. flex: 1;
  757. border-radius: 12rpx;
  758. padding: 5rpx 0;
  759. display: flex;
  760. flex-direction: column;
  761. align-items: center;
  762. justify-content: center;
  763. background-color: #f5f7fa;
  764. border: 2rpx solid #e5e7eb;
  765. cursor: pointer;
  766. gap: 12rpx;
  767. }
  768. .pay-now-button {
  769. width: 100%;
  770. border-radius: 12rpx;
  771. padding: 32rpx 0;
  772. display: flex;
  773. flex-direction: column;
  774. align-items: center;
  775. justify-content: center;
  776. background-color: #108cff;
  777. color: #fff;
  778. cursor: pointer;
  779. box-shadow: 0 4rpx 12rpx rgba(16, 140, 255, 0.2);
  780. }
  781. .button-text {
  782. font-size: 28rpx;
  783. font-weight: 500;
  784. color: inherit;
  785. }
  786. .modal-content {
  787. width: 100%;
  788. padding: 40rpx 20rpx;
  789. display: flex;
  790. flex-direction: column;
  791. align-items: center;
  792. }
  793. .payment-amount-display {
  794. font-size: 64rpx;
  795. font-weight: bold;
  796. color: #108cff;
  797. text-align: center;
  798. margin-bottom: 40rpx;
  799. width: 100%;
  800. }
  801. .payment-info-section {
  802. width: 100%;
  803. background-color: #f5f7fa;
  804. border: 2rpx solid #e5e7eb;
  805. border-radius: 12rpx;
  806. padding: 30rpx 20rpx;
  807. margin-bottom: 40rpx;
  808. }
  809. .info-item {
  810. display: flex;
  811. margin-bottom: 20rpx;
  812. align-items: center;
  813. justify-content: space-between;
  814. &:last-child {
  815. margin-bottom: 0;
  816. }
  817. }
  818. .next-btn {
  819. position: fixed;
  820. bottom: 10rpx;
  821. left: 2.5%;
  822. width: 95%;
  823. height: 80rpx;
  824. line-height: 80rpx;
  825. text-align: center;
  826. border-radius: 20rpx;
  827. }
  828. </style>