addAndEdit.vue 28 KB

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