Browse Source

预付款功能完善

shizi 1 month ago
parent
commit
2880bad08c

+ 4 - 1
.gitignore

@@ -18,4 +18,7 @@ dist
 *.ntvs*
 *.njsproj
 *.sln
-*.sw?
+*.sw?
+
+# AI
+openspec

+ 1 - 0
.node-version

@@ -0,0 +1 @@
+22.12.0

+ 64 - 4
src/pages/order/pages/prepaymentAndRecharge/prepaymentAndRecharge.vue

@@ -48,10 +48,13 @@ export default {
             rechargePurpose: {}, // 充值用途
             medicalRecords: {}, // 就诊记录
             rechargeAmount: "",
+            rechargeAmountMax: "", // 充值金额上限(订单总额),从 URL 带入后锁定不变,不和 rechargeAmount 同步
             admObj: {},
             purPoseObj: {},
             platform: app.globalData.platform,
-            provider: app.globalData.provider
+            provider: app.globalData.provider,
+            prePayAmt: '', // 最小充值金额(下限),由上游 advancePayment 透传
+            prePayIDInfo: '', // 押金账户信息,从 order.vue turnTrans 透传,传给 99070016
         }
     },
     onLoad: function (options) {
@@ -60,16 +63,51 @@ export default {
         eventChannel.on('selectAVisit', function (data) {
             _tihs.setData({
                 admObj: data.admObj,
-                purPoseObj: data.purPoseObj
+                purPoseObj: data.purPoseObj,
+                rechargeAmount: data.rechargeAmount || '',
+                prePayAmt: data.prePayAmt || '',
             }, () => {
                 console.log("admObj", _tihs.purPoseObj)
             });
         })
+        // 从账单页直接 URL 参数带入(跳过 advancePayment 中转的新流程)
+        if (options && (options.purPoseCode || options.rechargeAmount || options.prePayAmt || options.admID)) {
+            _tihs.setData({
+                purPoseObj: {
+                    accpurPoseCode: options.purPoseCode || '',
+                    accpurPoseDesc: options.purPoseDesc || options.purPoseCode || '',
+                },
+                admObj: { admID: options.admID || '' },
+                rechargeAmount: options.rechargeAmount || '',
+                rechargeAmountMax: options.rechargeAmount || '', // 上限锁定,不和输入同步
+                prePayAmt: options.prePayAmt || '',
+                prePayIDInfo: options.prePayIDInfo || '',
+            });
+        }
     },
     methods: {
         onChange(event) {
+            const val = event.detail.value;
+            const upper = +this.rechargeAmountMax; // 用锁定上限,不用当前输入值
+            const lower = +this.prePayAmt;
+            // 上限校验(订单金额,锁定不变)
+            if (upper && +val > upper) {
+                uni.showToast({
+                    title: `金额不能超过 ${upper} 元`,
+                    icon: 'none'
+                });
+                return;
+            }
+            // 下限校验(后端返回的最小充值金额),仅当 prePayAmt 有值时校验
+            if (this.prePayAmt && +val < lower) {
+                uni.showToast({
+                    title: `金额不能小于 ${lower} 元`,
+                    icon: 'none'
+                });
+                return;
+            }
             this.setData({
-                rechargeAmount: event.detail.value
+                rechargeAmount: val
             })
         },
 
@@ -80,10 +118,31 @@ export default {
             let userData = this.$cache.get('userData');
             let {
                 rechargeAmount,
+                rechargeAmountMax,
+                prePayAmt,
+                prePayIDInfo,
                 admObj,
                 purPoseObj,
                 platform
             } = this
+            // 上下限二次校验(防止 onChange 被绕过:粘贴、长按等场景)
+            const val = +rechargeAmount;
+            const upper = +rechargeAmountMax;
+            const lower = +prePayAmt;
+            if (upper && val > upper) {
+                uni.showToast({
+                    title: `金额不能超过 ${upper} 元`,
+                    icon: 'none'
+                });
+                return;
+            }
+            if (prePayAmt && val < lower) {
+                uni.showToast({
+                    title: `金额不能小于 ${lower} 元`,
+                    icon: 'none'
+                });
+                return;
+            }
             const userCode = platform == "alipay" ? "alisf" : "wxsf"
             const payWayCode = platform == "alipay" ? "ALIPAY" : "WECHAT"
             let data1 = {
@@ -99,6 +158,7 @@ export default {
                     payWayCode,
                     payWayAmt: rechargeAmount || "",
                     purPoseCode: purPoseObj.accpurPoseCode || "",
+                    prePayIDInfo: prePayIDInfo || "",
                 }]
             }
             let data = {
@@ -109,7 +169,7 @@ export default {
                     payReasonID: "",
                     insuType: "",
                     body: "",
-                    businessType: "DEPAliPAY", // "OPPAY",
+                    businessType: "DEPPAY", // "OPPAY",
                     patNo: userData.hisPatNo ? userData.hisPatNo : '',
                     patName: userData.patDesc ? userData.patDesc : '',
                     idCardNo: userData.idCardNo,

+ 29 - 22
src/pages/tabBar/order/order.vue

@@ -69,6 +69,7 @@
 	import $http from "@/utils/https";
 	import { getHospList, switchHospital, dealSwitchHospital } from '@/utils/common.js';
 	import httpConfig from '@/utils/httpConfig';
+	import { wxpay } from '@/utils/pay.js';
     import navBar from '@/components/navBar/index.vue';
     import vanTabs from '@/components/tabs/tabs.vue';
     import vanDivider from '@/components/divider/index.vue';
@@ -391,7 +392,21 @@
                 console.log('点击了付款', detailObj)
 				console.log(detailObj, detailObj?.purPoseCode)
 				if (!!(detailObj?.purPoseCode)) { // 存在支付方式,走押金充值
-			      this.handlePrepaidDepositRecharge(detailObj);
+			      if (detailObj?.directPayFlag === 'Y') {
+			        // 直付:保持原逻辑
+			        this.handlePrepaidDepositRecharge(detailObj);
+			        return;
+			      }
+			      // 非直付:直接跳 prepaymentAndRecharge,跳过 advancePayment 中转;
+			      // URL query 带入用途、用途描述、金额、最小充值金额、就诊ID
+			      const rechargeAmount = detailObj.ordReasonPatAmt ?? detailObj.patAmt ?? '';
+			      const prePayAmt = detailObj.prePayAmt ?? '';
+				  const prePayIDInfo = detailObj.prePayIDInfo ?? '';
+			      const admID = detailObj.admID ?? '';
+			      const purPoseDesc = detailObj.purPoseDesc ?? '';
+			      uni.navigateTo({
+			        url: `/pages/order/pages/prepaymentAndRecharge/prepaymentAndRecharge?purPoseCode=${encodeURIComponent(detailObj.purPoseCode)}&purPoseDesc=${encodeURIComponent(purPoseDesc)}&rechargeAmount=${encodeURIComponent(rechargeAmount)}&prePayIDInfo=${encodeURIComponent(prePayIDInfo)}&prePayAmt=${encodeURIComponent(prePayAmt)}&admID=${encodeURIComponent(admID)}`,
+			      });
 			      return;
 			    };
 				detailObj.hisPatID = this.patID;
@@ -400,7 +415,7 @@
 			      success: (res) => {
 			        // res.eventChannel.emit('detailObj', {
 			        //   detailObj: detailObj
-			        // })
+			        // })
 					console.log(detailObj)
 					this.$cache.set('orderDetailObj', detailObj)
 			      },
@@ -534,26 +549,18 @@
 			handlePay(data, patAmt) {
 			    console.log('uniapp通用支付',data)
 			    return new Promise((resolve, reject) => {
-			        uni.requestPayment({
-			            timeStamp: data.timeStamp + "",
-			            nonceStr: data.nonceStr,
-			            package: data.package,
-			            signType: data.signType,
-			            paySign: data.paySign,
-			            success(res) {
-			                console.log('pay success', res)
-							uni.navigateTo({
-							  url: '/pages/order/pages/prepaymentRechargeSuccessful/prepaymentRechargeSuccessful?amt=' + patAmt,
-							})
-			                resolve()
-			            },
-			            fail(err) {
-			                isPayment = true;
-			                console.log('pay fail', err)
-			                Utils.abnormalOrderDeal(data) // 取消未支付订单
-			                reject()
-			            }
-			        })
+					wxpay(data).then(res => {
+						console.log('pay success', res)
+						uni.navigateTo({
+						  url: '/pages/order/pages/prepaymentRechargeSuccessful/prepaymentRechargeSuccessful?amt=' + patAmt,
+						})
+						resolve()
+					}).catch(err => {
+						isPayment = true;
+						console.log('pay fail', err)
+						Utils.abnormalOrderDeal(data) // 取消未支付订单
+						reject()
+					})
 			    })
 			},