salesQuery.vue 87 KB

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