addAndEdit.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  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="getInventoryTemplate"
  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. this.form = {
  255. ...obj,
  256. performDate: [obj.dateStart,obj.dateEnd],
  257. goodsIds: obj.goodsIds ? obj.goodsIds.split(','):[],
  258. weekDay: obj.weekDay ? obj.weekDay.split(','):[],
  259. planSessionList: obj.planSessionList ? obj.planSessionList:[],
  260. id: null
  261. }
  262. console.log("form====",this.form)
  263. }else{
  264. this.title = "新增排期";
  265. this.form = {
  266. planSessionList: [],
  267. weekDay: [],
  268. weekType: 0
  269. };
  270. }
  271. this.$nextTick(() => {
  272. this.$refs["form"].clearValidate();
  273. });
  274. },
  275. /** 剧目选择 */
  276. changePerform(id) {
  277. this.goodsList.forEach(item => {
  278. if(id == item.id){
  279. this.selectPerform = item;
  280. }
  281. })
  282. this.goodsPageListS = []
  283. if(id) {
  284. this.goodsPageListFun(id);
  285. }
  286. //this.$set(this.form, 'performDate' , '')
  287. this.$set(this.form, 'goodsIds' , [])
  288. },
  289. // yyyy-mm-dd 转时时间戳
  290. dateToTimestamp(year, month, day) {
  291. const date = new Date(year, month - 1, day);
  292. return date.getTime();
  293. },
  294. // 时间选择
  295. performDateEven(key) {
  296. if(!this.form.performId){
  297. this.$message.error("请选择剧目!");
  298. this.$set(this.form, 'performDate', '');
  299. return false;
  300. }
  301. let newTime = ''
  302. if(key == 'list'){
  303. newTime = this.form.performDate[0]
  304. } else {
  305. newTime = this.form.performDate;
  306. }
  307. let newTimeArr = newTime.split('-');
  308. let letTiemArr = this.selectPerform.releaseDate.split('-');
  309. if(this.dateToTimestamp(newTimeArr[0], newTimeArr[1], newTimeArr[2]) < this.dateToTimestamp(letTiemArr[0], letTiemArr[1], letTiemArr[2])){
  310. this.$message.error("开始时间不能小于剧目上映时间" + this.selectPerform.releaseDate);
  311. this.$set(this.form, 'performDate' , '')
  312. return false
  313. }
  314. },
  315. /** 剧目列表查询 */
  316. goodsPageList() {
  317. goodsPageList(this.addDateRange({pageNum: 1, pageSize: 100, status: 1}))
  318. .then(response => {
  319. this.goodsList = response.data.rows;
  320. });
  321. },
  322. /** 演出厅列表查询 */
  323. merchantPageList(id) {
  324. merchantPageList(this.addDateRange({theatreId: id, pageNum: 1, pageSize: 100}))
  325. .then(response => {
  326. this.merchantList = response.data.rows;
  327. });
  328. },
  329. /** 票务信息 */
  330. async goodsPageListFun(value){
  331. try {
  332. let res = await goodsPageListApi({
  333. performId: value
  334. })
  335. if(res.code == 200){
  336. this.goodsPageListS = res.data
  337. }
  338. } catch (error) {
  339. }
  340. },
  341. /** 获取模板 */
  342. async getInventoryTemplate(value){
  343. try {
  344. if(this.form.planSessionList && this.form.planSessionList.length > 0) {
  345. let list = JSON.parse(JSON.stringify(this.form.planSessionList))
  346. list.forEach((item,index)=>{
  347. list[index].stockTmpId = null
  348. })
  349. this.$set(this.form,'planSessionList',list)
  350. }
  351. if(!value) {
  352. this.inventoryTemplateList = []
  353. return
  354. }
  355. let res = await getInventoryTemplateApi({
  356. auditoriumId: value,
  357. pageNum: 1,
  358. pageSize: 1000,
  359. })
  360. if(res.code == 200){
  361. this.inventoryTemplateList = res.data.rows
  362. }
  363. } catch (error) {
  364. console.error("error===",error)
  365. }
  366. },
  367. /**
  368. * 保存
  369. * @date 2023-11-22
  370. * @returns {any}
  371. */
  372. submitForm() {
  373. this.$refs["form"].validate(async (valid) => {
  374. if (valid) {
  375. try {
  376. let postEdit = JSON.parse(JSON.stringify(this.form))
  377. postEdit['dateStart'] = moment(postEdit.performDate[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss')
  378. postEdit['dateEnd'] = moment(postEdit.performDate[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
  379. postEdit.goodsIds = postEdit.goodsIds.join(',')
  380. postEdit.weekDay = postEdit.weekDay.join(','),
  381. delete postEdit.performDate
  382. if(this.checkList(this.form.planSessionList)) {
  383. this.$message.error("请完善场次信息!");
  384. return
  385. }
  386. this.loading = true;
  387. const { code } = await saveAndEdit({ ...postEdit });
  388. if (code === 200) {
  389. this.$message.success("操作成功!");
  390. this.$emit("getList");
  391. this.cancel();
  392. }
  393. } catch (error) {
  394. console.error("error====",error)
  395. } finally {
  396. this.loading = false;
  397. }
  398. }
  399. });
  400. },
  401. checkList(list){
  402. let flog = false
  403. if(list&&list.length>0) {
  404. for (let index = 0; index < list.length; index++) {
  405. let list2 = ['name', 'startInterval', 'endInterval', 'stockTmpId']
  406. for (let i = 0; i < list2.length; i++) {
  407. if(list[index].hasOwnProperty(list2[i]) && !list[index][list2[i]]) {
  408. console.log(list[index].hasOwnProperty(list2[i]),list[index][list2[i]])
  409. flog = true
  410. break
  411. }
  412. }
  413. if(flog) {
  414. break
  415. }
  416. }
  417. }
  418. return flog
  419. },
  420. /**
  421. * 重置
  422. * @date 2023-11-22
  423. * @returns {any}
  424. */
  425. reset() {
  426. },
  427. /**
  428. * 关闭弹框
  429. * @date 2023-11-22
  430. * @returns {any}
  431. */
  432. cancel() {
  433. this.reset();
  434. this.open = false;
  435. },
  436. /** 点击添加排期 */
  437. addTable() {
  438. if(!this.form.performId){
  439. this.$message.error("请选择剧目!");
  440. return false;
  441. }
  442. let map = {
  443. name: '',
  444. startInterval: '',
  445. startM: '',
  446. endInterval: '',
  447. endM: '',
  448. err: false,
  449. }
  450. this.form.planSessionList.push(map)
  451. },
  452. /** 开始时间和结束时间大小判断 */
  453. changValue(row, key, $index) {
  454. let start = '', startTime = '', end = '', endTime;
  455. if(row.startInterval && row.startInterval.length > 0) {
  456. start = row.startInterval.split(":");
  457. startTime = (start[0] * 3600) + (start[1] * 60);
  458. row.startM = startTime;
  459. }
  460. if(row.endInterval && row.endInterval.length > 0) {
  461. // if(this.selectPerform)
  462. end = row.endInterval.split(":");
  463. endTime = (end[0] * 3600) + (end[1] * 60);
  464. let showDuration = this.selectPerform.showDuration * 60;
  465. if(endTime - row.startM < showDuration) {
  466. this.$message.error("选择时间不能小于剧目时长," + this.selectPerform.showDuration + "分钟!");
  467. row.endInterval = ""
  468. return false
  469. }
  470. row.endM = endTime;
  471. }
  472. // 判断场次时间段是否存在冲突
  473. let status = false;
  474. this.form.planSessionList.forEach((item, index) => {
  475. if($index != index) {
  476. if(key == 'start') {
  477. if(item.startM <= startTime && startTime <= item.endM) {
  478. status = true;
  479. }
  480. }
  481. if (key == 'end') {
  482. if(item.startM <= endTime && endTime <= item.endM) {
  483. status = true;
  484. }
  485. }
  486. }
  487. })
  488. if(status) {
  489. this.$message.error("该场次的时间和其它场次时间段冲突!");
  490. if(key == 'start') {
  491. row.startInterval = ""
  492. row.startM = ""
  493. } else if (key == 'end') {
  494. row.endInterval = ""
  495. row.endM = ""
  496. }
  497. return false;
  498. }
  499. if(key == 'start') {
  500. if(endTime && startTime >= endTime) {
  501. row.startTime = ""
  502. row.startM = ""
  503. }
  504. } else if (key == 'end') {
  505. if(startTime && startTime >= endTime) {
  506. row.endTime = ""
  507. row.endM = ""
  508. }
  509. }
  510. },
  511. /** 删除按钮操作 */
  512. handleDelete(row, index) {
  513. if(this.form.planSessionList && this.form.planSessionList.length == 1){
  514. this.$message.error("只剩一场次, 不能删除!");
  515. return false;
  516. }
  517. this.$confirm('是否确认删除数据场次名称为"' + row.name + '"的数据项?', '提示', {
  518. confirmButtonText: '确定',
  519. cancelButtonText: '取消',
  520. type: 'warning'
  521. }).then(() => {
  522. this.form.planSessionList.splice(index, 1)
  523. }).catch(() => {
  524. });
  525. },
  526. selectWeekDay(item){
  527. let index = -1
  528. this.form.weekDay.forEach((item1,index1)=>{
  529. if(item.key == item1) {
  530. index = index1
  531. }
  532. })
  533. if(index != -1) {
  534. this.form.weekDay.splice(index,1)
  535. }else {
  536. this.form.weekDay.push(item.key)
  537. }
  538. if(this.form.weekDay.length>0) {
  539. this.form.weekType = 1
  540. }else {
  541. this.form.weekType = 0
  542. }
  543. },
  544. selectWeekType() {
  545. this.form.weekType = this.form.weekType == 1 ? 0 : 1
  546. if(!this.form.weekType) {
  547. this.form.weekDay = []
  548. }
  549. }
  550. },
  551. };
  552. </script>
  553. <style lang="scss" scoped>
  554. .dialog {
  555. height: 65vh;
  556. overflow-y: auto;
  557. }
  558. .dialog {
  559. .upload-btn {
  560. width: 100px;
  561. height: 100px;
  562. background-color: #fbfdff;
  563. border: dashed 1px #c0ccda;
  564. border-radius: 5px;
  565. i {
  566. font-size: 30px;
  567. margin-top: 20px;
  568. }
  569. &-text {
  570. margin-top: -10px;
  571. }
  572. }
  573. .avatar {
  574. cursor: pointer;
  575. }
  576. }
  577. </style>