Selaa lähdekoodia

feat(selfManage): 新增票种弹框线下票种/大类改接口数据源并补充默认值

线下票种下拉与产品中心-产品管理对齐: 同接口同参数(pageSize:-1)拉全量, value/label 改用 ticketTypeId/name; 票种大类改由接口返回的 category 去重生成, 选线下票种后自动带出; 新增默认值: 名称/底价/划线价留空, 在售=1, 可售日期默认10年, 渠道默认全选, 景点改必填, 有效期=1, 单次最多张数9999, 最少/最多提前天数9/365
LaveyD 5 päivää sitten
vanhempi
commit
cfaa105422
1 muutettua tiedostoa jossa 66 lisäystä ja 24 poistoa
  1. 66 24
      src/views/selfManage/ticketType/FormDialog.vue

+ 66 - 24
src/views/selfManage/ticketType/FormDialog.vue

@@ -24,10 +24,10 @@
         >
           <el-option
             v-for="item in offlineList"
-            :key="item.id"
-            :label="item.name + '(id: ' + item.id + ')'"
-            :value="item.id"
-            :disabled="isOfflineUsed(item.id)"
+            :key="item.ticketTypeId"
+            :label="item.name"
+            :value="item.ticketTypeId"
+            :disabled="isOfflineUsed(item.ticketTypeId)"
           ></el-option>
         </el-select>
       </el-form-item>
@@ -42,10 +42,10 @@
           placeholder="选择大类(创建后不可改)"
           @change="onCategoryChange">
           <el-option
-            v-for="(label, value) in SELF_TICKET_CATEGORY"
-            :key="value"
-            :label="label"
-            :value="value"></el-option>
+            v-for="item in categoryOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"></el-option>
         </el-select>
       </el-form-item>
 
@@ -187,7 +187,11 @@
         </el-checkbox-group>
         <div class="form-tip">要给分销商售卖必须勾选「自营分销商」</div>
       </el-form-item>
-      <el-form-item label="绑定景点">
+      <el-form-item
+        verify
+        class="is-required"
+        prop="scenicIds"
+        label="绑定景点">
         <el-select
           v-model="form.scenicIds"
           multiple
@@ -323,7 +327,7 @@
         <el-input-number
           v-model="form.saleMaxNums"
           :min="0"
-          :max="999"
+          :max="9999"
           controls-position="right"
           style="width: 160px"></el-input-number>
       </el-form-item>
