shish 10 часов назад
Родитель
Сommit
45e4655c26

+ 71 - 7
ghsApp/src/components/forward-options-popup.vue

@@ -2,8 +2,11 @@
   售后转冲销单-选项确认弹框
   用途:pagesOrder/refund.vue(超管直接发起售后)、pagesOrder/refundDetail.vue(超管审核客户/花店提交的售后申请)
   两个入口在检测到"该订单需转冲销单"场景时复用本弹框,只让用户选择:
-  退货方式(forwardStock)、返充到余额(returnBalance)、打印小票(needPrint),
+  退货方式(forwardStock)、资金处理方式(原路退回/返充到余额)、打印小票(needPrint),
   退款方式固定展示为原单支付渠道(不可选,由后端强制锁定,不信任前端传值)。
+  资金处理方式按原单支付渠道(payWay)分两类:
+  - 线上支付(微信/支付宝):展示"原路退回"(是/否);选否才继续展示"返充到余额"(是/否),二者互斥。
+  - 挂账/余额支付:不展示任何选项,强制返充到余额(挂账本质是负余额,返充余额=冲减欠款,账本层面是同一动作)。
   选好后点确认,由父组件负责调用 createForwardOrder 接口直接提交,不再跳转花材选择页重新走一遍流程。
   ssh 冲销单功能
 -->
@@ -33,7 +36,25 @@
 				</view>
 			</view>
 
-			<view class="forward-popup__row">
+			<!-- 线上支付(微信/支付宝):先问是否原路退回 -->
+			<view class="forward-popup__row" v-if="isOnlinePay">
+				<view class="forward-popup__label">原路退回</view>
+				<view class="forward-popup__value">
+					<button
+						class="admin-button-com middle forward-popup__btn"
+						:class="originalRefund === 1 ? 'blue' : 'default'"
+						@click="selectOriginalRefund(1)"
+					>是</button>
+					<button
+						class="admin-button-com middle forward-popup__btn"
+						:class="originalRefund === 0 ? 'blue' : 'default'"
+						@click="selectOriginalRefund(0)"
+					>否</button>
+				</view>
+			</view>
+
+			<!-- 线上支付且选择"不原路退回"时,才继续问是否返充到余额;与"原路退回"互斥 -->
+			<view class="forward-popup__row" v-if="isOnlinePay && originalRefund === 0">
 				<view class="forward-popup__label">返充到余额</view>
 				<view class="forward-popup__value">
 					<button
@@ -49,6 +70,12 @@
 				</view>
 			</view>
 
+			<!-- 挂账/余额支付:不给选项,只读提示强制返充到余额(挂账本质是负余额,返充余额即冲减欠款) -->
+			<view class="forward-popup__row" v-if="!isOnlinePay">
+				<view class="forward-popup__label">资金处理</view>
+				<view class="forward-popup__value forward-popup__value--locked">自动返充到客户余额</view>
+			</view>
+
 			<view class="forward-popup__row">
 				<view class="forward-popup__label">打印小票</view>
 				<view class="forward-popup__value">
@@ -90,6 +117,11 @@ export default {
 			type: String,
 			default: ''
 		},
