salesQuery.vue 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659
  1. <template>
  2. <div class="form-wrap">
  3. <el-form
  4. class="searchBox"
  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="orderNo"
  16. >
  17. <el-input v-model="form.orderNo"></el-input>
  18. </el-form-item>
  19. <el-form-item
  20. label="合作方订单号"
  21. prop="partnerOrderNo"
  22. >
  23. <el-input v-model="form.partnerOrderNo"></el-input>
  24. </el-form-item>
  25. <el-form-item
  26. label="票号"
  27. prop="ticketNo"
  28. >
  29. <el-input v-model="form.ticketNo"></el-input>
  30. </el-form-item>
  31. <el-form-item
  32. label="下单时间"
  33. prop="createTime">
  34. <el-date-picker
  35. v-model="form.createTime"
  36. style="width:240px"
  37. type="daterange"
  38. format="yyyy-MM-dd"
  39. range-separator="至"
  40. start-placeholder="开始日期"
  41. end-placeholder="结束日期">
  42. </el-date-picker>
  43. </el-form-item>
  44. <el-form-item
  45. label="游玩时间"
  46. prop="playDate">
  47. <el-date-picker
  48. v-model="form.playDate"
  49. style="width:240px"
  50. type="daterange"
  51. format="yyyy-MM-dd"
  52. range-separator="至"
  53. start-placeholder="开始日期"
  54. end-placeholder="结束日期">
  55. </el-date-picker>
  56. </el-form-item>
  57. <el-form-item
  58. label="支付方式"
  59. prop="payChannelList">
  60. <el-select
  61. v-model="form.payChannelList"
  62. multiple
  63. filterable>
  64. <el-option
  65. v-for="item in payChannelOptions"
  66. :key="item"
  67. :label="item"
  68. :value="item">
  69. </el-option>
  70. </el-select>
  71. </el-form-item>
  72. <el-form-item
  73. label="销售来源"
  74. prop="otaSourceNameList">
  75. <el-select
  76. v-model="form.otaSourceNameList"
  77. multiple
  78. filterable>
  79. <el-option
  80. v-for="item in otaSourceList"
  81. :key="item"
  82. :label="item"
  83. :value="item">
  84. </el-option>
  85. </el-select>
  86. </el-form-item>
  87. <el-form-item
  88. label="游客姓名"
  89. prop="visitorName"
  90. >
  91. <el-input v-model="form.visitorName"></el-input>
  92. </el-form-item>
  93. <el-form-item
  94. label="游客电话"
  95. prop="visitorPhone">
  96. <el-input v-model="form.visitorPhone"></el-input>
  97. </el-form-item>
  98. <el-form-item
  99. label="游客证件号"
  100. prop="visitorIdentify">
  101. <ReaderInput v-model="form.visitorIdentify"></ReaderInput>
  102. </el-form-item>
  103. <el-form-item
  104. label="订单状态"
  105. prop="orderStatus"
  106. >
  107. <el-select
  108. v-model="form.orderStatus"
  109. clearable
  110. placeholder="请选择"
  111. >
  112. <el-option
  113. label="全部"
  114. value=""></el-option>
  115. <el-option
  116. v-for="item in orderStatusDic"
  117. :key="item.value"
  118. :label="item.label"
  119. :value="item.value"
  120. >
  121. </el-option>
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item
  125. label="门票状态"
  126. prop="ticketStatus"
  127. >
  128. <el-select
  129. v-model="form.ticketStatus"
  130. clearable
  131. placeholder="请选择"
  132. >
  133. <el-option
  134. label="全部"
  135. value=""></el-option>
  136. <el-option
  137. v-for="item in ticketStatusDic"
  138. :key="item.value"
  139. :label="item.label"
  140. :value="item.value"
  141. >
  142. </el-option>
  143. </el-select>
  144. </el-form-item>
  145. <el-form-item
  146. label="订单类型"
  147. prop="orderCategory"
  148. >
  149. <el-select
  150. v-model="form.orderCategory"
  151. placeholder="请选择"
  152. filterable>
  153. <el-option
  154. v-for="item in orderCategories"
  155. :key="item.id"
  156. :value="item.id"
  157. :label="item.name">
  158. </el-option>
  159. </el-select>
  160. </el-form-item>
  161. <el-form-item
  162. label="票种列表"
  163. prop="ticketTypeIdList"
  164. >
  165. <el-select
  166. v-model="form.ticketTypeIdList"
  167. placeholder="请选择"
  168. multiple
  169. filterable>
  170. <el-option
  171. v-for="item in ticketTypeList"
  172. :key="item.id"
  173. :value="item.id"
  174. :label="item.name">
  175. </el-option>
  176. </el-select>
  177. </el-form-item>
  178. <el-form-item
  179. label="售票员"
  180. prop="adminIdList"
  181. >
  182. <el-select
  183. v-model="form.adminIdList"
  184. multiple
  185. placeholder="请选择"
  186. filterable>
  187. <el-option
  188. v-for="item in accountList"
  189. :key="item.id"
  190. :value="item.id"
  191. :label="item.loginName">
  192. </el-option>
  193. </el-select>
  194. </el-form-item>
  195. <el-form-item
  196. label="售卖自助机"
  197. prop="saleTermIdList"
  198. >
  199. <el-select
  200. v-model="form.saleTermIdList"
  201. multiple
  202. placeholder="请选择"
  203. filterable>
  204. <el-option
  205. v-for="item in termList"
  206. :key="item.id"
  207. :value="item.id"
  208. :label="item.name">
  209. </el-option>
  210. </el-select>
  211. </el-form-item>
  212. <div class="btn-wrap">
  213. <el-button
  214. @click="reset"
  215. >
  216. 重置
  217. </el-button>
  218. <el-button
  219. :disabled="loading"
  220. type="primary"
  221. @click="getOrderList(true)"
  222. >
  223. 搜索
  224. </el-button>
  225. </div>
  226. </el-form>
  227. <div class="tableBox">
  228. <div class="block-title">
  229. 统计信息
  230. </div>
  231. <el-table
  232. stripe
  233. border
  234. v-loading="loading"
  235. :data="tableData">
  236. <el-table-column
  237. min-width="200"
  238. prop="orderNo"
  239. label="订单号"
  240. fixed="left"
  241. >
  242. </el-table-column>
  243. <el-table-column
  244. width="120"
  245. prop="partnerOrderNo"
  246. label="线上订单号"
  247. >
  248. </el-table-column>
  249. <el-table-column
  250. width="120"
  251. prop="orderCategory"
  252. label="订单类型"
  253. >
  254. <template slot-scope="scope">
  255. {{ scope.row.orderCategory | filterOrderCategory }}
  256. </template>
  257. </el-table-column>
  258. <el-table-column
  259. width="120"
  260. prop="otaSourceName"
  261. label="订单来源渠道"
  262. >
  263. </el-table-column>
  264. <el-table-column
  265. label="支付渠道"
  266. width="120"
  267. prop="payChannel">
  268. </el-table-column>
  269. <el-table-column
  270. label="支付状态"
  271. fixed="right"
  272. >
  273. <template slot-scope="scope">
  274. <el-tag
  275. :type="getPayStatus(scope.row.payStatus, 'type')"
  276. size="normal"
  277. >
  278. {{ getPayStatus(scope.row.payStatus) }}
  279. </el-tag>
  280. </template>
  281. </el-table-column>
  282. <el-table-column
  283. label="支付时间"
  284. width="140"
  285. prop="payTime">
  286. </el-table-column>
  287. <!-- <el-table-column
  288. label="票种"
  289. min-width="120">
  290. <template slot-scope="scope">
  291. <Ellipsis
  292. type="tooltip"
  293. :content="scope.row.ticketsName"
  294. :length="15"></Ellipsis>
  295. </template>
  296. </el-table-column> -->
  297. <el-table-column
  298. prop="saleAdminName"
  299. width="120"
  300. label="售票员"
  301. >
  302. </el-table-column>
  303. <el-table-column
  304. width="140"
  305. label="售票时间"
  306. >
  307. <template slot-scope="scope">
  308. {{ scope.row.createTime | formatTime }}
  309. </template>
  310. </el-table-column>
  311. <el-table-column
  312. width="120"
  313. prop="buyerName"
  314. label="购买方名称"
  315. ></el-table-column>
  316. <el-table-column
  317. width="110"
  318. prop="buyerPhone"
  319. label="购买方手机">
  320. </el-table-column>
  321. <el-table-column
  322. width="140"
  323. prop="buyerIdentify"
  324. label="购买方证件号">
  325. </el-table-column>
  326. <el-table-column
  327. width="80"
  328. prop="ticketNum"
  329. label="所含票数"
  330. >
  331. </el-table-column>
  332. <!-- <el-table-column
  333. width="80"
  334. label="人数"
  335. >
  336. <template slot-scope="scope">
  337. {{ reduceCheckNum(scope.row.ticketList) }}
  338. </template>
  339. </el-table-column> -->
  340. <!-- <el-table-column
  341. width="80"
  342. label="游客信息"
  343. prop="guestName">
  344. </el-table-column> -->
  345. <!-- <el-table-column
  346. width="80"
  347. label="使用状态"
  348. prop="ticketStatus">
  349. </el-table-column> -->
  350. <el-table-column
  351. width="80"
  352. label="总价(¥)"
  353. >
  354. <template slot-scope="scope">
  355. {{ scope.row.price }}
  356. </template>
  357. </el-table-column>
  358. <el-table-column
  359. width="90"
  360. label="状态"
  361. fixed="right"
  362. >
  363. <template slot-scope="scope">
  364. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  365. </template>
  366. </el-table-column>
  367. <el-table-column
  368. width="80"
  369. label="备注"
  370. >
  371. <template slot-scope="scope">
  372. {{ scope.row.remark }}
  373. </template>
  374. </el-table-column>
  375. <el-table-column
  376. label="操作"
  377. fixed="right"
  378. width="220"
  379. >
  380. <template slot-scope="scope">
  381. <el-link
  382. type="primary"
  383. @click="showOrderDetail(scope.row)">
  384. 详情
  385. </el-link>
  386. <el-link
  387. type="primary"
  388. v-if="scope.row.status !== 'CANCELED'"
  389. @click="editOrder(scope.row)">
  390. 修改
  391. </el-link>
  392. <el-link
  393. type="primary"
  394. v-if="scope.row.status !== 'CANCELED'"
  395. @click="printOrder(scope.row)">
  396. 网络取票
  397. </el-link>
  398. <br>
  399. <el-link
  400. type="primary"
  401. v-if="scope.row.status !== 'CANCELED'"
  402. @click="checkOrder(scope.row)">
  403. 核销
  404. </el-link>
  405. <el-link
  406. type="primary"
  407. v-if="scope.row.status !== 'CANCELED'"
  408. @click="refundOrder(scope.row)">
  409. 退单
  410. </el-link>
  411. <el-link
  412. type="primary"
  413. v-if="scope.row.status !== 'CANCELED'"
  414. @click="secondPrint(scope.row)">
  415. 补打
  416. </el-link>
  417. <!--
  418. <el-link
  419. type="primary"
  420. v-if="scope.row.tickets.some(v=>v.is_invoice_picked===0&&v.status==='USED')&&scope.row.otaName!=='自营售票'"
  421. @click="showPickInvoice(scope.row)">
  422. 开票
  423. </el-link>
  424. -->
  425. <!-- <el-link
  426. type="primary"
  427. v-if="scenicName==='昭苏' && scope.row.ticketList.some(v=>v.is_invoice_picked===0&&v.status==='USED')&&scope.row.otaName!=='自营售票'"
  428. @click="showPickInvoice(scope.row)">
  429. 开票
  430. </el-link>
  431. <el-link
  432. type="primary"
  433. v-if="scenicName!=='昭苏' && scope.row.ticketList.some(v=>v.is_invoice_picked===0&&v.status==='USED')"
  434. @click="showPickInvoice(scope.row)">
  435. 开票
  436. </el-link> -->
  437. </template>
  438. </el-table-column>
  439. </el-table>
  440. <el-pagination
  441. background
  442. :current-page.sync="form.pageNum"
  443. @current-change="getOrderList()"
  444. layout="total, prev, pager, next"
  445. :total="total"
  446. >
  447. </el-pagination>
  448. </div>
  449. <OrderDetail ref="orderDetail"></OrderDetail>
  450. <el-dialog
  451. title="开票"
  452. :visible.sync="visible"
  453. width="80%"
  454. @close="visible=false">
  455. <el-table
  456. ref="multipleTable"
  457. :data="currentOrder.ticketList"
  458. @selection-change="handleSelectionChange">
  459. <el-table-column
  460. type="selection"
  461. :selectable="selectable"
  462. width="55">
  463. </el-table-column>
  464. <el-table-column
  465. prop="ticketNo"
  466. label="票号"
  467. >
  468. </el-table-column>
  469. <el-table-column
  470. prop="ticketTypeName"
  471. label="票种"
  472. >
  473. </el-table-column>
  474. <el-table-column
  475. width="80"
  476. label="票价(¥)"
  477. >
  478. <template slot-scope="scope">
  479. {{ scope.row.price/scope.row.checkNum }}
  480. </template>
  481. </el-table-column>
  482. <el-table-column
  483. prop="guestIdentifyType"
  484. label="证件类型"
  485. >
  486. <template slot-scope="scope">
  487. {{ papersType[scope.row.guestIdentifyType] }}
  488. </template>
  489. </el-table-column>
  490. <el-table-column
  491. width="100"
  492. prop="checkNum"
  493. label="检票人数"
  494. >
  495. </el-table-column>
  496. <el-table-column
  497. width="100"
  498. prop="payDateBegin"
  499. label="游玩时间"
  500. >
  501. <template slot-scope="scope">
  502. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  503. </template>
  504. </el-table-column>
  505. <el-table-column
  506. width="80"
  507. label="取票状态"
  508. >
  509. <template slot-scope="scope">
  510. <el-tag :type="scope.row.isPrint?'success':'info'">
  511. {{ scope.row.isPrint?'已取票':'未取票' }}
  512. </el-tag>
  513. </template>
  514. </el-table-column>
  515. <el-table-column
  516. width="80"
  517. label="状态"
  518. >
  519. <template slot-scope="scope">
  520. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  521. </template>
  522. </el-table-column>
  523. <el-table-column
  524. width="80"
  525. label="是否已开票"
  526. >
  527. <template slot-scope="scope">
  528. {{ scope.row.is_invoice_picked===1?'已开':'未开' }}
  529. </template>
  530. </el-table-column>
  531. <el-table-column
  532. width="80"
  533. prop="price"
  534. label="小计"
  535. >
  536. </el-table-column>
  537. </el-table>
  538. {{ formEl.invoiceType }}
  539. <el-form
  540. class="searchBox"
  541. ref="formEl"
  542. :model="formEl"
  543. :inline="true"
  544. label-width="200px"
  545. style="background: transparent"
  546. >
  547. <!-- 九龙湖只能固定一种开票方式 -->
  548. <el-form-item
  549. v-if="['九龙湖','demo'].includes(scenicName)"
  550. label="开票方式"
  551. prop="invoiceType"
  552. >
  553. <!-- <el-radio
  554. v-if="false"
  555. v-model="formEl.invoiceType"
  556. :label="1">
  557. 扫码开票
  558. </el-radio> -->
  559. <el-radio
  560. v-model="formEl.invoiceType"
  561. :label="0">
  562. 普通开票
  563. </el-radio>
  564. </el-form-item>
  565. <el-form-item
  566. v-else
  567. verify
  568. label="开票方式"
  569. prop="invoiceType"
  570. >
  571. <el-radio
  572. v-model="formEl.invoiceType"
  573. :label="1">
  574. 扫码开票
  575. </el-radio>
  576. <el-radio
  577. v-model="formEl.invoiceType"
  578. :label="0">
  579. 普通开票
  580. </el-radio>
  581. </el-form-item>
  582. <el-form-item
  583. v-if="!formEl.invoiceType"
  584. verify
  585. label="购买方"
  586. prop="invoiceBuyer"
  587. >
  588. <el-input
  589. v-model="formEl.invoiceBuyer"
  590. style="width:100%"></el-input>
  591. </el-form-item>
  592. <el-form-item
  593. v-if="!formEl.invoiceType"
  594. label="纳税⼈识别号"
  595. prop="invoiceBuyerTaxNum"
  596. :rules="rules.invoiceBuyerTaxNum"
  597. >
  598. <el-input
  599. v-model="formEl.invoiceBuyerTaxNum"
  600. style="width:100%"></el-input>
  601. </el-form-item>
  602. <el-form-item
  603. v-if="!formEl.invoiceType"
  604. label="纳税⼈邮箱"
  605. prop="invoiceBuyerEmail"
  606. :rules="[
  607. { required: false, message: '请输入邮箱', trigger: 'blur' },
  608. { type: 'email', message: '邮箱格式不正确', trigger: 'blur' }
  609. ]"
  610. >
  611. <el-input
  612. v-model="formEl.invoiceBuyerEmail"
  613. style="width:100%"></el-input>
  614. </el-form-item>
  615. <el-form-item
  616. v-if="!formEl.invoiceType"
  617. label="纳税⼈手机号"
  618. prop="invoiceBuyerPhone"
  619. :rules="[
  620. { required: false, message: '请输入手机号', trigger: 'blur' },
  621. { pattern: /^1[3456789]\d{9}$/, message: '手机号格式不正确', trigger: 'blur' }
  622. ]"
  623. >
  624. <el-input
  625. v-model="formEl.invoiceBuyerPhone"
  626. style="width:100%"></el-input>
  627. </el-form-item>
  628. <el-form-item
  629. v-if="!formEl.invoiceType"
  630. label="购买方地址"
  631. prop="invoiceBuyerAddress"
  632. >
  633. <el-input
  634. v-model="formEl.invoiceBuyerAddress"
  635. style="width:100%"></el-input>
  636. </el-form-item>
  637. <el-form-item
  638. v-if="!formEl.invoiceType"
  639. label="购买方银行开户行及账号"
  640. prop="invoiceBuyerBankAccount"
  641. >
  642. <el-input
  643. v-model="formEl.invoiceBuyerBankAccount"
  644. style="width:100%"></el-input>
  645. </el-form-item>
  646. <el-form-item
  647. v-if="!formEl.invoiceType"
  648. label="备注"
  649. prop="remark"
  650. >
  651. <el-input
  652. v-model="formEl.remark"
  653. style="width:100%"></el-input>
  654. </el-form-item>
  655. </el-form>
  656. <span slot="footer">
  657. <el-button @click="visible = false">取消</el-button>
  658. <el-button
  659. type="primary"
  660. @click="submitPickInvoice">确定</el-button>
  661. </span>
  662. </el-dialog>
  663. <el-dialog
  664. title="核销"
  665. :visible.sync="checkOrderDialogVisible"
  666. width="80%"
  667. @close="checkOrderDialogVisible=false">
  668. <div style="margin: 20px">
  669. <el-checkbox label="强制核销" v-model="checkOrderInfo.force"></el-checkbox>
  670. </div>
  671. <el-table
  672. border
  673. :data="currentOrder.ticketList"
  674. @selection-change="handleSelectionChange">
  675. <el-table-column
  676. type="selection"
  677. :selectable="selectable"
  678. width="55">
  679. </el-table-column>
  680. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  681. <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  682. <el-table-column prop="guestName" label="游客姓名">
  683. </el-table-column>
  684. <el-table-column prop="guestPhone" label="游客手机号">
  685. </el-table-column>
  686. <el-table-column prop="guestIdentifyType" label="证件类型">
  687. <template slot-scope="scope">
  688. {{ papersType[scope.row.guestIdentifyType] }}
  689. </template>
  690. </el-table-column>
  691. <el-table-column prop="guestIdentify" label="证件号码">
  692. <template slot-scope="scope">
  693. {{ scope.row.guestIdentify }}
  694. </template>
  695. </el-table-column>
  696. <el-table-column width="100" prop="checkNum" label="检票人数">
  697. </el-table-column>
  698. <el-table-column width="100" prop="payDateBegin" label="游玩时间">
  699. <template slot-scope="scope">
  700. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  701. </template>
  702. </el-table-column>
  703. <el-table-column width="80" label="取票状态">
  704. <template slot-scope="scope">
  705. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  706. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  707. </el-tag>
  708. </template>
  709. </el-table-column>
  710. <el-table-column width="80" label="状态">
  711. <template slot-scope="scope">
  712. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  713. </template>
  714. </el-table-column>
  715. <el-table-column width="80" prop="price" label="小计">
  716. </el-table-column>
  717. <el-table-column width="80" label="检票景点">
  718. <template slot-scope="scope">
  719. <el-button
  720. v-if="scope.row.ticketListScenic"
  721. @click="showDetail(scope.row)"
  722. >
  723. 明细
  724. </el-button>
  725. </template>
  726. </el-table-column>
  727. </el-table>
  728. <span slot="footer">
  729. <el-button @click="checkOrderDialogVisible = false">取消</el-button>
  730. <el-button
  731. type="primary"
  732. @click="submitCheckOrder">确定</el-button>
  733. </span>
  734. </el-dialog>
  735. <el-dialog
  736. title="退单"
  737. :visible.sync="refundOrderDialogVisible"
  738. width="80%"
  739. @close="refundOrderDialogVisible=false">
  740. <div style="margin: 20px">
  741. <el-checkbox label="强制取消" v-model="refundOrderInfo.force"></el-checkbox>
  742. </div>
  743. <!-- <div class="">
  744. <div class="tag">退票金额</div>
  745. <el-input-number
  746. v-model="refundOrderInfo.cancelPrice"
  747. :min="0"
  748. :precision="0.01"></el-input-number>
  749. </div> -->
  750. <el-table
  751. border
  752. :data="currentOrder.ticketList"
  753. @selection-change="handleSelectionChange">
  754. <el-table-column
  755. type="selection"
  756. :selectable="selectable"
  757. width="55">
  758. </el-table-column>
  759. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  760. <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  761. <el-table-column prop="guestName" label="游客姓名">
  762. </el-table-column>
  763. <el-table-column prop="guestPhone" label="游客手机号">
  764. </el-table-column>
  765. <el-table-column prop="guestIdentifyType" label="证件类型">
  766. <template slot-scope="scope">
  767. {{ papersType[scope.row.guestIdentifyType] }}
  768. </template>
  769. </el-table-column>
  770. <el-table-column prop="guestIdentify" label="证件号码">
  771. <template slot-scope="scope">
  772. {{ scope.row.guestIdentify }}
  773. </template>
  774. </el-table-column>
  775. <el-table-column width="100" prop="checkNum" label="检票人数">
  776. </el-table-column>
  777. <el-table-column width="100" prop="payDateBegin" label="游玩时间">
  778. <template slot-scope="scope">
  779. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  780. </template>
  781. </el-table-column>
  782. <el-table-column width="80" label="取票状态">
  783. <template slot-scope="scope">
  784. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  785. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  786. </el-tag>
  787. </template>
  788. </el-table-column>
  789. <el-table-column width="80" label="状态">
  790. <template slot-scope="scope">
  791. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  792. </template>
  793. </el-table-column>
  794. <el-table-column width="80" prop="price" label="小计">
  795. </el-table-column>
  796. <el-table-column width="80" label="检票景点">
  797. <template slot-scope="scope">
  798. <el-button
  799. v-if="scope.row.ticketListScenic"
  800. @click="showDetail(scope.row)"
  801. >
  802. 明细
  803. </el-button>
  804. </template>
  805. </el-table-column>
  806. </el-table>
  807. <span slot="footer">
  808. <el-button @click="refundOrderDialogVisible = false">取消</el-button>
  809. <el-button
  810. type="primary"
  811. @click="submitRefundOrder">确定</el-button>
  812. </span>
  813. </el-dialog>
  814. <el-dialog
  815. title="补打"
  816. :visible.sync="secondPrintDialogVisible"
  817. width="80%"
  818. @close="secondPrintDialogVisible=false">
  819. <!-- <div class="">
  820. <div class="tag">退票金额</div>
  821. <el-input-number
  822. v-model="refundOrderInfo.cancelPrice"
  823. :min="0"
  824. :precision="0.01"></el-input-number>
  825. </div> -->
  826. <el-table
  827. border
  828. :data="currentOrder.ticketList"
  829. @selection-change="handleSelectionChange">
  830. <el-table-column
  831. type="selection"
  832. :selectable="selectable"
  833. width="55">
  834. </el-table-column>
  835. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  836. <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  837. <el-table-column prop="guestName" label="游客姓名">
  838. </el-table-column>
  839. <el-table-column prop="guestPhone" label="游客手机号">
  840. </el-table-column>
  841. <el-table-column prop="guestIdentifyType" label="证件类型">
  842. <template slot-scope="scope">
  843. {{ papersType[scope.row.guestIdentifyType] }}
  844. </template>
  845. </el-table-column>
  846. <el-table-column prop="guestIdentify" label="证件号码">
  847. <template slot-scope="scope">
  848. {{ scope.row.guestIdentify }}
  849. </template>
  850. </el-table-column>
  851. <el-table-column width="100" prop="checkNum" label="检票人数">
  852. </el-table-column>
  853. <el-table-column width="100" prop="payDateBegin" label="游玩时间">
  854. <template slot-scope="scope">
  855. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  856. </template>
  857. </el-table-column>
  858. <el-table-column width="80" label="取票状态">
  859. <template slot-scope="scope">
  860. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  861. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  862. </el-tag>
  863. </template>
  864. </el-table-column>
  865. <el-table-column width="80" label="状态">
  866. <template slot-scope="scope">
  867. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  868. </template>
  869. </el-table-column>
  870. <el-table-column width="80" prop="price" label="小计">
  871. </el-table-column>
  872. <el-table-column width="80" label="检票景点">
  873. <template slot-scope="scope">
  874. <el-button
  875. v-if="scope.row.ticketListScenic"
  876. @click="showDetail(scope.row)"
  877. >
  878. 明细
  879. </el-button>
  880. </template>
  881. </el-table-column>
  882. </el-table>
  883. <span slot="footer">
  884. <el-button @click="secondPrintDialogVisible = false">取消</el-button>
  885. <el-button
  886. type="primary"
  887. @click="submitSecondPrint">确定</el-button>
  888. </span>
  889. </el-dialog>
  890. <el-dialog
  891. title="网络取票"
  892. :visible.sync="printOrderDialogVisible"
  893. width="80%"
  894. @close="printOrderDialogVisible=false">
  895. <el-table
  896. border
  897. :data="currentOrder.ticketList"
  898. @selection-change="handleSelectionChange">
  899. <el-table-column
  900. type="selection"
  901. :selectable="selectable"
  902. width="55">
  903. </el-table-column>
  904. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  905. <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  906. <el-table-column prop="guestName" label="游客姓名">
  907. </el-table-column>
  908. <el-table-column prop="guestPhone" label="游客手机号">
  909. </el-table-column>
  910. <el-table-column prop="guestIdentifyType" label="证件类型">
  911. <template slot-scope="scope">
  912. {{ papersType[scope.row.guestIdentifyType] }}
  913. </template>
  914. </el-table-column>
  915. <el-table-column prop="guestIdentify" label="证件号码">
  916. <template slot-scope="scope">
  917. {{ scope.row.guestIdentify }}
  918. </template>
  919. </el-table-column>
  920. <el-table-column width="100" prop="checkNum" label="检票人数">
  921. </el-table-column>
  922. <el-table-column width="100" prop="payDateBegin" label="游玩时间">
  923. <template slot-scope="scope">
  924. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  925. </template>
  926. </el-table-column>
  927. <el-table-column width="80" label="取票状态">
  928. <template slot-scope="scope">
  929. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  930. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  931. </el-tag>
  932. </template>
  933. </el-table-column>
  934. <el-table-column width="80" label="状态">
  935. <template slot-scope="scope">
  936. <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
  937. </template>
  938. </el-table-column>
  939. <el-table-column width="80" prop="price" label="小计">
  940. </el-table-column>
  941. <el-table-column width="80" label="检票景点">
  942. <template slot-scope="scope">
  943. <el-button
  944. v-if="scope.row.ticketListScenic"
  945. @click="showDetail(scope.row)"
  946. >
  947. 明细
  948. </el-button>
  949. </template>
  950. </el-table-column>
  951. </el-table>
  952. <span slot="footer">
  953. <el-button @click="printOrderDialogVisible = false">取消</el-button>
  954. <el-button
  955. type="primary"
  956. @click="submitPrintOrder">确定</el-button>
  957. </span>
  958. </el-dialog>
  959. <el-dialog
  960. title="修改"
  961. :visible.sync="editOrderDialogVisible"
  962. mini-height="500"
  963. @close="cancelEdit">
  964. <el-form
  965. class="searchBox"
  966. ref="formEl"
  967. :model="editOrderInfo"
  968. :inline="true"
  969. label-width="100px">
  970. <el-form-item
  971. label="修改类型"
  972. prop="updateType"
  973. >
  974. <el-select
  975. v-model="editOrderInfo.updateType"
  976. clearable
  977. placeholder="请选择"
  978. >
  979. <el-option
  980. v-for="item in updateTypes"
  981. :key="item.value"
  982. :label="item.label"
  983. :value="item.value"
  984. >
  985. </el-option>
  986. </el-select>
  987. </el-form-item>
  988. <el-form-item
  989. v-if="editOrderInfo.updateType === 'updateOrderPayChannel'"
  990. label="原支付方式"
  991. prop="payChannel"
  992. >
  993. {{ currentOrder.payChannel }}
  994. </el-form-item>
  995. <el-form-item
  996. v-if="editOrderInfo.updateType === 'updateOrderPayChannel'"
  997. label="支付方式"
  998. prop="payChannel"
  999. >
  1000. <el-radio-group
  1001. border
  1002. fill="#379143"
  1003. class="tags-btn"
  1004. v-model="editOrderInfo.payChannel">
  1005. <el-radio
  1006. border
  1007. v-for="val in payChannelOptions"
  1008. :key="val"
  1009. :value="val"
  1010. :label="val"></el-radio>
  1011. </el-radio-group>
  1012. </el-form-item>
  1013. <el-form-item
  1014. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1015. label="选择门票"
  1016. prop="playDateBegin">
  1017. <el-select
  1018. v-model="editOrderInfo.ticketIds"
  1019. multiple>
  1020. <el-option
  1021. v-for="item in currentOrder.ticketList"
  1022. :key="item.id"
  1023. :label="item.ticketNo"
  1024. :value="item.id">
  1025. <span style="">{{ item.ticketNo }}</span>-
  1026. <span style="color: #8492a6; font-size: 13px">{{ item.ticketTypeName }}</span>
  1027. (<span style="color: #849822; font-size: 13px">
  1028. {{ item.playDateBegin || item.playDateEnd ? `${item.playDateBegin || ''} - ${item.playDateEnd || ''}` : "无限制" }}
  1029. </span>)
  1030. </el-option>
  1031. </el-select>
  1032. </el-form-item>
  1033. <el-form-item
  1034. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1035. label="起始时间"
  1036. prop="playDateBegin">
  1037. <el-date-picker
  1038. v-model="editOrderInfo.playDateBegin"
  1039. type="datetime"
  1040. placeholder="选择日期时间">
  1041. </el-date-picker>
  1042. </el-form-item>
  1043. <el-form-item
  1044. v-if="editOrderInfo.updateType === 'updatePlayDate'"
  1045. label="截止时间"
  1046. prop="playDateEnd">
  1047. <el-date-picker
  1048. default-time="23:59:59"
  1049. v-model="editOrderInfo.playDateEnd"
  1050. type="datetime"
  1051. placeholder="选择日期时间">
  1052. </el-date-picker>
  1053. </el-form-item>
  1054. <div class="tableBox" v-if="editOrderInfo.updateType === 'updateScenicTimes'">
  1055. <div class="tips">
  1056. <i class="el-icon-info"></i>
  1057. -1代表不限制 如果当前景点为群组景点 该次数为群组景点的检票次数总和
  1058. </div>
  1059. <el-table
  1060. border
  1061. stripe
  1062. height="500"
  1063. :data="editOrderInfo.ticketList">
  1064. <el-table-column type="expand">
  1065. <template slot-scope="props">
  1066. <div class="title">检票景点明细</div>
  1067. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  1068. <el-table-column
  1069. prop="scenicName"
  1070. label="景点"
  1071. ></el-table-column>
  1072. <el-table-column
  1073. prop="checkLimitTimes"
  1074. label="可检票次数"
  1075. >
  1076. <template slot-scope="scope">
  1077. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  1078. </template>
  1079. </el-table-column>
  1080. <el-table-column
  1081. prop="checkedTimes"
  1082. label="已检票次数"
  1083. ></el-table-column>
  1084. </el-table>
  1085. </template>
  1086. </el-table-column>
  1087. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  1088. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  1089. <el-table-column min-width="180" label="检票景点">
  1090. <template slot-scope="scope">
  1091. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  1092. </template>
  1093. </el-table-column>
  1094. <el-table-column
  1095. label="景点的限制检票次数"
  1096. min-width="90">
  1097. <template slot-scope="scope">
  1098. <el-input-number
  1099. controls-position="right"
  1100. :min="-1"
  1101. :precision="0"
  1102. v-model="scope.row.checkLimitTimes"
  1103. ></el-input-number>
  1104. </template>
  1105. </el-table-column>
  1106. </el-table>
  1107. </div>
  1108. </el-form>
  1109. <span slot="footer">
  1110. <el-button @click="cancelEdit">取消</el-button>
  1111. <el-button
  1112. type="primary"
  1113. @click="submitEditOrder">确定</el-button>
  1114. </span>
  1115. </el-dialog>
  1116. </div>
  1117. </template>
  1118. <script>
  1119. /* eslint-disable no-unused-vars */
  1120. import { apiOrderList, pickInvoice, getInvoice, cancelOrder, reprintTicket, checkTickets, updateOrder, getSaleChannelList, getSingleOrder, printTickets } from '@/api/order'
  1121. import { orderStatusDic, ticketStatusDic, channelList, papersType, orderCategories } from '@/assets/staticData'
  1122. import { getPayStatus } from '@/utils/index'
  1123. // import Ellipsis from '@/components/Ellipsis'
  1124. import moment from 'moment'
  1125. import { payPOS } from '@/api/pay'
  1126. import { getSelf } from '@/api/systemSetting/account'
  1127. import { getSystemConfigList } from '@/api/systemConfig'
  1128. import { get } from 'core-js/core/dict'
  1129. const Store = require('electron-store')
  1130. const localStore = new Store()
  1131. export default {
  1132. name: 'salesQuery',
  1133. computed: {
  1134. scenicName () {
  1135. return this.$localStore.get('scenicName') || this.$store.state.user.scenicName
  1136. },
  1137. salesList () {
  1138. return this.$store.state.user.salesList
  1139. },
  1140. accountList () {
  1141. return this.$store.state.app.accountList
  1142. },
  1143. termList () {
  1144. return this.$store.state.app.termList
  1145. },
  1146. saleChannel () {
  1147. return this.$store.state.app.saleChannel
  1148. },
  1149. payChannelOptions () {
  1150. return this.$store.getters.payChannelOptions
  1151. },
  1152. ticketTypeList () {
  1153. const { ticketTypeList } = this.$store.state.app
  1154. const { orderCategory } = this.form
  1155. return orderCategory ? ticketTypeList.filter(item => item.category === orderCategory) : ticketTypeList
  1156. },
  1157. scenicList () {
  1158. return this.$store.state.app.scenicList
  1159. }
  1160. },
  1161. components: {
  1162. // ReaderInput,
  1163. // Ellipsis
  1164. },
  1165. data () {
  1166. return {
  1167. projecticketTypeName: process.env.VUE_APP_PROJECT,
  1168. channelList,
  1169. otaSourceList: [],
  1170. orderStatusDic,
  1171. ticketStatusDic,
  1172. papersType,
  1173. isDev: process.env.NODE_ENV === 'development',
  1174. orderCategories,
  1175. form: {
  1176. partnerOrderNo: '', // OTA订单号
  1177. otaOrderNo: '', // 渠道订单号
  1178. orderNo: '', // 订单号
  1179. createTime: [new Date(moment().subtract(7, 'day').format('YYYY-MM-DD')), new Date(moment().format('YYYY-MM-DD'))], // 下单时间
  1180. createTimeBegin: '',
  1181. createTimeEnd: '',
  1182. orderCategory: '',
  1183. playDate: ['', ''], // 游玩时间
  1184. playDateBegin: '',
  1185. playDateEnd: '',
  1186. payChannelList: [], // 支付方式
  1187. otaSourceNameList: [], // 销售来源
  1188. adminIdList: [], // 售票员
  1189. saleTermIdList: [], // 售卖自助机
  1190. orderStatus: '', // 订单状态
  1191. ticketStatus: '', // 门票状态
  1192. visitorName: '', // 游客姓名
  1193. visitorPhone: '', // 游客手机
  1194. visitorIdentify: '', // 游客身份证
  1195. ticketTypeIdList: [], // 票种列表
  1196. pageNum: 1,
  1197. pageSize: 10
  1198. },
  1199. tableData: [],
  1200. total: 0,
  1201. loading: false,
  1202. invoiceType: 0,
  1203. formEl: {
  1204. invoiceType: 1,
  1205. invoiceBuyer: '',
  1206. invoiceBuyerTaxNum: '',
  1207. invoiceBuyerEmail: '',
  1208. invoiceBuyerPhone: '',
  1209. invoiceBuyerAddress: '',
  1210. invoiceBuyerBankAccount: '',
  1211. remark: ''
  1212. },
  1213. rules: {
  1214. invoiceBuyerTaxNum: [
  1215. { required: false, message: '请输入纳税人识别号', trigger: 'blur' },
  1216. { pattern: /^[A-Za-z0-9]{15,20}$/, message: '纳税人识别号格式不正确', trigger: 'blur' }
  1217. ]
  1218. },
  1219. currentOrder: {},
  1220. multipleSelection: [],
  1221. order_tag_list: [],
  1222. visible: false,
  1223. refundOrderDialogVisible: false,
  1224. refundOrderInfo: {
  1225. force: false,
  1226. orderId: '',
  1227. ticketCancelRequestList: []
  1228. },
  1229. checkOrderDialogVisible: false,
  1230. checkOrderInfo: {
  1231. force: false,
  1232. orderId: '',
  1233. ticketIdList: []
  1234. },
  1235. printOrderDialogVisible: false,
  1236. secondPrintDialogVisible: false,
  1237. secondPrintInfo: {
  1238. orderId: '',
  1239. ticketIdList: []
  1240. },
  1241. updateTypes: [
  1242. { value: 'updateOrderPayChannel', label: '支付方式' },
  1243. { value: 'updatePlayDate', label: '游玩日期' },
  1244. { value: 'updateScenicTimes', label: '检票次数' }
  1245. ],
  1246. editOrderDialogVisible: false,
  1247. editOrderInfo: {
  1248. orderId: '',
  1249. updateType: '',
  1250. payChannel: '',
  1251. playDateBegin: '',
  1252. playDateEnd: '',
  1253. ticketIds: [],
  1254. ticketList: [],
  1255. ticketCheckScenicUpdateRequestList: []
  1256. }
  1257. }
  1258. },
  1259. filters: {
  1260. filterChannel (n) {
  1261. switch (n) {
  1262. case 1:
  1263. return '线下'
  1264. case 2:
  1265. return '线上'
  1266. case 3:
  1267. return '自助机'
  1268. }
  1269. },
  1270. filterOrderCategory (n) {
  1271. return orderCategories.find(item => item.id === n).name
  1272. }
  1273. },
  1274. async created () {
  1275. const searchParams = JSON.parse(sessionStorage.getItem('统计表-售票记录-查询条件'))
  1276. if (searchParams) {
  1277. // 如果存在查询条件,则设置到组件的数据中
  1278. this.form = searchParams // 记住上次搜索条件
  1279. }
  1280. this.getSaleChannelList()
  1281. this.getOrderList()
  1282. },
  1283. methods: {
  1284. getPayStatus,
  1285. reset () {
  1286. this.$refs.form.resetFields()
  1287. this.getOrderList(true)
  1288. },
  1289. // 取票状态
  1290. checkPrintStatus (ticketList) {
  1291. let tempArr = ticketList.filter(i => i.isPrint)
  1292. if (tempArr.length) {
  1293. if (tempArr.length === ticketList.length) {
  1294. return { type: 'success', text: '已取票' }
  1295. } else {
  1296. return { type: 'warning', text: '部分取票' }
  1297. }
  1298. } else {
  1299. return { type: 'info', text: '未取票' }
  1300. }
  1301. },
  1302. toggleSelection (rows) {
  1303. if (rows) {
  1304. rows.forEach(row => {
  1305. this.$refs.multipleTable.toggleRowSelection(row)
  1306. })
  1307. } else {
  1308. this.$refs.multipleTable.clearSelection()
  1309. }
  1310. },
  1311. handleSelectionChange (val) {
  1312. this.multipleSelection = val
  1313. },
  1314. selectable (row, index) {
  1315. return true
  1316. },
  1317. showPickInvoice (order) {
  1318. this.visible = true
  1319. this.currentOrder = order
  1320. if (['九龙湖', 'demo'].includes(this.scenicName)) {
  1321. this.formEl.invoiceType = 0 // 九龙湖只能普通开票
  1322. }
  1323. },
  1324. submitPickInvoice () {
  1325. if (!this.multipleSelection.length) return this.$message.error('请选择门票')
  1326. this.$refs.formEl.validate(valid => {
  1327. if (!valid) return
  1328. if (this.formEl.invoiceType) {
  1329. this.formEl.invoiceBuyer = ''
  1330. this.formEl.invoiceBuyerTaxNum = ''
  1331. this.formEl.invoiceBuyerEmail = ''
  1332. this.formEl.invoiceBuyerPhone = ''
  1333. this.formEl.invoiceBuyerAddress = ''
  1334. this.formEl.invoiceBuyerBankAccount = ''
  1335. this.formEl.remark = ''
  1336. }
  1337. 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 => {
  1338. this.$message.success('操作成功')
  1339. this.getOrderList()
  1340. this.visible = false
  1341. this.currentOrder = {}
  1342. this.formEl = {
  1343. invoiceType: 1,
  1344. invoiceBuyer: '',
  1345. invoiceBuyerTaxNum: '',
  1346. invoiceBuyerEmail: '',
  1347. invoiceBuyerPhone: '',
  1348. invoiceBuyerAddress: '',
  1349. invoiceBuyerBankAccount: '',
  1350. remark: ''
  1351. }
  1352. this.$confirm('发票已生成,是否跳转到发票下载页?', '提示', {
  1353. confirmButtonText: '确定',
  1354. cancelButtonText: '取消',
  1355. type: 'warning'
  1356. }).then(() => {
  1357. this.$router.push('/queryReport/invoiceRecord')
  1358. })
  1359. })
  1360. })
  1361. },
  1362. confirmPOS (record) {
  1363. this.$confirm('请确认该订单已付款,将手动更新订单状态为已支付', '提示', {
  1364. confirmButtonText: '确定',
  1365. cancelButtonText: '取消',
  1366. type: 'warning'
  1367. }).then(() => {
  1368. getSelf().then(response => {
  1369. const params = {
  1370. managerId: response.id,
  1371. id: record.id,
  1372. payChannel: record.payChannel,
  1373. posId: localStore.get('termId'),
  1374. tradeInfo: '',
  1375. type: 'TICKET'
  1376. }
  1377. payPOS(params).then(res => {
  1378. this.$message.success('操作成功')
  1379. this.getOrderList()
  1380. this.$confirm('门票状态已修改,是否跳转补打门票页面?', '提示', {
  1381. confirmButtonText: '确定',
  1382. cancelButtonText: '取消',
  1383. type: 'warning'
  1384. }).then(() => {
  1385. this.$router.push({ name: 'printTicket' })
  1386. }).catch(() => {
  1387. })
  1388. })
  1389. })
  1390. }).catch(() => {
  1391. })
  1392. },
  1393. getSaleChannelList () {
  1394. getSaleChannelList().then(res => {
  1395. this.otaSourceList = res.data
  1396. })
  1397. },
  1398. getOrderList (goFirst) {
  1399. this.loading = true
  1400. goFirst && (this.form.pageNum = 1)
  1401. const [s, e] = this.form.createTime || []
  1402. this.form.createTimeBegin = s ? moment(s).startOf('day').format('YYYY-MM-DD HH:mm:ss') : ''
  1403. this.form.createTimeEnd = e ? moment(e).endOf('day').format('YYYY-MM-DD HH:mm:ss') : ''
  1404. const [s1, e1] = this.form.playDate || []
  1405. this.form.playDateBegin = s1 ? moment(s1).format('YYYY-MM-DD') : ''
  1406. this.form.playDateEnd = e1 ? moment(e1).format('YYYY-MM-DD') : ''
  1407. apiOrderList(this.form).then(res => {
  1408. this.total = res.data.total
  1409. // const list = []
  1410. res.data.records.forEach(item => {
  1411. let ticketsName = []
  1412. item.ticketsName = ticketsName.join(',')
  1413. })
  1414. this.tableData = res.data.records
  1415. this.tableData.forEach(v => {
  1416. if (v.price === 0 && v.payChannel === '现金') {
  1417. v.payChannel = '免票'
  1418. }
  1419. })
  1420. console.log(this.tableData, 'tableData')
  1421. }).finally(() => {
  1422. this.loading = false
  1423. })
  1424. sessionStorage.setItem('统计表-售票记录-查询条件', JSON.stringify(this.form)) // 下次记住
  1425. },
  1426. reduceCheckNum (list) {
  1427. if (!list) return 0
  1428. return list.reduce((prev, item) => {
  1429. return prev + item.checkNum
  1430. }, 0)
  1431. },
  1432. async getOrderDetail (order) {
  1433. const res = await getSingleOrder(order.id)
  1434. this.currentOrder = res?.data || order
  1435. },
  1436. async refundOrder (order) {
  1437. await this.getOrderDetail(order)
  1438. this.refundOrderDialogVisible = true
  1439. this.refundOrderInfo.orderId = order.id
  1440. },
  1441. async secondPrint (order) {
  1442. await this.getOrderDetail(order)
  1443. this.secondPrintDialogVisible = true
  1444. this.secondPrintInfo.orderId = order.id
  1445. },
  1446. submitRefundOrder () {
  1447. if (!this.multipleSelection?.length) {
  1448. return this.$message.error('请选择门票')
  1449. }
  1450. this.refundOrderInfo.ticketCancelRequestList = this.multipleSelection.map(v => {
  1451. return {
  1452. ticketId: v.id,
  1453. cancelPrice: v.price
  1454. }
  1455. })
  1456. this.$confirm('确定要退单吗?', '提示', {
  1457. confirmButtonText: '确定',
  1458. cancelButtonText: '取消',
  1459. type: 'warning'
  1460. }).then(() => {
  1461. cancelOrder(this.refundOrderInfo).then(res => {
  1462. if (res.code === '999999') {
  1463. this.$message.warning(res.msg || '操作失败')
  1464. return
  1465. }
  1466. this.$message.success('操作成功')
  1467. this.refundOrderDialogVisible = false
  1468. this.getOrderList()
  1469. })
  1470. })
  1471. },
  1472. submitSecondPrint () {
  1473. if (!this.multipleSelection?.length) {
  1474. return this.$message.error('请选印门票')
  1475. }
  1476. this.secondPrintInfo.ticketIdList = this.multipleSelection.map(v => v.id)
  1477. this.$confirm('确定要打印吗?', '提示', {
  1478. confirmButtonText: '确定',
  1479. cancelButtonText: '取消',
  1480. type: 'warning'
  1481. }).then(() => {
  1482. reprintTicket(this.secondPrintInfo).then(res => {
  1483. if (res.code === '999999') {
  1484. this.$message.warning(res.msg || '操作失败')
  1485. return
  1486. }
  1487. this.$message.success('操作成功')
  1488. this.secondPrintDialogVisible = false
  1489. this.getOrderList()
  1490. })
  1491. })
  1492. },
  1493. async showOrderDetail (order) {
  1494. await this.getOrderDetail(order)
  1495. this.$refs.orderDetail.show(this.currentOrder)
  1496. },
  1497. // 核销
  1498. async checkOrder (order) {
  1499. await this.getOrderDetail(order)
  1500. this.checkOrderDialogVisible = true
  1501. this.checkOrderInfo.orderId = order.id
  1502. },
  1503. submitCheckOrder () {
  1504. if (!this.multipleSelection?.length) {
  1505. return this.$message.error('请选择门票')
  1506. }
  1507. this.checkOrderInfo.ticketIdList = this.multipleSelection.map(v => v.id)
  1508. this.$confirm('确定要核销吗?', '提示', {
  1509. confirmButtonText: '确定',
  1510. cancelButtonText: '取消',
  1511. type: 'warning'
  1512. }).then(() => {
  1513. checkTickets(this.checkOrderInfo).then(res => {
  1514. if (res.code === '999999') {
  1515. this.$message.warning(res.msg || '操作失败')
  1516. return
  1517. }
  1518. this.$message.success('操作成功')
  1519. this.checkOrderDialogVisible = false
  1520. this.getOrderList()
  1521. })
  1522. })
  1523. },
  1524. async printOrder (order) {
  1525. await this.getOrderDetail(order)
  1526. this.printOrderDialogVisible = true
  1527. },
  1528. submitPrintOrder () {
  1529. if (!this.multipleSelection?.length) {
  1530. return this.$message.error('请选择门票')
  1531. }
  1532. const ticketIdList = this.multipleSelection.map(v => v.id)
  1533. this.$confirm('确定要网络取票吗?', '提示', {
  1534. confirmButtonText: '确定',
  1535. cancelButtonText: '取消',
  1536. type: 'warning'
  1537. }).then(() => {
  1538. printTickets(ticketIdList).then(res => {
  1539. if (res.code === '999999') {
  1540. this.$message.warning(res.msg || '操作失败')
  1541. return
  1542. }
  1543. this.$message.success('操作成功')
  1544. this.checkOrderDialogVisible = false
  1545. this.getOrderList()
  1546. })
  1547. })
  1548. },
  1549. // 修改
  1550. async editOrder (order) {
  1551. await this.getOrderDetail(order)
  1552. this.editOrderDialogVisible = true
  1553. this.editOrderInfo.orderId = order.id
  1554. this.editOrderInfo.payChannel = order.payChannel
  1555. this.editOrderInfo.playDateBegin = order.playDateBegin
  1556. this.editOrderInfo.playDateEnd = order.playDateEnd
  1557. this.editOrderInfo.ticketCheckScenicUpdateRequestList = []
  1558. this.editOrderInfo.ticketList = []
  1559. this.currentOrder.ticketList.forEach(v => {
  1560. this.editOrderInfo.ticketList.push({
  1561. ...v,
  1562. checkLimitTimes: -1 // 默认不限制
  1563. })
  1564. // this.editOrderInfo.ticketCheckScenicUpdateRequestList.push(...v.ticketCheckScenicList)
  1565. })
  1566. },
  1567. cancelEdit () {
  1568. this.editOrderDialogVisible = false
  1569. this.editOrderInfo = {
  1570. orderId: '',
  1571. updateType: '',
  1572. payChannel: '',
  1573. playDateBegin: '',
  1574. playDateEnd: '',
  1575. ticketIds: [],
  1576. ticketList: [],
  1577. ticketCheckScenicUpdateRequestList: []
  1578. }
  1579. },
  1580. submitEditOrder () {
  1581. if (this.editOrderInfo.updateType === '') {
  1582. return this.$message.error('请选择修改类型')
  1583. }
  1584. if (this.editOrderInfo.updateType === 'updateOrderPayChannel' && !this.editOrderInfo.payChannel) {
  1585. return this.$message.error('请选择支付方式')
  1586. }
  1587. if (this.editOrderInfo.updateType === 'updatePlayDate' && (!this.editOrderInfo.playDateBegin || !this.editOrderInfo.playDateEnd)) {
  1588. return this.$message.error('请选择游玩日期')
  1589. }
  1590. this.editOrderInfo.ticketCheckScenicUpdateRequestList = []
  1591. if (this.editOrderInfo.updateType === 'updateScenicTimes') {
  1592. this.editOrderInfo.ticketIds = this.editOrderInfo.ticketList.map(item => item.id)
  1593. this.editOrderInfo.ticketList.forEach(item => {
  1594. item.ticketCheckScenicList.forEach(scenic => {
  1595. this.editOrderInfo.ticketCheckScenicUpdateRequestList.push({
  1596. id: scenic.id,
  1597. checkedTimes: scenic.checkedTimes,
  1598. checkLimitTimes: item.checkLimitTimes
  1599. })
  1600. })
  1601. })
  1602. }
  1603. updateOrder(this.editOrderInfo).then(res => {
  1604. if (res.code === '999999') {
  1605. this.$message.warning(res.msg || '修改失败')
  1606. return
  1607. }
  1608. this.$message.success('修改成功')
  1609. this.editOrderDialogVisible = false
  1610. this.getOrderList()
  1611. })
  1612. }
  1613. }
  1614. }
  1615. </script>
  1616. <style lang="scss">
  1617. .el-dialog__body {
  1618. min-height: 300px;
  1619. }
  1620. </style>