@@ -417,6 +421,7 @@ export default {
         ticketTypeId: [{ required: true, message: '请选择线下票种', trigger: 'change' }],
         category: [{ required: true, message: '请选择票种大类', trigger: 'change' }],
         name: [{ required: true, message: '请输入票种名称', trigger: 'blur' }],
+        scenicIds: [{ required: true, type: 'array', min: 1, message: '请至少绑定一个景点', trigger: 'change' }],
         price: [{
           required: true,
           validator: (rule, value, callback) => {
@@ -436,7 +441,19 @@ export default {
   },
   computed: {
     selectedOffline () {
-      return this.offlineList.find(i => i.id === this.form.ticketTypeId)
+      return this.offlineList.find(i => i.ticketTypeId === this.form.ticketTypeId)
+    },
+    // 票种大类直接取接口返回的 category 去重(与产品中心-产品管理同一数据源)
+    categoryOptions () {
+      const seen = {}
+      const list = []
+      this.offlineList.forEach(i => {
+        if (i.category && !seen[i.category]) {
+          seen[i.category] = true
+          list.push({ value: i.category, label: SELF_TICKET_CATEGORY[i.category] || i.category })
+        }
+      })
+      return list
     },
     batchConfigs () {
       return (this.selectedOffline && this.selectedOffline.batchConfigList) || []
@@ -454,27 +471,28 @@ export default {
         ticketTypeId: '',
         category: '',
         name: '',
-        price: 0,
-        highPrice: null,
+        price: undefined,
+        highPrice: undefined,
         isSale: 1,
         realNameType: 0,
         saleDateStart: '',
         saleDateEnd: '',
         saleTimeStart: '00:00:00',
         saleTimeEnd: '23:59:59',
-        channels: [],
+        // 销售渠道默认全选
+        channels: Object.keys(SELF_CHANNELS),
         scenicIds: [],
         dayStock: 0,
         totalStock: 0,
         saleMinNums: 1,
-        saleMaxNums: 9,
-        saleMinPreDays: 0,
-        saleMaxPreDays: 0,
+        saleMaxNums: 9999,
+        saleMinPreDays: 9,
+        saleMaxPreDays: 365,
         isAllowCancel: 1,
         isAgreeProtocol: 0,
         buyProtocol: '',
         // 大类相关
-        useDays: 0,
+        useDays: 1,
         useDateType: 1,
         useDateStart: '',
         useDateEnd: '',
@@ -482,16 +500,26 @@ export default {
         memberActiveType: 1
       }
     },
-    isOfflineUsed (id) {
-      return this.existingSelf.some(i => i.ticketTypeId === id && i.id !== this.form.id)
+    isOfflineUsed (ticketTypeId) {
+      return this.existingSelf.some(i => i.ticketTypeId === ticketTypeId && i.id !== this.form.id)
     },
     onOfflineChange () {
+      // 大类直接取所选线下票种的 category(接口数据,文档要求两者一致)
+      const item = this.selectedOffline
+      if (item && item.category) {
+        const prev = this.form.category
+        this.form.category = item.category
+        // 大类真正变化时才重置大类专属字段;首次从空选中保留新增默认值
+        if (prev && prev !== item.category) {
+          this.onCategoryChange()
+        }
+      }
       // 场次列表由 batchConfigs computed 依据 selectedOffline 自动更新
     },
     onCategoryChange () {
       // 切换大类时重置大类专属字段
       const f = this.form
-      f.useDays = 0
+      f.useDays = 1
       f.useDateType = 1
       f.useDateStart = ''
       f.useDateEnd = ''
@@ -502,8 +530,8 @@ export default {
     show (row) {
       this.visible = true
       this.dialogType = row && row.id ? 'edit' : 'add'
-      // 加载线下票种 / 已创建自营票种 / 景点(并行)
-      getTicketTypeList({ pageNum: 1, pageSize: 500 }).then(res => {
+      // 加载线下票种 / 已创建自营票种 / 景点(与产品中心-产品管理同一接口同一参数拉全量)
+      getTicketTypeList({ pageNum: 1, pageSize: -1 }).then(res => {
         this.offlineList = (res.data && res.data.records) || []
       })
       getSelfTicketTypeList({ pageNum: 1, pageSize: 1000 }).then(res => {
@@ -537,7 +565,7 @@ export default {
         })
       } else {
         this.form = this.emptyForm()
-        this.saleDateRange = []
+        this.saleDateRange = this.defaultSaleDateRange()
         this.saleTimeRange = ['00:00:00', '23:59:59']
         this.useDateRange = []
         this.$nextTick(() => {
@@ -545,6 +573,16 @@ export default {
         })
       }
     },
+    defaultSaleDateRange () {
+      const fmt = d => {
+        const p = n => (n < 10 ? '0' + n : '' + n)
+        return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate())
+      }
+      const start = new Date()
+      const end = new Date(start)
+      end.setFullYear(end.getFullYear() + 10)
+      return [fmt(start), fmt(end)]
+    },
     syncDateRange () {
       if (this.saleDateRange && this.saleDateRange.length === 2) {
         this.form.saleDateStart = this.saleDateRange[0]
@@ -595,6 +633,10 @@ export default {
         if (!f.isAgreeProtocol) {
           f.buyProtocol = ''
         }
+        // 划线价须大于底价才有意义,否则不传
+        if (!f.highPrice || f.highPrice <= f.price) {
+          delete f.highPrice
+        }
         if (!f.scenicIds) f.scenicIds = []
         if (!f.channels) f.channels = []
         this.submitting = true