|
@@ -24,10 +24,10 @@
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
v-for="item in offlineList"
|
|
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-option>
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -42,10 +42,10 @@
|
|
|
placeholder="选择大类(创建后不可改)"
|
|
placeholder="选择大类(创建后不可改)"
|
|
|
@change="onCategoryChange">
|
|
@change="onCategoryChange">
|
|
|
<el-option
|
|
<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-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
|
|
@@ -187,7 +187,11 @@
|
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
|
<div class="form-tip">要给分销商售卖必须勾选「自营分销商」</div>
|
|
<div class="form-tip">要给分销商售卖必须勾选「自营分销商」</div>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="绑定景点">
|
|
|
|
|
|
|
+ <el-form-item
|
|
|
|
|
+ verify
|
|
|
|
|
+ class="is-required"
|
|
|
|
|
+ prop="scenicIds"
|
|
|
|
|
+ label="绑定景点">
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.scenicIds"
|
|
v-model="form.scenicIds"
|
|
|
multiple
|
|
multiple
|
|
@@ -323,7 +327,7 @@
|
|
|
<el-input-number
|
|
<el-input-number
|
|
|
v-model="form.saleMaxNums"
|
|
v-model="form.saleMaxNums"
|
|
|
:min="0"
|
|
:min="0"
|
|
|
- :max="999"
|
|
|
|
|
|
|
+ :max="9999"
|
|
|
controls-position="right"
|
|
controls-position="right"
|
|
|
style="width: 160px"></el-input-number>
|
|
style="width: 160px"></el-input-number>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -417,6 +421,7 @@ export default {
|
|
|
ticketTypeId: [{ required: true, message: '请选择线下票种', trigger: 'change' }],
|
|
ticketTypeId: [{ required: true, message: '请选择线下票种', trigger: 'change' }],
|
|
|
category: [{ required: true, message: '请选择票种大类', trigger: 'change' }],
|
|
category: [{ required: true, message: '请选择票种大类', trigger: 'change' }],
|
|
|
name: [{ required: true, message: '请输入票种名称', trigger: 'blur' }],
|
|
name: [{ required: true, message: '请输入票种名称', trigger: 'blur' }],
|
|
|
|
|
+ scenicIds: [{ required: true, type: 'array', min: 1, message: '请至少绑定一个景点', trigger: 'change' }],
|
|
|
price: [{
|
|
price: [{
|
|
|
required: true,
|
|
required: true,
|
|
|
validator: (rule, value, callback) => {
|
|
validator: (rule, value, callback) => {
|
|
@@ -436,7 +441,19 @@ export default {
|
|
|
},
|
|
},
|
|
|
computed: {
|
|
computed: {
|
|
|
selectedOffline () {
|
|
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 () {
|
|
batchConfigs () {
|
|
|
return (this.selectedOffline && this.selectedOffline.batchConfigList) || []
|
|
return (this.selectedOffline && this.selectedOffline.batchConfigList) || []
|
|
@@ -454,27 +471,28 @@ export default {
|
|
|
ticketTypeId: '',
|
|
ticketTypeId: '',
|
|
|
category: '',
|
|
category: '',
|
|
|
name: '',
|
|
name: '',
|
|
|
- price: 0,
|
|
|
|
|
- highPrice: null,
|
|
|
|
|
|
|
+ price: undefined,
|
|
|
|
|
+ highPrice: undefined,
|
|
|
isSale: 1,
|
|
isSale: 1,
|
|
|
realNameType: 0,
|
|
realNameType: 0,
|
|
|
saleDateStart: '',
|
|
saleDateStart: '',
|
|
|
saleDateEnd: '',
|
|
saleDateEnd: '',
|
|
|
saleTimeStart: '00:00:00',
|
|
saleTimeStart: '00:00:00',
|
|
|
saleTimeEnd: '23:59:59',
|
|
saleTimeEnd: '23:59:59',
|
|
|
- channels: [],
|
|
|
|
|
|
|
+ // 销售渠道默认全选
|
|
|
|
|
+ channels: Object.keys(SELF_CHANNELS),
|
|
|
scenicIds: [],
|
|
scenicIds: [],
|
|
|
dayStock: 0,
|
|
dayStock: 0,
|
|
|
totalStock: 0,
|
|
totalStock: 0,
|
|
|
saleMinNums: 1,
|
|
saleMinNums: 1,
|
|
|
- saleMaxNums: 9,
|
|
|
|
|
- saleMinPreDays: 0,
|
|
|
|
|
- saleMaxPreDays: 0,
|
|
|
|
|
|
|
+ saleMaxNums: 9999,
|
|
|
|
|
+ saleMinPreDays: 9,
|
|
|
|
|
+ saleMaxPreDays: 365,
|
|
|
isAllowCancel: 1,
|
|
isAllowCancel: 1,
|
|
|
isAgreeProtocol: 0,
|
|
isAgreeProtocol: 0,
|
|
|
buyProtocol: '',
|
|
buyProtocol: '',
|
|
|
// 大类相关
|
|
// 大类相关
|
|
|
- useDays: 0,
|
|
|
|
|
|
|
+ useDays: 1,
|
|
|
useDateType: 1,
|
|
useDateType: 1,
|
|
|
useDateStart: '',
|
|
useDateStart: '',
|
|
|
useDateEnd: '',
|
|
useDateEnd: '',
|
|
@@ -482,16 +500,26 @@ export default {
|
|
|
memberActiveType: 1
|
|
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 () {
|
|
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 自动更新
|
|
// 场次列表由 batchConfigs computed 依据 selectedOffline 自动更新
|
|
|
},
|
|
},
|
|
|
onCategoryChange () {
|
|
onCategoryChange () {
|
|
|
// 切换大类时重置大类专属字段
|
|
// 切换大类时重置大类专属字段
|
|
|
const f = this.form
|
|
const f = this.form
|
|
|
- f.useDays = 0
|
|
|
|
|
|
|
+ f.useDays = 1
|
|
|
f.useDateType = 1
|
|
f.useDateType = 1
|
|
|
f.useDateStart = ''
|
|
f.useDateStart = ''
|
|
|
f.useDateEnd = ''
|
|
f.useDateEnd = ''
|
|
@@ -502,8 +530,8 @@ export default {
|
|
|
show (row) {
|
|
show (row) {
|
|
|
this.visible = true
|
|
this.visible = true
|
|
|
this.dialogType = row && row.id ? 'edit' : 'add'
|
|
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) || []
|
|
this.offlineList = (res.data && res.data.records) || []
|
|
|
})
|
|
})
|
|
|
getSelfTicketTypeList({ pageNum: 1, pageSize: 1000 }).then(res => {
|
|
getSelfTicketTypeList({ pageNum: 1, pageSize: 1000 }).then(res => {
|
|
@@ -537,7 +565,7 @@ export default {
|
|
|
})
|
|
})
|
|
|
} else {
|
|
} else {
|
|
|
this.form = this.emptyForm()
|
|
this.form = this.emptyForm()
|
|
|
- this.saleDateRange = []
|
|
|
|
|
|
|
+ this.saleDateRange = this.defaultSaleDateRange()
|
|
|
this.saleTimeRange = ['00:00:00', '23:59:59']
|
|
this.saleTimeRange = ['00:00:00', '23:59:59']
|
|
|
this.useDateRange = []
|
|
this.useDateRange = []
|
|
|
this.$nextTick(() => {
|
|
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 () {
|
|
syncDateRange () {
|
|
|
if (this.saleDateRange && this.saleDateRange.length === 2) {
|
|
if (this.saleDateRange && this.saleDateRange.length === 2) {
|
|
|
this.form.saleDateStart = this.saleDateRange[0]
|
|
this.form.saleDateStart = this.saleDateRange[0]
|
|
@@ -595,6 +633,10 @@ export default {
|
|
|
if (!f.isAgreeProtocol) {
|
|
if (!f.isAgreeProtocol) {
|
|
|
f.buyProtocol = ''
|
|
f.buyProtocol = ''
|
|
|
}
|
|
}
|
|
|
|
|
+ // 划线价须大于底价才有意义,否则不传
|
|
|
|
|
+ if (!f.highPrice || f.highPrice <= f.price) {
|
|
|
|
|
+ delete f.highPrice
|
|
|
|
|
+ }
|
|
|
if (!f.scenicIds) f.scenicIds = []
|
|
if (!f.scenicIds) f.scenicIds = []
|
|
|
if (!f.channels) f.channels = []
|
|
if (!f.channels) f.channels = []
|
|
|
this.submitting = true
|
|
this.submitting = true
|