addAndEdit.vue 17 KB

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