shish 1 日 前
コミット
167a9e787e

+ 15 - 10
ghsApp/src/admin/billing/forwardResult.vue

@@ -26,7 +26,7 @@
       <button class="admin-button-com big action-btn" @click="goBack">返回首页</button>
     </appResult>
 
-    <!-- 已返充 / 挂账原路:凭证海报(含小程序码) -->
+    <!-- 已返充 / 余额·挂账原路:凭证海报(含小程序码) -->
     <appResult v-else-if="showPoster" :title="posterPageTitle">
       <text v-if="posterUrl && originReturnDesc" class="origin-desc">{{ originReturnDesc }}</text>
       <view v-if="posterLoading" class="status-text">凭证生成中...</view>
@@ -124,28 +124,31 @@ export default {
         && Number(this.returnBalance) === 0
         && (Number(this.needFundAction) === 1 || Number(this.orderId) === 0)
     },
-    /** 挂账原路已完成(需出凭证海报) */
-    isDebtOriginReturn() {
+    /** 余额/挂账原路已完成(需出凭证海报,方便转发给客户) */
+    isBalanceOrDebtOriginReturn() {
       return Number(this.hasReturn) === 1
         && Number(this.returnBalance) === 0
-        && Number(this.payWay) === 3
+        && (Number(this.payWay) === 2 || Number(this.payWay) === 3)
     },
-    /** 已返充或挂账原路:展示带小程序码的凭证海报 */
+    /** 已返充或余额/挂账原路:展示带小程序码的凭证海报 */
     showPoster() {
-      return Number(this.returnBalance) === 1 || this.isDebtOriginReturn
+      return Number(this.returnBalance) === 1 || this.isBalanceOrDebtOriginReturn
     },
     posterPageTitle() {
-      if (this.isDebtOriginReturn) return '原路退回成功'
+      if (this.isBalanceOrDebtOriginReturn) return '原路退回成功'
       return '退款成功'
     },
     pageTitle() {
       if (Number(this.hasReturn) === 1) return '原路退回成功'
       return '退款成功'
     },
-    /** 海报导语:返充 / 挂账减欠 / 挂账退余额 */
+    /** 海报导语:返充 / 余额原路 / 挂账减欠 / 挂账退余额 */
     posterStatusText() {
       if (Number(this.returnBalance) === 1) return '已返充到余额'
-      if (this.isDebtOriginReturn) {
+      if (Number(this.payWay) === 2 && Number(this.hasReturn) === 1) {
+        return '已原路退回到客户余额'
+      }
+      if (Number(this.payWay) === 3 && Number(this.hasReturn) === 1) {
         return Number(this.sameDay) === 0 ? '挂账原路已退回余额' : '已按挂账原路减少欠款'
       }
       return '退款成功'
@@ -187,7 +190,9 @@ export default {
       if ((payWay === 0 || payWay === 1) && online) {
         return ''
       }
-      if (payWay === 2) return '金额已自动加回该客户账户余额。'
+      if (payWay === 2) {
+        return '金额已自动加回该客户账户余额,可长按下方凭证转发给客户。'
+      }
       if (payWay === 3) {
         if (Number(this.sameDay) === 0) {
           return '退款金额已加回客户余额。可长按下方凭证转发给客户核对。'

+ 2 - 2
ghsApp/src/pagesOrder/refund.vue

@@ -418,9 +418,9 @@ export default {
 							&& Number(data.returnBalance) === 0
 							&& Number(data.couldReturn) === 1)
 					const payWay = data.payWay != null ? Number(data.payWay) : Number(that.orderInfo.payWay)
-					// 返充余额,或挂账原路:进结果页出凭证海报
+					// 返充余额,或余额/挂账原路:进结果页出凭证海报
 					const showPoster = Number(data.returnBalance) === 1
-						|| (Number(data.hasReturn) === 1 && payWay === 3)
+						|| (Number(data.hasReturn) === 1 && (payWay === 2 || payWay === 3))
 					if (needFund || showPoster) {
 						const payload = {
 							amount: data.refundPrice || refundParams.price,

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

@@ -250,11 +250,12 @@ export default {
 		},
 		/** 已通过且返充余额时可查看凭证 */
 		canShowPoster() {
-			// 返充余额,或挂账原路:均可查看凭证海报
+			// 返充余额,或余额/挂账原路:均可查看凭证海报
 			const info = this.info || {}
 			if (Number(info.status) !== 1) return false
 			if (Number(info.returnBalance) === 1) return true
-			return Number(info.hasReturn) === 1 && Number(info.payWay) === 3
+			return Number(info.hasReturn) === 1
+				&& (Number(info.payWay) === 2 || Number(info.payWay) === 3)
 		},
 		/** 申请原因文案 */
 		causeText() {

+ 14 - 11
hdApp/src/admin/billing/forwardResult.vue

@@ -26,7 +26,7 @@
       <button class="admin-button-com big action-btn" @click="goBack">返回首页</button>
     </appResult>
 
-    <!-- 已返充 / 挂账原路:凭证海报(含小程序码) -->
+    <!-- 已返充 / 余额·挂账原路:凭证海报(含小程序码) -->
     <appResult v-else-if="showPoster" :title="posterPageTitle">
       <text v-if="posterUrl && originReturnDesc" class="origin-desc">{{ originReturnDesc }}</text>
       <view v-if="posterLoading" class="status-text">凭证生成中...</view>
@@ -124,28 +124,31 @@ export default {
         && Number(this.returnBalance) === 0
         && (Number(this.needFundAction) === 1 || Number(this.orderId) === 0)
     },
-    /** 挂账原路已完成(需出凭证海报) */
-    isDebtOriginReturn() {
+    /** 余额/挂账原路已完成(需出凭证海报,方便转发给客户) */
+    isBalanceOrDebtOriginReturn() {
       return Number(this.hasReturn) === 1
         && Number(this.returnBalance) === 0
-        && Number(this.payWay) === 3
+        && (Number(this.payWay) === 2 || Number(this.payWay) === 3)
     },
-    /** 已返充或挂账原路:展示带小程序码的凭证海报 */
+    /** 已返充或余额/挂账原路:展示带小程序码的凭证海报 */
     showPoster() {
-      return Number(this.returnBalance) === 1 || this.isDebtOriginReturn
+      return Number(this.returnBalance) === 1 || this.isBalanceOrDebtOriginReturn
     },
     posterPageTitle() {
-      if (this.isDebtOriginReturn) return '原路退回成功'
+      if (this.isBalanceOrDebtOriginReturn) return '原路退回成功'
       return '退款成功'
     },
     pageTitle() {
       if (Number(this.hasReturn) === 1) return '原路退回成功'
       return '退款成功'
     },
-    /** 海报导语:返充 / 挂账减欠 / 挂账退余额 */
+    /** 海报导语:返充 / 余额原路 / 挂账减欠 / 挂账退余额 */
     posterStatusText() {
       if (Number(this.returnBalance) === 1) return '已返充到余额'
-      if (this.isDebtOriginReturn) {
+      if (Number(this.payWay) === 2 && Number(this.hasReturn) === 1) {
+        return '已原路退回到客户余额'
+      }
+      if (Number(this.payWay) === 3 && Number(this.hasReturn) === 1) {
         return Number(this.sameDay) === 0 ? '挂账原路已退回余额' : '已按挂账原路减少欠款'
       }
       return '退款成功'
@@ -188,7 +191,7 @@ export default {
         return ''
       }
       if (payWay === 2) {
-        return '金额已自动加回该客户账户余额,客户可在小程序查看最新余额。'
+        return '金额已自动加回该客户账户余额,可长按下方凭证转发给客户。'
       }
       if (payWay === 3) {
         if (Number(this.sameDay) === 0) {
@@ -615,7 +618,7 @@ export default {
 }
 
 .poster-img {
-  width: 640upx;
+  width: 450upx;
   max-width: 100%;
   border-radius: 12upx;
   box-shadow: 0 8upx 24upx rgba(0, 0, 0, 0.12);

+ 179 - 68
hdApp/src/admin/order/detail.vue

@@ -157,7 +157,8 @@
         </view>
       </view>
 
-      <!-- 任务模块 -->
+      <!-- 任务模块:暂隐藏,后续再补 -->
+      <!--
       <view class="module-com" v-if="!$util.isEmpty(orderInfo.workList)">
         <view class="module-tit">任务</view>
         <view class="module-det">
@@ -170,6 +171,7 @@
           </block>
         </view>
       </view>
+      -->
 
       <!-- 订单信息模块 -->
       <view class="module-com order-msg">
@@ -181,39 +183,38 @@
         </view>
         <view class="module-det">
           <view class="order-msg-blo">
-            <!-- 累计退款:tkPrice + nextDayTkPrice,对齐 ghs;售后记录挂在本行 -->
+            <!-- 累计退款:金额与「售后记录」并排,避免按钮挡住金额 -->
             <view
-              class="msg-list rel"
+              class="msg-list msg-list--with-action"
               v-if="orderInfo.refundLog == 1 || Number(orderInfo.nextDayTkPrice) > 0 || Number(orderInfo.tkPrice) > 0"
             >
-              <view class="label">累计退款:</view>
-              <view class="value" style="color:red;font-weight:bold;">
-                ¥{{ totalTkPrice }}
+              <view class="label">累计退款</view>
+              <view class="value-wrap">
+                <text class="value text-danger">¥{{ totalTkPrice }}</text>
+                <button
+                  class="admin-button-com mini-btn refund-log-btn"
+                  @click="pageTo({url: '/admin/order/refundList',query: {orderSn: orderInfo.orderSn}})"
+                >售后记录</button>
               </view>
-              <button
-                class="admin-button-com mini-btn abs-tr"
-                @click="pageTo({url: '/admin/order/refundList',query: {orderSn: orderInfo.orderSn}})"
-              >售后记录</button>
             </view>
 
             <!-- 付款类型 -->
             <view class="msg-list" v-if="orderInfo.payStatus == 1">
-              <view class="label">付款类型</view>
+              <view class="label">付款类型</view>
               <view class="value" v-if="orderInfo.onlinePay == 2"><text class="tag tag--primary">线上付款</text></view>
               <view class="value" v-else>线下付款</view>
             </view>
 
             <!-- 付款方式 -->
             <view class="msg-list" v-if="orderInfo.payStatus == 1">
-              <view class="label">付款方式</view>
+              <view class="label">付款方式</view>
               <block v-if="orderInfo.payWay==3">
                 <view 
-                  class="value" 
-                  v-if="Number(orderInfo.remainDebtPrice)>0" 
-                  style="color:red;font-weight:bold;">
+                  class="value text-danger" 
+                  v-if="Number(orderInfo.remainDebtPrice)>0">
                   挂账
                 </view>
-                <view v-else class="value" style="color:#3385ff;font-weight:bold;">
+                <view v-else class="value text-primary" style="font-weight:bold;">
                   挂账<text>(已清)</text>
                 </view>
               </block>
@@ -231,8 +232,8 @@
 
             <!-- 红包信息 -->
             <view class="msg-list" v-if="orderInfo.hbId && Number(orderInfo.hbId) != 0">
-              <view class="label">红包</view>
-              <view class="value" style="color:red;">-¥{{ orderInfo.hbAmount ? parseFloat(orderInfo.hbAmount) : 0 }}</view>
+              <view class="label">红包</view>
+              <view class="value text-danger">-¥{{ orderInfo.hbAmount ? parseFloat(orderInfo.hbAmount) : 0 }}</view>
               <button v-if="Number(orderInfo.hbId) > 0"
                 class="admin-button-com"
                 :class="canBackHb ? 'blue' : 'default'"
@@ -243,8 +244,8 @@
 
             <!-- 欠款信息 -->
             <view class="msg-list rel" v-if="Number(orderInfo.remainDebtPrice)>0">
-              <view class="label">欠款金额</view>
-              <view class="value" style="color:red;font-weight:bold;">
+              <view class="label">欠款金额</view>
+              <view class="value text-danger">
                 ¥{{ orderInfo.remainDebtPrice ? parseFloat(orderInfo.remainDebtPrice) : 0 }}
               </view>
               <button 
@@ -255,7 +256,7 @@
 
             <!-- 账单信息 -->
             <view class="msg-list" v-if="!$util.isEmpty(orderInfo.orderSettleList)">
-              <view class="label">账单信息</view>
+              <view class="label">账单信息</view>
               <view class="value">
                 <text 
                   v-for="(osItem, osIndex) in orderInfo.orderSettleList" 
@@ -267,59 +268,74 @@
 
             <!-- 运费 -->
             <view class="msg-list" v-if="Number(orderInfo.sendCost)>0">
-              <view class="label">运费金额</view>
+              <view class="label">运费金额</view>
               <view class="value">¥{{ orderInfo.sendCost ? parseFloat(orderInfo.sendCost) : 0 }}</view>
             </view>
 
             <!-- 手续费 -->
             <view class="msg-list" v-if="Number(orderInfo.serviceFee)>0">
-              <view class="label">手续费用</view>
+              <view class="label">手续费用</view>
               <view class="value">¥{{ orderInfo.serviceFee ? parseFloat(orderInfo.serviceFee) : 0 }}</view>
             </view>
 
             <!-- 包装费(劳务) -->
             <view class="msg-list" v-if="Number(orderInfo.labourCost)>0">
-              <view class="label">材料费用</view>
+              <view class="label">材料费用</view>
               <view class="value">¥{{ orderInfo.labourCost ? parseFloat(orderInfo.labourCost) : 0 }}</view>
             </view>
 
             <!-- 包装费 -->
             <view class="msg-list" v-if="Number(orderInfo.packingFee)>0">
-              <view class="label">包装费用</view>
+              <view class="label">包装费用</view>
               <view class="value">¥{{ orderInfo.packingFee ? parseFloat(orderInfo.packingFee) : 0 }}</view>
             </view>
 
             <!-- 优惠金额 -->
             <view v-if="orderInfo.discountAmount > 0" class="msg-list">
-              <view class="label">优惠金额</view>
-              <view class="value">-¥{{ orderInfo.discountAmount ? parseFloat(orderInfo.discountAmount) : 0 }}</view>
+              <view class="label">优惠金额</view>
+              <view class="value text-danger">-¥{{ orderInfo.discountAmount ? parseFloat(orderInfo.discountAmount) : 0 }}</view>
             </view>
 
-            <!-- 应付金额 -->
-            <view class="msg-list" v-if="Number(orderInfo.tkPrice)>0">
-              <view class="label">订单金额:</view>
-              <view class="value">¥{{ orderInfo.orderPrice ? parseFloat(orderInfo.orderPrice) : 0 }}</view>
-            </view>
+            <!-- 金额汇总:订单 → 当天售后 → 实际 → 跨天售后 → 最终 -->
+            <view class="amount-panel">
+              <view class="msg-list">
+                <view class="label">订单金额</view>
+                <view class="value">¥{{ orderInfo.orderPrice ? parseFloat(orderInfo.orderPrice) : 0 }}</view>
+              </view>
 
-            <!-- 当天售后(仅影响 actPrice 的当日部分;隔天在累计退款里) -->
-            <view class="msg-list" v-if="Number(orderInfo.tkPrice)>0">
-              <view class="label">当天售后:</view>
-              <view class="value" style="color:red;">
-                -¥{{ orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0 }}
+              <!-- 当天售后仅影响 actPrice/realPrice 的当日部分 -->
+              <view class="msg-list" v-if="Number(orderInfo.tkPrice)>0">
+                <view class="label">当天售后</view>
+                <view class="value text-danger">
+                  -¥{{ orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0 }}
+                </view>
               </view>
-            </view>
 
-            <!-- 实际金额 -->
-            <view class="msg-list">
-              <view class="label">实际金额:</view>
-              <view class="value">
-                ¥{{ orderInfo.realPrice ? parseFloat(orderInfo.realPrice) : 0 }}
+              <view class="msg-list msg-list--emphasis">
+                <view class="label">实际金额</view>
+                <view class="value text-primary amount-strong">
+                  ¥{{ orderInfo.realPrice ? parseFloat(orderInfo.realPrice) : 0 }}
+                </view>
+              </view>
+
+              <!-- 跨天售后不改 realPrice;最终金额 = 实际金额 - 跨天售后 -->
+              <view class="msg-list" v-if="Number(orderInfo.nextDayTkPrice) > 0">
+                <view class="label">跨天售后</view>
+                <view class="value text-danger">
+                  -¥{{ nextDayTkPrice }}
+                </view>
+              </view>
+              <view class="msg-list msg-list--emphasis" v-if="Number(orderInfo.nextDayTkPrice) > 0">
+                <view class="label">最终金额</view>
+                <view class="value text-primary amount-strong">
+                  ¥{{ finalPriceAfterNextDayRefund }}
+                </view>
               </view>
             </view>
 
             <!-- 订单状态 -->
-            <view class="msg-list">
-              <view class="label">订单状态:</view>
+            <view class="msg-list msg-list--meta">
+              <view class="label">订单状态</view>
               <view class="value">
                 {{orderInfo.status == 1 ? '待付款':
                   orderInfo.status == 2 ? '待发货':
@@ -329,25 +345,25 @@
               </view>
             </view>
 
-            <view class="msg-list">
-              <view class="label">订单编号</view>
-              <view class="value">{{ orderInfo.orderSn || '' }}</view>
+            <view class="msg-list msg-list--meta">
+              <view class="label">订单编号</view>
+              <view class="value value--mono">{{ orderInfo.orderSn || '' }}</view>
             </view>
 
             <!-- 下单时间 -->
-            <view class="msg-list">
-              <view class="label">创建订单</view>
+            <view class="msg-list msg-list--meta">
+              <view class="label">创建订单</view>
               <view class="value">{{ orderInfo.addTime ? orderInfo.addTime.substr(5,11) : ''}}</view>
             </view>
 
-            <view class="msg-list" v-if="orderInfo.payTime!='0000-00-00 00:00:00'">
-              <view class="label">支付时间</view>
+            <view class="msg-list msg-list--meta" v-if="orderInfo.payTime!='0000-00-00 00:00:00'">
+              <view class="label">支付时间</view>
               <view class="value">{{ orderInfo.payTime ? orderInfo.payTime.substr(5,11) : ''}}</view>
             </view>
 
             <!-- 过期时间 -->
-            <view class="msg-list" v-if="orderInfo.status == 1">
-              <view class="label">过期时间</view>
+            <view class="msg-list msg-list--meta" v-if="orderInfo.status == 1">
+              <view class="label">过期时间</view>
               <view class="value">{{ orderInfo.deadline ? orderInfo.deadline : ''}}</view>
             </view>
           </view>
@@ -493,6 +509,20 @@ export default {
       const day = Number(this.orderInfo && this.orderInfo.tkPrice) || 0
       const next = Number(this.orderInfo && this.orderInfo.nextDayTkPrice) || 0
       return parseFloat((day + next).toFixed(2))
+    },
+    /** 跨天售后金额(不改 realPrice) */
+    nextDayTkPrice() {
+      return parseFloat((Number(this.orderInfo && this.orderInfo.nextDayTkPrice) || 0).toFixed(2))
+    },
+    /**
+     * 最终金额:实际金额 realPrice - 跨天售后 nextDayTkPrice
+     * 跨天售后不改实付字段,用差值给店员看净额
+     */
+    finalPriceAfterNextDayRefund() {
+      const real = Number(this.orderInfo && this.orderInfo.realPrice) || 0
+      const next = Number(this.orderInfo && this.orderInfo.nextDayTkPrice) || 0
+      const final = real - next
+      return parseFloat((final > 0 ? final : 0).toFixed(2))
     }
   },
   methods: {
@@ -886,27 +916,105 @@ export default {
   .order-msg {
     .order-msg-blo {
       font-size: 28upx;
-      padding: 20upx 0;
+      padding: 12upx 0 8upx;
       border-top: 1px solid $borderColor;
       
       .msg-list {
         display: flex;
+        align-items: flex-start;
         justify-content: flex-start;
-        margin: 16upx 0;
+        margin: 0;
+        padding: 18upx 8upx;
+        border-bottom: 1upx solid #f5f6f8;
+        
+        &:last-child {
+          border-bottom: none;
+        }
         
         .label {
-          color: #999999;
+          color: #8a8f99;
           width: 160upx;
           flex-shrink: 0;
-          text-align: right;
-          padding-right: 12upx;
+          text-align: left;
+          padding-right: 16upx;
+          line-height: 1.5;
         }
         .value {
           flex: 1;
-          line-height: 1.6;
+          color: #333;
+          line-height: 1.5;
           word-break: break-all;
+          text-align: right;
+        }
+        .value--mono {
+          font-size: 26upx;
+          color: #666;
+        }
+      }
+
+      .msg-list--with-action {
+        align-items: center;
+
+        .value-wrap {
+          flex: 1;
+          display: flex;
+          align-items: center;
+          justify-content: flex-end;
+        }
+
+        .value {
+          flex: none;
+          margin-right: 16upx;
+        }
+
+        .refund-log-btn {
+          flex-shrink: 0;
+          margin: 0;
         }
       }
+
+      .msg-list--emphasis {
+        background: rgba(51, 133, 255, 0.04);
+        border-radius: 10upx;
+        border-bottom: none;
+        margin: 8upx 0;
+        padding: 20upx 16upx;
+
+        .label {
+          color: #333;
+          font-weight: 600;
+        }
+      }
+
+      .msg-list--meta {
+        .label,
+        .value {
+          color: #999;
+          font-size: 26upx;
+        }
+      }
+
+      .amount-panel {
+        margin: 12upx 0 8upx;
+        padding: 8upx 4upx 4upx;
+        background: #fafbfd;
+        border-radius: 14upx;
+        border: 1upx solid #eef1f6;
+      }
+
+      .text-danger {
+        color: #ff4757;
+        font-weight: 600;
+      }
+
+      .text-primary {
+        color: #3385ff;
+      }
+
+      .amount-strong {
+        font-size: 34upx;
+        font-weight: 700;
+      }
     }
     
     & .order-msg-blo:first-child {
@@ -941,17 +1049,18 @@ export default {
 }
 
 .module-com {
-  border-radius: 10upx;
+  border-radius: 16upx;
   background-color: #fff;
-  padding: 0 20upx;
-  box-shadow: 0upx 6upx 16upx #ddd;
+  padding: 0 24upx;
+  box-shadow: 0 4upx 20upx rgba(0, 0, 0, 0.06);
   margin-bottom: 20upx;
   
   .module-tit {
-    padding: 20upx 0;
-    font-size: 28upx;
+    padding: 28upx 0 22upx;
+    font-size: 30upx;
     font-weight: 600;
-    border-bottom: 1px solid $borderColor;
+    color: #222;
+    border-bottom: 1upx solid #f0f2f5;
     display: flex;
     align-items: center;
     justify-content: space-between;
@@ -959,13 +1068,15 @@ export default {
     .module-tit__text {
       display: inline-flex;
       align-items: center;
-      gap: 10upx;
     }
 
     .module-tit__actions {
       display: inline-flex;
       align-items: center;
-      gap: 16upx;
+    }
+
+    .module-tit__actions .admin-button-com {
+      margin-left: 16upx;
     }
   }
 }

+ 3 - 2
hdApp/src/admin/order/refundDetail.vue

@@ -231,12 +231,13 @@ export default {
 				&& Number(this.info.hasReturn || 0) === 0
 				&& Number(this.info.returnBalance || 0) === 0
 		},
-		/** 已通过且返充余额/挂账原路时可查看凭证海报 */
+		/** 已通过且返充余额/余额原路/挂账原路时可查看凭证海报 */
 		canShowPoster() {
 			const info = this.info || {}
 			if (Number(info.status) !== 1) return false
 			if (Number(info.returnBalance || 0) === 1) return true
-			return Number(info.hasReturn || 0) === 1 && Number(info.payWay) === 3
+			return Number(info.hasReturn || 0) === 1
+				&& (Number(info.payWay) === 2 || Number(info.payWay) === 3)
 		},
 		/** 待审核:商城顾客申请,超管可在本页通过/驳回 */
 		canAudit() {