addAndEdit.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. <!--
  2. * @Description: 新增/编辑弹框
  3. * @Author: Sugar.
  4. * @Date: 2023-11-24 13:55:00
  5. * @LastEditors: gcz
  6. * @LastEditTime: 2025-02-19 09:44:32
  7. * @FilePath: \great_webui\src\views\ticket\ticketMr\dialog\addAndEdit.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="800px"
  15. append-to-body
  16. :close-on-click-modal="false"
  17. @close="cancel"
  18. >
  19. <div class="dialog">
  20. <el-form v-if="open" :model="form" ref="form" :rules="rules" label-width="130px">
  21. <el-tabs v-model="activeName">
  22. <!-- 基础信息 -->
  23. <el-tab-pane label="基础信息" name="01">
  24. <el-form-item label="票务名称:" prop="goodsName" style="margin-top: 20px">
  25. <el-input
  26. v-model="form.goodsName"
  27. placeholder="票务名称"
  28. clearable
  29. />
  30. </el-form-item>
  31. <el-form-item label="纸质票票务名称:" prop="printName" style="margin-top: 20px">
  32. <div style="display: flex;">
  33. <el-input
  34. v-model="form.printName"
  35. placeholder="纸质票票务名称"
  36. clearable
  37. :maxlength="6"
  38. show-word-limit
  39. />
  40. <span style="color: #ccc;white-space: nowrap;padding-left: 20px;">禁止录入特殊符号</span>
  41. </div>
  42. </el-form-item>
  43. <el-form-item label="票档类型:" prop="seatType">
  44. <el-select
  45. v-model="form.seatType"
  46. placeholder="请选择票档类型"
  47. multiple
  48. clearable
  49. style="width: 100%"
  50. >
  51. <el-option
  52. v-for="item in seatTypeListArr"
  53. :key="item.id"
  54. :label="item.name"
  55. :value="item.id"
  56. />
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="包含人数:" prop="personnelNum" v-if="channelType!=='group'">
  60. <el-input-number v-model="form.personnelNum" :step="1" step-strictly :min="0" :controls="false" controls-position="right" placeholder="请输入包含人数"></el-input-number>
  61. <p>0-表示不限制 其他数字表示限制人数</p>
  62. <!-- <span v-if="form.oneMany == 1">0-表示不限制 其他数字表示限制人数</span>
  63. <span v-if="form.oneMany == 2">限制人数最少为1人</span> -->
  64. </el-form-item>
  65. <el-form-item label="是否实名:" prop="isAuth">
  66. <el-radio-group v-model="form.isAuth">
  67. <el-radio :label="1">是</el-radio>
  68. <el-radio :label="2">否</el-radio>
  69. </el-radio-group>
  70. </el-form-item>
  71. <el-form-item label="证件要求:" prop="oneMany" v-if="form.isAuth == 1">
  72. <el-radio-group v-model="form.oneMany">
  73. <el-radio :label="1">一证一人</el-radio>
  74. <el-radio :label="2">一证多人</el-radio>
  75. </el-radio-group>
  76. </el-form-item>
  77. <el-form-item label="停止售卖时间:" prop="stopSaleTime">
  78. <span style="margin-right: 5px">开演前</span>
  79. <el-input-number v-model="form.stopSaleTime" :controls="false" controls-position="right" placeholder="停止售卖时间"></el-input-number>
  80. <span style="margin-left: 5px">分钟内
  81. </span>
  82. </el-form-item>
  83. <el-form-item label="票务说明:">
  84. <el-input
  85. type="textarea"
  86. :rows="3"
  87. maxlength="400"
  88. show-word-limit
  89. placeholder="请输入内容"
  90. v-model="form.detail">
  91. </el-input>
  92. </el-form-item>
  93. </el-tab-pane>
  94. <!-- 销售信息 -->
  95. <el-tab-pane label="销售信息" name="02">
  96. <!-- <el-form-item label="销售价:" label-width="100px" prop="salePrice">
  97. <el-input
  98. v-model="form.salePrice"
  99. placeholder="销售价"
  100. type="number"
  101. clearable
  102. @change="changePriceAmount('salePrice')"
  103. style="width: 100%;"
  104. >
  105. <template slot="append">元</template>
  106. </el-input>
  107. </el-form-item> -->
  108. <!-- <el-form-item label="销售有效期:" label-width="100px" prop="saleTimeAll">
  109. <el-date-picker
  110. v-model="form.saleTimeAll"
  111. type="datetimerange"
  112. value-format="yyyy-MM-dd HH:mm:ss"
  113. range-separator="至"
  114. start-placeholder="开始日期"
  115. end-placeholder="结束日期">
  116. </el-date-picker>
  117. </el-form-item> -->
  118. <el-form-item label="是否限购:" prop="buyAstrictType" label-width="100px" style="margin-bottom: 10px">
  119. <el-radio v-model="form.buyAstrictType" label="1">是</el-radio>
  120. <el-radio v-model="form.buyAstrictType" label="2">否</el-radio>
  121. </el-form-item>
  122. <el-form-item label="" prop="buyAstrict" label-width="100px" v-if="form.buyAstrictType == 1">
  123. <span><span style="color: red">*</span>每个账号在每个场次限购</span>
  124. <el-input
  125. v-model.number="form.buyAstrict"
  126. placeholder=""
  127. clearable
  128. style="width: 140px;margin-left: 5px"
  129. >
  130. <template slot="append">张</template>
  131. </el-input>
  132. </el-form-item>
  133. <!-- <el-form-item label="售票渠道:" required label-width="100px">
  134. <el-checkbox v-model="form.channelWx">小程序</el-checkbox>
  135. <el-checkbox v-model="form.channelWindow">窗口</el-checkbox>
  136. <el-checkbox v-model="form.channelAutoSale">自助售/取票机</el-checkbox>
  137. <el-checkbox v-model="form.channelPersonSale">小程序(分销)</el-checkbox>
  138. </el-form-item> -->
  139. <el-form-item label="税率:" prop="taxRate" label-width="100px">
  140. <el-select
  141. v-model="form.taxRate"
  142. placeholder="请选择税率"
  143. clearable
  144. style="width: 240px"
  145. >
  146. <el-option
  147. v-for="dict in dict.type.system_taxrate"
  148. :key="dict.value"
  149. :label="dict.label"
  150. :value="dict.value"
  151. />
  152. </el-select>
  153. </el-form-item>
  154. <el-form-item label="可售区域:" label-width="100px">
  155. <span @click="deliverableAreaDialogCancel(form.saleArea)" style="cursor: pointer;color: #1890ff;">请选择(点击这里进行选择)</span>
  156. <span style="margin-left: 10px;color: red;cursor: pointer;" @click="form.saleArea=''">全部清除</span>
  157. <div style="width: 100%;height: 100px;overflow: hidden;overflow-y: auto;background-color: rgba(204, 204, 204,0.3);padding: 5px;box-sizing: border-box;border-radius: 10px;">
  158. <div v-if="form.saleArea">
  159. <el-tag :key="index" style="margin-left: 5px;margin-bottom: 5px;" v-for="(item,index) in form.saleArea" >{{ item }}</el-tag>
  160. </div>
  161. </div>
  162. </el-form-item>
  163. </el-tab-pane>
  164. <!-- 退改信息 -->
  165. <el-tab-pane label="退改信息" name="03">
  166. <el-form-item label="是否支持退票:" prop="backStatus" label-width="120px">
  167. <el-radio v-model="form.backStatus" label="0">是</el-radio>
  168. <el-radio v-model="form.backStatus" label="1">否</el-radio>
  169. </el-form-item>
  170. <el-form-item v-if="form.backStatus == '0'" label="退票时间:" prop="backTime" label-width="120px" style="margin-bottom: 10px">
  171. <el-radio v-model="form.backTime" label="1">按购买日期结算</el-radio>
  172. </el-form-item>
  173. <el-form-item label="" v-if="form.backStatus == '0'" prop="days" label-width="120px">
  174. <span>提前</span>
  175. <el-input
  176. v-model="form.days"
  177. type="number"
  178. placeholder=""
  179. clearable
  180. @change="changePriceAmount('days')"
  181. style="width: 140px;margin-left: 5px"
  182. />
  183. <span style="padding: 0 10px">天</span>
  184. <el-time-select
  185. v-model="form.hour"
  186. :picker-options="{ start: '00:00', step: '00:01', end: '23:59'}"
  187. placeholder="选择时间">
  188. </el-time-select>
  189. <span style="padding-left: 10px">可退</span>
  190. </el-form-item>
  191. <el-form-item label="是否允许改签:" prop="allowReSubmit" label-width="120px">
  192. <el-radio v-model="form.allowReSubmit" :label="1">是</el-radio>
  193. <el-radio v-model="form.allowReSubmit" :label="0">否</el-radio>
  194. </el-form-item>
  195. <el-form-item v-if="form.allowReSubmit == 1" label="禁止改签时间:" prop="reSubmitTime" label-width="120px">
  196. <span style="margin-right: 5px">开演前</span>
  197. <el-input
  198. v-model="form.reSubmitTime"
  199. @change="changePriceAmount('reSubmitTime')"
  200. type="number"
  201. placeholder="禁止改签时间"
  202. clearable
  203. style="width: 200px;"
  204. >
  205. </el-input>
  206. <span style="margin-left: 5px">分钟内</span>
  207. </el-form-item>
  208. </el-tab-pane>
  209. <!-- 核销信息 -->
  210. <el-tab-pane label="核销信息" name="04">
  211. <el-form-item label="核销时间:" prop="beforeTime">
  212. <span style="margin-right: 5px">开演前</span>
  213. <el-input
  214. v-model="form.beforeTime"
  215. @change="changePriceAmount('beforeTime')"
  216. type="number"
  217. placeholder="核销时间"
  218. clearable
  219. style="width: 200px;"
  220. >
  221. </el-input>
  222. <span style="margin-left: 5px">分钟内</span>
  223. </el-form-item>
  224. <el-form-item label="核销播报次数:" prop="verificationSpeaker">
  225. <el-input
  226. v-model="form.verificationSpeaker"
  227. @change="changePriceAmount('verificationSpeaker')"
  228. type="number"
  229. placeholder="核销播报次数"
  230. clearable
  231. style="width: 100%;"
  232. >
  233. </el-input>
  234. </el-form-item>
  235. <el-form-item label="核销凭证:" prop="checkList">
  236. <el-checkbox-group v-model="form.checkList">
  237. <el-checkbox label="A">电子核销码</el-checkbox>
  238. <el-checkbox label="B">身份证</el-checkbox>
  239. </el-checkbox-group>
  240. <span>说明:未勾选核销凭证时,观影人员需到票务中心取票入场</span>
  241. </el-form-item>
  242. <el-form-item label="票务闸机播报名称:" label-width="140px" prop="talkName">
  243. <div style="display: flex;">
  244. <el-input
  245. v-model="form.talkName"
  246. placeholder="票务闸机播报名称"
  247. clearable
  248. style="width: 100%;"
  249. maxlength="4"
  250. show-word-limit
  251. >
  252. </el-input>
  253. <span style="color: #ccc;white-space: nowrap;padding-left: 20px;">禁止录入特殊符号</span>
  254. </div>
  255. </el-form-item>
  256. </el-tab-pane>
  257. </el-tabs>
  258. </el-form>
  259. </div>
  260. <span slot="footer" class="dialog-footer">
  261. <el-button @click="cancel">取消</el-button>
  262. <el-button
  263. type="primary"
  264. @click="submitForm"
  265. v-loading.fullscreen.lock="loading"
  266. element-loading-text="提交中..."
  267. element-loading-spinner="el-icon-loading"
  268. element-loading-background="rgba(0, 0, 0, 0.8)"
  269. >
  270. <span v-if="loading">提交中...</span>
  271. <span v-else>保存</span>
  272. </el-button>
  273. </span>
  274. <!-- 选择配送区域对话框 Start -->
  275. <el-dialog
  276. :visible.sync="selectDeliveryAreaDialogOpen"
  277. :title="selectDeliveryAreaDialogTitle"
  278. width="60%"
  279. append-to-body
  280. class="delivery-area-dialog"
  281. @close="selectDeliveryAreaDialogCancel"
  282. >
  283. <div class="area-container"
  284. v-loading="selectCityListLoading"
  285. element-loading-text="加载数据中..."
  286. >
  287. <el-row>
  288. <el-col
  289. v-for="(areaItem, areaIndex) in selectDeliveryAreaDialogList"
  290. :key="areaItem.areaCode"
  291. class="area-wrap"
  292. :span="8"
  293. >
  294. <el-checkbox
  295. v-model="areaItem.selected"
  296. :label="areaItem.name"
  297. class="area-wrap-province"
  298. @change="handleChangeProvince(areaIndex, areaItem)"
  299. >
  300. <template #default>
  301. <span
  302. slot="reference"
  303. :class="areaItem.hasChildrenSelect ? 'area-province-label' : ''"
  304. >{{ areaItem.name }}</span>
  305. </template>
  306. </el-checkbox>
  307. <el-cascader
  308. v-model="areaItem.selectCityList"
  309. :options="areaItem.cityList"
  310. :props="areaCascaderProps(areaItem, areaIndex)"
  311. :clearable="false"
  312. collapse-tags
  313. class="area-wrap-city"
  314. popper-class="area-city-popper"
  315. @visible-change="(isVisible)=>handleCascaderVisibleChangeCity(isVisible, areaItem, areaIndex)"
  316. @change="changeCascader"
  317. />
  318. </el-col>
  319. </el-row>
  320. </div>
  321. <template #footer>
  322. <div class="dialog-footer">
  323. <el-button @click="selectDeliveryAreaDialogCancel">取 消</el-button>
  324. <el-button type="primary" @click="selectDeliveryAreaDialogSubmitForm">确 定</el-button>
  325. </div>
  326. </template>
  327. </el-dialog>
  328. <!-- 选择配送区域对话框 End -->
  329. <!-- 添加或修改对话框 End -->
  330. </el-dialog>
  331. </template>
  332. <script>
  333. // import { updateNoticeMgr } from "@/api/system/noticeMgr";
  334. import { saveAndEdit, getSelectById,seatTypeList } from '@/api/ticketMr/ticketMr'
  335. import { getToken } from "@/utils/auth";
  336. import { pageList } from '@/api/performMr/performMr'
  337. import FreightMgrIndexMi from "./FreightMgrIndexMi"
  338. export default {
  339. name: "addAndEdit",
  340. mixins: [FreightMgrIndexMi],
  341. dicts: ['system_taxrate'],
  342. data() {
  343. let validateNumber = (rule, value, callback) => {
  344. let regNumber=/^(([1-9]\d*)|([0][.]{1}[0-9]{0,2}[0-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g;
  345. if (value === '') {
  346. callback(new Error('请输入大于等于0的数值!!!'));
  347. } else if(value==0){
  348. callback();
  349. }
  350. else if (!regNumber.test(value)) {
  351. callback(new Error('只能大于等于0的数值!!!'));
  352. } else{
  353. callback();
  354. }
  355. };
  356. return {
  357. channelList: [
  358. {id: 1, name: '小程序', value: 1},
  359. {id: 2, name: '窗口', value: 2},
  360. ],
  361. title: "编辑",
  362. model: "EDIT",
  363. activeName: '01',
  364. // 演员信息弹窗
  365. performerVisible: false,
  366. // 演员信息
  367. performerList: [],
  368. // 演员上传图片索引
  369. performerIndex: 0,
  370. open: false,
  371. loading: false,
  372. form: {
  373. id: undefined,
  374. type: "",
  375. content: "",
  376. isAuth: 1,
  377. backTime: '1',
  378. goodsPerform: {},
  379. seatType: [],
  380. seatTypeList: [],
  381. allowReSubmit: 1,
  382. },
  383. rules: {
  384. goodsName: [{ required: true, message: "请输入票务名称", trigger: ["change","blur"] }],
  385. printName: [
  386. { required: true, message: "请输入纸质票票务名称", trigger: ["change","blur"] },
  387. { pattern: /^[\u4E00-\u9FA5]+$/, message: '只能输入文字', trigger: ["change","blur"] }
  388. ],
  389. stopSaleTime: [
  390. { required: true, message: "请输入停止售卖时间", trigger: ["change","blur"] },
  391. // { validator: validateNumber, trigger: ["blur","change"]},
  392. ],
  393. beforeTime: [{ required: true, message: "请输入核销时间", trigger: ["change","blur"] }],
  394. verificationSpeaker: [{ required: true, message: "请输入核销播报次数", trigger: ["change","blur"] }],
  395. detail: [{ required: true, message: "请输入票务说明", trigger: ["change","blur"] }],
  396. salePrice: [{ required: true, message: "请输入销售价", trigger: ["change","blur"] }],
  397. buyAstrictType: [{ required: true, message: "请选择是否限购", trigger: ["change","blur"] }],
  398. buyAstrict: [{ required: true, message: "请输入每个账号在每个场次限购张数", trigger: ["change","blur"] }],
  399. taxRate: [{ required: true, message: "请输入税率", trigger: ["change","blur"] }],
  400. backStatus: [{ required: true, message: "请选择是否支持退票", trigger: ["change","blur"] }],
  401. days: [{ required: true, message: "请输入日期", trigger: ["change","blur"] }],
  402. saleTimeAll: [{required: true, message: "请选择销售有效期", trigger: ["change","blur"]}],
  403. seatType: [
  404. { required: true, message: "请选择票档类型", trigger: ["change","blur"] }
  405. ],
  406. oneMany: [{required: true, message: "请选择实名要求", trigger: ["change","blur"]}],
  407. personnelNum: [{required: true, message: "请输入包含人数", trigger: ["change","blur"]}],
  408. checkList: [{required: false, message: "请选择核销凭证", trigger: ["change","blur"]}],
  409. allowReSubmit: [
  410. { required: true, message: "请选择是否允许改签", trigger: ["change","blur"] }
  411. ],
  412. reSubmitTime: [{required: true, message: "请输入禁止改签时间", trigger: ["change","blur"]}],
  413. talkName: [
  414. {required: true, message: "请输入票务闸机播报名称", trigger: ["change","blur"]},
  415. { pattern: /^[\u4E00-\u9FA5]+$/, message: '只能输入文字', trigger: ["change","blur"] }
  416. ],
  417. },
  418. uploadObj: {
  419. url: process.env.VUE_APP_UPLOAD_FILE_API + "/upload/single/minio",
  420. Headers: { Authorization: "Bearer " + getToken() },
  421. },
  422. statusList: [
  423. {id: 1, name: '是', value: 1},
  424. {id: 2, name: '否', value: 2},
  425. ],
  426. performList: [],
  427. seatTypeListArr: [],
  428. channelType: '',
  429. };
  430. },
  431. created() {
  432. this.getList()
  433. this.getSeatTypeList()
  434. },
  435. methods: {
  436. /** 查询主办方列表 */
  437. getList() {
  438. pageList({pageNum: 1, pageSize: 100})
  439. .then(response => {
  440. this.performList = response.data.rows;
  441. }
  442. );
  443. },
  444. /** 主办方选择事件 */
  445. changePerform(val) {
  446. this.performList.forEach(item => {
  447. if(item.id == val){
  448. this.form.sponsorName = item.name
  449. }
  450. })
  451. },
  452. /**
  453. * 打开弹框
  454. * @date 2023-11-22
  455. * @param {any} title 标题
  456. * @param {any} obj 编辑对象
  457. * @param {string} channelType 销售渠道
  458. * @returns {any}
  459. */
  460. openDialog(title, obj, channelType) {
  461. this.open = true;
  462. this.reset();
  463. this.activeName = '01';
  464. this.channelType = channelType;
  465. if (obj) {
  466. this.title = "编辑票务管理";
  467. this.getSelectByIdApi(obj)
  468. } else {
  469. this.title = "添加票务管理";
  470. this.setDefaultChannelValues();
  471. this.$nextTick(() => {
  472. this.$refs["form"].clearValidate();
  473. });
  474. }
  475. },
  476. /** 获取详情 */
  477. getSelectByIdApi(row) {
  478. const id = row.id
  479. getSelectById(id).then(response => {
  480. const obj = response.data;
  481. this.$nextTick(() => {
  482. this.form = {}
  483. this.$set(this.form, 'id', obj.id);
  484. this.$set(this.form, 'goodsName', obj.goodsName);
  485. this.$set(this.form, 'seatType', obj.seatTypeList ? obj.seatTypeList.map(item => item.seatTypeId) : []);
  486. this.$set(this.form, 'isAuth', obj.isAuth);
  487. this.$set(this.form, 'verificationSpeaker', obj.goodsPerform.verificationSpeaker);
  488. this.$set(this.form, 'beforeTime', obj.goodsPerform.beforeTime);
  489. this.$set(this.form, 'stopSaleTime', obj.goodsPerform.stopSaleTime);
  490. this.$set(this.form, 'detail', obj.goodsPerform.detail);
  491. this.$set(this.form, 'salePrice', obj.salePrice);
  492. if(obj.goodsPerform.buyAstrict > -1){
  493. this.$set(this.form, 'buyAstrictType', '1');
  494. this.$set(this.form, 'buyAstrict', obj.goodsPerform.buyAstrict);
  495. } else {
  496. this.$set(this.form, 'buyAstrictType', '2');
  497. this.$set(this.form, 'buyAstrict', '');
  498. }
  499. this.$set(this.form, 'channelWx', obj.goodsPerform.channelWx == 0);
  500. this.$set(this.form, 'channelWindow', obj.goodsPerform.channelWindow == 0);
  501. this.$set(this.form, 'channelAutoSale', obj.goodsPerform.channelAutoSale == 0);
  502. this.$set(this.form, 'channelPersonSale', obj.goodsPerform.channelPersonSale == 0);
  503. this.$set(this.form, 'backStatus', obj.goodsPerform.backStatus);
  504. this.$set(this.form, 'backTime', '1');
  505. this.$set(this.form, 'taxRate', obj.taxRate);
  506. this.$set(this.form, 'backStatus', obj.goodsPerform.backStatus.toString());
  507. this.$set(this.form, 'saleArea', obj.saleArea);
  508. this.$set(this.form, 'stopSaleTime', obj.goodsPerform.stopSaleTime);
  509. if(obj.goodsPerform.backStatus == '0') {
  510. this.$set(this.form, 'days', obj.performRefundRule.days);
  511. this.$set(this.form, 'hour', obj.performRefundRule.hour);
  512. }
  513. if(obj.goodsPerform.saleBeginTime && obj.goodsPerform.saleEndTime){
  514. this.$set(this.form, 'saleTimeAll', [obj.goodsPerform.saleBeginTime,obj.goodsPerform.saleEndTime]);
  515. }
  516. this.$set(this.form, 'oneMany', obj.goodsPerform.oneMany);
  517. this.$set(this.form, 'personnelNum', obj.goodsPerform.personnelNum);
  518. this.$set(this.form,'checkList',[])
  519. if(obj.goodsPerform.verificationQrcode == 0) {
  520. this.form.checkList.push('A')
  521. }
  522. if(obj.goodsPerform.verificationIdcard == 0) {
  523. this.form.checkList.push('B')
  524. }
  525. this.$set(this.form, 'seatTypeList', obj.seatTypeList || []);
  526. this.$set(this.form, 'allowReSubmit', obj.allowReSubmit);
  527. this.$set(this.form, 'reSubmitTime', obj.reSubmitTime);
  528. this.$set(this.form, 'talkName',obj.goodsPerform.talkName)
  529. this.$set(this.form, 'printName',obj.goodsPerform.printName)
  530. });
  531. });
  532. },
  533. /** 价格输入事件 */
  534. changePriceAmount(key) {
  535. if(this.form[key] * 1 < 0){
  536. this.$message.error("输入需大于或等于0!");
  537. this.$set(this.form, key, '');
  538. return false
  539. }
  540. },
  541. /**
  542. * 保存
  543. * @date 2023-11-22
  544. * @returns {any}
  545. */
  546. submitForm() {
  547. this.$refs["form"].validate(async (valid,object) => {
  548. if (valid) {
  549. try {
  550. let postMap = {
  551. goodsPerform: {},
  552. performRefundRule: {}
  553. }
  554. if(this.form.id){
  555. postMap.id = this.form.id;
  556. }
  557. postMap.goodsName = this.form.goodsName;
  558. postMap.seatType = this.form.seatType;
  559. postMap.isAuth = this.form.isAuth;
  560. postMap.goodsPerform.verificationSpeaker = this.form.verificationSpeaker;
  561. postMap.goodsPerform.beforeTime = this.form.beforeTime;
  562. postMap.goodsPerform.detail = this.form.detail;
  563. postMap.salePrice = this.form.salePrice;
  564. postMap.goodsPerform.buyAstrict = this.form.buyAstrictType == '1' ? this.form.buyAstrict : '-1';
  565. postMap.taxRate = this.form.taxRate
  566. postMap.goodsPerform.channelWx = this.form.channelWx ? 0 : 1;
  567. postMap.goodsPerform.channelWindow = this.form.channelWindow ? 0 : 1;
  568. postMap.goodsPerform.channelAutoSale = this.form.channelAutoSale ? 0 : 1;
  569. postMap.goodsPerform.channelPersonSale = this.form.channelPersonSale ? 0 : 1;
  570. postMap.goodsPerform.backStatus = this.form.backStatus;
  571. if(this.form.backStatus == '0') {
  572. postMap.performRefundRule.days = this.form.days;
  573. postMap.performRefundRule.hour = this.form.hour;
  574. }
  575. postMap.goodsType = 2;
  576. postMap.classifyId = 1;
  577. postMap.classifyName = "门票类";
  578. postMap.saleArea = this.form.saleArea&&this.form.saleArea.length>0?this.form.saleArea:[]
  579. postMap.goodsPerform.stopSaleTime = this.form.stopSaleTime
  580. if(this.form.saleTimeAll && this.form.saleTimeAll.length > 0) {
  581. postMap.goodsPerform.saleBeginTime = this.form.saleTimeAll[0];
  582. postMap.goodsPerform.saleEndTime = this.form.saleTimeAll[1];
  583. }
  584. postMap.goodsPerform.oneMany = this.form.oneMany
  585. postMap.goodsPerform.personnelNum = this.form.personnelNum
  586. // 团购渠道设置包含人数为1
  587. if(this.channelType=='group'){
  588. postMap.goodsPerform.personnelNum = 1
  589. }
  590. if(this.form.checkList.indexOf('A') != -1) {
  591. postMap.goodsPerform.verificationQrcode = 0
  592. }else {
  593. postMap.goodsPerform.verificationQrcode = 1
  594. }
  595. if(this.form.checkList.indexOf('B') != -1) {
  596. postMap.goodsPerform.verificationIdcard = 0
  597. }else {
  598. postMap.goodsPerform.verificationIdcard = 1
  599. }
  600. postMap.seatTypeList = this.form.seatType.map(id => ({
  601. seatTypeId: id
  602. }));
  603. postMap.channelType = this.channelType;
  604. postMap.allowReSubmit = this.form.allowReSubmit;
  605. postMap.reSubmitTime = this.form.reSubmitTime;
  606. postMap.goodsPerform.talkName = this.form.talkName
  607. postMap.goodsPerform.printName = this.form.printName
  608. this.loading = true;
  609. const { code } = await saveAndEdit({ ...postMap });
  610. if (code === 200) {
  611. this.$message.success("操作成功!");
  612. this.$emit("getList");
  613. this.cancel();
  614. }
  615. } catch (error) {
  616. } finally {
  617. this.loading = false;
  618. }
  619. }else{
  620. // console.log('error submit!!',valid,object);
  621. if(object&&JSON.stringify(object) != '{}'){
  622. let str = ''
  623. for(let key in object){
  624. if(object.hasOwnProperty(key)){
  625. str = str + `[${object[key][0].message}]}]`
  626. }
  627. }
  628. this.$message.error(str);
  629. }
  630. }
  631. });
  632. },
  633. /**
  634. * 重置
  635. * @date 2023-11-22
  636. * @returns {any}
  637. */
  638. reset() {
  639. this.$set(this.form, 'id', '');
  640. this.$set(this.form, 'goodsName', '');
  641. this.$set(this.form, 'seatType', []);
  642. this.$set(this.form, 'isAuth', 1);
  643. this.$set(this.form, 'verificationSpeaker', '');
  644. this.$set(this.form, 'detail', '');
  645. this.$set(this.form, 'goodsPerform', {});
  646. this.$set(this.form, 'salePrice', '');
  647. this.$set(this.form, 'buyAstrictType', '1');
  648. this.$set(this.form, 'buyAstrict', '');
  649. this.$set(this.form, 'channelWx', false);
  650. this.$set(this.form, 'channelWindow', false);
  651. this.$set(this.form, 'beforeTime', '');
  652. this.$set(this.form, 'backStatus', '');
  653. this.$set(this.form, 'backTime', '1');
  654. this.$set(this.form, 'taxRate', '');
  655. this.$set(this.form, 'backStatus', '');
  656. this.$set(this.form, 'days', '');
  657. this.$set(this.form, 'hour', '');
  658. this.$set(this.form, 'saleArea', '');
  659. this.$set(this.form, 'stopSaleTime', '');
  660. this.$set(this.form, 'saleTimeAll', '');
  661. this.$set(this.form, 'oneMany', '');
  662. this.$set(this.form, 'personnelNum', undefined);
  663. this.$set(this.form, 'checkList', ['A','B'])
  664. this.$set(this.form, 'seatTypeList', []);
  665. this.$set(this.form, 'allowReSubmit', 1);
  666. this.$set(this.form, 'talkName', '');
  667. this.$set(this.form, 'reSubmitTime', '');
  668. },
  669. /**
  670. * 关闭弹框
  671. * @date 2023-11-22
  672. * @returns {any}
  673. */
  674. cancel() {
  675. // this.reset();
  676. this.open = false;
  677. },
  678. getSeatTypeList() {
  679. seatTypeList().then(response => {
  680. this.seatTypeListArr = Array.isArray(response.data.list) ? response.data.list : [];
  681. });
  682. },
  683. // 新增方法 - 根据销售渠道设置默认值
  684. setDefaultChannelValues() {
  685. // 重置所有渠道为 false
  686. this.$set(this.form, 'channelWx', false);
  687. this.$set(this.form, 'channelWindow', false);
  688. this.$set(this.form, 'channelAutoSale', false);
  689. this.$set(this.form, 'channelPersonSale', false);
  690. // 根据选择的渠道设置对应值为 true
  691. switch(this.channelType) {
  692. case '1': // 小程序
  693. this.$set(this.form, 'channelWx', true);
  694. break;
  695. case '2': // 窗口
  696. this.$set(this.form, 'channelWindow', true);
  697. break;
  698. case '3': // 自助售/取票机
  699. this.$set(this.form, 'channelAutoSale', true);
  700. break;
  701. case '4': // 小程序(分销)
  702. this.$set(this.form, 'channelPersonSale', true);
  703. break;
  704. default:
  705. break;
  706. }
  707. },
  708. },
  709. };
  710. </script>
  711. <style lang="scss" scoped>
  712. .dialog {
  713. padding: 0 30px;
  714. max-height: 65vh;
  715. overflow-y: auto;
  716. }
  717. .dialog {
  718. padding: 0 30px;
  719. .upload-btn {
  720. width: 100px;
  721. height: 100px;
  722. background-color: #fbfdff;
  723. border: dashed 1px #c0ccda;
  724. border-radius: 5px;
  725. i {
  726. font-size: 30px;
  727. margin-top: 20px;
  728. }
  729. &-text {
  730. margin-top: -10px;
  731. }
  732. }
  733. .avatar {
  734. cursor: pointer;
  735. }
  736. }
  737. .el-table{
  738. .upload-btn {
  739. width: 100px;
  740. height: 100px;
  741. background-color: #fbfdff;
  742. border: dashed 1px #c0ccda;
  743. border-radius: 5px;
  744. i {
  745. font-size: 30px;
  746. margin-top: 20px;
  747. }
  748. &-text {
  749. margin-top: -10px;
  750. }
  751. }
  752. .avatar {
  753. cursor: pointer;
  754. }
  755. }
  756. .area-container {
  757. min-height: 400px;
  758. }
  759. ::v-deep .area-wrap-city.el-cascader {
  760. line-height: normal;
  761. .el-input {
  762. cursor: pointer;
  763. width: 100% !important;
  764. height: 28px !important;
  765. .el-input__inner {
  766. display: none !important;
  767. }
  768. span.el-input__suffix {
  769. position: inherit !important;
  770. i.el-input__icon {
  771. line-height: inherit;
  772. margin-left: 5px;
  773. }
  774. }
  775. .el-input__wrapper {
  776. box-shadow: none;
  777. input {
  778. display: none;
  779. }
  780. }
  781. }
  782. .el-cascader__tags {
  783. display: none;
  784. }
  785. }
  786. .area-city-popper {
  787. .el-cascader-panel {
  788. .el-scrollbar.el-cascader-menu {
  789. .el-cascader-menu__wrap.el-scrollbar__wrap {
  790. height: 315px;
  791. }
  792. }
  793. }
  794. }
  795. </style>
  796. <style>
  797. .custom-class-box {
  798. z-index: 999999 !important;
  799. }
  800. </style>