salesQuery.vue 88 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356
  1. <template>
  2. <div class="form-wrap">
  3. <el-form
  4. class="search-box"
  5. ref="form"
  6. :model="form"
  7. :inline="true"
  8. label-width="100px"
  9. >
  10. <div class="block-title">
  11. 查询条件
  12. </div>
  13. <el-form-item
  14. label="下单时间"
  15. prop="createTime">
  16. <el-date-picker
  17. v-model="form.createTime"
  18. style="width:240px"
  19. type="daterange"
  20. format="yyyy-MM-dd"
  21. range-separator="至"
  22. start-placeholder="开始日期"
  23. end-placeholder="结束日期">
  24. </el-date-picker>
  25. </el-form-item>
  26. <el-form-item
  27. label="游玩时间"
  28. prop="playDate">
  29. <el-date-picker
  30. v-model="form.playDate"
  31. style="width:240px"
  32. type="daterange"
  33. format="yyyy-MM-dd"
  34. range-separator="至"
  35. start-placeholder="开始日期"
  36. end-placeholder="结束日期">
  37. </el-date-picker>
  38. </el-form-item>
  39. <el-form-item
  40. label="关键词"
  41. prop="searchKeywords"
  42. >
  43. <ReaderInput
  44. style="width:320px !important"
  45. v-model="form.searchKeywords"
  46. placeholder="订单号/票号/游客姓名/电话/证件号"
  47. clearable
  48. @change="form.searchKeywords=$event.IDNumber,form.name=$event.Name"
  49. @input="setSearchKeywords"
  50. ></ReaderInput>
  51. </el-form-item>
  52. <el-form-item
  53. label="合作方订单号"
  54. prop="partnerOrderNo"
  55. >
  56. <el-input
  57. v-model="form.partnerOrderNo"
  58. clearable></el-input>
  59. </el-form-item>
  60. <el-form-item
  61. label="票号"
  62. prop="ticketNo"
  63. >
  64. <el-input
  65. v-model="form.ticketNo"
  66. clearable></el-input>
  67. </el-form-item>
  68. <el-form-item
  69. label="支付方式"
  70. prop="payChannelList">
  71. <el-select
  72. v-model="form.payChannelList"
  73. multiple
  74. clearable
  75. filterable>
  76. <el-option
  77. v-for="item in payChannelOptions"
  78. :key="item"
  79. :label="item"
  80. :value="item">
  81. </el-option>
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item
  85. label="销售来源"
  86. prop="otaSourceNameList">
  87. <el-select
  88. v-model="form.otaSourceNameList"
  89. multiple
  90. clearable
  91. filterable>
  92. <el-option
  93. v-for="item in otaSourceList"
  94. :key="item"
  95. :label="item"
  96. :value="item">
  97. </el-option>
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item
  101. label="订单状态"
  102. prop="orderStatus"
  103. >
  104. <el-select
  105. v-model="form.orderStatus"
  106. clearable
  107. placeholder="请选择"
  108. >
  109. <el-option
  110. label="全部"
  111. value=""></el-option>
  112. <el-option
  113. v-for="item in orderStatusDic"
  114. :key="item.value"
  115. :label="item.label"
  116. :value="item.value"
  117. >
  118. </el-option>
  119. </el-select>
  120. </el-form-item>
  121. <el-form-item
  122. label="门票状态"
  123. prop="ticketStatus"
  124. >
  125. <el-select
  126. v-model="form.ticketStatus"
  127. clearable
  128. placeholder="请选择"
  129. >
  130. <el-option
  131. label="全部"
  132. value=""></el-option>
  133. <el-option
  134. v-for="item in ticketStatusDic"
  135. :key="item.value"
  136. :label="item.label"
  137. :value="item.value"
  138. >
  139. </el-option>
  140. </el-select>
  141. </el-form-item>
  142. <el-form-item
  143. label="订单类型"
  144. prop="orderCategory"
  145. >
  146. <el-select
  147. v-model="form.orderCategory"
  148. placeholder="请选择"
  149. clearable
  150. filterable>
  151. <el-option
  152. v-for="item in orderCategories"
  153. :key="item.id"
  154. :value="item.id"
  155. :label="item.name">
  156. </el-option>
  157. </el-select>
  158. </el-form-item>
  159. <el-form-item
  160. label="票种"
  161. prop="ticketTypeIdList"
  162. >
  163. <el-select
  164. v-model="form.ticketTypeIdList"
  165. placeholder="请选择"
  166. multiple
  167. clearable
  168. filterable>
  169. <el-option
  170. v-for="item in ticketTypeList"
  171. :key="item.id"
  172. :value="item.id"
  173. :label="item.name">
  174. </el-option>
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item
  178. label="景点"
  179. prop="scenicIdList"
  180. >
  181. <el-select
  182. v-model="form.scenicIdList"
  183. placeholder="请选择"
  184. multiple
  185. clearable
  186. filterable>
  187. <el-option
  188. v-for="(item, idx) in scenicList"
  189. :key="`scene-${idx}`"
  190. :label="item.name"
  191. :value="item.id"
  192. />
  193. </el-select>
  194. </el-form-item>
  195. <el-form-item
  196. label="售票员"
  197. prop="adminIdList"
  198. >
  199. <el-select
  200. v-model="form.adminIdList"
  201. multiple
  202. clearable
  203. placeholder="请选择"
  204. filterable>
  205. <el-option
  206. v-for="item in accountList"
  207. :key="item.id"
  208. :value="item.id"
  209. :label="`${item.loginName}-${item.name}`">
  210. </el-option>
  211. </el-select>
  212. </el-form-item>
  213. <el-form-item
  214. label="售卖自助机"
  215. prop="saleTermIdList"
  216. >
  217. <el-select
  218. v-model="form.saleTermIdList"
  219. multiple
  220. clearable
  221. placeholder="请选择"
  222. filterable>
  223. <el-option
  224. v-for="item in termList"
  225. :key="item.id"
  226. :value="item.id"
  227. :label="item.name">
  228. </el-option>
  229. </el-select>
  230. </el-form-item>
  231. <el-form-item
  232. label="单价区间"
  233. prop="partnerOrderNo"
  234. >
  235. <el-input-number
  236. v-model="form.unitPriceBegin"
  237. :min="0"
  238. :step="0.01"
  239. :precision="2"></el-input-number>&nbsp;~&nbsp;
  240. <el-input-number
  241. v-model="form.unitPriceEnd"
  242. :min="0"
  243. :step="0.01"
  244. :precision="2"></el-input-number>
  245. </el-form-item>
  246. <el-form-item
  247. label="团队"
  248. prop="teamIdList"
  249. >
  250. <el-select
  251. v-model="form.teamIdList"
  252. multiple
  253. placeholder="请选择"
  254. filterable>
  255. <el-option
  256. v-for="item in teamList"
  257. :key="item.id"
  258. :label="item.name"
  259. :value="item.id">
  260. </el-option>
  261. </el-select>
  262. </el-form-item>
  263. <div class="btn-wrap">
  264. <el-button
  265. @click="reset"
  266. >
  267. 重置
  268. </el-button>
  269. <el-button
  270. :disabled="loading"
  271. type="primary"
  272. @click="getOrderList(true)"
  273. >
  274. 搜索
  275. </el-button>
  276. <el-dropdown @command="reportExport" style="margin-left: 10px;">
  277. <el-button type="primary">
  278. 导出<i class="el-icon-arrow-down el-icon--right"></i>
  279. </el-button>
  280. <el-dropdown-menu slot="dropdown">
  281. <el-dropdown-item command="order">订单级别</el-dropdown-item>
  282. <el-dropdown-item command="ticket">门票级别</el-dropdown-item>
  283. </el-dropdown-menu>
  284. </el-dropdown>
  285. <i class="el-icon-setting" style="cursor: pointer; margin-left: 10px;" title="设置显示列" @click="showColumnConfig" />
  286. </div>
  287. </el-form>
  288. <div class="table-box">
  289. <!-- <div class="block-title">
  290. 统计信息
  291. </div> -->
  292. <el-table
  293. stripe
  294. border
  295. v-loading="loading"
  296. :data="tableData">
  297. <el-table-column
  298. width="300"
  299. prop="orderNo"
  300. label="订单"
  301. fixed="left"
  302. >
  303. <template slot-scope="scope">
  304. <div
  305. class="order-info-item">
  306. <div class="label">
  307. 订单号:
  308. </div>
  309. <div class="value">
  310. {{ scope.row.orderNo }}
  311. </div>
  312. </div>
  313. <div
  314. class="order-info-item">
  315. <div class="label">
  316. 合作方订单号:
  317. </div>
  318. <div class="value">
  319. {{ scope.row.partnerOrderNo }}
  320. </div>
  321. </div>
  322. <!-- <el-tag
  323. type="primary"
  324. size="small"
  325. style="position: absolute; top: 0; right: 10px;"
  326. >
  327. {{ scope.row.firstTicketTypeName }}
  328. </el-tag> -->
  329. </template>
  330. </el-table-column>
  331. <el-table-column
  332. width="160"
  333. prop="firstTicketTypeName"
  334. show-overflow-tooltip
  335. label="票种"
  336. >
  337. </el-table-column>
  338. <!-- <el-table-column
  339. width="75"
  340. prop="orderCategory"
  341. label="订单类型"
  342. >
  343. <template slot-scope="scope">
  344. {{ scope.row.orderCategory | filterOrderCategory }}
  345. </template>
  346. </el-table-column> -->
  347. <el-table-column
  348. width="150"
  349. prop="isOnlineOrder"
  350. label="渠道"
  351. >
  352. <template slot-scope="scope">
  353. <div class="order-info-item">
  354. <div class="label">
  355. 销售来源:{{ scope.row.isOnlineOrder === 1 ? '线上' : '线下' }}
  356. </div>
  357. </div>
  358. <div
  359. class="order-info-item">
  360. <div class="label">
  361. 销售渠道:{{ scope.row.otaSourceName }}
  362. </div>
  363. </div>
  364. <div
  365. class="order-info-item">
  366. <div class="label">
  367. 支付渠道:{{ scope.row.payChannel }}
  368. </div>
  369. </div>
  370. </template>
  371. </el-table-column>
  372. <el-table-column
  373. label="支付状态"
  374. width="100"
  375. fixed="right"
  376. >
  377. <template slot-scope="scope">
  378. <el-tag
  379. :type="getPayStatus(scope.row.payStatus, 'type')"
  380. size="normal"
  381. >
  382. {{ getPayStatus(scope.row.payStatus) }}
  383. </el-tag>
  384. </template>
  385. </el-table-column>
  386. <!-- <el-table-column
  387. label="支付时间"
  388. width="140"
  389. prop="payTime">
  390. </el-table-column>
  391. <el-table-column
  392. label="票种"
  393. min-width="120">
  394. <template slot-scope="scope">
  395. <Ellipsis
  396. type="tooltip"
  397. :content="scope.row.ticketsName"
  398. :length="15"></Ellipsis>
  399. </template>
  400. </el-table-column> -->
  401. <el-table-column
  402. width="140"
  403. label="售票"
  404. >
  405. <template slot-scope="scope">
  406. <div>
  407. {{ scope.row.saleAdminName }}
  408. </div>
  409. <div>
  410. {{ scope.row.createTime | formatTime }}
  411. </div>
  412. </template>
  413. </el-table-column>
  414. <el-table-column
  415. width="160"
  416. label="购买方"
  417. >
  418. <template slot-scope="scope">
  419. <div>
  420. {{ scope.row.buyerName }}
  421. </div>
  422. <div>
  423. {{ scope.row.buyerPhone }}
  424. </div>
  425. <div>
  426. {{ scope.row.buyerIdentify }}
  427. </div>
  428. </template>
  429. </el-table-column>
  430. <!-- <el-table-column
  431. width="120"
  432. prop="buyerName"
  433. label="购买方名称"
  434. ></el-table-column>
  435. <el-table-column
  436. width="110"
  437. prop="buyerPhone"
  438. label="购买方手机">
  439. </el-table-column>
  440. <el-table-column
  441. width="140"
  442. prop="buyerIdentify"
  443. label="购买方证件号">
  444. </el-table-column> -->
  445. <el-table-column
  446. width="80"
  447. prop="ticketNum"
  448. label="所含票数"
  449. >
  450. <template slot-scope="scope">
  451. <div class="order-info-item">
  452. <div class="label">
  453. 总张数:{{ scope.row.ticketNum }}
  454. </div>
  455. </div>
  456. <div
  457. class="order-info-item">
  458. <div class="label">
  459. 总人数:{{ scope.row.ticketCheckNum }}
  460. </div>
  461. </div>
  462. </template>
  463. </el-table-column>
  464. <!-- <el-table-column
  465. width="80"
  466. label="人数"
  467. >
  468. <template slot-scope="scope">
  469. {{ reduceCheckNum(scope.row.ticketList) }}
  470. </template>
  471. </el-table-column>
  472. <el-table-column
  473. width="80"
  474. label="游客信息"
  475. prop="guestName">
  476. </el-table-column>
  477. <el-table-column
  478. width="80"
  479. label="使用状态"
  480. prop="ticketStatus">
  481. </el-table-column> -->
  482. <el-table-column
  483. width="80"
  484. label="总价(¥)"
  485. >
  486. <template slot-scope="scope">
  487. {{ scope.row.price }}
  488. </template>
  489. </el-table-column>
  490. <el-table-column
  491. width="100"
  492. label="订单状态"
  493. fixed="right"
  494. >
  495. <template slot-scope="scope">
  496. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  497. </template>
  498. </el-table-column>
  499. <el-table-column
  500. label="下单备注"
  501. show-overflow-tooltip
  502. prop="createOrderRemark">
  503. </el-table-column>
  504. <el-table-column
  505. label="操作"
  506. fixed="right"
  507. width="220"
  508. >
  509. <template slot-scope="scope">
  510. <el-link
  511. type="primary"
  512. @click="showOrderDetail(scope.row)">
  513. 详情
  514. </el-link>
  515. <el-link
  516. type="primary"
  517. v-if="hasPermission('order-update')"
  518. @click="editOrder(scope.row)">
  519. 修改
  520. </el-link>
  521. <el-link
  522. type="primary"
  523. v-if="hasPermission('manual-print')"
  524. @click="printOrder(scope.row)">
  525. 取票
  526. </el-link>
  527. <br>
  528. <el-link
  529. type="primary"
  530. v-if="hasPermission('manual-check')"
  531. @click="checkOrder(scope.row)">
  532. 核销
  533. </el-link>
  534. <el-link
  535. type="primary"
  536. v-if="hasPermission('manual-cancel')"
  537. @click="refundOrder(scope.row)">
  538. 退单
  539. </el-link>
  540. <el-link
  541. type="primary"
  542. v-if="hasPermission('manual-second-print')"
  543. @click="secondPrint(scope.row)">
  544. 补打
  545. </el-link>
  546. <!--
  547. <el-link
  548. type="primary"
  549. v-if="scope.row.tickets.some(v=>v.is_invoice_picked===0&&v.status==='USED')&&scope.row.otaSourceName!=='自营售票'"
  550. @click="showPickInvoice(scope.row)">
  551. 开票
  552. </el-link>
  553. -->
  554. <!-- <el-link
  555. type="primary"
  556. v-if="scenicName==='昭苏' && scope.row.ticketList.some(v=>v.is_invoice_picked===0&&v.status==='USED')&&scope.row.otaSourceName!=='自营售票'"
  557. @click="showPickInvoice(scope.row)">
  558. 开票
  559. </el-link>
  560. <el-link
  561. type="primary"
  562. v-if="scenicName!=='昭苏' && scope.row.ticketList.some(v=>v.is_invoice_picked===0&&v.status==='USED')"
  563. @click="showPickInvoice(scope.row)">
  564. 开票
  565. </el-link> -->
  566. </template>
  567. </el-table-column>
  568. </el-table>
  569. <el-pagination
  570. background
  571. :current-page.sync="form.pageNum"
  572. :page-sizes="[10, 20, 50, 100]"
  573. :page-size="form.pageSize"
  574. @size-change="handleSizeChange"
  575. @current-change="getOrderList()"
  576. layout="total, sizes, prev, pager, next, jumper"
  577. :total="total"
  578. >
  579. </el-pagination>
  580. </div>
  581. <OrderDetail ref="orderDetail"></OrderDetail>
  582. <el-dialog
  583. title="选择导出列"
  584. :visible.sync="dialogVisible"
  585. append-to-body>
  586. <div
  587. v-for="group in columnGroups"
  588. :key="group.name"
  589. style="margin-bottom: 12px;">
  590. <div style="font-weight: 600; margin-bottom: 6px;">
  591. {{ group.name }}
  592. </div>
  593. <el-checkbox-group v-model="tempSelectedFields">
  594. <el-checkbox
  595. v-for="field in group.fields"
  596. :key="field.key"
  597. :label="field.key">
  598. {{ field.label }}
  599. </el-checkbox>
  600. </el-checkbox-group>
  601. </div>
  602. <span
  603. slot="footer"
  604. class="dialog-footer">
  605. <el-button @click="dialogVisible = false">取 消</el-button>
  606. <el-button
  607. type="primary"
  608. @click="saveUserConfig">
  609. 确 定
  610. </el-button>
  611. </span>
  612. </el-dialog>
  613. <el-dialog
  614. title="开票"
  615. :visible.sync="visible"
  616. width="80%"
  617. @close="visible=false">
  618. <el-table
  619. ref="multipleTable"
  620. :data="currentOrder.ticketList"
  621. @selection-change="handleSelectionChange">
  622. <el-table-column
  623. type="selection"
  624. :selectable="selectable"
  625. width="55">
  626. </el-table-column>
  627. <el-table-column
  628. prop="ticketNo"
  629. label="票号"
  630. >
  631. </el-table-column>
  632. <el-table-column
  633. prop="ticketTypeName"
  634. label="票种"
  635. >
  636. </el-table-column>
  637. <el-table-column
  638. width="80"
  639. label="单价(¥)"
  640. >
  641. <template slot-scope="scope">
  642. {{ scope.row.checkNum ? scope.row.price/scope.row.checkNum : scope.row.price }}
  643. </template>
  644. </el-table-column>
  645. <el-table-column
  646. width="80"
  647. prop="price"
  648. label="小计"
  649. >
  650. </el-table-column>
  651. <el-table-column
  652. prop="guestIdentifyType"
  653. label="证件类型"
  654. >
  655. <template slot-scope="scope">
  656. {{ papersType[scope.row.guestIdentifyType] }}
  657. </template>
  658. </el-table-column>
  659. <el-table-column
  660. width="100"
  661. prop="checkNum"
  662. label="检票人数"
  663. >
  664. </el-table-column>
  665. <el-table-column
  666. width="100"
  667. prop="playDateBegin"
  668. label="游玩时间"
  669. >
  670. <template slot-scope="scope">
  671. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  672. </template>
  673. </el-table-column>
  674. <el-table-column
  675. width="80"
  676. label="取票状态"
  677. >
  678. <template slot-scope="scope">
  679. <el-tag :type="scope.row.isPrint?'success':'info'">
  680. {{ scope.row.isPrint?'已取票':'未取票' }}
  681. </el-tag>
  682. </template>
  683. </el-table-column>
  684. <el-table-column
  685. width="80"
  686. label="状态"
  687. >
  688. <template slot-scope="scope">
  689. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  690. </template>
  691. </el-table-column>
  692. <el-table-column
  693. width="80"
  694. label="是否已开票"
  695. >
  696. <template slot-scope="scope">
  697. {{ scope.row.is_invoice_picked===1?'已开':'未开' }}
  698. </template>
  699. </el-table-column>
  700. </el-table>
  701. {{ formEl.invoiceType }}
  702. <el-form
  703. class="search-box"
  704. ref="formEl"
  705. :model="formEl"
  706. :inline="true"
  707. label-width="200px"
  708. style="background: transparent"
  709. >
  710. <!-- 九龙湖只能固定一种开票方式 -->
  711. <el-form-item
  712. v-if="['九龙湖','demo'].includes(scenicName)"
  713. label="开票方式"
  714. prop="invoiceType"
  715. >
  716. <!-- <el-radio
  717. v-if="false"
  718. v-model="formEl.invoiceType"
  719. :label="1">
  720. 扫码开票
  721. </el-radio> -->
  722. <el-radio
  723. v-model="formEl.invoiceType"
  724. :label="0">
  725. 普通开票
  726. </el-radio>
  727. </el-form-item>
  728. <el-form-item
  729. v-else
  730. verify
  731. label="开票方式"
  732. prop="invoiceType"
  733. >
  734. <el-radio
  735. v-model="formEl.invoiceType"
  736. :label="1">
  737. 扫码开票
  738. </el-radio>
  739. <el-radio
  740. v-model="formEl.invoiceType"
  741. :label="0">
  742. 普通开票
  743. </el-radio>
  744. </el-form-item>
  745. <el-form-item
  746. v-if="!formEl.invoiceType"
  747. verify
  748. label="购买方"
  749. prop="invoiceBuyer"
  750. >
  751. <el-input
  752. v-model="formEl.invoiceBuyer"
  753. style="width:100%"></el-input>
  754. </el-form-item>
  755. <el-form-item
  756. v-if="!formEl.invoiceType"
  757. label="纳税⼈识别号"
  758. prop="invoiceBuyerTaxNum"
  759. :rules="rules.invoiceBuyerTaxNum"
  760. >
  761. <el-input
  762. v-model="formEl.invoiceBuyerTaxNum"
  763. style="width:100%"></el-input>
  764. </el-form-item>
  765. <el-form-item
  766. v-if="!formEl.invoiceType"
  767. label="纳税⼈邮箱"
  768. prop="invoiceBuyerEmail"
  769. :rules="[
  770. { required: false, message: '请输入邮箱', trigger: 'blur' },
  771. { type: 'email', message: '邮箱格式不正确', trigger: 'blur' }
  772. ]"
  773. >
  774. <el-input
  775. v-model="formEl.invoiceBuyerEmail"
  776. style="width:100%"></el-input>
  777. </el-form-item>
  778. <el-form-item
  779. v-if="!formEl.invoiceType"
  780. label="纳税⼈手机号"
  781. prop="invoiceBuyerPhone"
  782. :rules="[
  783. { required: false, message: '请输入手机号', trigger: 'blur' },
  784. { pattern: /^1[3456789]\d{9}$/, message: '手机号格式不正确', trigger: 'blur' }
  785. ]"
  786. >
  787. <el-input
  788. v-model="formEl.invoiceBuyerPhone"
  789. style="width:100%"></el-input>
  790. </el-form-item>
  791. <el-form-item
  792. v-if="!formEl.invoiceType"
  793. label="购买方地址"
  794. prop="invoiceBuyerAddress"
  795. >
  796. <el-input
  797. v-model="formEl.invoiceBuyerAddress"
  798. style="width:100%"></el-input>
  799. </el-form-item>
  800. <el-form-item
  801. v-if="!formEl.invoiceType"
  802. label="购买方银行开户行及账号"
  803. prop="invoiceBuyerBankAccount"
  804. >
  805. <el-input
  806. v-model="formEl.invoiceBuyerBankAccount"
  807. style="width:100%"></el-input>
  808. </el-form-item>
  809. <el-form-item
  810. v-if="!formEl.invoiceType"
  811. label="备注"
  812. prop="remark"
  813. >
  814. <el-input
  815. v-model="formEl.remark"
  816. style="width:100%"></el-input>
  817. </el-form-item>
  818. </el-form>
  819. <span slot="footer">
  820. <el-button @click="visible = false">取消</el-button>
  821. <el-button
  822. type="primary"
  823. @click="submitPickInvoice">确定</el-button>
  824. </span>
  825. </el-dialog>
  826. <el-dialog
  827. title="核销"
  828. :visible.sync="checkOrderDialogVisible"
  829. width="80%"
  830. @close="checkOrderDialogVisible=false;ticketNoSearch=''">
  831. <div
  832. class="search-area"
  833. style="margin: 20px;display: flex;align-items: center;justify-content: space-between;">
  834. <el-checkbox
  835. v-if="hasPermission('manual-force-check')"
  836. label="强制核销"
  837. v-model="checkOrderInfo.force"></el-checkbox>
  838. <div class="name">
  839. <span style="margin-right: 10px;">票号搜索</span>
  840. <el-input v-model="ticketNoSearch"></el-input>
  841. </div>
  842. </div>
  843. <el-table
  844. border
  845. :data="(currentOrder.ticketList || []).filter(v => v.ticketNo.includes(ticketNoSearch))"
  846. @selection-change="handleSelectionChange">
  847. <el-table-column
  848. type="selection"
  849. fixed
  850. :selectable="selectable"
  851. width="55">
  852. </el-table-column>
  853. <el-table-column type="expand">
  854. <template slot-scope="props">
  855. <div class="title">检票景点</div>
  856. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  857. <el-table-column
  858. prop="scenicName"
  859. label="景点"
  860. ></el-table-column>
  861. <el-table-column
  862. prop="checkLimitTimes"
  863. label="可检票次数"
  864. >
  865. <template slot-scope="scope">
  866. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  867. </template>
  868. </el-table-column>
  869. <el-table-column
  870. prop="checkedTimes"
  871. label="已检票次数"
  872. ></el-table-column>
  873. <el-table-column
  874. prop="singleDayLimitTimes"
  875. label="单日可检票次数"
  876. ></el-table-column>
  877. </el-table>
  878. </template>
  879. </el-table-column>
  880. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  881. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  882. <el-table-column width="80" prop="price" label="单价(¥)">
  883. <template slot-scope="scope">
  884. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  885. </template>
  886. </el-table-column>
  887. <el-table-column width="80" prop="price" label="小计"></el-table-column>
  888. <el-table-column width="100" prop="status" label="状态">
  889. <template slot-scope="scope">
  890. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  891. </template>
  892. </el-table-column>
  893. <el-table-column width="210" prop="guestInfo" label="游客信息">
  894. <template slot-scope="scope">
  895. <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
  896. <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
  897. <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
  898. <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
  899. </template>
  900. </el-table-column>
  901. <el-table-column width="260" prop="ticketCheckInfo" label="检票信息">
  902. <template slot-scope="scope">
  903. <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
  904. <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
  905. <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
  906. <div class=""><span>最近一次检票设备:</span>{{ scope.row.checkerName }}</div>
  907. </template>
  908. </el-table-column>
  909. <el-table-column width="260" prop="ticketPrintInfo" label="取票信息">
  910. <template slot-scope="scope">
  911. <div class=""><span>取票状态:</span>
  912. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  913. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  914. </el-tag>
  915. </div>
  916. <div class=""><span>取票时间:</span>{{ scope.row.printTime }}</div>
  917. <div class=""><span>取票人:</span>{{ scope.row.printAdminName }}</div>
  918. <div class=""><span>取票自助机:</span>{{ scope.row.printTermName }}</div>
  919. </template>
  920. </el-table-column>
  921. <el-table-column width="260" prop="ticketRefundInfo" label="退票信息">
  922. <template slot-scope="scope">
  923. <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName }}</div>
  924. <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice }}</div>
  925. <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime }}</div>
  926. <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime }}</div>
  927. <div class=""><span>是否强制取消:</span>{{ scope.row.isForceCancel ? '是' : '否' }}</div>
  928. </template>
  929. </el-table-column>
  930. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  931. <template slot-scope="scope">
  932. <div v-if="scope.row.batchConfigName"><span>场次:</span>{{ scope.row.batchConfigName || '' }}</div>
  933. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  934. </template>
  935. </el-table-column>
  936. <el-table-column min-width="180" label="检票景点">
  937. <template slot-scope="scope">
  938. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  939. </template>
  940. </el-table-column>
  941. <el-table-column width="240" prop="ticketCardInfo" label="卡信息">
  942. <template slot-scope="scope" v-if="scope.row.card">
  943. <div class=""><span>卡片编号:</span>{{ scope.row.card.cardNo }}</div>
  944. <div class=""><span>有效时间:</span>{{ scope.row.card.validDateStart }} - {{ scope.row.card.validDateEnd }}</div>
  945. <div class=""><span>卡片状态:</span>{{ scope.row.card.status | filterCardStatus }}</div>
  946. <div class="" v-if="scope.row.card.status === 1"><span>开卡时间:</span>{{ scope.row.card.activeTime }}</div>
  947. <div class="" v-if="scope.row.card.status === 0"><span>退卡时间:</span>{{ scope.row.card.cardNo }}</div>
  948. <div class="" v-if="scope.row.card.status === 2"><span>挂失时间:</span>{{ scope.row.card.repealTime }}</div>
  949. </template>
  950. </el-table-column>
  951. <el-table-column width="240" prop="ticketFaceInfo" label="人脸信息">
  952. <template slot-scope="scope" v-if="scope.row.face">
  953. <div class=""><span>有效时间:</span>{{ scope.row.face.validDateStart }} - {{ scope.row.face.validDateEnd }}</div>
  954. <div class=""><span>卡片状态:</span>{{ scope.row.face.status === 0 ? '可用' : '不可用' }}</div>
  955. <div class=""><span>图片地址:</span>{{ scope.row.face.imageUrl }}</div>
  956. <div class=""><span>base64:</span>{{ scope.row.face.faceData }}</div>
  957. <div class=""><span>注册状态:</span>{{ scope.row.face.registerStatus === 0 ? '未注册' : '已注册' }}</div>
  958. </template>
  959. </el-table-column>
  960. </el-table>
  961. <span slot="footer">
  962. <el-button @click="checkOrderDialogVisible = false">取消</el-button>
  963. <el-button
  964. type="primary"
  965. @click="submitCheckOrder">确定</el-button>
  966. </span>
  967. </el-dialog>
  968. <el-dialog
  969. title="退单"
  970. :visible.sync="refundOrderDialogVisible"
  971. width="80%"
  972. @close="refundOrderDialogVisible=false;ticketNoSearch=''">
  973. <div
  974. class="search-area"
  975. style="margin: 20px;display: flex;align-items: center;justify-content: space-between;">
  976. <el-checkbox
  977. v-if="hasPermission('manual-force-cancel')"
  978. label="强制退单"
  979. v-model="refundOrderInfo.force"></el-checkbox>
  980. <div class="name">
  981. <span style="margin-right: 10px;">票号搜索</span>
  982. <el-input v-model="ticketNoSearch"></el-input>
  983. </div>
  984. </div>
  985. <!-- <div class="">
  986. <div class="tag">退票金额</div>
  987. <el-input-number
  988. v-model="refundOrderInfo.cancelPrice"
  989. :min="0"
  990. :precision="0.01"></el-input-number>
  991. </div> -->
  992. <el-table
  993. border
  994. :data="(currentOrder.ticketList || []).filter(v => v.ticketNo.includes(ticketNoSearch))"
  995. @selection-change="handleSelectionChange">
  996. <el-table-column
  997. type="selection"
  998. fixed
  999. :selectable="selectable"
  1000. width="55">
  1001. </el-table-column>
  1002. <el-table-column type="expand">
  1003. <template slot-scope="props">
  1004. <div class="title">检票景点</div>
  1005. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  1006. <el-table-column
  1007. prop="scenicName"
  1008. label="景点"
  1009. ></el-table-column>
  1010. <el-table-column
  1011. prop="checkLimitTimes"
  1012. label="可检票次数"
  1013. >
  1014. <template slot-scope="scope">
  1015. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  1016. </template>
  1017. </el-table-column>
  1018. <el-table-column
  1019. prop="checkedTimes"
  1020. label="已检票次数"
  1021. ></el-table-column>
  1022. <el-table-column
  1023. prop="singleDayLimitTimes"
  1024. label="单日可检票次数"
  1025. ></el-table-column>
  1026. </el-table>
  1027. </template>
  1028. </el-table-column>
  1029. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  1030. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  1031. <el-table-column width="80" prop="price" label="单价(¥)">
  1032. <template slot-scope="scope">
  1033. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  1034. </template>
  1035. </el-table-column>
  1036. <el-table-column width="80" prop="price" label="小计"></el-table-column>
  1037. <el-table-column width="100" prop="status" label="状态">
  1038. <template slot-scope="scope">
  1039. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  1040. </template>
  1041. </el-table-column>
  1042. <el-table-column width="210" prop="guestInfo" label="游客信息">
  1043. <template slot-scope="scope">
  1044. <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
  1045. <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
  1046. <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
  1047. <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
  1048. </template>
  1049. </el-table-column>
  1050. <el-table-column width="260" prop="ticketCheckInfo" label="检票信息">
  1051. <template slot-scope="scope">
  1052. <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
  1053. <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
  1054. <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
  1055. <div class=""><span>最近一次检票设备:</span>{{ scope.row.checkerName }}</div>
  1056. </template>
  1057. </el-table-column>
  1058. <el-table-column width="260" prop="ticketPrintInfo" label="取票信息">
  1059. <template slot-scope="scope">
  1060. <div class=""><span>取票状态:</span>
  1061. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  1062. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  1063. </el-tag>
  1064. </div>
  1065. <div class=""><span>取票时间:</span>{{ scope.row.printTime }}</div>
  1066. <div class=""><span>取票人:</span>{{ scope.row.printAdminName }}</div>
  1067. <div class=""><span>取票自助机:</span>{{ scope.row.printTermName }}</div>
  1068. </template>
  1069. </el-table-column>
  1070. <el-table-column width="260" prop="ticketRefundInfo" label="退票信息">
  1071. <template slot-scope="scope">
  1072. <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName }}</div>
  1073. <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice }}</div>
  1074. <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime }}</div>
  1075. <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime }}</div>
  1076. <div class=""><span>是否强制取消:</span>{{ scope.row.isForceCancel ? '是' : '否' }}</div>
  1077. </template>
  1078. </el-table-column>
  1079. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  1080. <template slot-scope="scope">
  1081. <div v-if="scope.row.batchConfigName"><span>场次:</span>{{ scope.row.batchConfigName || '' }}</div>
  1082. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  1083. </template>
  1084. </el-table-column>
  1085. <el-table-column min-width="180" label="检票景点">
  1086. <template slot-scope="scope">
  1087. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  1088. </template>
  1089. </el-table-column>
  1090. <el-table-column width="240" prop="ticketCardInfo" label="卡信息">
  1091. <template slot-scope="scope" v-if="scope.row.card">
  1092. <div class=""><span>卡片编号:</span>{{ scope.row.card.cardNo }}</div>
  1093. <div class=""><span>有效时间:</span>{{ scope.row.card.validDateStart }} - {{ scope.row.card.validDateEnd }}</div>
  1094. <div class=""><span>卡片状态:</span>{{ scope.row.card.status | filterCardStatus }}</div>
  1095. <div class="" v-if="scope.row.card.status === 1"><span>开卡时间:</span>{{ scope.row.card.activeTime }}</div>
  1096. <div class="" v-if="scope.row.card.status === 0"><span>退卡时间:</span>{{ scope.row.card.cardNo }}</div>
  1097. <div class="" v-if="scope.row.card.status === 2"><span>挂失时间:</span>{{ scope.row.card.repealTime }}</div>
  1098. </template>
  1099. </el-table-column>
  1100. <el-table-column width="240" prop="ticketFaceInfo" label="人脸信息">
  1101. <template slot-scope="scope" v-if="scope.row.face">
  1102. <div class=""><span>有效时间:</span>{{ scope.row.face.validDateStart }} - {{ scope.row.face.validDateEnd }}</div>
  1103. <div class=""><span>卡片状态:</span>{{ scope.row.face.status === 0 ? '可用' : '不可用' }}</div>
  1104. <div class=""><span>图片地址:</span>{{ scope.row.face.imageUrl }}</div>
  1105. <div class=""><span>base64:</span>{{ scope.row.face.faceData }}</div>
  1106. <div class=""><span>注册状态:</span>{{ scope.row.face.registerStatus === 0 ? '未注册' : '已注册' }}</div>
  1107. </template>
  1108. </el-table-column>
  1109. </el-table>
  1110. <span slot="footer">
  1111. <el-button @click="refundOrderDialogVisible = false">取消</el-button>
  1112. <el-button
  1113. type="primary"
  1114. @click="submitRefundOrder">确定</el-button>
  1115. </span>
  1116. </el-dialog>
  1117. <el-dialog
  1118. title="补打"
  1119. :visible.sync="secondPrintDialogVisible"
  1120. width="80%"
  1121. @close="secondPrintDialogVisible=false;ticketNoSearch=''">
  1122. <!-- <div class="">
  1123. <div class="tag">退票金额</div>
  1124. <el-input-number
  1125. v-model="refundOrderInfo.cancelPrice"
  1126. :min="0"
  1127. :precision="0.01"></el-input-number>
  1128. </div> -->
  1129. <div
  1130. class="search-area"
  1131. style="margin: 20px;display: flex;align-items: center;">
  1132. <div class="name" style="margin-right: 10px;">票号搜索</div>
  1133. <el-input v-model="ticketNoSearch"></el-input>
  1134. </div>
  1135. <el-table
  1136. border
  1137. :data="(currentOrder.ticketList || []).filter(v => v.ticketNo.includes(ticketNoSearch))"
  1138. @selection-change="handleSelectionChange">
  1139. <el-table-column
  1140. type="selection"
  1141. fixed
  1142. :selectable="selectable"
  1143. width="55">
  1144. </el-table-column>
  1145. <el-table-column type="expand">
  1146. <template slot-scope="props">
  1147. <div class="title">检票景点</div>
  1148. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  1149. <el-table-column
  1150. prop="scenicName"
  1151. label="景点"
  1152. ></el-table-column>
  1153. <el-table-column
  1154. prop="checkLimitTimes"
  1155. label="可检票次数"
  1156. >
  1157. <template slot-scope="scope">
  1158. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  1159. </template>
  1160. </el-table-column>
  1161. <el-table-column
  1162. prop="checkedTimes"
  1163. label="已检票次数"
  1164. ></el-table-column>
  1165. <el-table-column
  1166. prop="singleDayLimitTimes"
  1167. label="单日可检票次数"
  1168. ></el-table-column>
  1169. </el-table>
  1170. </template>
  1171. </el-table-column>
  1172. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  1173. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  1174. <el-table-column width="80" prop="price" label="单价(¥)">
  1175. <template slot-scope="scope">
  1176. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  1177. </template>
  1178. </el-table-column>
  1179. <el-table-column width="80" prop="price" label="小计"></el-table-column>
  1180. <el-table-column width="100" prop="status" label="状态">
  1181. <template slot-scope="scope">
  1182. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  1183. </template>
  1184. </el-table-column>
  1185. <el-table-column width="210" prop="guestInfo" label="游客信息">
  1186. <template slot-scope="scope">
  1187. <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
  1188. <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
  1189. <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
  1190. <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
  1191. </template>
  1192. </el-table-column>
  1193. <el-table-column width="260" prop="ticketCheckInfo" label="检票信息">
  1194. <template slot-scope="scope">
  1195. <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
  1196. <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
  1197. <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
  1198. <div class=""><span>最近一次检票设备:</span>{{ scope.row.checkerName }}</div>
  1199. </template>
  1200. </el-table-column>
  1201. <el-table-column width="260" prop="ticketPrintInfo" label="取票信息">
  1202. <template slot-scope="scope">
  1203. <div class=""><span>取票状态:</span>
  1204. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  1205. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  1206. </el-tag>
  1207. </div>
  1208. <div class=""><span>取票时间:</span>{{ scope.row.printTime }}</div>
  1209. <div class=""><span>取票人:</span>{{ scope.row.printAdminName }}</div>
  1210. <div class=""><span>取票自助机:</span>{{ scope.row.printTermName }}</div>
  1211. </template>
  1212. </el-table-column>
  1213. <el-table-column width="260" prop="ticketRefundInfo" label="退票信息">
  1214. <template slot-scope="scope">
  1215. <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName }}</div>
  1216. <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice }}</div>
  1217. <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime }}</div>
  1218. <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime }}</div>
  1219. <div class=""><span>是否强制取消:</span>{{ scope.row.isForceCancel ? '是' : '否' }}</div>
  1220. </template>
  1221. </el-table-column>
  1222. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  1223. <template slot-scope="scope">
  1224. <div v-if="scope.row.batchConfigName"><span>场次:</span>{{ scope.row.batchConfigName || '' }}</div>
  1225. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  1226. </template>
  1227. </el-table-column>
  1228. <el-table-column min-width="180" label="检票景点">
  1229. <template slot-scope="scope">
  1230. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  1231. </template>
  1232. </el-table-column>
  1233. <el-table-column width="240" prop="ticketCardInfo" label="卡信息">
  1234. <template slot-scope="scope" v-if="scope.row.card">
  1235. <div class=""><span>卡片编号:</span>{{ scope.row.card.cardNo }}</div>
  1236. <div class=""><span>有效时间:</span>{{ scope.row.card.validDateStart }} - {{ scope.row.card.validDateEnd }}</div>
  1237. <div class=""><span>卡片状态:</span>{{ scope.row.card.status | filterCardStatus }}</div>
  1238. <div class="" v-if="scope.row.card.status === 1"><span>开卡时间:</span>{{ scope.row.card.activeTime }}</div>
  1239. <div class="" v-if="scope.row.card.status === 0"><span>退卡时间:</span>{{ scope.row.card.cardNo }}</div>
  1240. <div class="" v-if="scope.row.card.status === 2"><span>挂失时间:</span>{{ scope.row.card.repealTime }}</div>
  1241. </template>
  1242. </el-table-column>
  1243. <el-table-column width="240" prop="ticketFaceInfo" label="人脸信息">
  1244. <template slot-scope="scope" v-if="scope.row.face">
  1245. <div class=""><span>有效时间:</span>{{ scope.row.face.validDateStart }} - {{ scope.row.face.validDateEnd }}</div>
  1246. <div class=""><span>卡片状态:</span>{{ scope.row.face.status === 0 ? '可用' : '不可用' }}</div>
  1247. <div class=""><span>图片地址:</span>{{ scope.row.face.imageUrl }}</div>
  1248. <div class=""><span>base64:</span>{{ scope.row.face.faceData }}</div>
  1249. <div class=""><span>注册状态:</span>{{ scope.row.face.registerStatus === 0 ? '未注册' : '已注册' }}</div>
  1250. </template>
  1251. </el-table-column>
  1252. <el-table-column width="80" label="操作">
  1253. <template slot-scope="scope">
  1254. <el-button type="primary" @click="printSingleTicket(scope.row)">
  1255. 打印
  1256. </el-button>
  1257. </template>
  1258. </el-table-column>
  1259. </el-table>
  1260. <div
  1261. class="opt-area"
  1262. style="margin-top: 20px;width: 100%;text-align: center;">
  1263. <el-button
  1264. type="primary"
  1265. @click="submitSecondPrint">
  1266. 全部打印
  1267. </el-button>
  1268. <el-button
  1269. type="primary"
  1270. @click="submitSecondPrint">
  1271. 打印小票
  1272. </el-button>
  1273. </div>
  1274. <span slot="footer">
  1275. <el-button @click="secondPrintDialogVisible = false">取消</el-button>
  1276. </span>
  1277. </el-dialog>
  1278. <el-dialog
  1279. title="取票"
  1280. :visible.sync="printOrderDialogVisible"
  1281. width="80%"
  1282. @close="printOrderDialogVisible=false;ticketNoSearch=''">
  1283. <div
  1284. class="search-area"
  1285. style="margin: 20px;display: flex;align-items: center;">
  1286. <div class="name" style="margin-right: 10px;">票号搜索</div>
  1287. <el-input v-model="ticketNoSearch"></el-input>
  1288. </div>
  1289. <el-table
  1290. border
  1291. :data="(currentOrder.ticketList || []).filter(v => v.ticketNo.includes(ticketNoSearch))"
  1292. @selection-change="handleSelectionChange">
  1293. <el-table-column
  1294. type="selection"
  1295. fixed
  1296. :selectable="selectable"
  1297. width="55">
  1298. </el-table-column>
  1299. <el-table-column type="expand">
  1300. <template slot-scope="props">
  1301. <div class="title">检票景点</div>
  1302. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  1303. <el-table-column
  1304. prop="scenicName"
  1305. label="景点"
  1306. ></el-table-column>
  1307. <el-table-column
  1308. prop="checkLimitTimes"
  1309. label="可检票次数"
  1310. >
  1311. <template slot-scope="scope">
  1312. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  1313. </template>
  1314. </el-table-column>
  1315. <el-table-column
  1316. prop="checkedTimes"
  1317. label="已检票次数"
  1318. ></el-table-column>
  1319. <el-table-column
  1320. prop="singleDayLimitTimes"
  1321. label="单日可检票次数"
  1322. ></el-table-column>
  1323. </el-table>
  1324. </template>
  1325. </el-table-column>
  1326. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  1327. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  1328. <el-table-column width="80" prop="price" label="单价(¥)">
  1329. <template slot-scope="scope">
  1330. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  1331. </template>
  1332. </el-table-column>
  1333. <el-table-column width="80" prop="price" label="小计"></el-table-column>
  1334. <el-table-column width="100" prop="status" label="状态">
  1335. <template slot-scope="scope">
  1336. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  1337. </template>
  1338. </el-table-column>
  1339. <el-table-column width="210" prop="guestInfo" label="游客信息">
  1340. <template slot-scope="scope">
  1341. <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
  1342. <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
  1343. <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
  1344. <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
  1345. </template>
  1346. </el-table-column>
  1347. <el-table-column width="260" prop="ticketCheckInfo" label="检票信息">
  1348. <template slot-scope="scope">
  1349. <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
  1350. <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
  1351. <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
  1352. <div class=""><span>最近一次检票设备:</span>{{ scope.row.checkerName }}</div>
  1353. </template>
  1354. </el-table-column>
  1355. <el-table-column width="260" prop="ticketPrintInfo" label="取票信息">
  1356. <template slot-scope="scope">
  1357. <div class=""><span>取票状态:</span>
  1358. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  1359. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  1360. </el-tag>
  1361. </div>
  1362. <div class=""><span>取票时间:</span>{{ scope.row.printTime }}</div>
  1363. <div class=""><span>取票人:</span>{{ scope.row.printAdminName }}</div>
  1364. <div class=""><span>取票自助机:</span>{{ scope.row.printTermName }}</div>
  1365. </template>
  1366. </el-table-column>
  1367. <el-table-column width="260" prop="ticketRefundInfo" label="退票信息">
  1368. <template slot-scope="scope">
  1369. <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName }}</div>
  1370. <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice }}</div>
  1371. <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime }}</div>
  1372. <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime }}</div>
  1373. <div class=""><span>是否强制取消:</span>{{ scope.row.isForceCancel ? '是' : '否' }}</div>
  1374. </template>
  1375. </el-table-column>
  1376. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  1377. <template slot-scope="scope">
  1378. <div v-if="scope.row.batchConfigName"><span>场次:</span>{{ scope.row.batchConfigName || '' }}</div>
  1379. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  1380. </template>
  1381. </el-table-column>
  1382. <el-table-column min-width="180" label="检票景点">
  1383. <template slot-scope="scope">
  1384. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  1385. </template>
  1386. </el-table-column>
  1387. <el-table-column width="240" prop="ticketCardInfo" label="卡信息">
  1388. <template slot-scope="scope" v-if="scope.row.card">
  1389. <div class=""><span>卡片编号:</span>{{ scope.row.card.cardNo }}</div>
  1390. <div class=""><span>有效时间:</span>{{ scope.row.card.validDateStart }} - {{ scope.row.card.validDateEnd }}</div>
  1391. <div class=""><span>卡片状态:</span>{{ scope.row.card.status | filterCardStatus }}</div>
  1392. <div class="" v-if="scope.row.card.status === 1"><span>开卡时间:</span>{{ scope.row.card.activeTime }}</div>
  1393. <div class="" v-if="scope.row.card.status === 0"><span>退卡时间:</span>{{ scope.row.card.cardNo }}</div>
  1394. <div class="" v-if="scope.row.card.status === 2"><span>挂失时间:</span>{{ scope.row.card.repealTime }}</div>
  1395. </template>
  1396. </el-table-column>
  1397. <el-table-column width="240" prop="ticketFaceInfo" label="人脸信息">
  1398. <template slot-scope="scope" v-if="scope.row.face">
  1399. <div class=""><span>有效时间:</span>{{ scope.row.face.validDateStart }} - {{ scope.row.face.validDateEnd }}</div>
  1400. <div class=""><span>卡片状态:</span>{{ scope.row.face.status === 0 ? '可用' : '不可用' }}</div>
  1401. <div class=""><span>图片地址:</span>{{ scope.row.face.imageUrl }}</div>
  1402. <div class=""><span>base64:</span>{{ scope.row.face.faceData }}</div>
  1403. <div class=""><span>注册状态:</span>{{ scope.row.face.registerStatus === 0 ? '未注册' : '已注册' }}</div>
  1404. </template>
  1405. </el-table-column>
  1406. </el-table>
  1407. <span slot="footer">
  1408. <el-button @click="printOrderDialogVisible = false">取消</el-button>
  1409. <el-button
  1410. type="primary"
  1411. @click="submitPrintOrder">确定</el-button>
  1412. </span>
  1413. </el-dialog>
  1414. <el-dialog
  1415. title="修改"
  1416. :visible.sync="editOrderDialogVisible"
  1417. mini-height="500"
  1418. @close="cancelEdit">
  1419. <el-form
  1420. class="form-box"
  1421. ref="formEl"
  1422. :model="editOrderInfo"
  1423. :inline="true"
  1424. label-width="100px">
  1425. <el-form-item
  1426. label="修改类型"
  1427. prop="updateType"
  1428. >
  1429. <el-select
  1430. v-model="editOrderInfo.updateType"
  1431. clearable
  1432. placeholder="请选择"
  1433. >
  1434. <el-option
  1435. v-for="item in updateTypes"
  1436. :key="item.value"
  1437. :label="item.label"
  1438. :value="item.value"
  1439. >
  1440. </el-option>
  1441. </el-select>
  1442. </el-form-item>
  1443. <el-form-item
  1444. v-if="editOrderInfo.updateType === 'updateOrderPayChannel'"
  1445. label="原支付方式"
  1446. prop="payChannel"
  1447. >
  1448. {{ currentOrder.payChannel }}
  1449. </el-form-item>
  1450. <el-form-item
  1451. v-if="editOrderInfo.updateType === 'updateOrderPayChannel'"
  1452. label="支付方式"
  1453. prop="payChannel"
  1454. >
  1455. <el-radio-group
  1456. border
  1457. fill="#379143"
  1458. class="tags-btn"
  1459. v-model="editOrderInfo.payChannel">
  1460. <el-radio
  1461. border
  1462. v-for="val in payChannelOptions"
  1463. :key="val"
  1464. :value="val"
  1465. :label="val"></el-radio>
  1466. </el-radio-group>
  1467. </el-form-item>
  1468. <el-form-item
  1469. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1470. label="选择门票"
  1471. prop="playDateBegin">
  1472. <el-select
  1473. v-model="editOrderInfo.ticketIds"
  1474. multiple>
  1475. <el-option
  1476. v-for="item in currentOrder.ticketList"
  1477. :key="item.id"
  1478. :label="item.ticketNo"
  1479. :value="item.id">
  1480. <span style="">{{ item.ticketNo }}</span>-
  1481. <span style="color: #8492a6; font-size: 13px">{{ item.ticketTypeName }}</span>
  1482. (<span style="color: #849822; font-size: 13px">
  1483. {{ item.playDateBegin || item.playDateEnd ? `${item.playDateBegin || ''} - ${item.playDateEnd || ''}` : "无限制" }}
  1484. </span>)
  1485. </el-option>
  1486. </el-select>
  1487. </el-form-item>
  1488. <el-form-item
  1489. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1490. label="起始时间"
  1491. prop="playDateBegin">
  1492. <el-date-picker
  1493. v-model="editOrderInfo.playDateBegin"
  1494. type="date"
  1495. placeholder="选择日期时间">
  1496. </el-date-picker>
  1497. </el-form-item>
  1498. <el-form-item
  1499. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1500. label="截止时间"
  1501. prop="playDateEnd">
  1502. <el-date-picker
  1503. v-model="editOrderInfo.playDateEnd"
  1504. type="date"
  1505. placeholder="选择日期时间">
  1506. </el-date-picker>
  1507. </el-form-item>
  1508. <div class="table-box" v-if="editOrderInfo.updateType === 'updateScenicTimes'">
  1509. <div class="tips">
  1510. <i class="el-icon-info"></i>
  1511. -1代表不限制 如果当前景点为群组景点 该次数为群组景点的检票次数总和
  1512. </div>
  1513. <el-table
  1514. border
  1515. stripe
  1516. height="500"
  1517. :data="editOrderInfo.ticketList">
  1518. <el-table-column type="expand">
  1519. <template slot-scope="props">
  1520. <div class="title">检票景点明细</div>
  1521. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  1522. <el-table-column
  1523. prop="scenicName"
  1524. label="景点"
  1525. ></el-table-column>
  1526. <el-table-column
  1527. prop="checkLimitTimes"
  1528. label="可检票次数"
  1529. >
  1530. <template slot-scope="scope">
  1531. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  1532. </template>
  1533. </el-table-column>
  1534. <el-table-column
  1535. prop="checkedTimes"
  1536. label="已检票次数"
  1537. ></el-table-column>
  1538. </el-table>
  1539. </template>
  1540. </el-table-column>
  1541. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  1542. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  1543. <el-table-column min-width="180" label="检票景点">
  1544. <template slot-scope="scope">
  1545. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  1546. </template>
  1547. </el-table-column>
  1548. <el-table-column
  1549. label="景点的限制检票次数"
  1550. min-width="90">
  1551. <template slot-scope="scope">
  1552. <el-input-number
  1553. controls-position="right"
  1554. :min="-1"
  1555. :precision="0"
  1556. v-model="scope.row.checkLimitTimes"
  1557. ></el-input-number>
  1558. </template>
  1559. </el-table-column>
  1560. </el-table>
  1561. </div>
  1562. </el-form>
  1563. <span slot="footer">
  1564. <el-button @click="cancelEdit">取消</el-button>
  1565. <el-button
  1566. type="primary"
  1567. @click="submitEditOrder">确定</el-button>
  1568. </span>
  1569. </el-dialog>
  1570. </div>
  1571. </template>
  1572. <script>
  1573. /* eslint-disable no-unused-vars */
  1574. import { apiOrderList, pickInvoice, getInvoice, cancelOrder, reprintTicket, checkTickets, updateOrder, getSaleChannelList, getSingleOrder, printTickets } from '@/api/order'
  1575. import { orderStatusDic, ticketStatusDic, channelList, papersType, orderCategories } from '@/assets/staticData'
  1576. import { getPayStatus } from '@/utils/index'
  1577. // import Ellipsis from '@/components/Ellipsis'
  1578. import ReaderInput from '@/components/ReaderInput'
  1579. import moment from 'moment'
  1580. import { payPOS } from '@/api/pay'
  1581. import { getTeamList, getGuideList } from '@/api/checker'
  1582. import { getSelf } from '@/api/systemSetting/account'
  1583. import { getSystemConfigList } from '@/api/systemConfig'
  1584. import { addUserConfig, getUserConfig } from '@/api/configSetting'
  1585. import { EventBus } from '@/utils/eventBus'
  1586. import { cloneDeep } from 'lodash'
  1587. const COLUMN_SCHEMA = [
  1588. { key: 'orderCategory', label: '订单类型', group: '订单', column: 'extra', apiKey: 'orderCategory' },
  1589. { key: 'firstTicketTypeName', label: '票种名称', group: '票种', column: 'firstTicketTypeName', apiKey: 'ticketTypeName' },
  1590. { key: 'orderNo', label: '订单号', group: '订单', column: 'orderNo', apiKey: 'orderNo' },
  1591. { key: 'partnerOrderNo', label: '合作方订单号', group: '订单', column: 'orderNo', apiKey: 'partnerOrderNo' },
  1592. { key: 'ticketNo', label: '票号', group: '票务', column: 'extra', apiKey: 'ticketNo' },
  1593. { key: 'payChannel', label: '支付方式', group: '渠道', column: 'isOnlineOrder', apiKey: 'payChannel' },
  1594. { key: 'payTime', label: '支付时间', group: '支付', column: 'extra', apiKey: 'payTime' },
  1595. { key: 'teamName', label: '团体名称', group: '订单', column: 'extra', apiKey: 'teamName' },
  1596. { key: 'guideName', label: '导游名称', group: '订单', column: 'extra', apiKey: 'guideName' },
  1597. { key: 'otaSourceName', label: '订单来源渠道', group: '渠道', column: 'isOnlineOrder', apiKey: 'otaSourceName' },
  1598. { key: 'saleAdminName', label: '售卖人名称', group: '售票', column: 'saleInfo', apiKey: 'saleAdminName' },
  1599. { key: 'buyerName', label: '购买方名称', group: '购买方', column: 'buyerInfo', apiKey: 'buyerName' },
  1600. { key: 'buyerPhone', label: '购买方电话', group: '购买方', column: 'buyerInfo', apiKey: 'buyerPhone' },
  1601. { key: 'buyerIdentify', label: '购买方证件号', group: '购买方', column: 'buyerInfo', apiKey: 'buyerIdentify' },
  1602. { key: 'price', label: '订单总额', group: '订单', column: 'price', apiKey: 'orderPrice' },
  1603. { key: 'ticketNum', label: '包含的票数量', group: '票务', column: 'ticketNum', apiKey: 'ticketNum' },
  1604. { key: 'status', label: '订单状态', group: '订单', column: 'status', apiKey: 'orderStatus' },
  1605. { key: 'isOnlineOrder', label: '是否是线上订单', group: '渠道', column: 'isOnlineOrder', apiKey: 'isOnlineOrder' },
  1606. { key: 'createOrderRemark', label: '下单备注', group: '订单', column: 'createOrderRemark', apiKey: 'createOrderRemark' },
  1607. { key: 'discountDescription', label: '优惠说明', group: '优惠', column: 'extra', apiKey: 'discountDescription' },
  1608. { key: 'adminRemark', label: '管理员备注', group: '订单', column: 'extra', apiKey: 'adminRemark' },
  1609. { key: 'checkNum', label: '售票人数', group: '票务', column: 'extra', apiKey: 'checkNum' },
  1610. { key: 'isPrint', label: '是否已取票', group: '取票', column: 'extra', apiKey: 'isPrint' },
  1611. { key: 'printAdminName', label: '取票操作人', group: '取票', column: 'extra', apiKey: 'printAdminName' },
  1612. { key: 'printTime', label: '取票时间', group: '取票', column: 'extra', apiKey: 'printTime' },
  1613. { key: 'printTermName', label: '取票自助机', group: '取票', column: 'extra', apiKey: 'printTermName' },
  1614. { key: 'ticketStatus', label: '门票状态', group: '票务', column: 'extra', apiKey: 'ticketStatus' },
  1615. { key: 'unitPrice', label: '门票单价', group: '票务', column: 'extra', apiKey: 'unitPrice' },
  1616. { key: 'ticketPrice', label: '门票价格', group: '票务', column: 'extra', apiKey: 'ticketPrice' },
  1617. { key: 'originalPrice', label: '门票原价', group: '票务', column: 'extra', apiKey: 'originalPrice' },
  1618. { key: 'discountPrice', label: '门票调整价格', group: '票务', column: 'extra', apiKey: 'discountPrice' },
  1619. { key: 'settlementPrice', label: '门票结算价格', group: '票务', column: 'extra', apiKey: 'settlementPrice' },
  1620. { key: 'guestName', label: '游客姓名', group: '游客', column: 'extra', apiKey: 'guestName' },
  1621. { key: 'guestPhone', label: '游客电话', group: '游客', column: 'extra', apiKey: 'guestPhone' },
  1622. { key: 'guestIdentify', label: '游客证件号', group: '游客', column: 'extra', apiKey: 'guestIdentify' },
  1623. { key: 'playDateBegin', label: '游玩时间', group: '游玩', column: 'extra', apiKey: 'playDateBegin' },
  1624. { key: 'playDateEnd', label: '游玩时间', group: '游玩', column: 'extra', apiKey: 'playDateEnd' },
  1625. { key: 'batchConfigName', label: '场次名称', group: '游玩', column: 'extra', apiKey: 'batchConfigName' },
  1626. { key: 'buyTime', label: '付款时间', group: '支付', column: 'extra', apiKey: 'buyTime' },
  1627. { key: 'firstCheckTime', label: '首次检票时间', group: '检票', column: 'extra', apiKey: 'firstCheckTime' },
  1628. { key: 'checkTime', label: '最后检票时间', group: '检票', column: 'extra', apiKey: 'checkTime' },
  1629. { key: 'checkerName', label: '最近一次检票设备', group: '检票', column: 'extra', apiKey: 'checkerName' },
  1630. { key: 'cancelSubmitTime', label: '申请退款时间', group: '退款', column: 'extra', apiKey: 'cancelSubmitTime' },
  1631. { key: 'cancelPrice', label: '退款金额', group: '退款', column: 'extra', apiKey: 'cancelPrice' },
  1632. { key: 'cancelAdminName', label: '退款操作人', group: '退款', column: 'extra', apiKey: 'cancelAdminName' },
  1633. { key: 'cancelCompleteTime', label: '退款完成时间', group: '退款', column: 'extra', apiKey: 'cancelCompleteTime' },
  1634. { key: 'isForceCancel', label: '是否强制取消', group: '退款', column: 'extra', apiKey: 'isForceCancel' }
  1635. ]
  1636. const API_KEY_TO_FIELD = COLUMN_SCHEMA.reduce((acc, item) => {
  1637. acc[item.apiKey] = item.key
  1638. return acc
  1639. }, {})
  1640. const COLUMN_FIELD_MAP = COLUMN_SCHEMA.reduce((acc, item) => {
  1641. if (!acc[item.column]) acc[item.column] = []
  1642. acc[item.column].push(item.key)
  1643. return acc
  1644. }, {})
  1645. const DEFAULT_FIELD_KEYS = COLUMN_SCHEMA.map(item => item.key)
  1646. const STAT_KEY = 'orderDetail'
  1647. export default {
  1648. name: 'salesQuery',
  1649. computed: {
  1650. scenicName () {
  1651. return this.$localStore.get('scenicName') || this.$store.state.user.scenicName
  1652. },
  1653. salesList () {
  1654. return this.$store.state.user.salesList
  1655. },
  1656. accountList () {
  1657. return this.$store.state.app.accountList
  1658. },
  1659. termList () {
  1660. return this.$store.state.app.termList
  1661. },
  1662. saleChannel () {
  1663. return this.$store.state.app.saleChannel
  1664. },
  1665. payChannelOptions () {
  1666. return this.$store.getters.payChannelOptions
  1667. },
  1668. ticketTypeList () {
  1669. const { ticketTypeList } = this.$store.state.app
  1670. const { orderCategory } = this.form
  1671. return orderCategory ? ticketTypeList.filter(item => item.category === orderCategory) : ticketTypeList
  1672. },
  1673. scenicList () {
  1674. return this.$store.state.app.scenicList
  1675. },
  1676. permissionList () {
  1677. return this.$store.state.user.menuList || []
  1678. },
  1679. columnGroups () {
  1680. const groupList = []
  1681. const groupMap = {}
  1682. COLUMN_SCHEMA.forEach(item => {
  1683. if (!groupMap[item.group]) {
  1684. groupMap[item.group] = { name: item.group, fields: [] }
  1685. groupList.push(groupMap[item.group])
  1686. }
  1687. groupMap[item.group].fields.push({ key: item.key, label: item.label })
  1688. })
  1689. return groupList
  1690. }
  1691. },
  1692. components: {
  1693. ReaderInput
  1694. // Ellipsis
  1695. },
  1696. data () {
  1697. return {
  1698. projecticketTypeName: process.env.VUE_APP_PROJECT,
  1699. channelList,
  1700. teamList: [],
  1701. otaSourceList: [],
  1702. orderStatusDic,
  1703. ticketStatusDic,
  1704. papersType,
  1705. isDev: process.env.NODE_ENV === 'development',
  1706. orderCategories,
  1707. form: {
  1708. searchKeywords: '', // 搜索关键字
  1709. partnerOrderNo: '', // OTA订单号
  1710. ticketNo: '', // 票号
  1711. otaOrderNo: '', // 渠道订单号
  1712. orderNo: '', // 订单号
  1713. createTime: [new Date(moment().subtract(7, 'day').format('YYYY-MM-DD')), new Date(moment().format('YYYY-MM-DD'))], // 下单时间
  1714. createTimeBegin: '',
  1715. createTimeEnd: '',
  1716. orderCategory: '',
  1717. playDate: ['', ''], // 游玩时间
  1718. playDateBegin: '',
  1719. playDateEnd: '',
  1720. payChannelList: [], // 支付方式
  1721. otaSourceNameList: [], // 销售来源
  1722. adminIdList: [], // 售票员
  1723. saleTermIdList: [], // 售卖自助机
  1724. orderStatus: '', // 订单状态
  1725. ticketStatus: '', // 门票状态
  1726. visitorName: '', // 游客姓名
  1727. visitorPhone: '', // 游客手机
  1728. visitorIdentify: '', // 游客身份证
  1729. ticketTypeIdList: [], // 票种列表
  1730. scenicIdList: [], // 景点列表
  1731. unitPriceBegin: undefined, // 单价
  1732. unitPriceEnd: undefined, // 单价
  1733. teamIdList: [],
  1734. pageNum: 1,
  1735. pageSize: 10
  1736. },
  1737. tableData: [],
  1738. total: 0,
  1739. loading: false,
  1740. invoiceType: 0,
  1741. formEl: {
  1742. invoiceType: 1,
  1743. invoiceBuyer: '',
  1744. invoiceBuyerTaxNum: '',
  1745. invoiceBuyerEmail: '',
  1746. invoiceBuyerPhone: '',
  1747. invoiceBuyerAddress: '',
  1748. invoiceBuyerBankAccount: '',
  1749. remark: ''
  1750. },
  1751. rules: {
  1752. invoiceBuyerTaxNum: [
  1753. { required: false, message: '请输入纳税人识别号', trigger: 'blur' },
  1754. { pattern: /^[A-Za-z0-9]{15,20}$/, message: '纳税人识别号格式不正确', trigger: 'blur' }
  1755. ]
  1756. },
  1757. currentOrder: {},
  1758. multipleSelection: [],
  1759. order_tag_list: [],
  1760. visible: false,
  1761. refundOrderDialogVisible: false,
  1762. refundOrderInfo: {
  1763. force: false,
  1764. orderId: '',
  1765. ticketCancelRequestList: []
  1766. },
  1767. checkOrderDialogVisible: false,
  1768. checkOrderInfo: {
  1769. force: false,
  1770. orderId: '',
  1771. ticketIdList: []
  1772. },
  1773. printOrderDialogVisible: false,
  1774. secondPrintDialogVisible: false,
  1775. secondPrintInfo: {
  1776. orderId: '',
  1777. ticketIdList: []
  1778. },
  1779. updateTypes: [
  1780. { value: 'updateOrderPayChannel', label: '支付方式' },
  1781. { value: 'updatePlayDate', label: '游玩日期' },
  1782. { value: 'updateScenicTimes', label: '检票次数' }
  1783. ],
  1784. dialogVisible: false,
  1785. columnSchema: COLUMN_SCHEMA,
  1786. columnFieldMap: COLUMN_FIELD_MAP,
  1787. selectedFields: [...DEFAULT_FIELD_KEYS],
  1788. tempSelectedFields: [...DEFAULT_FIELD_KEYS],
  1789. editOrderDialogVisible: false,
  1790. editOrderInfo: {
  1791. orderId: '',
  1792. updateType: '',
  1793. payChannel: '',
  1794. playDateBegin: '',
  1795. playDateEnd: '',
  1796. ticketIds: [],
  1797. ticketList: [],
  1798. ticketCheckScenicUpdateRequestList: []
  1799. },
  1800. ticketNoSearch: ''
  1801. }
  1802. },
  1803. filters: {
  1804. filterChannel (n) {
  1805. switch (n) {
  1806. case 1:
  1807. return '线下'
  1808. case 2:
  1809. return '线上'
  1810. case 3:
  1811. return '自助机'
  1812. }
  1813. },
  1814. filterOrderCategory (n) {
  1815. return orderCategories.find(item => item.id === n).name
  1816. }
  1817. },
  1818. async created () {
  1819. const searchParams = JSON.parse(sessionStorage.getItem('统计表-售票记录-查询条件'))
  1820. if (searchParams) {
  1821. // 如果存在查询条件,则设置到组件的数据中
  1822. this.form = searchParams // 记住上次搜索条件
  1823. }
  1824. this.loadUserConfig()
  1825. // this.getSaleChannelList()
  1826. // this.getOrderList()
  1827. },
  1828. mounted () {
  1829. this.getSaleChannelList()
  1830. this.getOrderList()
  1831. this.getTeams()
  1832. EventBus.$on('activeTag', (tag) => {
  1833. if (tag === '/queryReport/salesQuery') {
  1834. this.getOrderList()
  1835. }
  1836. })
  1837. },
  1838. methods: {
  1839. getPayStatus,
  1840. getTeams () {
  1841. getTeamList({ pageSize: -1, pageNum: 1 }).then(res => {
  1842. this.teamList = res.data.records || []
  1843. })
  1844. },
  1845. showColumnConfig () {
  1846. this.dialogVisible = true
  1847. this.loadUserConfig(false)
  1848. },
  1849. loadUserConfig (applyToTable = true) {
  1850. getUserConfig({ statKey: STAT_KEY }).then(config => {
  1851. const fields = config?.data?.fields || config?.fields || config?.data?.columns || config?.columns || config?.data || []
  1852. let nextSelected = []
  1853. if (Array.isArray(fields) && fields.length) {
  1854. nextSelected = fields
  1855. .filter(i => Number(i.isShow) === 1)
  1856. .map(i => API_KEY_TO_FIELD[i.fieldKey] || i.fieldKey)
  1857. .filter(key => DEFAULT_FIELD_KEYS.includes(key))
  1858. } else {
  1859. nextSelected = [...DEFAULT_FIELD_KEYS]
  1860. }
  1861. if (applyToTable) {
  1862. this.selectedFields = nextSelected
  1863. }
  1864. this.tempSelectedFields = [...nextSelected]
  1865. }).catch(() => {
  1866. const nextSelected = [...DEFAULT_FIELD_KEYS]
  1867. if (applyToTable) {
  1868. this.selectedFields = nextSelected
  1869. }
  1870. this.tempSelectedFields = [...nextSelected]
  1871. })
  1872. },
  1873. saveUserConfig () {
  1874. const fields = this.columnSchema
  1875. .filter(item => item.apiKey)
  1876. .map(item => ({
  1877. fieldKey: item.apiKey,
  1878. fieldName: item.label,
  1879. isShow: this.tempSelectedFields.includes(item.key) ? 1 : 0
  1880. }))
  1881. addUserConfig({ statKey: STAT_KEY, fields }).then(() => {
  1882. this.selectedFields = [...this.tempSelectedFields]
  1883. this.dialogVisible = false
  1884. })
  1885. },
  1886. hasPermission (key) {
  1887. return !!this.permissionList.some(item => item.code === key)
  1888. },
  1889. reset () {
  1890. this.$refs.form.resetFields()
  1891. this.form.unitPriceBegin = undefined
  1892. this.form.unitPriceEnd = undefined
  1893. this.getOrderList(true)
  1894. },
  1895. setSearchKeywords (val) {
  1896. this.form.searchKeywords = val
  1897. },
  1898. // 取票状态
  1899. checkPrintStatus (ticketList) {
  1900. let tempArr = ticketList.filter(i => i.isPrint)
  1901. if (tempArr.length) {
  1902. if (tempArr.length === ticketList.length) {
  1903. return { type: 'success', text: '已取票' }
  1904. } else {
  1905. return { type: 'warning', text: '部分取票' }
  1906. }
  1907. } else {
  1908. return { type: 'info', text: '未取票' }
  1909. }
  1910. },
  1911. toggleSelection (rows) {
  1912. if (rows) {
  1913. rows.forEach(row => {
  1914. this.$refs.multipleTable.toggleRowSelection(row)
  1915. })
  1916. } else {
  1917. this.$refs.multipleTable.clearSelection()
  1918. }
  1919. },
  1920. handleSelectionChange (val) {
  1921. this.multipleSelection = val
  1922. },
  1923. selectable (row, index) {
  1924. return true
  1925. },
  1926. showPickInvoice (order) {
  1927. this.visible = true
  1928. this.currentOrder = order
  1929. if (['九龙湖', 'demo'].includes(this.scenicName)) {
  1930. this.formEl.invoiceType = 0 // 九龙湖只能普通开票
  1931. }
  1932. },
  1933. submitPickInvoice () {
  1934. if (!this.multipleSelection.length) return this.$message.error('请选择门票')
  1935. this.$refs.formEl.validate(valid => {
  1936. if (!valid) return
  1937. if (this.formEl.invoiceType) {
  1938. this.formEl.invoiceBuyer = ''
  1939. this.formEl.invoiceBuyerTaxNum = ''
  1940. this.formEl.invoiceBuyerEmail = ''
  1941. this.formEl.invoiceBuyerPhone = ''
  1942. this.formEl.invoiceBuyerAddress = ''
  1943. this.formEl.invoiceBuyerBankAccount = ''
  1944. this.formEl.remark = ''
  1945. }
  1946. pickInvoice([this.currentOrder.id], this.multipleSelection.map(v => v.id), this.formEl.invoiceType, this.formEl.invoiceBuyer, this.formEl.invoiceBuyerTaxNum, this.formEl.invoiceBuyerEmail, this.formEl.invoiceBuyerPhone, this.formEl.invoiceBuyerAddress, this.formEl.invoiceBuyerBankAccount, this.formEl.remark).then(res => {
  1947. this.$message.success('操作成功')
  1948. this.getOrderList()
  1949. this.visible = false
  1950. this.currentOrder = {}
  1951. this.formEl = {
  1952. invoiceType: 1,
  1953. invoiceBuyer: '',
  1954. invoiceBuyerTaxNum: '',
  1955. invoiceBuyerEmail: '',
  1956. invoiceBuyerPhone: '',
  1957. invoiceBuyerAddress: '',
  1958. invoiceBuyerBankAccount: '',
  1959. remark: ''
  1960. }
  1961. this.$confirm('发票已生成,是否跳转到发票下载页?', '提示', {
  1962. confirmButtonText: '确定',
  1963. cancelButtonText: '取消',
  1964. type: 'warning'
  1965. }).then(() => {
  1966. this.$router.push('/queryReport/invoiceRecord')
  1967. })
  1968. })
  1969. })
  1970. },
  1971. confirmPOS (record) {
  1972. this.$confirm('请确认该订单已付款,将手动更新订单状态为已支付', '提示', {
  1973. confirmButtonText: '确定',
  1974. cancelButtonText: '取消',
  1975. type: 'warning'
  1976. }).then(() => {
  1977. getSelf().then(response => {
  1978. const params = {
  1979. managerId: response.id,
  1980. id: record.id,
  1981. payChannel: record.payChannel,
  1982. posId: this.$localStore.get('termId'),
  1983. tradeInfo: '',
  1984. type: 'TICKET'
  1985. }
  1986. payPOS(params).then(res => {
  1987. this.$message.success('操作成功')
  1988. this.getOrderList()
  1989. this.$confirm('门票状态已修改,是否跳转补打门票页面?', '提示', {
  1990. confirmButtonText: '确定',
  1991. cancelButtonText: '取消',
  1992. type: 'warning'
  1993. }).then(() => {
  1994. this.$router.push({ name: 'printTicket' })
  1995. }).catch(() => {
  1996. })
  1997. })
  1998. })
  1999. }).catch(() => {
  2000. })
  2001. },
  2002. getSaleChannelList () {
  2003. getSaleChannelList().then(res => {
  2004. this.otaSourceList = res.data
  2005. })
  2006. },
  2007. handleSizeChange (size) {
  2008. this.form.pageSize = size
  2009. this.getOrderList()
  2010. },
  2011. dataExport () {
  2012. this.form.export = true
  2013. // this.form.exportDetail = true
  2014. apiOrderList(this.form).then(() => {
  2015. this.$message.success('导出成功。')
  2016. this.goToDownload()
  2017. }, () => {
  2018. this.$message.success('导出失败。')
  2019. })
  2020. this.reset()
  2021. },
  2022. reportExport (exportType) {
  2023. this.$confirm(`是否要导出明细数据`, '确认提示', {
  2024. confirmButtonText: '是',
  2025. cancelButtonText: '否',
  2026. type: 'warning'
  2027. }).then(() => {
  2028. this.handleExport({
  2029. ...this.form,
  2030. exportType: exportType || 'ticket',
  2031. export: true,
  2032. exportDetail: true
  2033. })
  2034. }).catch(() => {
  2035. this.handleExport({
  2036. ...this.form,
  2037. exportType: exportType || 'ticket',
  2038. export: true,
  2039. exportDetail: false
  2040. })
  2041. })
  2042. },
  2043. handleExport (params) {
  2044. apiOrderList(params).then(() => {
  2045. this.$message.success('导出成功。')
  2046. this.goToDownload()
  2047. }, () => {
  2048. this.$message.success('导出失败。')
  2049. })
  2050. },
  2051. getOrderList (goFirst) {
  2052. this.loading = true
  2053. goFirst && (this.form.pageNum = 1)
  2054. const [s, e] = this.form.createTime || []
  2055. this.form.createTimeBegin = s ? moment(s).startOf('day').format('YYYY-MM-DD HH:mm:ss') : ''
  2056. this.form.createTimeEnd = e ? moment(e).endOf('day').format('YYYY-MM-DD HH:mm:ss') : ''
  2057. const [s1, e1] = this.form.playDate || []
  2058. this.form.playDateBegin = s1 ? moment(s1).format('YYYY-MM-DD') : ''
  2059. this.form.playDateEnd = e1 ? moment(e1).format('YYYY-MM-DD') : ''
  2060. if (this.form.unitPriceBegin && this.form.unitPriceEnd && this.form.unitPriceBegin > this.form.unitPriceEnd) {
  2061. this.$message.warning('单价区间起始金额不能大于终止金额')
  2062. }
  2063. apiOrderList(this.form).then(res => {
  2064. this.total = res.data.total
  2065. // const list = []
  2066. res.data.records.forEach(item => {
  2067. let ticketsName = []
  2068. item.ticketsName = ticketsName.join(',')
  2069. })
  2070. this.tableData = res.data.records
  2071. // this.tableData.forEach(v => {
  2072. // if (v.price === 0 && v.payChannel === '现金') {
  2073. // v.payChannel = '免票'
  2074. // }
  2075. // })
  2076. console.log(this.tableData, 'tableData')
  2077. }).finally(() => {
  2078. this.loading = false
  2079. })
  2080. sessionStorage.setItem('统计表-售票记录-查询条件', JSON.stringify(this.form)) // 下次记住
  2081. },
  2082. reduceCheckNum (list) {
  2083. if (!list) return 0
  2084. return list.reduce((prev, item) => {
  2085. return prev + item.checkNum
  2086. }, 0)
  2087. },
  2088. async getOrderDetail (order) {
  2089. const res = await getSingleOrder(order.id)
  2090. this.currentOrder = res?.data || order
  2091. },
  2092. async refundOrder (order) {
  2093. await this.getOrderDetail(order)
  2094. this.refundOrderDialogVisible = true
  2095. this.refundOrderInfo.orderId = order.id
  2096. },
  2097. async secondPrint (order) {
  2098. await this.getOrderDetail(order)
  2099. this.secondPrintDialogVisible = true
  2100. this.secondPrintInfo.orderId = order.id
  2101. },
  2102. submitRefundOrder () {
  2103. if (!this.multipleSelection?.length) {
  2104. return this.$message.error('请选择门票')
  2105. }
  2106. this.refundOrderInfo.ticketCancelRequestList = this.multipleSelection.map(v => {
  2107. return {
  2108. ticketId: v.id,
  2109. cancelPrice: v.price
  2110. }
  2111. })
  2112. this.$confirm('确定要退单吗?', '提示', {
  2113. confirmButtonText: '确定',
  2114. cancelButtonText: '取消',
  2115. type: 'warning'
  2116. }).then(() => {
  2117. cancelOrder(this.refundOrderInfo).then(res => {
  2118. if (res.code === '999999') {
  2119. this.$message.warning(res.msg || '操作失败')
  2120. return
  2121. }
  2122. this.$message.success('操作成功')
  2123. this.refundOrderDialogVisible = false
  2124. this.getOrderList()
  2125. })
  2126. })
  2127. },
  2128. submitSecondPrint () {
  2129. if (!this.multipleSelection?.length) {
  2130. return this.$message.error('请选印门票')
  2131. }
  2132. this.secondPrintInfo.ticketIdList = this.multipleSelection.map(v => v.id)
  2133. this.$confirm('确定要打印吗?', '提示', {
  2134. confirmButtonText: '确定',
  2135. cancelButtonText: '取消',
  2136. type: 'warning'
  2137. }).then(() => {
  2138. reprintTicket(this.secondPrintInfo).then(res => {
  2139. if (res.code === '200') {
  2140. if (this.currentOrder) {
  2141. const order = cloneDeep(this.currentOrder)
  2142. order.ticketList = order.ticketList.filter(v => this.secondPrintInfo.ticketIdList.includes(v.id))
  2143. console.log('print currentOrder tickets', this.secondPrintInfo.ticketIdList)
  2144. this.$print(order)
  2145. }
  2146. this.$message.success('操作成功')
  2147. this.secondPrintDialogVisible = false
  2148. this.getOrderList()
  2149. } else {
  2150. this.$message.warning(res.msg || '操作失败')
  2151. }
  2152. })
  2153. })
  2154. },
  2155. async showOrderDetail (order) {
  2156. await this.getOrderDetail(order)
  2157. this.$refs.orderDetail.show(this.currentOrder)
  2158. },
  2159. // 核销
  2160. async checkOrder (order) {
  2161. await this.getOrderDetail(order)
  2162. this.checkOrderDialogVisible = true
  2163. this.checkOrderInfo.orderId = order.id
  2164. },
  2165. submitCheckOrder () {
  2166. if (!this.multipleSelection?.length) {
  2167. return this.$message.error('请选择门票')
  2168. }
  2169. this.checkOrderInfo.ticketIdList = this.multipleSelection.map(v => v.id)
  2170. this.$confirm('确定要核销吗?', '提示', {
  2171. confirmButtonText: '确定',
  2172. cancelButtonText: '取消',
  2173. type: 'warning'
  2174. }).then(() => {
  2175. checkTickets(this.checkOrderInfo).then(res => {
  2176. if (res.code === '999999') {
  2177. this.$message.warning(res.msg || '操作失败')
  2178. return
  2179. }
  2180. this.$message.success('操作成功')
  2181. this.checkOrderDialogVisible = false
  2182. this.getOrderList()
  2183. })
  2184. })
  2185. },
  2186. async printOrder (order) {
  2187. await this.getOrderDetail(order)
  2188. this.printOrderDialogVisible = true
  2189. },
  2190. submitPrintOrder () {
  2191. if (!this.multipleSelection?.length) {
  2192. return this.$message.error('请选择门票')
  2193. }
  2194. const ticketIdList = this.multipleSelection.map(v => v.id)
  2195. this.$confirm('确定要取票吗?', '提示', {
  2196. confirmButtonText: '确定',
  2197. cancelButtonText: '取消',
  2198. type: 'warning'
  2199. }).then(() => {
  2200. printTickets(ticketIdList).then(res => {
  2201. if (res.code === '999999') {
  2202. this.$message.warning(res.msg || '操作失败')
  2203. return
  2204. }
  2205. this.$message.success('操作成功')
  2206. this.checkOrderDialogVisible = false
  2207. this.getOrderList()
  2208. })
  2209. })
  2210. },
  2211. printSingleTicket (order) {
  2212. const ticketIdList = [order.id]
  2213. this.$confirm('确定要取票吗?', '提示', {
  2214. confirmButtonText: '确定',
  2215. cancelButtonText: '取消',
  2216. type: 'warning'
  2217. }).then(() => {
  2218. printTickets(ticketIdList).then(res => {
  2219. if (res.code === '200') {
  2220. this.$message.success('操作成功')
  2221. if (this.currentOrder) {
  2222. const order = cloneDeep(this.currentOrder)
  2223. order.ticketList = order.ticketList.filter(v => ticketIdList.includes(v.id))
  2224. console.log('print currentOrder tickets', ticketIdList)
  2225. this.$print(order)
  2226. }
  2227. } else {
  2228. this.$message.warning(res.msg || '操作失败')
  2229. }
  2230. })
  2231. })
  2232. },
  2233. // 修改
  2234. async editOrder (order) {
  2235. await this.getOrderDetail(order)
  2236. this.editOrderDialogVisible = true
  2237. this.editOrderInfo.orderId = order.id
  2238. this.editOrderInfo.payChannel = order.payChannel
  2239. this.editOrderInfo.playDateBegin = order.playDateBegin
  2240. this.editOrderInfo.playDateEnd = order.playDateEnd
  2241. this.editOrderInfo.ticketCheckScenicUpdateRequestList = []
  2242. this.editOrderInfo.ticketList = []
  2243. this.currentOrder.ticketList.forEach(v => {
  2244. this.editOrderInfo.ticketList.push({
  2245. ...v,
  2246. checkLimitTimes: -1 // 默认不限制
  2247. })
  2248. // this.editOrderInfo.ticketCheckScenicUpdateRequestList.push(...v.ticketCheckScenicList)
  2249. })
  2250. },
  2251. cancelEdit () {
  2252. this.editOrderDialogVisible = false
  2253. this.editOrderInfo = {
  2254. orderId: '',
  2255. updateType: '',
  2256. payChannel: '',
  2257. playDateBegin: '',
  2258. playDateEnd: '',
  2259. ticketIds: [],
  2260. ticketList: [],
  2261. ticketCheckScenicUpdateRequestList: []
  2262. }
  2263. },
  2264. submitEditOrder () {
  2265. if (this.editOrderInfo.updateType === '') {
  2266. return this.$message.error('请选择修改类型')
  2267. }
  2268. if (this.editOrderInfo.updateType === 'updateOrderPayChannel' && !this.editOrderInfo.payChannel) {
  2269. return this.$message.error('请选择支付方式')
  2270. }
  2271. if (this.editOrderInfo.updateType === 'updatePlayDate' && (!this.editOrderInfo.playDateBegin || !this.editOrderInfo.playDateEnd)) {
  2272. return this.$message.error('请选择游玩日期')
  2273. }
  2274. this.editOrderInfo.ticketCheckScenicUpdateRequestList = []
  2275. if (this.editOrderInfo.playDateBegin) {
  2276. this.editOrderInfo.playDateBegin = moment(this.editOrderInfo.playDateBegin).format('YYYY-MM-DD')
  2277. }
  2278. if (this.editOrderInfo.playDateEnd) {
  2279. this.editOrderInfo.playDateEnd = moment(this.editOrderInfo.playDateEnd).format('YYYY-MM-DD')
  2280. }
  2281. if (this.editOrderInfo.updateType === 'updateScenicTimes') {
  2282. this.editOrderInfo.ticketIds = this.editOrderInfo.ticketList.map(item => item.id)
  2283. this.editOrderInfo.ticketList.forEach(item => {
  2284. item.ticketCheckScenicList.forEach(scenic => {
  2285. this.editOrderInfo.ticketCheckScenicUpdateRequestList.push({
  2286. id: scenic.id,
  2287. checkedTimes: scenic.checkedTimes,
  2288. checkLimitTimes: item.checkLimitTimes
  2289. })
  2290. })
  2291. })
  2292. }
  2293. updateOrder(this.editOrderInfo).then(res => {
  2294. if (res.code === '999999') {
  2295. this.$message.warning(res.msg || '修改失败')
  2296. return
  2297. }
  2298. this.$message.success('修改成功')
  2299. this.editOrderDialogVisible = false
  2300. this.getOrderList()
  2301. })
  2302. }
  2303. },
  2304. beforeDestroy () {
  2305. EventBus.$off('activeTag')
  2306. }
  2307. }
  2308. </script>
  2309. <style lang="scss" scoped>
  2310. .el-dialog__body {
  2311. min-height: 300px;
  2312. }
  2313. </style>