Dialog.vue 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818
  1. <template>
  2. <el-dialog
  3. :visible.sync="visible"
  4. :title="dialogType === 'add' ? '新增票种' : '编辑票种'"
  5. width="85%"
  6. append-to-body
  7. @close="handleClose"
  8. >
  9. <el-scrollbar
  10. :style="{ height: 'calc(100vh - 160px)' }"
  11. class="dialog-scroll">
  12. <el-form
  13. inline
  14. :model="form"
  15. ref="form"
  16. class="form-wrap"
  17. label-width="160px"
  18. >
  19. <div
  20. class="dialog-info1"
  21. style="padding-bottom: 0;">
  22. <div class="block-title">
  23. 基本属性
  24. </div>
  25. <el-form-item
  26. verify
  27. label="票种分类"
  28. prop="category">
  29. <el-select
  30. value-key="id"
  31. v-model="form.category"
  32. placeholder="请选择">
  33. <el-option
  34. v-for="item in ticketCategory"
  35. :key="item.id"
  36. :value="item.id"
  37. :label="item.name">
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item
  42. verify
  43. label="票种名称"
  44. prop="name"
  45. >
  46. <el-input v-model="form.name"></el-input>
  47. </el-form-item>
  48. <el-form-item
  49. verify
  50. label="在售状态"
  51. prop="isSale"
  52. >
  53. <el-switch
  54. v-model="form.isSale"
  55. :active-value="1"
  56. :inactive-value="0"
  57. active-text="在售"
  58. inactive-text="禁售">
  59. </el-switch>
  60. </el-form-item>
  61. <!-- 新增开票状态 -->
  62. <el-form-item
  63. verify
  64. label="开票状态"
  65. prop="isSupportInvoice"
  66. >
  67. <el-switch
  68. v-model="form.isSupportInvoice"
  69. :active-value="1"
  70. :inactive-value="0"
  71. active-text="支持开票"
  72. inactive-text="不支持开票">
  73. </el-switch>
  74. </el-form-item>
  75. <el-form-item
  76. verify
  77. label="销售价格"
  78. prop="price"
  79. >
  80. <el-input v-model="form.price"></el-input>
  81. </el-form-item>
  82. <!-- <el-form-item
  83. label="线上价格"
  84. prop="onlinePrice"
  85. >
  86. <el-input-number
  87. controls-position="right"
  88. v-model="form.onlinePrice"
  89. :min="0"
  90. :step="0.01"
  91. :precision="2"
  92. ></el-input-number>
  93. </el-form-item>
  94. <el-form-item
  95. label="虚拟高价"
  96. prop="highPrice"
  97. >
  98. <el-input-number
  99. controls-position="right"
  100. v-model="form.highPrice"
  101. :min="0"
  102. :step="0.01"
  103. :precision="2"
  104. ></el-input-number>
  105. </el-form-item> -->
  106. <el-form-item
  107. verify
  108. label="多日票类型"
  109. prop="useDaysDelayType"
  110. >
  111. <el-radio
  112. v-model="form.useDaysDelayType"
  113. :label="1">
  114. 按照游玩时间延长
  115. </el-radio>
  116. <el-radio
  117. v-model="form.useDaysDelayType"
  118. :label="2">
  119. 按照首次核销时间延长
  120. </el-radio>
  121. </el-form-item>
  122. <el-form-item
  123. v-if="form.category !== 'member'"
  124. verify
  125. label="日期类型"
  126. prop="useDateType"
  127. >
  128. <el-radio
  129. v-model="form.useDateType"
  130. :label="1">
  131. 日历票
  132. </el-radio>
  133. <el-radio
  134. v-model="form.useDateType"
  135. :label="2">
  136. 期票,时间期限内有效
  137. </el-radio>
  138. </el-form-item>
  139. <!-- <el-form-item
  140. v-if="form.useDateType === 2"
  141. label="消费日期"
  142. prop="validityUseDays"
  143. >
  144. 自购买起
  145. <el-input-number
  146. controls-position="right"
  147. v-model="form.validityUseDays"
  148. :min="0"
  149. :step="1"
  150. ></el-input-number>
  151. 天内可用
  152. </el-form-item> -->
  153. <!-- <el-form-item
  154. label="是否限制使用日期"
  155. prop="isUseDateLimit"
  156. >
  157. <el-switch
  158. v-model="form.isUseDateLimit"
  159. :active-value="1"
  160. :inactive-value="0"
  161. active-text="限制"
  162. inactive-text="不限">
  163. </el-switch>
  164. </el-form-item> -->
  165. <el-form-item
  166. v-if="form.category === 'member'"
  167. verify
  168. label="会员时长类型"
  169. prop="memberUseDateType"
  170. >
  171. <el-radio
  172. v-model="form.memberUseDateType"
  173. :label="1">
  174. 【按天】:购买后多少天的有效期
  175. </el-radio>
  176. <el-radio
  177. v-model="form.memberUseDateType"
  178. :label="2">
  179. 【按照使用日期】:固定某个时间期内可以用
  180. </el-radio>
  181. </el-form-item>
  182. <el-form-item
  183. v-if="!(form.category === 'member' && form.memberUseDateType === 2)"
  184. verify
  185. label="使用天数"
  186. prop="useDays"
  187. >
  188. <el-input-number
  189. controls-position="right"
  190. v-model="form.useDays"
  191. :min="0"
  192. :step="1"
  193. ></el-input-number>
  194. </el-form-item>
  195. <el-form-item
  196. v-if="!(form.category === 'member' && form.memberUseDateType === 1)"
  197. verify
  198. label="使用日期"
  199. prop="useDateStart"
  200. >
  201. <el-date-picker
  202. :editable="false"
  203. :clearable="false"
  204. :picker-options="pickerOptions"
  205. v-model="form.useDateStart"
  206. type="date"
  207. placeholder="开始日期"
  208. >
  209. </el-date-picker>
  210. <span style="margin:0 10px">至</span>
  211. <el-date-picker
  212. :editable="false"
  213. :clearable="false"
  214. :picker-options="pickerOptions"
  215. v-model="form.useDateEnd"
  216. type="date"
  217. placeholder="结束日期"
  218. >
  219. </el-date-picker>
  220. </el-form-item>
  221. <el-form-item
  222. v-if="form.category === 'member'"
  223. verify
  224. label="激活方式"
  225. prop="memberActiveType"
  226. >
  227. <el-radio
  228. v-model="form.memberActiveType"
  229. :label="1">
  230. 【购买即激活】 该年卡购买了就开始递减天数
  231. </el-radio>
  232. <el-radio
  233. v-model="form.memberActiveType"
  234. :label="2">
  235. 【首次使用激活】:第一次用了之后才开始递减时间,示例值
  236. </el-radio>
  237. </el-form-item>
  238. <!-- <el-form-item
  239. label="是否实名制购票"
  240. prop="isRealName"
  241. >
  242. <el-switch
  243. v-model="form.isRealName"
  244. :active-value="1"
  245. :inactive-value="0"
  246. active-text="限制"
  247. inactive-text="不限">
  248. </el-switch>
  249. </el-form-item>
  250. <el-form-item
  251. label="实名要求"
  252. prop="realNameType"
  253. >
  254. <el-radio
  255. v-model="form.realNameType"
  256. :label="1">
  257. 一证一人
  258. </el-radio>
  259. <el-radio
  260. v-model="form.realNameType"
  261. :label="2">
  262. 一证多人
  263. </el-radio>
  264. </el-form-item>
  265. <el-form-item
  266. label="预订协议"
  267. prop="buyProtocol"
  268. >
  269. <el-input v-model="form.buyProtocol"></el-input>
  270. <el-checkbox
  271. v-model="form.isAgreeProtocol">
  272. <span style="color:#0075ff">是否必须同意预定协议才可以购买</span>
  273. </el-checkbox>
  274. </el-form-item> -->
  275. <!-- <el-form-item
  276. label="是否限制售卖日期"
  277. prop="isSaleDateLimit"
  278. >
  279. <el-switch
  280. v-model="form.isSaleDateLimit"
  281. :active-value="1"
  282. :inactive-value="0"
  283. active-text="限制"
  284. inactive-text="不限">
  285. </el-switch>
  286. </el-form-item> -->
  287. <el-form-item
  288. v-if="form.isSaleDateLimit === 1"
  289. verify
  290. label="售卖时间"
  291. prop="saleDateStart"
  292. >
  293. <el-date-picker
  294. :editable="false"
  295. :clearable="false"
  296. :picker-options="pickerOptions"
  297. v-model="form.saleDateStart"
  298. type="date"
  299. placeholder="开始日期"
  300. >
  301. </el-date-picker>
  302. <span style="margin:0 10px">至</span>
  303. <el-date-picker
  304. :editable="false"
  305. :clearable="false"
  306. :picker-options="pickerOptions"
  307. v-model="form.saleDateEnd"
  308. type="date"
  309. placeholder="结束日期"
  310. >
  311. </el-date-picker>
  312. </el-form-item>
  313. <!-- <el-form-item
  314. label="是否限制预售范围"
  315. prop="isSalePreLimit"
  316. >
  317. <el-switch
  318. v-model="form.isSalePreLimit"
  319. :active-value="1"
  320. :inactive-value="0"
  321. active-text="限制"
  322. inactive-text="不限">
  323. </el-switch>
  324. </el-form-item>
  325. <el-form-item
  326. label="预售范围"
  327. prop="saleMaxPreDays"
  328. >
  329. <div class="item">
  330. 最大预售
  331. <el-input-number
  332. controls-position="right"
  333. v-model="form.saleMaxPreDays"
  334. :min="0"
  335. :step="1"
  336. ></el-input-number>
  337. 天以内的
  338. </div>
  339. <div class="item">
  340. 最小需提前
  341. <el-input-number
  342. controls-position="right"
  343. v-model="form.saleMinPreDays"
  344. :min="0"
  345. :step="1"
  346. ></el-input-number>
  347. 天预定(0 代表可订当日)
  348. </div>
  349. </el-form-item>
  350. <el-form-item
  351. label="是否限制下单数量"
  352. prop="isSaleNumsLimit"
  353. >
  354. <el-switch
  355. v-model="form.isSaleNumsLimit"
  356. :active-value="1"
  357. :inactive-value="0"
  358. active-text="限制"
  359. inactive-text="不限">
  360. </el-switch>
  361. </el-form-item>
  362. <el-form-item
  363. label="起订数"
  364. prop="saleMinNums"
  365. >
  366. <div class="item">
  367. 单订单最小起订数
  368. <el-input-number
  369. controls-position="right"
  370. v-model="form.saleMinNums"
  371. :min="0"
  372. :step="1"
  373. ></el-input-number>
  374. </div>
  375. <div class="item">
  376. 单订单最大起订数
  377. <el-input-number
  378. controls-position="right"
  379. v-model="form.saleMaxNums"
  380. :min="0"
  381. :step="1"
  382. ></el-input-number>
  383. </div>
  384. </el-form-item> -->
  385. <el-form-item
  386. verify
  387. label="核销凭证"
  388. prop="checkType"
  389. >
  390. <el-checkbox-group v-model="form.checkType">
  391. <el-checkbox
  392. label="qrcode">
  393. 二维码
  394. </el-checkbox>
  395. <el-checkbox
  396. label="idcard">
  397. 证件号
  398. </el-checkbox>
  399. <el-checkbox
  400. label="face">
  401. 人脸
  402. </el-checkbox>
  403. <el-checkbox
  404. label="card">
  405. IC卡
  406. </el-checkbox>
  407. </el-checkbox-group>
  408. </el-form-item>
  409. <el-form-item
  410. verify
  411. label="核销规则"
  412. prop="checkRule"
  413. >
  414. <el-checkbox-group v-model="form.checkRule">
  415. <el-checkbox
  416. label="1">
  417. 人工,检票设备核销
  418. </el-checkbox>
  419. <el-checkbox
  420. label="2">
  421. 取票即核销
  422. </el-checkbox>
  423. <el-checkbox
  424. label="3">
  425. 购买即核销
  426. </el-checkbox>
  427. </el-checkbox-group>
  428. </el-form-item>
  429. <el-form-item
  430. verify
  431. label="批量核销"
  432. prop="batchCheckRule"
  433. >
  434. <el-radio
  435. v-model="form.batchCheckRule"
  436. label="single">
  437. 单次核销
  438. </el-radio>
  439. <el-radio
  440. v-model="form.batchCheckRule"
  441. label="batch">
  442. 当票可以使用多次时,一次核销完成
  443. </el-radio>
  444. </el-form-item>
  445. <el-form-item
  446. label="核销语音"
  447. prop="checkVoice"
  448. >
  449. <el-input v-model="form.checkVoice">
  450. </el-input>
  451. <el-tag type="warning" style="margin-left: 10px;">如果为空 默认播报票种名称</el-tag>
  452. </el-form-item>
  453. <el-form-item
  454. verify
  455. label="星期检票规则"
  456. prop="useDayOfWeek"
  457. >
  458. <el-checkbox-group v-model="form.useDayOfWeek">
  459. <el-checkbox label="2">
  460. 星期一
  461. </el-checkbox>
  462. <el-checkbox label="3">
  463. 星期二
  464. </el-checkbox>
  465. <el-checkbox label="4">
  466. 星期三
  467. </el-checkbox>
  468. <el-checkbox label="5">
  469. 星期四
  470. </el-checkbox>
  471. <el-checkbox label="6">
  472. 星期五
  473. </el-checkbox>
  474. <el-checkbox label="7">
  475. 星期六
  476. </el-checkbox>
  477. <el-checkbox label="1">
  478. 星期日
  479. </el-checkbox>
  480. </el-checkbox-group>
  481. </el-form-item>
  482. <el-form-item
  483. verify
  484. label="票种绑定的销售渠道"
  485. prop="source"
  486. >
  487. <el-checkbox-group v-model="form.source">
  488. <el-checkbox
  489. label="window">
  490. 窗口
  491. </el-checkbox>
  492. <el-checkbox
  493. label="term">
  494. 自助机
  495. </el-checkbox>
  496. </el-checkbox-group>
  497. </el-form-item>
  498. <el-form-item
  499. verify
  500. label="是否可以退订"
  501. prop="isAllowCancel"
  502. >
  503. <el-switch
  504. v-model="form.isAllowCancel"
  505. :active-value="1"
  506. :inactive-value="0"
  507. active-text="可以"
  508. inactive-text="不可以">
  509. </el-switch>
  510. </el-form-item>
  511. <el-form-item
  512. verify
  513. label="是否必须换票使用"
  514. prop="isNeedPrint"
  515. >
  516. <el-switch
  517. v-model="form.isNeedPrint"
  518. :active-value="1"
  519. :inactive-value="0"
  520. active-text="需要"
  521. inactive-text="不限">
  522. </el-switch>
  523. </el-form-item>
  524. <el-form-item
  525. verify
  526. label="过期操作"
  527. prop="outOfDateDeal"
  528. >
  529. <el-radio
  530. v-model="form.outOfDateDeal"
  531. :label="1">
  532. 人工处理
  533. </el-radio>
  534. <el-radio
  535. v-model="form.outOfDateDeal"
  536. :label="2">
  537. 自动核销
  538. </el-radio>
  539. </el-form-item>
  540. <template v-if="form.category === 'batch' && dialogType !== 'add'">
  541. <div class="block-title">
  542. 时间场次
  543. </div>
  544. <div>
  545. <div class="btn-wrap-left">
  546. <!-- <el-button
  547. plain
  548. class="add-btn"
  549. type="primary"
  550. @click="handleAddBachConfig">
  551. 增加
  552. </el-button> -->
  553. </div>
  554. <div class="table-box">
  555. <el-tag type="warning">场次时间默认不限制为-1</el-tag>
  556. <el-table
  557. border
  558. stripe
  559. :data="form.batchConfigList">
  560. <el-table-column
  561. label="场次名称"
  562. prop="name">
  563. <!-- <template slot-scope="scope">
  564. <el-input
  565. v-model="scope.row.name"
  566. style="width: 95%"></el-input>
  567. </template> -->
  568. </el-table-column>
  569. <el-table-column
  570. label="开始时间"
  571. prop="startTime">
  572. <!-- <template slot-scope="scope">
  573. <el-time-picker
  574. arrow-control
  575. style="width: 95%"
  576. v-model="scope.row.startTime"
  577. format="HH:mm:ss"
  578. value-format="HH:mm:ss"
  579. placeholder="开始时间">
  580. </el-time-picker>
  581. </template> -->
  582. </el-table-column>
  583. <el-table-column
  584. label="结束时间"
  585. prop="endTime">
  586. <!-- <template slot-scope="scope">
  587. <el-time-picker
  588. arrow-control
  589. v-model="scope.row.endTime"
  590. style="width: 95%"
  591. format="HH:mm:ss"
  592. value-format="HH:mm:ss"
  593. placeholder="结束时间">
  594. </el-time-picker>
  595. </template> -->
  596. </el-table-column>
  597. <el-table-column
  598. label="开场后X分钟停止售票"
  599. prop="saleStopMinutes">
  600. <!-- <template slot-scope="scope">
  601. <el-input-number
  602. controls-position="right"
  603. style="width: 95%"
  604. :min="-1"
  605. :precision="0"
  606. v-model="scope.row.saleStopMinutes"
  607. ></el-input-number>
  608. </template> -->
  609. </el-table-column>
  610. <el-table-column
  611. label="开场前X分钟停止退票"
  612. prop="cancelStopBeforeStartMinutes"
  613. min-width="90">
  614. <!-- <template slot-scope="scope">
  615. <el-input-number
  616. controls-position="right"
  617. style="width: 95%"
  618. :min="-1"
  619. :precision="0"
  620. v-model="scope.row.cancelStopBeforeStartMinutes"
  621. ></el-input-number>
  622. </template> -->
  623. </el-table-column>
  624. <el-table-column
  625. label="开场后X分钟停止退票"
  626. prop="cancelStopAfterStartMinutes"
  627. min-width="90">
  628. <!-- <template slot-scope="scope">
  629. <el-input-number
  630. controls-position="right"
  631. style="width: 95%"
  632. :min="-1"
  633. :precision="0"
  634. v-model="scope.row.cancelStopAfterStartMinutes"
  635. ></el-input-number>
  636. </template> -->
  637. </el-table-column>
  638. <el-table-column
  639. label="开场前X分钟允许检票入场"
  640. prop="preCheckMinutes"
  641. min-width="90">
  642. <!-- <template slot-scope="scope">
  643. <el-input-number
  644. controls-position="right"
  645. style="width: 95%"
  646. :min="-1"
  647. :precision="0"
  648. v-model="scope.row.preCheckMinutes"
  649. ></el-input-number>
  650. </template> -->
  651. </el-table-column>
  652. <el-table-column
  653. label="开场后X分钟停止检票"
  654. prop="stopCheckMinutes"
  655. min-width="90">
  656. <!-- <template slot-scope="scope">
  657. <el-input-number
  658. controls-position="right"
  659. style="width: 95%"
  660. :min="-1"
  661. :precision="0"
  662. v-model="scope.row.stopCheckMinutes"
  663. ></el-input-number>
  664. </template> -->
  665. </el-table-column>
  666. <el-table-column
  667. label="无座位时的最大数量"
  668. prop="maxSaleNums"
  669. min-width="90">
  670. <!-- <template slot-scope="scope">
  671. <el-input-number
  672. controls-position="right"
  673. style="width: 95%"
  674. :min="-1"
  675. :precision="0"
  676. v-model="scope.row.maxSaleNums"
  677. ></el-input-number>
  678. </template> -->
  679. </el-table-column>
  680. <!-- <el-table-column
  681. width="110"
  682. class-name="align-item"
  683. label="操作">
  684. <template slot-scope="scope">
  685. <span
  686. class="el-button el-button--primary el-button--small"
  687. @click="deleteBachConfig(scope.$index, scope.row)">
  688. <i class="el-icon-delete"></i>
  689. 删除
  690. </span>
  691. </template>
  692. </el-table-column> -->
  693. </el-table>
  694. </div>
  695. </div>
  696. </template>
  697. <div class="block-title">
  698. 添加适用景点
  699. </div>
  700. <div>
  701. <el-tag type="warning" style="margin-left: 10px;">景点检票次数不限制为-1</el-tag>
  702. <div class="btn-wrap-left">
  703. <el-button
  704. plain
  705. class="add-btn"
  706. type="primary"
  707. @click="handleAdd">
  708. 添加单个
  709. </el-button>
  710. </div>
  711. <div class="table-box">
  712. <el-table
  713. border
  714. stripe
  715. :data="form.singleScenicList">
  716. <el-table-column
  717. label="适用景点">
  718. <template slot-scope="scope">
  719. <el-select
  720. v-model="scope.row.scenicId">
  721. <el-option
  722. v-for="item in scenicList"
  723. :key="item.id"
  724. :label="item.name"
  725. :value="item.id"
  726. >
  727. </el-option>
  728. </el-select>
  729. </template>
  730. </el-table-column>
  731. <el-table-column
  732. label="检票次数"
  733. min-width="90">
  734. <template slot-scope="scope">
  735. <el-input-number
  736. controls-position="right"
  737. :min="-1"
  738. :precision="0"
  739. v-model="scope.row.checkLimitTimes"
  740. ></el-input-number>
  741. </template>
  742. </el-table-column>
  743. <el-table-column
  744. label="单日限制检票次数"
  745. min-width="90">
  746. <template slot-scope="scope">
  747. <el-input-number
  748. controls-position="right"
  749. :min="-1"
  750. :precision="0"
  751. v-model="scope.row.singleDayLimitTimes"
  752. ></el-input-number>
  753. </template>
  754. </el-table-column>
  755. <el-table-column
  756. width="90"
  757. class-name="align-item"
  758. label="操作">
  759. <template slot-scope="scope">
  760. <span
  761. class="el-button el-button--primary el-button--small"
  762. @click="delScenic(scope.$index)">
  763. <i class="el-icon-delete"></i>
  764. 删除
  765. </span>
  766. </template>
  767. </el-table-column>
  768. </el-table>
  769. </div>
  770. <div class="btn-wrap-left">
  771. <el-button
  772. plain
  773. class="add-btn"
  774. type="primary"
  775. @click="handleAdd('multiple')">
  776. 添加群组
  777. </el-button>
  778. </div>
  779. <div class="table-box">
  780. <el-table
  781. border
  782. stripe
  783. :data="form.groupScenicList">
  784. <el-table-column
  785. label="适用景点">
  786. <template slot-scope="scope">
  787. <el-select
  788. v-model="scope.row.scenicId"
  789. multiple>
  790. <el-option
  791. v-for="item in scenicList"
  792. :key="item.id"
  793. :label="item.name"
  794. :value="item.id"
  795. >
  796. </el-option>
  797. </el-select>
  798. </template>
  799. </el-table-column>
  800. <el-table-column
  801. label="检票次数总和"
  802. min-width="90">
  803. <template slot-scope="scope">
  804. <el-input-number
  805. controls-position="right"
  806. :min="-1"
  807. :precision="0"
  808. v-model="scope.row.checkLimitTimes"
  809. ></el-input-number>
  810. </template>
  811. </el-table-column>
  812. <!-- <el-table-column
  813. label="单景点检票次数"
  814. min-width="90">
  815. <template slot-scope="scope">
  816. <el-input-number
  817. controls-position="right"
  818. :min="-1"
  819. :precision="0"
  820. v-model="scope.row.scenicLimitTimes"
  821. ></el-input-number>
  822. </template>
  823. </el-table-column> -->
  824. <el-table-column
  825. width="210"
  826. class-name="align-item"
  827. label="操作">
  828. <template slot-scope="scope">
  829. <div style="display:flex">
  830. <span
  831. class="el-button el-button--primary el-button--small"
  832. @click="setSceneTimes(scope.$index, scope.row)">
  833. <i class="el-icon-edit-outline"></i>
  834. 分配次数
  835. </span>
  836. <span
  837. class="el-button el-button--primary el-button--small"
  838. @click="delScenic(scope.$index, 'multiple')">
  839. <i class="el-icon-delete"></i>
  840. 删除
  841. </span>
  842. </div>
  843. </template>
  844. </el-table-column>
  845. </el-table>
  846. </div>
  847. </div>
  848. <div class="block-title">
  849. 添加工商银行子商户
  850. </div>
  851. <div>
  852. <div class="btn-wrap-left">
  853. <el-button
  854. plain
  855. class="add-btn"
  856. type="primary"
  857. @click="handleAddGhSubMerchant">
  858. 添加
  859. </el-button>
  860. </div>
  861. <div class="table-box">
  862. <el-table
  863. border
  864. stripe
  865. :data="form.payGonghangTicketTypeMerchantList">
  866. <el-table-column
  867. label="工行子商户">
  868. <template slot-scope="scope">
  869. <el-select
  870. v-model="scope.row.gonghangMerchantId">
  871. <el-option
  872. v-for="item in ghSubMerchantList"
  873. :key="item.id"
  874. :label="item.name"
  875. :value="item.id"
  876. >
  877. </el-option>
  878. </el-select>
  879. </template>
  880. </el-table-column>
  881. <el-table-column
  882. label="分账比例"
  883. min-width="90">
  884. <template slot-scope="scope">
  885. <el-input-number
  886. controls-position="right"
  887. :min="0"
  888. :max="100"
  889. v-model="scope.row.splitRatio"
  890. ></el-input-number>
  891. <span class="unit" style="margin-left: 20px; font-size: 16px;">{{ scope.row.splitRatio * 100 }}%</span>
  892. </template>
  893. </el-table-column>
  894. <el-table-column
  895. label="固定金额"
  896. min-width="90">
  897. <template slot-scope="scope">
  898. <el-input-number
  899. controls-position="right"
  900. :min="0"
  901. v-model="scope.row.fixedAmount"
  902. ></el-input-number>
  903. <Tip msg="避免小数点情况 优先按照固定金额计算分账金额否则按照分账比例" style="margin-left: 10px;"></Tip>
  904. </template>
  905. </el-table-column>
  906. <el-table-column
  907. width="90"
  908. class-name="align-item"
  909. label="操作">
  910. <template slot-scope="scope">
  911. <span
  912. class="el-button el-button--primary el-button--small"
  913. @click="delGhSubMerchant(scope.$index)">
  914. <i class="el-icon-delete"></i>
  915. 删除
  916. </span>
  917. </template>
  918. </el-table-column>
  919. </el-table>
  920. </div>
  921. </div>
  922. <div class="block-title">
  923. 添加发票销售方
  924. </div>
  925. <div>
  926. <div class="btn-wrap-left">
  927. <el-button
  928. plain
  929. class="add-btn"
  930. type="primary"
  931. @click="handleAddInvoiceSeller">
  932. 添加
  933. </el-button>
  934. </div>
  935. <div class="table-box">
  936. <el-table
  937. border
  938. stripe
  939. :data="form.ticketTypeInvoiceSellerList">
  940. <el-table-column
  941. label="销售方">
  942. <template slot-scope="scope">
  943. <el-select
  944. v-model="scope.row.invoiceSellerId">
  945. <el-option
  946. v-for="item in invoiceSellerList"
  947. :key="item.id"
  948. :label="item.invoiceSellerName"
  949. :value="item.id"
  950. >
  951. </el-option>
  952. </el-select>
  953. </template>
  954. </el-table-column>
  955. <el-table-column
  956. label="分账比例"
  957. min-width="90">
  958. <template slot-scope="scope">
  959. <el-input-number
  960. controls-position="right"
  961. :min="0"
  962. :max="1"
  963. v-model="scope.row.splitRatio"
  964. ></el-input-number>
  965. <span class="unit" style="margin-left: 20px; font-size: 16px;">{{ scope.row.splitRatio * 100 }}%</span>
  966. </template>
  967. </el-table-column>
  968. <el-table-column
  969. label="固定金额"
  970. min-width="90">
  971. <template slot-scope="scope">
  972. <el-input-number
  973. controls-position="right"
  974. :min="0"
  975. v-model="scope.row.fixedAmount"
  976. ></el-input-number>
  977. <Tip msg="避免小数点情况 优先按照固定金额计算分账金额否则按照分账比例" style="margin-left: 10px;"></Tip>
  978. </template>
  979. </el-table-column>
  980. <el-table-column
  981. width="90"
  982. class-name="align-item"
  983. label="操作">
  984. <template slot-scope="scope">
  985. <span
  986. class="el-button el-button--primary el-button--small"
  987. @click="delInvoiceSeller(scope.$index)">
  988. <i class="el-icon-delete"></i>
  989. 删除
  990. </span>
  991. </template>
  992. </el-table-column>
  993. </el-table>
  994. </div>
  995. </div>
  996. <div class="block-title">
  997. 添加分账子景点
  998. </div>
  999. <div>
  1000. <div class="btn-wrap-left">
  1001. <el-button
  1002. plain
  1003. class="add-btn"
  1004. type="primary"
  1005. @click="handleAddScenicSplit">
  1006. 添加
  1007. </el-button>
  1008. </div>
  1009. <div class="table-box">
  1010. <el-table
  1011. border
  1012. stripe
  1013. :data="form.ticketTypeScenicSplitRequests">
  1014. <el-table-column
  1015. label="适用景点">
  1016. <template slot-scope="scope">
  1017. <el-select
  1018. v-model="scope.row.scenicId">
  1019. <el-option
  1020. v-for="item in scenicList"
  1021. :key="item.id"
  1022. :label="item.name"
  1023. :value="item.id"
  1024. >
  1025. </el-option>
  1026. </el-select>
  1027. </template>
  1028. </el-table-column>
  1029. <el-table-column
  1030. label="应分金额"
  1031. min-width="90">
  1032. <template slot-scope="scope">
  1033. <el-input-number
  1034. controls-position="right"
  1035. :min="0"
  1036. v-model="scope.row.price"
  1037. ></el-input-number>
  1038. </template>
  1039. </el-table-column>
  1040. <el-table-column
  1041. width="90"
  1042. class-name="align-item"
  1043. label="操作">
  1044. <template slot-scope="scope">
  1045. <span
  1046. class="el-button el-button--primary el-button--small"
  1047. @click="delScenicSplit(scope.$index)">
  1048. <i class="el-icon-delete"></i>
  1049. 删除
  1050. </span>
  1051. </template>
  1052. </el-table-column>
  1053. </el-table>
  1054. </div>
  1055. </div>
  1056. </div>
  1057. <div class="dialog-btn-wrap">
  1058. <el-button
  1059. @click="handleClose">
  1060. 取消
  1061. </el-button>
  1062. <el-button
  1063. @click="reset"
  1064. v-if="dialogType === 'add'">
  1065. 重置
  1066. </el-button>
  1067. <el-button
  1068. @click="submit"
  1069. type="primary">
  1070. 保存
  1071. </el-button>
  1072. </div>
  1073. </el-form>
  1074. </el-scrollbar>
  1075. <el-dialog
  1076. :visible.sync="setTimeVisible"
  1077. title="分配次数"
  1078. append-to-body
  1079. @close="handleGroupTimeClose">
  1080. <div class="table-box">
  1081. <el-table
  1082. border
  1083. stripe
  1084. :data="currGroupScenicInfo">
  1085. <el-table-column
  1086. label="景点">
  1087. <template slot-scope="scope">
  1088. {{ scope.row.scenicName }}
  1089. </template>
  1090. </el-table-column>
  1091. <el-table-column
  1092. label="单个景点的检票次数"
  1093. min-width="90">
  1094. <template slot-scope="scope">
  1095. <el-input-number
  1096. controls-position="right"
  1097. :min="-1"
  1098. :precision="0"
  1099. v-model="scope.row.scenicLimitTimes"
  1100. ></el-input-number>
  1101. </template>
  1102. </el-table-column>
  1103. <el-table-column
  1104. label="单日限制检票次数"
  1105. min-width="90">
  1106. <template slot-scope="scope">
  1107. <el-input-number
  1108. controls-position="right"
  1109. :min="-1"
  1110. :precision="0"
  1111. v-model="scope.row.singleDayLimitTimes"
  1112. ></el-input-number>
  1113. </template>
  1114. </el-table-column>
  1115. </el-table>
  1116. </div>
  1117. <div
  1118. slot="footer"
  1119. class="dialog-btn-wrap">
  1120. <el-button
  1121. @click="handleGroupTimeClose">
  1122. 取消
  1123. </el-button>
  1124. <el-button
  1125. @click="handleGroupTimeSubmit"
  1126. type="primary">
  1127. 确定
  1128. </el-button>
  1129. </div>
  1130. </el-dialog>
  1131. </el-dialog>
  1132. </template>
  1133. <script>
  1134. import { addTicket, updateTicket, queueList, batchUpdateTicketBatch, delTicketBatch } from '@/api/ticketType'
  1135. import { getGhSubMerchantList } from '@/api/payChannel'
  1136. import { getInvoiceSellerList } from '@/api/invoice'
  1137. import { getLabelName } from '@/utils'
  1138. import { cloneDeep } from 'lodash'
  1139. import moment from 'moment'
  1140. const defaultForm = {
  1141. category: 'ticket', // 大类
  1142. name: '', // 名称
  1143. isSale: 1, // 在售状态 0为禁售 1为在售 默认为1
  1144. isSupportInvoice:1, // 是否支持发票 0为不支持 1为支持 默认为1
  1145. price: '', // 窗口价格
  1146. onlinePrice: 0, // 线上价格
  1147. highPrice: 0, // 虚拟高价(划线价格)
  1148. memberUseDateType: 1, // 会员时长类型 1【按天】:购买后多少天的有效期 由票种字段use_days生效 。2【按照使用日期】:固定某个时间期内可以用
  1149. memberActiveType: 1, // 激活方式:【1:购买即激活】 该年卡购买了就开始递减天数。【2:首次使用激活】:第一次用了之后才开始递减时间,示例值(1)
  1150. useDays: 1, // 使用天数 默认为1天 如果是年卡次卡 且会员卡的时长类型是按天数的 该值代表会员卡的时长天数 比如365 该值必须大于1 否则该值为0
  1151. // validityUseDays: 0, // 期票模式下第一种情况 自购买日起X天内可使用 X必须大于0
  1152. // isUseDateLimit: 1, // 是否限制使用日期 0为不限 1为限制 默认为0 如果限制 必须指定使用日期 期票模式下且不是购买日情况下必须指定
  1153. useDateStart: moment().format('YYYY-MM-DD'), // 使用日期开始
  1154. useDateEnd: moment().add(10, 'years').format('YYYY-MM-DD'), // 使用日期结束
  1155. isRealName: 0, // 是否需要实名认证 0为不需要 1为需要 默认为0
  1156. realNameType: 1, // 在实名制购票下 1 【一证一人】:购买两张票需要两张实名。2【一证多人】:购买多张只需要一人实名
  1157. buyProtocol: '', // 预定协议 富文本
  1158. isAgreeProtocol: 0, // 是否必须同意预定协议才可以购买 开启为1 默认为0
  1159. isSaleDateLimit: 1, // 是否限制售卖日期 0为不限 1为限制 默认为0 如果限制 必须指定售卖时间
  1160. saleDateStart: moment().format('YYYY-MM-DD'), // 售卖时间开始
  1161. saleDateEnd: moment().add(10, 'years').format('YYYY-MM-DD'), // 售卖时间结束
  1162. isSalePreLimit: 0, // 是否限制预售范围 0为不限 1为限制 默认为0 如果限制 必须指定预售范围
  1163. saleMaxPreDays: 365, // 预售范围 最大预售X天以内的 默认为365 代表可预定一整年
  1164. saleMinPreDays: 0, // 预售范围 最小需提前X天预定 默认为0 代表可订当日
  1165. isSaleNumsLimit: 0, // 是否限制下单数量 0为不限 1为限制 默认为0 如果限制 必须指定下单数量
  1166. saleMinNums: 0, // 单订单最小起订数
  1167. saleMaxNums: 0, // 单订单最大起订数
  1168. checkType: ['qrcode', 'idcard'], // 核销凭证 qrcode 二维码 idcard 证件号 face 人脸 多选用逗号分隔,示例值(qrcode,idcard)
  1169. checkRule: ['1'], // 核销规则 1人工,检票设备核销 2取票即核销 3购买即核销 多选用逗号分隔,示例值(1,2)
  1170. batchCheckRule: 'single', // 批量核销规则 single-代表单次核销 batch-代表当票可以使用多次时,一次核销完
  1171. checkVoice: '', // 核销语音 如果为空 默认播报票种名称
  1172. useDayOfWeek: ['1', '2', '3', '4', '5', '6', '7'], // 指定周几可以用 逗号分隔 1表示周日,2表示周一 依次类推,示例值(1,2,3,4,5,6,7)
  1173. isAllowCancel: 1, // 是否允许取消订单 0为不允许 1为允许 默认为1
  1174. isNeedPrint: 0, // 是否必须换票使用 默认为0 不限 否则需要门票取票打印后才可以核销
  1175. outOfDateDeal: 1, // 过期操作 1人工处理 2自动核销 默认为1,示例值(1)
  1176. singleScenicList: [], // 包含项目-单个景点数组
  1177. groupScenicList: [], // 包含项目-组合景点数组 二维数组结构
  1178. batchConfigList: [], // 批次配置数组
  1179. ticketTypeScenicList: [], // 票种绑定的景点数组
  1180. source: ['window', 'term'], // 票种绑定的销售渠道 窗口:window ; 自助机:term,示例值([window])
  1181. useDateType: 1, // 使用日期类型 1日历票 2期票 默认为1
  1182. useDaysDelayType:1, // 使用日期截止类型 1按使用日期截止 2按使用天数截止 默认为1
  1183. payGonghangTicketTypeMerchantList: [], // 工行子商户列表
  1184. ticketTypeInvoiceSellerList: [], // 发票销售方列表
  1185. ticketTypeScenicSplitRequests: [] // 子分账景点
  1186. }
  1187. export default {
  1188. computed: {
  1189. scenicName () {
  1190. return this.$localStore.get('scenicName') || this.$store.state.user.scenicName
  1191. },
  1192. ticketCategory () {
  1193. return this.$store.state.app.ticketCategory
  1194. }
  1195. },
  1196. props: {
  1197. memberTypeList: {
  1198. type: Array,
  1199. default: () => []
  1200. },
  1201. // ticketItem: {
  1202. // type: Object,
  1203. // default: () => {}
  1204. // },
  1205. // dialogType: {
  1206. // type: String,
  1207. // default: ''
  1208. // },
  1209. scenicList: {
  1210. type: Array,
  1211. default: () => []
  1212. },
  1213. ticketTagList: {
  1214. type: Array,
  1215. default: () => []
  1216. },
  1217. invoiceSeller: {
  1218. type: Array,
  1219. default: () => []
  1220. }
  1221. },
  1222. data () {
  1223. return {
  1224. ticketItem: {},
  1225. dialogType: 'add',
  1226. projectName: process.env.VUE_APP_PROJECT,
  1227. visible: false,
  1228. pickerOptions: {
  1229. disabledDate: (theTime) => {
  1230. let startTime = moment().format('YYYY-MM-DD') + ' 00:00:00'
  1231. return moment(theTime).isBefore(startTime)
  1232. }
  1233. },
  1234. dialogVisible: false,
  1235. originRecord: {},
  1236. currentRecord: {},
  1237. man: 0, // 满x
  1238. jian: 0, // 减y
  1239. queueList: [],
  1240. inputVisible: false,
  1241. inputValue: [],
  1242. form: defaultForm,
  1243. batchConfig: {
  1244. name: '', // 批次名称
  1245. startTime: '', // 批次开始时间
  1246. endTime: '', // 批次结束时间
  1247. saleStopMinutes: -1, // 售卖截止时间
  1248. cancelStopBeforeStartMinutes: -1, // 取消截止时间
  1249. cancelStopAfterStartMinutes: -1, // 取消截止时间
  1250. preCheckMinutes: -1, // 预检时间
  1251. stopCheckMinutes: -1, // 停止检票时间
  1252. maxSaleNums: -1 // 最大售卖数量
  1253. },
  1254. setTimeVisible: false,
  1255. groupIndex: -1,
  1256. currGroupScenicInfo: [],
  1257. groupScenicMap: new Map(),
  1258. ghSubMerchantList: [], // 工行子商户列表
  1259. invoiceSellerList: [] // 发票销售方列表
  1260. }
  1261. },
  1262. watch: {
  1263. // 'form.memberType' (val) {
  1264. // console.log(val)
  1265. // this.form.name = val && val.name
  1266. // this.form.price = val && val.capital
  1267. // },
  1268. 'form.category' (val) {
  1269. if (val === 'member') {
  1270. this.form.useDays = 365
  1271. } else {
  1272. this.form.useDays = 1
  1273. }
  1274. },
  1275. // 满x减y
  1276. 'man': function (newVal, oldVal) {
  1277. this.updateDiscountRule()
  1278. },
  1279. 'jian': function (newVal, oldVal) {
  1280. this.updateDiscountRule()
  1281. }
  1282. },
  1283. methods: {
  1284. show (ticketItem, type) {
  1285. // this.reset()
  1286. this.ticketItem = ticketItem
  1287. this.dialogType = type
  1288. if (ticketItem) {
  1289. this.form = cloneDeep(ticketItem)
  1290. this.form.source = ticketItem.source || []
  1291. this.form.useDayOfWeek = this.form.useDayOfWeek.split(',')
  1292. this.form.checkType = this.form.checkType.split(',')
  1293. this.form.checkRule = this.form.checkRule.split(',')
  1294. if (!this.form.source) {
  1295. this.form.source = []
  1296. }
  1297. if (!this.form.ticketTypeScenicList) {
  1298. this.form.ticketTypeScenicList = []
  1299. }
  1300. if (!this.form.singleScenicList) {
  1301. this.form.singleScenicList = []
  1302. }
  1303. if (!this.form.groupScenicList) {
  1304. this.form.groupScenicList = []
  1305. }
  1306. if (!this.form.batchConfigList) {
  1307. this.form.batchConfigList = []
  1308. }
  1309. if (!this.form.payGonghangTicketTypeMerchantList) {
  1310. this.form.payGonghangTicketTypeMerchantList = []
  1311. }
  1312. if (!this.form.ticketTypeInvoiceSellerList) {
  1313. this.form.ticketTypeInvoiceSellerList = []
  1314. }
  1315. if (!this.form.ticketTypeScenicSplitRequests) {
  1316. this.form.ticketTypeScenicSplitRequests = []
  1317. }
  1318. let groupFlag = ''
  1319. let groupIndex = 0
  1320. this.form.ticketTypeScenicList.forEach(item => {
  1321. if (!item.groupFlag) {
  1322. this.form.singleScenicList.push({
  1323. scenicId: item.scenicId,
  1324. checkLimitTimes: item.checkLimitTimes,
  1325. singleDayLimitTimes: item.singleDayLimitTimes
  1326. })
  1327. } else {
  1328. if (groupFlag !== item.groupFlag) {
  1329. groupFlag = item.groupFlag
  1330. groupIndex += 1
  1331. this.form.groupScenicList.push({
  1332. scenicId: [item.scenicId],
  1333. checkLimitTimes: item.checkLimitTimes,
  1334. scenicLimitTimes: item.scenicLimitTimes,
  1335. singleDayLimitTimes: item.singleDayLimitTimes
  1336. })
  1337. } else {
  1338. this.form.groupScenicList[groupIndex - 1].scenicId.push(item.scenicId)
  1339. }
  1340. }
  1341. })
  1342. }
  1343. // 复制票种功能
  1344. if (this.dialogType === 'add' && this.ticketItem) {
  1345. // '创建票种失败,名称或助记符重复' 需要在此之前去掉名称和助记符,待复制时用户填入
  1346. this.codeCopyFromVisibleEdit() // 执行与edit一样的操作,要确保传过来的ticketItem把ID信息去了
  1347. }
  1348. if (typeof this.form.requiredField === 'string') {
  1349. this.form.requiredField = JSON.parse(this.form.requiredField)
  1350. } else {
  1351. this.form.requiredField = []
  1352. }
  1353. if (this.form && this.form.discountRule) {
  1354. // 初始化满减
  1355. let result = this.parseDiscountRule(this.form.discountRule)
  1356. this.man = result ? result.man : this.man
  1357. this.jian = result ? result.jian : this.jian
  1358. }
  1359. if (this.projectName === 'hangzhousuodao') {
  1360. this.getQueue()
  1361. }
  1362. this.getGhSubMerchantList()
  1363. this.getInvoiceSellerList()
  1364. this.visible = true
  1365. },
  1366. async getGhSubMerchantList () {
  1367. // 获取工行子商户列表
  1368. const res = await getGhSubMerchantList()
  1369. this.ghSubMerchantList = res.data || []
  1370. },
  1371. async getInvoiceSellerList () {
  1372. // 获取发票销售方列表
  1373. const res = await getInvoiceSellerList()
  1374. this.invoiceSellerList = res.data || []
  1375. },
  1376. updateDiscountRule: function () {
  1377. let man = parseInt(this.man)
  1378. let jian = parseInt(this.jian)
  1379. let form = this.form
  1380. form.discountRule = '满' + man + '减' + jian
  1381. },
  1382. // 从满10减1这种字符串里提取出10和1
  1383. parseDiscountRule (discountRule) {
  1384. let pattern = /满(\d+)减(\d+)/ // 定义正则表达式
  1385. let match = discountRule.match(pattern) // 使用 match() 方法匹配字符串
  1386. if (match) {
  1387. let man = parseInt(match[1]) // 第一个括号中的数字为满减条件
  1388. let jian = parseInt(match[2]) // 第二个括号中的数字为满减金额
  1389. return { man, jian }
  1390. }
  1391. return null // 如果匹配失败,则返回 null
  1392. },
  1393. getLabelName,
  1394. // isScenicDisabled (id) {
  1395. // return this.form.singleScenicList.some(s => s.scenicId === id)
  1396. // },
  1397. handleClose () {
  1398. this.visible = false
  1399. this.reset()
  1400. this.$emit('updateList')
  1401. },
  1402. reset () {
  1403. this.$refs.form.resetFields()
  1404. this.form = { ...defaultForm }
  1405. this.form.singleScenicList = []
  1406. this.form.groupScenicList = []
  1407. },
  1408. handleMemberChange (e) {
  1409. let target = this.memberTypeList.find(i => i.id === e)
  1410. this.form.price = target.capital
  1411. this.form.name = target.name
  1412. },
  1413. // 增加 适用景点-检票次数
  1414. handleAdd (type) {
  1415. if (type === 'multiple') {
  1416. this.form.groupScenicList.push({
  1417. scenicId: [],
  1418. checkLimitTimes: 1,
  1419. singleDayLimitTimes: -1,
  1420. scenicLimitTimes: -1
  1421. })
  1422. } else {
  1423. this.form.singleScenicList.push({
  1424. scenicId: '',
  1425. checkLimitTimes: 1,
  1426. singleDayLimitTimes: -1,
  1427. scenicLimitTimes: -1
  1428. })
  1429. }
  1430. },
  1431. handleAddGhSubMerchant () {
  1432. this.form.payGonghangTicketTypeMerchantList.push({
  1433. gonghangMerchantId: '',
  1434. splitRatio: 0,
  1435. fixedAmount: ''
  1436. })
  1437. },
  1438. delGhSubMerchant (index) {
  1439. this.form.payGonghangTicketTypeMerchantList.splice(index, 1)
  1440. },
  1441. handleAddInvoiceSeller () {
  1442. this.form.ticketTypeInvoiceSellerList.push({
  1443. invoiceSellerId: '',
  1444. splitRatio: 0,
  1445. fixedAmount: ''
  1446. })
  1447. },
  1448. delInvoiceSeller (index) {
  1449. this.form.ticketTypeInvoiceSellerList.splice(index, 1)
  1450. },
  1451. handleAddScenicSplit () {
  1452. this.form.ticketTypeScenicSplitRequests.push({
  1453. scenicId: '',
  1454. price: 0
  1455. })
  1456. },
  1457. delScenicSplit (index) {
  1458. this.form.ticketTypeScenicSplitRequests.splice(index, 1)
  1459. },
  1460. setSceneTimes (idx, item) {
  1461. if (!item || !item.scenicId || !item.scenicId.length) {
  1462. return this.$message.error('请先添加适用景点')
  1463. }
  1464. this.groupIndex = idx
  1465. const groupScenic = this.groupScenicMap.get(idx)
  1466. if (groupScenic) {
  1467. this.currGroupScenicInfo = groupScenic
  1468. } else {
  1469. this.currGroupScenicInfo = []
  1470. item.scenicId.forEach(id => {
  1471. const scene = this.scenicList.find((scene) => scene.id === id)
  1472. if (scene) {
  1473. this.currGroupScenicInfo.push({
  1474. scenicId: scene.id,
  1475. scenicName: scene.name,
  1476. scenicLimitTimes: -1,
  1477. singleDayLimitTimes: -1,
  1478. checkLimitTimes: item.checkLimitTimes
  1479. })
  1480. }
  1481. })
  1482. }
  1483. this.setTimeVisible = true
  1484. },
  1485. handleGroupTimeClose () {
  1486. this.currGroupScenicInfo = []
  1487. this.setTimeVisible = false
  1488. },
  1489. handleGroupTimeSubmit () {
  1490. this.groupScenicMap.set(this.groupIndex, this.currGroupScenicInfo)
  1491. this.currGroupScenicInfo = []
  1492. this.setTimeVisible = false
  1493. },
  1494. // 删除 适用景点-检票次数
  1495. delScenic (index, type) {
  1496. if (type === 'multiple') {
  1497. this.form.groupScenicList.splice(index, 1)
  1498. } else {
  1499. this.form.singleScenicList.splice(index, 1)
  1500. }
  1501. },
  1502. isScenicValid () {
  1503. if (this.form.singleScenicList.length === 0 && this.form.groupScenicList.length === 0) {
  1504. this.$message.error('请添加适用景点')
  1505. return false
  1506. } else if (this.form.singleScenicList.some(item => !item.scenicId)) {
  1507. this.$message.error('适用景点信息错误')
  1508. return false
  1509. } else if (this.form.groupScenicList.some(item => !item.scenicId.length)) {
  1510. this.$message.error('适用景点信息错误')
  1511. return false
  1512. } else {
  1513. return true
  1514. }
  1515. },
  1516. handleAddBachConfig () {
  1517. this.form.batchConfigList.push({ ...this.batchConfig })
  1518. },
  1519. deleteBachConfig (index, row) {
  1520. if (row.id) {
  1521. this.$confirm('确定删除场次时间配置?', '提示', {
  1522. confirmButtonText: '确定',
  1523. cancelButtonText: '取消',
  1524. type: 'warning'
  1525. }).then(() => {
  1526. delTicketBatch([row.id]).then(res => {
  1527. if (res.code === '200') {
  1528. this.$message.success('删除成功')
  1529. this.form.batchConfigList.splice(index, 1)
  1530. }
  1531. })
  1532. }).catch(() => {})
  1533. } else {
  1534. this.form.batchConfigList.splice(index, 1)
  1535. }
  1536. },
  1537. async saveAllBatchConfig () {
  1538. const ticketTypeId = this.form.id
  1539. if (!ticketTypeId) {
  1540. return
  1541. }
  1542. batchUpdateTicketBatch(ticketTypeId, this.form.batchConfigList).then(res => {
  1543. if (res.code !== '200') {
  1544. this.$message.error('场次保存失败')
  1545. }
  1546. })
  1547. },
  1548. setGroupScenicConfig () {
  1549. const gsList = []
  1550. const { groupScenicList } = this.form
  1551. for (let i = 0; i < groupScenicList.length; i++) {
  1552. const item = groupScenicList[i]
  1553. const sList = this.groupScenicMap.get(i) || item.scenicId.map(scenicId => {
  1554. return {
  1555. scenicId,
  1556. checkLimitTimes: item.checkLimitTimes,
  1557. singleDayLimitTimes: item.singleDayLimitTimes || -1,
  1558. scenicLimitTimes: item.scenicLimitTimes || -1
  1559. }
  1560. })
  1561. gsList.push(sList)
  1562. }
  1563. this.form.groupScenicList = gsList
  1564. },
  1565. async submit () {
  1566. this.$refs.form.validate(valid => {
  1567. // 会员不检查景点
  1568. const {
  1569. price,
  1570. useDateStart,
  1571. useDateEnd,
  1572. isSaleDateLimit,
  1573. saleDateStart,
  1574. saleDateEnd
  1575. } = this.form
  1576. if (valid) {
  1577. if (isNaN(Number(price)) || price < 0) {
  1578. this.$message.error('请填写销售价格')
  1579. return
  1580. }
  1581. if (moment(useDateStart).isAfter(useDateEnd)) {
  1582. this.$message.error('游玩开始时间不可晚于游玩截止时间')
  1583. return
  1584. }
  1585. if (isSaleDateLimit === 1 && moment(saleDateStart).isAfter(saleDateEnd)) {
  1586. this.$message.error('起售时间不可晚于停售时间')
  1587. return
  1588. }
  1589. if (moment(useDateStart).isAfter(useDateEnd)) {
  1590. this.$message.error('游玩开始时间不可晚于游玩截止时间')
  1591. return
  1592. }
  1593. if (isSaleDateLimit === 1 && moment(saleDateEnd).isAfter(useDateEnd)) {
  1594. this.$message.error('停售时间不可晚于游玩截止时间')
  1595. return
  1596. }
  1597. if (isSaleDateLimit === 1 && moment(saleDateStart).isAfter(useDateStart)) {
  1598. this.$message.error('起售时间不可晚于游玩开始时间')
  1599. return
  1600. }
  1601. // if (category === 'batch') {
  1602. // if (batchConfigList.length === 0) {
  1603. // this.$message.error('请添加场次时间')
  1604. // return
  1605. // }
  1606. // if (batchConfigList.some(item => !item.name)) {
  1607. // this.$message.error('场次名称不能为空')
  1608. // return
  1609. // }
  1610. // if (batchConfigList.some(item => !item.startTime)) {
  1611. // this.$message.error('场次开始时间不能为空')
  1612. // return
  1613. // }
  1614. // if (batchConfigList.some(item => !item.endTime)) {
  1615. // this.$message.error('场次结束时间不能为空')
  1616. // return
  1617. // }
  1618. // }
  1619. if (!this.isScenicValid()) {
  1620. return
  1621. }
  1622. // this.saveAllBatchConfig()
  1623. // if (moment('2019-01-21 ' + this.form.useDateStart).isAfter('2019-01-21 ' + this.form.useDateEnd)) {
  1624. // this.$message.error('当日游玩开始时间不可晚于结束时间')
  1625. // return
  1626. // }
  1627. // this.form.saleDateStart = this.formatStartTime(this.form.saleDateStart)
  1628. // this.form.saleDateEnd = this.formatEndTime(this.form.saleDateEnd)
  1629. // this.form.useDateStart = this.formatStartTime(this.form.useDateStart)
  1630. // this.form.useDateEnd = this.formatEndTime(this.form.useDateEnd)
  1631. // this.form.requiredField = JSON.stringify(this.form.requiredField)
  1632. // form.useDayOfWeek.join is not a function"
  1633. this.form.price = Number(price)
  1634. this.form.useDayOfWeek = this.form.useDayOfWeek?.join(',')
  1635. this.form.checkRule = this.form.checkRule.join(',')
  1636. this.form.checkType = this.form.checkType.join(',')
  1637. this.setGroupScenicConfig()
  1638. switch (this.dialogType) {
  1639. case 'add':
  1640. this.addTicket()
  1641. break
  1642. case 'edit':
  1643. this.updateTicket()
  1644. break
  1645. }
  1646. } else {
  1647. console.log('error submit!!')
  1648. this.$message.error('请补充表单内容')
  1649. return false
  1650. }
  1651. })
  1652. },
  1653. addTicket () {
  1654. this.form.creator = this.$store.state.user.name
  1655. addTicket(this.form).then(res => {
  1656. if (res.code !== '200') {
  1657. this.$message.error(res.msg || '添加失败')
  1658. } else {
  1659. this.$message.success('添加成功')
  1660. this.reset()
  1661. this.handleClose()
  1662. this.$emit('updateList')
  1663. }
  1664. })
  1665. },
  1666. updateTicket () {
  1667. updateTicket(this.form).then(res => {
  1668. if (res.code !== '200') {
  1669. this.$message.error(res.msg || '保存失败')
  1670. } else {
  1671. this.$message.success('保存成功')
  1672. this.reset()
  1673. this.handleClose()
  1674. this.$emit('updateList')
  1675. }
  1676. })
  1677. },
  1678. showInput () {
  1679. this.inputVisible = true
  1680. },
  1681. handleInputConfirm () {
  1682. let inputValue = this.inputValue
  1683. if (inputValue.length) {
  1684. this.form.dateCheckRules.push({ useDateStart: inputValue[0], useDateEnd: inputValue[1] })
  1685. }
  1686. this.inputVisible = false
  1687. this.inputValue = []
  1688. },
  1689. getQueue () {
  1690. queueList({ pageNum: 1, pageSize: 9999 }).then(res => {
  1691. this.queueList = res?.data.list
  1692. })
  1693. },
  1694. formatStartTime (time) {
  1695. return moment(time).hour(0).minute(0).second(0).toDate()
  1696. },
  1697. formatEndTime (time) {
  1698. return moment(time).hour(23).minute(59).second(59).toDate()
  1699. },
  1700. // 从visible的edit那边抄过来的大段代码
  1701. codeCopyFromVisibleEdit () {
  1702. delete this.form.id
  1703. }
  1704. }
  1705. }
  1706. </script>
  1707. <style lang="scss">
  1708. .el-dialog {
  1709. margin-top: 5vh !important;
  1710. .form-wrap .el-input {
  1711. width: auto !important;
  1712. }
  1713. }
  1714. .el-scrollbar__wrap {
  1715. overflow-x: hidden;
  1716. }
  1717. </style>
  1718. <style scoped lang="scss">
  1719. .table-box{
  1720. width: calc(100% - 40px);
  1721. margin-top: 0;
  1722. }
  1723. .el-tag + .el-tag {
  1724. margin-left: 10px;
  1725. }
  1726. .button-new-tag {
  1727. margin-left: 10px;
  1728. height: 32px;
  1729. line-height: 30px;
  1730. padding-top: 0;
  1731. padding-bottom: 0;
  1732. }
  1733. .input-new-tag {
  1734. width: 90px;
  1735. margin-left: 10px;
  1736. vertical-align: bottom;
  1737. }
  1738. </style>