Просмотр исходного кода

feat(admin-order): 发货弹窗暴露「发货方式」选择(需求②:后台订单发货 shipType 透传)

问题:后端 resolveShipType() 对 deliveryMethod ∈ {3,4,5} 或 NULL 返回 null,
管理端发货按钮因前端未传 shipType 直接报「无法判断发货方式」。

改动(仅 cfc-web/src/views/admin/OrderManage.vue):
- 发货弹窗新增「发货方式」el-radio-group(express 快递 / selfpickup 自提 / local 同城配送)
- 弹窗打开时按 deliveryMethod 预填:1→express,2/4→selfpickup,6→local,
  3/5/NULL→express(订单层面无法判定,由管理员手动覆盖)
- shipForm 增加 shipType 默认 'express';新增 defaultShipType() 推导方法
- confirmShip 调 shipOrder 时透传 shipType(api/admin.js 已支持 extra 展开)
- 自提时隐藏物流公司/单号/快递费三字段并跳过单号必填校验,
  显式传空物流信息(后端 SELF_PICKUP 分支会拒绝非空单号)
- 快递/同城增加物流公司必填前置校验,避免后端报「请填写物流公司」
- 顺带补 deliveryMethod=6(同城配送)的展示文案

验证:cfc-web vue-cli-service build 通过;cfc-backend mvn compile 通过。
Sisyphus 1 неделя назад
Родитель
Сommit
4f573116d8
1 измененных файлов с 43 добавлено и 8 удалено
  1. 43 8
      cfc-web/src/views/admin/OrderManage.vue

+ 43 - 8
cfc-web/src/views/admin/OrderManage.vue

@@ -157,16 +157,26 @@
         </template>
       </el-alert>
       <el-form :model="shipForm" label-width="90px">
-        <el-form-item label="物流公司">
+        <el-form-item label="物流公司" v-if="shipForm.shipType !== 'selfpickup'">
           <el-input v-model="shipForm.expressCompany" placeholder="如:顺丰、中通" />
         </el-form-item>
-        <el-form-item label="物流单号">
+        <el-form-item label="物流单号" v-if="shipForm.shipType !== 'selfpickup'">
           <el-input v-model="shipForm.trackingNumber" placeholder="请输入物流单号" />
         </el-form-item>
-        <el-form-item label="快递费(元)">
+        <el-form-item label="快递费(元)" v-if="shipForm.shipType !== 'selfpickup'">
           <el-input v-model.number="shipForm.shippingCost" type="number" placeholder="0" />
         </el-form-item>
+        <el-form-item label="发货方式">
+          <el-radio-group v-model="shipForm.shipType">
+            <el-radio label="express">快递发货</el-radio>
+            <el-radio label="selfpickup">用户自提</el-radio>
+            <el-radio label="local">同城配送</el-radio>
+          </el-radio-group>
+        </el-form-item>
       </el-form>
+      <el-alert v-if="shipTarget" title="提示" type="info" :closable="false" style="margin-top:8px">
+        默认根据配送方式自动选择;如选错可手动覆盖。用户自提无需填写物流信息。
+      </el-alert>
       <span slot="footer">
         <el-button @click="shipDialogVisible = false">取消</el-button>
         <el-button type="primary" @click="confirmShip" :loading="shipLoading">确认发货</el-button>
@@ -218,7 +228,7 @@ export default {
       shipDialogVisible: false,
       shipTarget: null,
       shipLoading: false,
-      shipForm: { expressCompany: '', trackingNumber: '', shippingCost: '' },
+      shipForm: { expressCompany: '', trackingNumber: '', shippingCost: '', shipType: 'express' },
       refundDialogVisible: false,
       refundTarget: null,
       refundLoading: false,
@@ -275,17 +285,42 @@ export default {
     },
     showShipDialog(row) {
       this.shipTarget = row
-      this.shipForm = { expressCompany: '', trackingNumber: '', shippingCost: '' }
+      this.shipForm = {
+        expressCompany: '',
+        trackingNumber: '',
+        shippingCost: '',
+        shipType: this.defaultShipType(row && row.deliveryMethod)
+      }
       this.shipDialogVisible = true
     },
+    // 发货方式默认值:1快递 / 2自提 / 4线上服务 / 6同城 / 3、5及NULL 订单层面无法判定 → 默认快递,可手动覆盖
+    defaultShipType(deliveryMethod) {
+      var dm = deliveryMethod === null || deliveryMethod === undefined ? null : Number(deliveryMethod)
+      if (dm === 2 || dm === 4) return 'selfpickup'
+      if (dm === 6) return 'local'
+      return 'express'
+    },
     async confirmShip() {
-      if (!this.shipForm.trackingNumber.trim()) {
+      var isSelfPickup = this.shipForm.shipType === 'selfpickup'
+      if (!isSelfPickup && !this.shipForm.trackingNumber.trim()) {
         return this.$message.warning('请填写物流单号')
       }
+      if (!isSelfPickup && !this.shipForm.expressCompany.trim()) {
+        return this.$message.warning('请填写物流公司')
+      }
       this.shipLoading = true
       try {
         const shippingCost = this.shipForm.shippingCost ? Math.round(parseFloat(this.shipForm.shippingCost) * 100) : null
-        await shipOrder(this.shipTarget.orderNo, this.shipForm.trackingNumber, this.shipForm.expressCompany, { shippingCost })
+        // 自提订单后端要求不带物流信息(否则报"自提订单无需填写物流信息"),故显式传空
+        await shipOrder(
+          this.shipTarget.orderNo,
+          isSelfPickup ? '' : this.shipForm.trackingNumber,
+          isSelfPickup ? '' : this.shipForm.expressCompany,
+          {
+            shippingCost: isSelfPickup ? null : shippingCost,
+            shipType: this.shipForm.shipType
+          }
+        )
         this.$message.success('发货成功')
         this.shipDialogVisible = false
         this.loadList()
@@ -406,7 +441,7 @@ export default {
       return total - disc - pts;
     },
     deliveryMethodLabel(method) {
-      var map = { 1: '快递配送', 2: '到店自提', 3: '快递/自提', 4: '线上服务', 5: '线上预约' }
+      var map = { 1: '快递配送', 2: '到店自提', 3: '快递/自提', 4: '线上服务', 5: '线上预约', 6: '同城配送' }
       return map[method] || '快递'
     },
     getJsonField(snapshot, field) {