Dialog.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="visible"
  5. width="840px"
  6. @close="handleClose">
  7. <el-form
  8. inline
  9. :model="form"
  10. ref="form"
  11. class="form-wrap"
  12. label-width="160px">
  13. <div class="dialog-info">
  14. <el-form-item
  15. style="width:100%"
  16. verify
  17. label="场次名称"
  18. prop="name">
  19. <el-input v-model="form.name"></el-input>
  20. </el-form-item>
  21. <el-form-item
  22. verify
  23. style="width:100%"
  24. label="循环策略"
  25. prop="strategy">
  26. <el-select
  27. v-model="form.strategy"
  28. @change="form.strategyContent=[]">
  29. <el-option label="日常" value="basic"></el-option>
  30. <el-option label="周期性" value="week"></el-option>
  31. <el-option label="日期段" value="date"></el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item
  35. :verify="verifyPeriod"
  36. label="策略内容"
  37. style="width:100%"
  38. v-if="form.strategy !== 'basic'"
  39. prop="strategyContent">
  40. <template v-if="form.strategy==='week'">
  41. <el-checkbox-group v-model="form.strategyContent">
  42. <el-checkbox
  43. v-for="(i,index) in weekdayMap"
  44. :key="index + 1"
  45. :label="index + 1">
  46. {{ i }}
  47. </el-checkbox>
  48. </el-checkbox-group>
  49. </template>
  50. <template v-else>
  51. <div
  52. v-for="(item,index) in form.strategyContent"
  53. :key="index"
  54. class="periodItem"
  55. >
  56. <el-date-picker
  57. style="width:414px; margin-right:10px"
  58. v-model="form.strategyContent[index]"
  59. type="daterange"
  60. range-separator="至"
  61. start-placeholder="开始日期"
  62. end-placeholder="结束日期">
  63. </el-date-picker>
  64. <el-tooltip
  65. content="删除"
  66. placement="top"
  67. effect="dark">
  68. <el-button
  69. @click="form.strategyContent.splice(index, 1)"
  70. type="danger"
  71. icon="el-icon-minus"
  72. size="mini"
  73. circle
  74. ></el-button>
  75. </el-tooltip>
  76. </div>
  77. <el-button
  78. type="primary"
  79. @click="handleAddPeriod">
  80. 新增时间段
  81. </el-button>
  82. </template>
  83. </el-form-item>
  84. <el-form-item
  85. verify
  86. label="开始时间"
  87. prop="startTime">
  88. <el-time-picker
  89. v-model="form.startTime"
  90. placeholder="开始时间">
  91. </el-time-picker>
  92. </el-form-item>
  93. <el-form-item
  94. verify
  95. label="结束时间"
  96. prop="endTime">
  97. <el-time-picker
  98. v-model="form.endTime"
  99. placeholder="结束时间">
  100. </el-time-picker>
  101. </el-form-item>
  102. <el-form-item
  103. verify
  104. label="开场后停售(分钟)"
  105. prop="saleStopMinutes">
  106. <el-input-number
  107. v-model="form.saleStopMinutes"
  108. :min="-1"
  109. placeholder="-1为不限制">
  110. </el-input-number>
  111. </el-form-item>
  112. <el-form-item
  113. verify
  114. label="开场前停止退票(分钟)"
  115. prop="cancelStopBeforeStartMinutes">
  116. <el-input-number
  117. v-model="form.cancelStopBeforeStartMinutes"
  118. :min="-1"
  119. placeholder="-1为不限制">
  120. </el-input-number>
  121. </el-form-item>
  122. <el-form-item
  123. verify
  124. label="开场后停止退票(分钟)"
  125. prop="cancelStopAfterStartMinutes">
  126. <el-input-number
  127. v-model="form.cancelStopAfterStartMinutes"
  128. :min="-1"
  129. placeholder="-1为不限制">
  130. </el-input-number>
  131. </el-form-item>
  132. <el-form-item
  133. verify
  134. label="开场前允许检票(分钟)"
  135. prop="preCheckMinutes">
  136. <el-input-number
  137. v-model="form.preCheckMinutes"
  138. :min="-1"
  139. placeholder="-1为不限制">
  140. </el-input-number>
  141. </el-form-item>
  142. <el-form-item
  143. verify
  144. label="开场后停止检票(分钟)"
  145. prop="stopCheckMinutes">
  146. <el-input-number
  147. v-model="form.stopCheckMinutes"
  148. :min="-1"
  149. placeholder="-1为不限制">
  150. </el-input-number>
  151. </el-form-item>
  152. <el-form-item
  153. verify
  154. label="最大销售数量"
  155. prop="maxSaleNums"
  156. style="width:100%">
  157. <el-input-number
  158. v-model="form.maxSaleNums"
  159. :min="-1"
  160. placeholder="-1为不限制">
  161. </el-input-number>
  162. </el-form-item>
  163. <el-form-item
  164. :verify="verifyTicket"
  165. label="绑定票种"
  166. prop="ticketTypeIds"
  167. style="width:100%">
  168. <el-select
  169. v-model="form.ticketTypeIds"
  170. filterable
  171. multiple
  172. placeholder="请选择">
  173. <el-option
  174. v-for="ticketType in ticketTypeList"
  175. :key="ticketType.id"
  176. :label="ticketType.name"
  177. :value="ticketType.id">
  178. </el-option>
  179. </el-select>
  180. </el-form-item>
  181. </div>
  182. </el-form>
  183. <div slot="footer">
  184. <el-button @click="handleClose">
  185. 取 消
  186. </el-button>
  187. <el-button
  188. type="primary"
  189. :loading="loading"
  190. @click="handleSubmit">
  191. 确 定
  192. </el-button>
  193. </div>
  194. </el-dialog>
  195. </template>
  196. <script>
  197. import { updateBatchConfig, saveBatchConfig } from '@/api/batch'
  198. import { strategyMap, weekdayMap } from '@/assets/staticData'
  199. import moment from 'moment'
  200. const defaultForm = {
  201. name: '',
  202. strategy: 'basic',
  203. strategyContent: [],
  204. startTime: new Date(2020, 1, 1, 0, 0, 0),
  205. endTime: new Date(2020, 1, 1, 0, 0, 0),
  206. saleStopMinutes: -1,
  207. cancelStopBeforeStartMinutes: -1,
  208. cancelStopAfterStartMinutes: -1,
  209. preCheckMinutes: -1,
  210. stopCheckMinutes: -1,
  211. maxSaleNums: -1,
  212. ticketTypeIds: []
  213. }
  214. export default {
  215. computed: {
  216. ticketTypeList () {
  217. return this.$store.state.app.ticketTypeList
  218. }
  219. },
  220. data () {
  221. return {
  222. title: '',
  223. visible: false,
  224. strategyMap,
  225. weekdayMap,
  226. loading: false,
  227. form: {
  228. ...defaultForm
  229. }
  230. }
  231. },
  232. methods: {
  233. show (data, type) {
  234. // 获取所有票种列表
  235. this.$store.dispatch('getTicketTypeList')
  236. this.type = type
  237. this.title = type === 'edit' ? '编辑场次' : '新增场次'
  238. this.visible = true
  239. this.$nextTick(() => {
  240. this.reset()
  241. if (type === 'edit' && data) {
  242. this.form = Object.assign({}, this.form, JSON.parse(JSON.stringify(data)))
  243. this.form.startTime = new Date('2020-1-1 ' + data.startTime)
  244. this.form.endTime = new Date('2020-1-1 ' + data.endTime)
  245. this.form.ticketTypeIds = data.ticketTypes?.map(ticket => ticket.id) || []
  246. if (this.form.strategy === 'date') {
  247. this.form.strategyContent = this.formatPeriodToArray(data.strategyContent)
  248. }
  249. if (this.form.strategy === 'week') {
  250. this.form.strategyContent = JSON.parse(data.strategyContent)
  251. }
  252. } else {
  253. this.form = JSON.parse(JSON.stringify(defaultForm))
  254. }
  255. })
  256. },
  257. reset () {
  258. this.$refs.form.resetFields()
  259. },
  260. handleClose () {
  261. this.visible = false
  262. },
  263. handleAddPeriod () {
  264. this.form.strategyContent.push([new Date(), new Date()])
  265. },
  266. formatPeriodToArray (arr) {
  267. try {
  268. const periods = JSON.parse(arr)
  269. return periods.map(i => {
  270. return [i.start, i.end]
  271. })
  272. } catch (e) {
  273. return []
  274. }
  275. },
  276. formatPeriodToObject (arr) {
  277. return arr.map(i => {
  278. return {
  279. start: moment(i[0]).format('YYYY-MM-DD'),
  280. end: moment(i[1]).format('YYYY-MM-DD')
  281. }
  282. })
  283. },
  284. verifyPeriod (rule, val, callback) {
  285. if (this.form.strategy === 'date') {
  286. if (val.length > 0) {
  287. if (val.some(i => i === null)) {
  288. callback(Error('内容不能为空'))
  289. } else {
  290. callback()
  291. }
  292. } else {
  293. callback(Error('请添加时间段'))
  294. }
  295. }
  296. if (this.form.strategy === 'week') {
  297. if (val.length > 0) {
  298. callback()
  299. } else {
  300. callback(Error('请选择星期'))
  301. }
  302. }
  303. },
  304. verifyTicket (rule, val, callback) {
  305. if (val.length > 0) {
  306. if (val.some(i => i.ticketTypeId === '')) {
  307. callback(Error('请选择票种'))
  308. } else {
  309. callback()
  310. }
  311. } else {
  312. callback(Error('请添加票种'))
  313. }
  314. },
  315. handleSubmit () {
  316. console.log(this.form)
  317. this.$refs.form.validate(valid => {
  318. if (valid) {
  319. let params = JSON.parse(JSON.stringify(this.form))
  320. params.startTime = moment(params.startTime).format('HH:mm:ss')
  321. params.endTime = moment(params.endTime).format('HH:mm:ss')
  322. if (params.strategy === 'date') {
  323. params.strategyContent = this.formatPeriodToObject(params.strategyContent)
  324. }
  325. // 按星期排序
  326. if (params.strategy === 'week') {
  327. params.strategyContent.sort()
  328. }
  329. if (params.strategy === 'basic') {
  330. params.strategyContent = ''
  331. } else {
  332. params.strategyContent = JSON.stringify(params.strategyContent)
  333. }
  334. this.loading = true
  335. if (this.type === 'edit') {
  336. updateBatchConfig(params).then(res => {
  337. this.$message.success('更新成功')
  338. this.$emit('update-list')
  339. this.handleClose()
  340. }).finally(() => {
  341. this.loading = false
  342. })
  343. } else {
  344. saveBatchConfig(params).then(res => {
  345. this.$message.success('添加成功')
  346. this.$emit('update-list')
  347. this.handleClose()
  348. }).finally(() => {
  349. this.loading = false
  350. })
  351. }
  352. }
  353. })
  354. }
  355. }
  356. }
  357. </script>
  358. <style lang="scss" scoped>
  359. .periodItem {
  360. display: flex; margin: 0 10px 10px 0; align-items: center;
  361. }
  362. .form-wrap {
  363. .priceInput {
  364. margin: 0 10px;
  365. .el-input-number{
  366. width: 160px;
  367. }
  368. ::v-deep .el-input {
  369. width: 100%;
  370. }
  371. }
  372. }
  373. </style>