addAndEdit.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. <!--
  2. * @Description: 新增/编辑弹框
  3. * @Author: Sugar.
  4. * @Date: 2023-11-24 13:55:00
  5. * @LastEditors: Sugar.
  6. * @LastEditTime: 2023-11-24 13:55:00
  7. * @FilePath: \cattle_webui\src\views\venue\schedulingMr\dialog\AddOrEditDialog.vue
  8. * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
  9. -->
  10. <template>
  11. <el-dialog
  12. :title="title"
  13. :visible.sync="open"
  14. width="70%"
  15. class="text-dia-log-class"
  16. append-to-body
  17. :close-on-click-modal="false"
  18. @close="cancel"
  19. >
  20. <div class="dialog">
  21. <el-form :model="form" ref="form" :rules="rules" label-width="120px">
  22. <el-form-item label="日期范围:" prop="performDate">
  23. <el-date-picker
  24. v-model="form.performDate"
  25. type="daterange"
  26. range-separator="至"
  27. value-format="yyyy-MM-dd"
  28. start-placeholder="开始日期"
  29. end-placeholder="结束日期">
  30. </el-date-picker>
  31. </el-form-item>
  32. <el-form-item label="星期:" prop="weekType">
  33. <div>
  34. <el-button
  35. @click="selectWeekType()"
  36. :type="form.weekType == 1 ?'':'primary'">不限</el-button>
  37. <el-button
  38. v-for="(item,index) in weekDayList"
  39. :key="index"
  40. @click="selectWeekDay(item)"
  41. :type="form.weekDay.includes(item.key)?'primary':''">{{ item.name }}</el-button>
  42. </div>
  43. <div style="font-size: 12px;">指定在选定区间内的周几价格进行调整,列如区间选择2018-01-01至2018-01-20,星期选择星期一,则这个区间内的星期一价格都进行调整</div>
  44. </el-form-item>
  45. <el-form-item label="选择演出厅:" prop="auditoriumId">
  46. <el-select
  47. v-model="form.auditoriumId"
  48. placeholder="选择演出厅"
  49. clearable
  50. style="width: 100%"
  51. @change="(value) =>getInventoryTemplate(value)"
  52. >
  53. <el-option
  54. v-for="dict in merchantList"
  55. :key="dict.id"
  56. :label="dict.name"
  57. :value="dict.id"
  58. />
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="选择剧目:" prop="performId">
  62. <el-select
  63. v-model="form.performId"
  64. placeholder="选择剧目"
  65. clearable
  66. @change="changePerform"
  67. style="width: 100%"
  68. >
  69. <el-option
  70. v-for="dict in goodsList"
  71. :key="dict.id"
  72. :label="dict.name"
  73. :value="dict.id"
  74. />
  75. </el-select>
  76. </el-form-item>
  77. <el-form-item label="票务绑定:" prop="goodsIds">
  78. <el-select
  79. v-model="form.goodsIds"
  80. placeholder="票务绑定"
  81. clearable
  82. multiple
  83. style="width: 100%"
  84. >
  85. <el-option
  86. v-for="dict in goodsPageListS"
  87. :key="dict.id"
  88. :value="dict.id"
  89. :label="dict.status == 1 ? dict.goodsName + '(被禁用)': dict.goodsName"
  90. :disabled="dict.status != 0"
  91. >
  92. </el-option>
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item label="场次排期:" prop="planSessionList" v-if="!editType">
  96. <el-button type="primary" size="small" @click="addTable">添加</el-button>
  97. </el-form-item>
  98. <el-form-item label="" v-if="form.planSessionList && form.planSessionList.length > 0">
  99. <el-table ref="tables" v-loading="loading" :data="form.planSessionList" border>
  100. <el-table-column label="序号" align="center" type="index" width="50"></el-table-column>
  101. <el-table-column label="场次名称" align="center">
  102. <template slot-scope="scope">
  103. <el-input v-model="scope.row.name" placeholder="请输入内容"></el-input>
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="开始时间" align="center">
  107. <template slot-scope="scope">
  108. <el-time-picker
  109. v-model="scope.row.startInterval"
  110. style="width: 100%"
  111. value-format="HH:mm"
  112. format="HH:mm"
  113. @change="changValue(scope.row, 'start', scope.$index)"
  114. :picker-options="{ selectableRange: '00:00:00 - 23:59:59'}"
  115. placeholder="选择时间">
  116. </el-time-picker>
  117. </template>
  118. </el-table-column>
  119. <el-table-column label="结束时间" align="center">
  120. <template slot-scope="scope">
  121. <el-time-picker
  122. v-model="scope.row.endInterval"
  123. style="width: 100%"
  124. value-format="HH:mm"
  125. format="HH:mm"
  126. @change="changValue(scope.row, 'end', scope.$index)"
  127. :picker-options="{ selectableRange: '00:00:00 - 23:59:59'}"
  128. placeholder="选择时间">
  129. </el-time-picker>
  130. </template>
  131. </el-table-column>
  132. <el-table-column label="库存模板">
  133. <template slot-scope="scope">
  134. <el-select
  135. v-model="scope.row.stockTmpId"
  136. placeholder="选择库存模板"
  137. clearable
  138. style="width: 100%"
  139. >
  140. <el-option
  141. v-for="dict in inventoryTemplateList"
  142. :key="dict.id"
  143. :label="dict.name"
  144. :value="dict.id"
  145. :disabled="dict.status != 1"
  146. />
  147. </el-select>
  148. </template>
  149. </el-table-column>
  150. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  151. <template slot-scope="scope">
  152. <el-button
  153. size="mini"
  154. type="text"
  155. @click="handleDelete(scope.row,scope.$index)"
  156. >删除</el-button>
  157. </template>
  158. </el-table-column>
  159. </el-table>
  160. </el-form-item>
  161. </el-form>
  162. </div>
  163. <span slot="footer" class="dialog-footer">
  164. <el-button @click="cancel">取消</el-button>
  165. <el-button
  166. type="primary"
  167. @click="submitForm"
  168. v-loading.fullscreen.lock="loading"
  169. element-loading-text="提交中..."
  170. element-loading-spinner="el-icon-loading"
  171. element-loading-background="rgba(0, 0, 0, 0.8)"
  172. >
  173. <span v-if="loading">提交中...</span>
  174. <span v-else>保存</span>
  175. </el-button>
  176. </span>
  177. </el-dialog>
  178. </template>
  179. <script>
  180. import { saveAndEdit, goodsPageList as goodsPageListApi, } from "@/api/ticketMr/schedulingConfiguration";
  181. import { goodsPageList } from '@/api/programmeMr/programmeMr'
  182. import { merchantPageList } from '@/api/performanceHallMr/performanceHallMr'
  183. import { pageList as getInventoryTemplateApi } from '@/api/ticketMr/InventoryTemplate'
  184. import { getToken } from "@/utils/auth";
  185. import moment from "moment"
  186. export default {
  187. name: "addAndEdit",
  188. data() {
  189. return {
  190. title: "编辑",
  191. model: "EDIT",
  192. open: false,
  193. loading: false,
  194. tableType: false,
  195. form: {
  196. id: undefined,
  197. planSessionList: [],
  198. insertType: '1',
  199. useStock: 0,
  200. weekDay: [],
  201. weekType: 0
  202. },
  203. rules: {
  204. auditoriumId: [{ required: true, message: "请选择演出厅", trigger: ["change","blur"] }],
  205. performId: [{ required: true, message: "请选择剧目", trigger: ["change","blur"] }],
  206. performDate: [{ required: true, message: "请选择日期", trigger: ["change","blur"] }],
  207. planSessionList: [{ required: true, message: "请添加场次", trigger: ["change","blur"] }],
  208. goodsIds: [{ required: true, message: "请选择票务", trigger: ["change","blur"] }],
  209. weekType: [{ required: true, message: "请选择星期", trigger: ["change","blur"] }],
  210. },
  211. uploadObj: {
  212. url: process.env.VUE_APP_UPLOAD_FILE_API + "/upload/single/minio",
  213. Headers: { Authorization: "Bearer " + getToken() },
  214. },
  215. theatreList: [],
  216. goodsList: [],
  217. merchantList: [],
  218. editType: false,
  219. selectPerform: {},
  220. goodsPageListS: [], // 票务
  221. weekDayList: [
  222. {name: "星期一",key: "1"},
  223. {name: "星期二",key: "2"},
  224. {name: "星期三",key: "3"},
  225. {name: "星期四",key: "4"},
  226. {name: "星期五",key: "5"},
  227. {name: "星期六",key: "6"},
  228. {name: "星期天",key: "7"},
  229. ],
  230. inventoryTemplateList: []
  231. };
  232. },
  233. created() {
  234. /** 获取票务 */
  235. this.goodsPageList(); // 剧目列表
  236. this.merchantPageList('') // 演出厅
  237. //this.getInventoryTemplate()
  238. },
  239. methods: {
  240. /**
  241. * 打开弹框
  242. * @date 2023-11-22
  243. * @param {any} obj
  244. * @returns {any}
  245. */
  246. async openDialog(title, obj, type) {
  247. this.open = true;
  248. this.editType = false;
  249. if (obj){
  250. this.title = "编辑排期";
  251. if(obj.performId) {
  252. await this.goodsPageListFun(obj.performId);
  253. }
  254. await this.getInventoryTemplate(obj.auditoriumId)
  255. this.form = {
  256. ...obj,
  257. performDate: [obj.dateStart,obj.dateEnd],
  258. goodsIds: obj.goodsIds ? obj.goodsIds.split(','):[],
  259. weekDay: obj.weekDay ? obj.weekDay.split(','):[],
  260. planSessionList: obj.planSessionList ? obj.planSessionList:[],
  261. id: null
  262. }
  263. console.log("form====",this.form)
  264. }else{
  265. this.title = "新增排期";
  266. this.form = {
  267. planSessionList: [],
  268. weekDay: [],
  269. weekType: 0
  270. };
  271. }
  272. this.$nextTick(() => {
  273. this.$refs["form"].clearValidate();
  274. });
  275. },
  276. /** 剧目选择 */
  277. changePerform(id) {
  278. this.goodsList.forEach(item => {
  279. if(id == item.id){
  280. this.selectPerform = item;
  281. }
  282. })
  283. this.goodsPageListS = []
  284. if(id) {
  285. this.goodsPageListFun(id);
  286. }
  287. //this.$set(this.form, 'performDate' , '')
  288. this.$set(this.form, 'goodsIds' , [])
  289. },
  290. // yyyy-mm-dd 转时时间戳
  291. dateToTimestamp(year, month, day) {
  292. const date = new Date(year, month - 1, day);
  293. return date.getTime();
  294. },
  295. // 时间选择
  296. performDateEven(key) {
  297. if(!this.form.performId){
  298. this.$message.error("请选择剧目!");
  299. this.$set(this.form, 'performDate', '');
  300. return false;
  301. }
  302. let newTime = ''
  303. if(key == 'list'){
  304. newTime = this.form.performDate[0]
  305. } else {
  306. newTime = this.form.performDate;
  307. }
  308. let newTimeArr = newTime.split('-');
  309. let letTiemArr = this.selectPerform.releaseDate.split('-');
  310. if(this.dateToTimestamp(newTimeArr[0], newTimeArr[1], newTimeArr[2]) < this.dateToTimestamp(letTiemArr[0], letTiemArr[1], letTiemArr[2])){
  311. this.$message.error("开始时间不能小于剧目上映时间" + this.selectPerform.releaseDate);
  312. this.$set(this.form, 'performDate' , '')
  313. return false
  314. }
  315. },
  316. /** 剧目列表查询 */
  317. goodsPageList() {
  318. goodsPageList(this.addDateRange({pageNum: 1, pageSize: 100, status: 1}))
  319. .then(response => {
  320. this.goodsList = response.data.rows;
  321. });
  322. },
  323. /** 演出厅列表查询 */
  324. merchantPageList(id) {
  325. merchantPageList(this.addDateRange({theatreId: id, pageNum: 1, pageSize: 100}))
  326. .then(response => {
  327. this.merchantList = response.data.rows;
  328. });
  329. },
  330. /** 票务信息 */
  331. async goodsPageListFun(value){
  332. try {
  333. let res = await goodsPageListApi({
  334. performId: value
  335. })
  336. if(res.code == 200){
  337. this.goodsPageListS = res.data
  338. }
  339. } catch (error) {
  340. }
  341. },
  342. /** 获取模板 */
  343. async getInventoryTemplate(value,type){
  344. try {
  345. if(this.form.planSessionList && this.form.planSessionList.length > 0 && type) {
  346. let list = JSON.parse(JSON.stringify(this.form.planSessionList))
  347. list.forEach((item,index)=>{
  348. list[index].stockTmpId = null
  349. })
  350. this.$set(this.form,'planSessionList',list)
  351. }
  352. if(!value) {
  353. this.inventoryTemplateList = []
  354. return
  355. }
  356. let res = await getInventoryTemplateApi({
  357. auditoriumId: value,
  358. pageNum: 1,
  359. pageSize: 1000,
  360. })
  361. if(res.code == 200){
  362. this.inventoryTemplateList = res.data.rows
  363. }
  364. } catch (error) {
  365. console.error("error===",error)
  366. }
  367. },
  368. /**
  369. * 保存
  370. * @date 2023-11-22
  371. * @returns {any}
  372. */
  373. submitForm() {
  374. this.$refs["form"].validate(async (valid) => {
  375. if (valid) {
  376. try {
  377. let postEdit = JSON.parse(JSON.stringify(this.form))
  378. postEdit['dateStart'] = moment(postEdit.performDate[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss')
  379. postEdit['dateEnd'] = moment(postEdit.performDate[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
  380. postEdit.goodsIds = postEdit.goodsIds.join(',')
  381. postEdit.weekDay = postEdit.weekDay.join(','),
  382. delete postEdit.performDate
  383. if(this.checkList(this.form.planSessionList)) {
  384. this.$message.error("请完善场次信息!");
  385. return
  386. }
  387. this.loading = true;
  388. const { code } = await saveAndEdit({ ...postEdit });
  389. if (code === 200) {
  390. this.$message.success("操作成功!");
  391. this.$emit("getList");
  392. this.cancel();
  393. }
  394. } catch (error) {
  395. console.error("error====",error)
  396. } finally {
  397. this.loading = false;
  398. }
  399. }
  400. });
  401. },
  402. checkList(list){
  403. let flog = false
  404. if(list&&list.length>0) {
  405. for (let index = 0; index < list.length; index++) {
  406. let list2 = ['name', 'startInterval', 'endInterval', 'stockTmpId']
  407. for (let i = 0; i < list2.length; i++) {
  408. if(list[index].hasOwnProperty(list2[i]) && !list[index][list2[i]]) {
  409. console.log(list[index].hasOwnProperty(list2[i]),list[index][list2[i]])
  410. flog = true
  411. break
  412. }
  413. }
  414. if(flog) {
  415. break
  416. }
  417. }
  418. }
  419. return flog
  420. },
  421. /**
  422. * 重置
  423. * @date 2023-11-22
  424. * @returns {any}
  425. */
  426. reset() {
  427. },
  428. /**
  429. * 关闭弹框
  430. * @date 2023-11-22
  431. * @returns {any}
  432. */
  433. cancel() {
  434. this.reset();
  435. this.open = false;
  436. },
  437. /** 点击添加排期 */
  438. addTable() {
  439. if(!this.form.performId){
  440. this.$message.error("请选择剧目!");
  441. return false;
  442. }
  443. let map = {
  444. name: '',
  445. startInterval: '',
  446. startM: '',
  447. endInterval: '',
  448. endM: '',
  449. err: false,
  450. }
  451. this.form.planSessionList.push(map)
  452. },
  453. /** 开始时间和结束时间大小判断 */
  454. changValue(row, key, $index) {
  455. let start = '', startTime = '', end = '', endTime;
  456. if(row.startInterval && row.startInterval.length > 0) {
  457. start = row.startInterval.split(":");
  458. startTime = (start[0] * 3600) + (start[1] * 60);
  459. row.startM = startTime;
  460. }
  461. if(row.endInterval && row.endInterval.length > 0) {
  462. // if(this.selectPerform)
  463. end = row.endInterval.split(":");
  464. endTime = (end[0] * 3600) + (end[1] * 60);
  465. let showDuration = this.selectPerform.showDuration * 60;
  466. if(endTime - row.startM < showDuration) {
  467. this.$message.error("选择时间不能小于剧目时长," + this.selectPerform.showDuration + "分钟!");
  468. row.endInterval = ""
  469. return false
  470. }
  471. row.endM = endTime;
  472. }
  473. // 判断场次时间段是否存在冲突
  474. let status = false;
  475. this.form.planSessionList.forEach((item, index) => {
  476. if($index != index) {
  477. if(key == 'start') {
  478. if(item.startM <= startTime && startTime <= item.endM) {
  479. status = true;
  480. }
  481. }
  482. if (key == 'end') {
  483. if(item.startM <= endTime && endTime <= item.endM) {
  484. status = true;
  485. }
  486. }
  487. }
  488. })
  489. if(status) {
  490. this.$message.error("该场次的时间和其它场次时间段冲突!");
  491. if(key == 'start') {
  492. row.startInterval = ""
  493. row.startM = ""
  494. } else if (key == 'end') {
  495. row.endInterval = ""
  496. row.endM = ""
  497. }
  498. return false;
  499. }
  500. if(key == 'start') {
  501. if(endTime && startTime >= endTime) {
  502. row.startTime = ""
  503. row.startM = ""
  504. }
  505. } else if (key == 'end') {
  506. if(startTime && startTime >= endTime) {
  507. row.endTime = ""
  508. row.endM = ""
  509. }
  510. }
  511. },
  512. /** 删除按钮操作 */
  513. handleDelete(row, index) {
  514. if(this.form.planSessionList && this.form.planSessionList.length == 1){
  515. this.$message.error("只剩一场次, 不能删除!");
  516. return false;
  517. }
  518. this.$confirm('是否确认删除数据场次名称为"' + row.name + '"的数据项?', '提示', {
  519. confirmButtonText: '确定',
  520. cancelButtonText: '取消',
  521. type: 'warning'
  522. }).then(() => {
  523. this.form.planSessionList.splice(index, 1)
  524. }).catch(() => {
  525. });
  526. },
  527. selectWeekDay(item){
  528. let index = -1
  529. this.form.weekDay.forEach((item1,index1)=>{
  530. if(item.key == item1) {
  531. index = index1
  532. }
  533. })
  534. if(index != -1) {
  535. this.form.weekDay.splice(index,1)
  536. }else {
  537. this.form.weekDay.push(item.key)
  538. }
  539. if(this.form.weekDay.length>0) {
  540. this.form.weekType = 1
  541. }else {
  542. this.form.weekType = 0
  543. }
  544. },
  545. selectWeekType() {
  546. this.form.weekType = this.form.weekType == 1 ? 0 : 1
  547. if(!this.form.weekType) {
  548. this.form.weekDay = []
  549. }
  550. }
  551. },
  552. };
  553. </script>
  554. <style lang="scss" scoped>
  555. .dialog {
  556. height: 65vh;
  557. overflow-y: auto;
  558. }
  559. .dialog {
  560. .upload-btn {
  561. width: 100px;
  562. height: 100px;
  563. background-color: #fbfdff;
  564. border: dashed 1px #c0ccda;
  565. border-radius: 5px;
  566. i {
  567. font-size: 30px;
  568. margin-top: 20px;
  569. }
  570. &-text {
  571. margin-top: -10px;
  572. }
  573. }
  574. .avatar {
  575. cursor: pointer;
  576. }
  577. }
  578. </style>