+		//原单支付方式原始编码:0微信 1支付宝 2余额 3挂账,用于决定资金处理选项的展示分支
+		payWay: {
+			type: [Number, String],
+			default: -1
+		},
 		//本次冲销金额,仅用于弹框内展示
 		amount: {
 			type: [Number, String],
@@ -104,32 +136,64 @@ export default {
 	data() {
 		return {
 			forwardStock: -1, // -1未选 0库存退回 1库存不退,与后端字段值一致
+			originalRefund: -1, // -1未选 1是(原路退回网关) 0否,仅线上支付分支使用
 			returnBalance: -1, // -1未选 1是 0否
 			needPrint: 1 // 1打印 2不打印
 		};
 	},
+	computed: {
+		//原单是否线上支付(微信/支付宝):只有这种场景才允许"原路退回"选项,其它(挂账/余额支付)强制走返充余额
+		isOnlinePay() {
+			return Number(this.payWay) === 0 || Number(this.payWay) === 1;
+		}
+	},
 	methods: {
 		open() {
 			this.forwardStock = -1;
-			this.returnBalance = -1;
+			this.originalRefund = -1;
+			//挂账/余额支付没有可选项,直接内部锁定为"返充余额";线上支付则等用户选
+			this.returnBalance = this.isOnlinePay ? -1 : 1;
 			this.needPrint = 1;
 			this.$refs.popupRef.open('center');
 		},
 		close() {
 			this.$refs.popupRef.close();
 		},
+		selectOriginalRefund(val) {
+			this.originalRefund = val;
+			//切回"原路退回=是"时,返充到余额的选择要清空,避免带着上一次选的值一起提交(二者互斥)
+			if (val === 1) {
+				this.returnBalance = -1;
+			}
+		},
 		confirm() {
 			if (this.forwardStock === -1) {
 				this.$msg('请选择退货方式');
 				return;
 			}
-			if (this.returnBalance === -1) {
-				this.$msg('请选择是否返充到余额');
-				return;
+			let originalRefund = 0;
+			let returnBalance = this.returnBalance;
+			if (this.isOnlinePay) {
+				if (this.originalRefund === -1) {
+					this.$msg('请选择是否原路退回');
+					return;
+				}
+				originalRefund = this.originalRefund;
+				if (originalRefund === 0 && returnBalance === -1) {
+					this.$msg('请选择是否返充到余额');
+					return;
+				}
+				if (originalRefund === 1) {
+					returnBalance = 0;
+				}
+			} else {
+				//挂账/余额支付:强制返充余额,不给选
+				returnBalance = 1;
 			}
 			this.$emit('confirm', {
 				forwardStock: this.forwardStock,
-				returnBalance: this.returnBalance,
+				originalRefund: originalRefund,
+				returnBalance: returnBalance,
 				needPrint: this.needPrint
 			});
 		}

+ 12 - 4
ghsApp/src/pagesOrder/detail.vue

@@ -195,11 +195,19 @@
 						>{{ bill.clearSn ? bill.clearSn : ('结账单' + (billIndex + 1)) }}<text v-if="Number(bill.amount)>0" class="order-clear-bills__amt"> 本单销¥{{ parseFloat(bill.amount) }}</text></text>
 					</view>
 				</view>
-				<view class="order-info_box" style="margin-top:40upx;">
-					<view>订单状态:</view>
-					<view>{{ detailInfo.status==1?'待付款':detailInfo.status==2?'待发货':detailInfo.status==3?'配送中':detailInfo.status==4?'已完成':detailInfo.status==5?'已取消':'已退款' }}</view>
+			<!-- 冲销单关联原单:当前订单本身是冲销单(forward==1)时,展示关联的原销售单入口,方便追溯来源;ssh 冲销单功能 -->
+			<view v-if="Number(detailInfo.forward)==1 && detailInfo.relateOrderId > 0" class="order-info_box" style="margin-top:40upx;">
+				<view>关联原单:</view>
+				<view style="color:#3385ff;">{{ detailInfo.relateOrderSn }}</view>
+				<view class="price">
+					<button @click="pageTo({url: '/pagesOrder/detail', query: {id: detailInfo.relateOrderId}})" style="color:#3385ff;border: 1upx solid #3385ff;" class="admin-button-com">查看原单</button>
+				</view>
+			</view>
+			<view class="order-info_box" style="margin-top:40upx;">
+				<view>订单状态:</view>
+				<view>{{ detailInfo.status==1?'待付款':detailInfo.status==2?'待发货':detailInfo.status==3?'配送中':detailInfo.status==4?'已完成':detailInfo.status==5?'已取消':'已退款' }}</view>
 
-					<view class="price" style="font-weight:normal;" v-if="Number(detailInfo.forward)==0">
+				<view class="price" style="font-weight:normal;" v-if="Number(detailInfo.forward)==0">
 						<block v-if="detailInfo.status == 2 && detailInfo.book == 0">
 							<button class="admin-button-com bule" @click.stop="directFh(detailInfo)">发货</button>
 							<button class="admin-button-com bule" style="margin-left:30upx;" @click.stop="fillNoFh(detailInfo)">物流单发货</button>

+ 3 - 1
ghsApp/src/pagesOrder/refund.vue

@@ -222,6 +222,7 @@
 		<forward-options-popup
 			ref="forwardPopup"
 			:pay-way-name="getPayWayName(orderInfo.payWay)"
+			:pay-way="orderInfo.payWay"
 			:amount="refundPrice"
 			:submitting="forwardSubmitting"
 			@confirm="submitForwardOrder"
@@ -371,7 +372,7 @@ export default {
 				})
 		},
 		/** 冲销单弹框确认后的真正提交逻辑:直接调后端接口生成冲销单并关联原单 */
-		async submitForwardOrder({ forwardStock, returnBalance, needPrint }){
+		async submitForwardOrder({ forwardStock, originalRefund, returnBalance, needPrint }){
 			if(this.forwardSubmitting){
 				return
 			}
@@ -390,6 +391,7 @@ export default {
 					remark: this.remark,
 					payWay: this.orderInfo.payWay,
 					forwardStock: forwardStock,
+					originalRefund: originalRefund,
 					returnBalance: returnBalance,
 					needPrint: needPrint,
 					relateOrderId: this.option.id

+ 3 - 1
ghsApp/src/pagesOrder/refundDetail.vue

@@ -183,6 +183,7 @@
 		<forward-options-popup
 			ref="forwardPopup"
 			:pay-way-name="getPayWayName(info.orderInfo && info.orderInfo.payWay)"
+			:pay-way="info.orderInfo && info.orderInfo.payWay"
 			:amount="refundPrice"
 			:submitting="forwardSubmitting"
 			@confirm="submitForwardOrder"
@@ -339,7 +340,7 @@ export default {
 			this.$refs.forwardPopup.open()
 		},
 		/** 冲销单弹框确认后提交:只传 refundOrderId,后端按该售后申请的商品明细自动生成冲销单并把本售后标记为已通过 */
-		async submitForwardOrder({ forwardStock, returnBalance, needPrint }) {
+		async submitForwardOrder({ forwardStock, originalRefund, returnBalance, needPrint }) {
 			if (this.forwardSubmitting) {
 				return
 			}
@@ -352,6 +353,7 @@ export default {
 					refundOrderId: this.option.id,
 					remark: this.remark,
 					forwardStock: forwardStock,
+					originalRefund: originalRefund,
 					returnBalance: returnBalance,
 					needPrint: needPrint
 				}, { hideError: true })

+ 8 - 0
hdApp/src/pagesPurchase/purDetails.vue

@@ -110,6 +110,14 @@
           <view>采购人员:</view>
           <view>{{ detailInfo.adminName }}</view>
         </view>
+        <!-- 冲销单关联原单:当前采购单本身是冲销单(forward==1)时,展示关联的原采购单入口,方便追溯来源;ssh 冲销单功能 -->
+        <view v-if="Number(detailInfo.forward)==1 && detailInfo.relateCgId > 0" class="order-info_box">
+          <view>关联原单:</view>
+          <view style="color:#3385ff;">{{ detailInfo.relateOrderSn }}</view>
+          <view class="price">
+            <button @click="pageTo({url: '/pagesPurchase/purDetails?id='+detailInfo.relateCgId})" style="color:#3385ff;border: 1upx solid #3385ff;" class="admin-button-com">查看原单</button>
+          </view>
+        </view>
         <view class="order-info_box">
           <view>订单状态:</view>
           <block v-if="detailInfo.status==5">