OrderDetail.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. <template>
  2. <el-dialog
  3. :visible.sync="visible"
  4. :before-close="handleClose"
  5. title="订单信息"
  6. width="90%"
  7. >
  8. <el-form
  9. :inline="true"
  10. label-width="120px"
  11. class="dialog-info"
  12. v-if="orderData"
  13. >
  14. <el-form-item label="线下订单号">
  15. {{ orderData.orderNo }}
  16. </el-form-item>
  17. <el-form-item label="创建时间">
  18. {{ orderData.createTime | formatTime }}
  19. </el-form-item>
  20. <el-form-item label="合作方订单号">
  21. {{ orderData.partnerOrderNo }}
  22. </el-form-item>
  23. <el-form-item label="订单类型">
  24. {{ orderData.orderCategory | formatCategory }}
  25. </el-form-item>
  26. <el-form-item label="总价(¥)">
  27. {{ orderData.price }}
  28. </el-form-item>
  29. <el-form-item label="包含的票数">
  30. {{ orderData.ticketNum }}
  31. </el-form-item>
  32. <el-form-item label="支付类型">
  33. {{ orderData.payChannel }}
  34. </el-form-item>
  35. <el-form-item label="支付状态">
  36. <el-tag
  37. :type="getPayStatus(orderData.payStatus, 'type')"
  38. size="normal"
  39. >
  40. {{ getPayStatus(orderData.payStatus) }}
  41. </el-tag>
  42. </el-form-item>
  43. <el-form-item label="支付时间">
  44. {{ orderData.payTime | formatTime }}
  45. </el-form-item>
  46. <el-form-item label="订单来源渠道">
  47. {{ orderData.otaSourceName }}
  48. </el-form-item>
  49. <el-form-item label="售票员">
  50. {{ orderData.saleAdminName }}
  51. </el-form-item>
  52. <el-form-item label="购买方名称">
  53. {{ orderData.buyerName }}
  54. </el-form-item>
  55. <el-form-item label="购买方手机号">
  56. {{ orderData.buyerPhone }}
  57. </el-form-item>
  58. <el-form-item label="购买方证件号">
  59. {{ orderData.buyerIdentify }}
  60. </el-form-item>
  61. <el-form-item label="是否是线上订单">
  62. {{ orderData.isOnlineOrder ? '是' : '否' }}
  63. </el-form-item>
  64. <el-form-item label="订单状态">
  65. <OrderStatusTag :value="orderData.status"></OrderStatusTag>
  66. </el-form-item>
  67. <el-form-item label="团队名称">
  68. {{ orderData.teamName || '无' }}
  69. </el-form-item>
  70. <el-form-item label="导游名称">
  71. {{ orderData.guideName || '无' }}
  72. </el-form-item>
  73. <el-tabs v-model="activeTab" type="card">
  74. <el-tab-pane class="block-title" label="门票信息" name="ticketCheckInfo">
  75. <div class="title" style="display: flex;justify-content: space-between;margin-bottom: 10px;">
  76. 检票景点明细
  77. <el-input v-model="ticketNoSearch1" placeholder="输入票号查询"></el-input>
  78. </div>
  79. <el-table border :data="checkDetailList" :max-height="400">
  80. <el-table-column type="expand">
  81. <template slot-scope="props">
  82. <div class="title">检票景点</div>
  83. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  84. <el-table-column
  85. prop="scenicName"
  86. label="景点"
  87. ></el-table-column>
  88. <el-table-column
  89. prop="checkLimitTimes"
  90. label="可检票次数"
  91. >
  92. <template slot-scope="scope">
  93. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. prop="checkedTimes"
  98. label="已检票次数"
  99. ></el-table-column>
  100. <el-table-column
  101. prop="singleCheckLimitTimes"
  102. label="单日可检票次数"
  103. ></el-table-column>
  104. </el-table>
  105. </template>
  106. </el-table-column>
  107. <el-table-column width="160" prop="ticketNo" label="票号">
  108. <template slot-scope="scope">
  109. <div class="">{{ scope.row.ticketNo }}</div>
  110. <img v-if="scope.row.ticketNoImg" :src="scope.row.ticketNoImg || ''" style="width: 130px;height: 130px;" alt="">
  111. </template>
  112. </el-table-column>
  113. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  114. <el-table-column width="80" prop="price" label="单价(¥)">
  115. <template slot-scope="scope">
  116. <div class="">{{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}</div>
  117. <div v-if="scope.row.discountPrice" style="color: #bbb">原价:{{ scope.row.originalPrice }}</div>
  118. <div v-if="scope.row.discountPrice" style="color: #52c41a">优惠:{{ scope.row.discountPrice }}</div>
  119. <div v-if="scope.row.price !== scope.row.settlementPrice" style="color: #0080ff">结算价:{{ scope.row.settlementPrice }}</div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column width="80" prop="price" label="小计"></el-table-column>
  123. <el-table-column width="100" prop="status" label="状态">
  124. <template slot-scope="scope">
  125. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  126. </template>
  127. </el-table-column>
  128. <el-table-column width="210" prop="guestInfo" label="游客信息">
  129. <template slot-scope="scope">
  130. <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
  131. <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
  132. <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
  133. <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
  134. </template>
  135. </el-table-column>
  136. <el-table-column width="260" prop="ticketCheckInfo" label="检票信息">
  137. <template slot-scope="scope">
  138. <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
  139. <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
  140. <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
  141. <div class=""><span>最近一次检票设备:</span>{{ scope.row.checkerName }}</div>
  142. </template>
  143. </el-table-column>
  144. <el-table-column width="260" prop="ticketPrintInfo" label="取票信息">
  145. <template slot-scope="scope">
  146. <div class=""><span>取票状态:</span>
  147. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  148. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  149. </el-tag>
  150. </div>
  151. <div class=""><span>取票时间:</span>{{ scope.row.printTime }}</div>
  152. <div class=""><span>取票人:</span>{{ scope.row.printAdminName }}</div>
  153. <div class=""><span>取票自助机:</span>{{ scope.row.printTermName }}</div>
  154. </template>
  155. </el-table-column>
  156. <el-table-column width="260" prop="ticketRefundInfo" label="退票信息">
  157. <template slot-scope="scope">
  158. <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName }}</div>
  159. <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice }}</div>
  160. <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime }}</div>
  161. <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime }}</div>
  162. <div class=""><span>是否强制取消:</span>{{ scope.row.isForceCancel ? '是' : '否' }}</div>
  163. </template>
  164. </el-table-column>
  165. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  166. <template slot-scope="scope">
  167. <div v-if="scope.row.batchConfigName"><span>场次:</span>{{ scope.row.batchConfigName || '' }}</div>
  168. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  169. </template>
  170. </el-table-column>
  171. <el-table-column min-width="180" label="检票景点">
  172. <template slot-scope="scope">
  173. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  174. </template>
  175. </el-table-column>
  176. <el-table-column width="240" prop="ticketCardInfo" label="卡信息">
  177. <template slot-scope="scope" v-if="scope.row.card">
  178. <div class=""><span>卡片编号:</span>{{ scope.row.card.cardNo }}</div>
  179. <div class=""><span>有效时间:</span>{{ scope.row.card.validDateStart }} - {{ scope.row.card.validDateEnd }}</div>
  180. <div class=""><span>卡片状态:</span>{{ scope.row.card.status | filterCardStatus }}</div>
  181. <div class="" v-if="scope.row.card.status === 1"><span>开卡时间:</span>{{ scope.row.card.activeTime }}</div>
  182. <div class="" v-if="scope.row.card.status === 0"><span>退卡时间:</span>{{ scope.row.card.cardNo }}</div>
  183. <div class="" v-if="scope.row.card.status === 2"><span>挂失时间:</span>{{ scope.row.card.repealTime }}</div>
  184. </template>
  185. </el-table-column>
  186. <el-table-column width="240" prop="ticketFaceInfo" label="人脸信息">
  187. <template slot-scope="scope" v-if="scope.row.face">
  188. <div class=""><span>有效时间:</span>{{ scope.row.face.validDateStart }} - {{ scope.row.face.validDateEnd }}</div>
  189. <div class=""><span>卡片状态:</span>{{ scope.row.face.status === 0 ? '可用' : '不可用' }}</div>
  190. <div class=""><span>图片地址:</span>{{ scope.row.face.imageUrl }}</div>
  191. <div class=""><span>base64:</span>{{ scope.row.face.faceData }}</div>
  192. <div class=""><span>注册状态:</span>{{ scope.row.face.registerStatus === 0 ? '未注册' : '已注册' }}</div>
  193. </template>
  194. </el-table-column>
  195. </el-table>
  196. <!-- <el-table :data="checkDetailList" :max-height="200">
  197. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  198. <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  199. <el-table-column width="80" prop="price" label="票价(¥)">
  200. <template slot-scope="scope">
  201. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  202. </template>
  203. </el-table-column>
  204. <el-table-column
  205. prop="scenicName"
  206. label="景点"
  207. ></el-table-column>
  208. <el-table-column
  209. prop="checkLimitTimes"
  210. label="可检票次数"
  211. >
  212. <template slot-scope="scope">
  213. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  214. </template>
  215. </el-table-column>
  216. <el-table-column
  217. prop="checkedTimes"
  218. label="已检票次数"
  219. ></el-table-column>
  220. </el-table> -->
  221. <div class="title" style="display: flex;justify-content: space-between;margin: 10px 0;">
  222. 门票检票日志
  223. <el-input v-model="ticketNoSearch2" placeholder="输入票号查询"></el-input>
  224. </div>
  225. <el-table border :data="checkLogList" :max-height="200">
  226. <el-table-column prop="ticketNo" label="票号"> </el-table-column>
  227. <!-- <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
  228. <el-table-column width="80" prop="price" label="票价(¥)">
  229. <template slot-scope="scope">
  230. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  231. </template>
  232. </el-table-column> -->
  233. <el-table-column prop="checkType" label="检票类型">
  234. <template slot-scope="prop">
  235. {{ prop.row.checkType | checkTypeFilter }}
  236. </template>
  237. </el-table-column>
  238. <el-table-column prop="scenicName" label="景点名称"> </el-table-column>
  239. <el-table-column prop="checkerAdminName" label="检票员"> </el-table-column>
  240. <el-table-column prop="checkerName" label="检票设备名称"> </el-table-column>
  241. <el-table-column prop="checkTime" label="检票时间"> </el-table-column>
  242. </el-table>
  243. </el-tab-pane>
  244. <el-tab-pane class="block-title" label="支付信息" name="payInfo">
  245. <el-form-item label="支付方式">
  246. {{ orderData.payChannel }}
  247. </el-form-item>
  248. <template v-if="orderData.payContext">
  249. <div class="title">支付信息列表</div>
  250. <el-table border :data="orderData.payContext.payList">
  251. <el-table-column prop="orderNo" label="支付订单号">
  252. </el-table-column>
  253. <el-table-column prop="payStatus" label="支付状态">
  254. <template slot-scope="scope">
  255. <el-tag :type="getPayStatus(scope.row.payStatus, 'type')">
  256. {{ getPayStatus(scope.row.payStatus) }}
  257. </el-tag>
  258. </template>
  259. </el-table-column>
  260. <el-table-column prop="submitTime" label="提交时间"> </el-table-column>
  261. <el-table-column prop="payTime" label="支付完成时间">
  262. </el-table-column>
  263. <el-table-column prop="fee" label="支付金额">
  264. </el-table-column>
  265. <el-table-column prop="outOrderNo" label="合作方订单号">
  266. </el-table-column>
  267. <el-table-column prop="errMsg" label="支付错误信息">
  268. </el-table-column>
  269. </el-table>
  270. <div class="title">退款信息</div>
  271. <el-table border :data="orderData.payContext.payRefundList">
  272. <el-table-column prop="status" label="退款状态">
  273. </el-table-column>
  274. <el-table-column prop="refundFee" label="退款金额">
  275. </el-table-column>
  276. <el-table-column prop="refundOrderNo" label="退款订单号">
  277. </el-table-column>
  278. <el-table-column prop="outRefundOrderNo" label="第三方退款单号">
  279. </el-table-column>
  280. <el-table-column prop="submitTime" label="退款提交时间">
  281. </el-table-column>
  282. <el-table-column prop="completeTime" label="退款完成时间">
  283. </el-table-column>
  284. <el-table-column prop="errMsg" label="退款错误信息">
  285. </el-table-column>
  286. </el-table>
  287. <div class="title">退款明细</div>
  288. <el-table border :data="orderData.payContext.payRefundTaskList">
  289. <el-table-column prop="status" label="退款明细状态">
  290. </el-table-column>
  291. <el-table-column prop="refundFee" label="退款金额">
  292. </el-table-column>
  293. <el-table-column prop="refundRetryCount" label="退款重试次数">
  294. </el-table-column>
  295. <el-table-column prop="submitTime" label="退款提交时间">
  296. </el-table-column>
  297. <el-table-column prop="completeTime" label="退款完成时间">
  298. </el-table-column>
  299. <el-table-column prop="errMsg" label="退款错误信息">
  300. </el-table-column>
  301. </el-table>
  302. </template>
  303. </el-tab-pane>
  304. <!-- <el-tab-pane class="block-title" label="购票信息" name="customerInfo">
  305. <div style="display: flex;justify-content: space-between;">
  306. <el-form-item label="包含的票数">
  307. {{ orderData.ticketNum || 0 }}
  308. </el-form-item>
  309. <el-input v-model="ticketNoSearch" placeholder="输入票号查询"></el-input>
  310. </div>
  311. <el-table border :data="orderTicketList" :max-height="400">
  312. <el-table-column type="expand">
  313. <template slot-scope="props">
  314. <div class="title">检票景点明细</div>
  315. <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
  316. <el-table-column
  317. prop="scenicName"
  318. label="景点"
  319. ></el-table-column>
  320. <el-table-column
  321. prop="checkLimitTimes"
  322. label="可检票次数"
  323. >
  324. <template slot-scope="scope">
  325. {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
  326. </template>
  327. </el-table-column>
  328. <el-table-column
  329. prop="checkedTimes"
  330. label="已检票次数"
  331. ></el-table-column>
  332. </el-table>
  333. </template>
  334. </el-table-column>
  335. <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
  336. <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
  337. <el-table-column width="80" prop="price" label="票价(¥)">
  338. <template slot-scope="scope">
  339. {{ scope.row.checkNum ? scope.row.price / scope.row.checkNum : scope.row.price }}
  340. </template>
  341. </el-table-column>
  342. <el-table-column width="100" prop="guestName" label="游客姓名">
  343. </el-table-column>
  344. <el-table-column width="140" prop="guestPhone" label="游客手机号">
  345. </el-table-column>
  346. <el-table-column width="100" prop="guestIdentifyType" label="证件类型">
  347. <template slot-scope="scope">
  348. {{ papersType[scope.row.guestIdentifyType] }}
  349. </template>
  350. </el-table-column>
  351. <el-table-column prop="guestIdentify" label="证件号码">
  352. </el-table-column>
  353. <el-table-column width="80" prop="checkNum" label="检票人数">
  354. </el-table-column>
  355. <el-table-column width="160" prop="playDateBegin" label="游玩时间">
  356. <template slot-scope="scope">
  357. {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
  358. </template>
  359. </el-table-column>
  360. <el-table-column width="80" label="取票状态">
  361. <template slot-scope="scope">
  362. <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
  363. {{ scope.row.isPrint ? "已取票" : "未取票" }}
  364. </el-tag>
  365. </template>
  366. </el-table-column>
  367. <el-table-column width="80" label="状态">
  368. <template slot-scope="scope">
  369. <TicketStatusTag :value="scope.row.status"></TicketStatusTag>
  370. </template>
  371. </el-table-column>
  372. <el-table-column width="80" prop="price" label="小计">
  373. </el-table-column>
  374. <el-table-column min-width="180" label="检票景点">
  375. <template slot-scope="scope">
  376. {{ scope.row.ticketCheckScenicList.map(item => item.scenicName).join(',') }}
  377. </template>
  378. </el-table-column>
  379. </el-table>
  380. </el-tab-pane> -->
  381. <el-tab-pane class="block-title" label="修改记录" name="orderUpdateLog">
  382. <el-table border :data="orderData.orderUpdateLogList" :max-height="400">
  383. <el-table-column prop="updateType" label="修改类型">
  384. <template slot-scope="scope">
  385. {{ scope.row.updateType | updateTypeFilter }}
  386. </template>
  387. </el-table-column>
  388. <el-table-column prop="orderNo" label="订单号">
  389. </el-table-column>
  390. <el-table-column prop="ticketNo" label="票号">
  391. </el-table-column>
  392. <el-table-column prop="oldValue" label="修改前">
  393. <template slot-scope="scope">
  394. {{ getValueDetail(scope.row, 'oldValue') }}
  395. </template>
  396. </el-table-column>
  397. <el-table-column prop="newValue" label="修改后">
  398. <template slot-scope="scope">
  399. {{ getValueDetail(scope.row, 'newValue') }}
  400. </template>
  401. </el-table-column>
  402. <el-table-column prop="updateAdminName" label="操作人">
  403. </el-table-column>
  404. <el-table-column prop="createTime" label="修改时间">
  405. </el-table-column>
  406. </el-table>
  407. </el-tab-pane>
  408. <el-tab-pane class="block-title" label="补打信息" name="secondPrintInfo">
  409. <el-table border :data="orderData.ticketSecondPrintLogList" :max-height="400">
  410. <el-table-column prop="printAdminName" label="操作人"> </el-table-column>
  411. <el-table-column prop="printTime" label="操作时间"> </el-table-column>
  412. </el-table>
  413. </el-tab-pane>
  414. </el-tabs>
  415. <el-dialog
  416. label="检票景点明细"
  417. :visible.sync="detailVisible"
  418. append-to-body
  419. >
  420. <div style="padding:20px">
  421. <el-table :data="record.ticketListScenic">
  422. <el-table-column
  423. prop="scenic_name"
  424. label="景点"
  425. ></el-table-column>
  426. <el-table-column
  427. prop="checkLimitTimes"
  428. label="可检票次数"
  429. ></el-table-column>
  430. <el-table-column
  431. prop="checked_times"
  432. label="已检票次数"
  433. ></el-table-column>
  434. </el-table>
  435. </div>
  436. </el-dialog>
  437. </el-form>
  438. </el-dialog>
  439. </template>
  440. <script>
  441. import { channelList, IDENTIFY_TYPES } from '@/assets/staticData'
  442. import { getPayStatus } from '@/utils/index'
  443. import QRCode from 'qrcode'
  444. export default {
  445. created () {
  446. this.posType = this.$localStore.get('posType')
  447. },
  448. computed: {
  449. previewList () {
  450. return this.orderData.pictureRemarks.map(i => i.url)
  451. },
  452. orderTicketList () {
  453. if (!this.orderData) return []
  454. return this.orderData.ticketList.filter(i =>
  455. this.ticketNoSearch
  456. ? i.ticketNo.includes(this.ticketNoSearch)
  457. : true
  458. )
  459. },
  460. checkDetailList () {
  461. if (!this.orderData) return []
  462. return this.orderData.ticketList.filter(i =>
  463. this.ticketNoSearch1
  464. ? !!i.ticketNo.includes(this.ticketNoSearch1)
  465. : true
  466. )
  467. },
  468. checkLogList () {
  469. if (!this.orderData) return []
  470. return this.ticketCheckLogList.filter(i =>
  471. this.ticketNoSearch2
  472. ? !!i.ticketNo.includes(this.ticketNoSearch2)
  473. : true
  474. )
  475. }
  476. },
  477. data () {
  478. return {
  479. channelList,
  480. papersType: IDENTIFY_TYPES,
  481. posType: '',
  482. orderData: null,
  483. visible: false,
  484. detailVisible: false,
  485. record: {},
  486. activeTab: 'ticketCheckInfo',
  487. ticketNoSearch: '',
  488. ticketNoSearch1: '',
  489. ticketNoSearch2: '',
  490. ticketCheckScenicList: [],
  491. ticketSecondPrintLogList: [],
  492. ticketCheckLogList: []
  493. }
  494. },
  495. filters: {
  496. checkTypeFilter (input) {
  497. switch (input) {
  498. case 'qrcode':
  499. return '二维码'
  500. case 'face':
  501. return '人脸'
  502. case 'card':
  503. return 'IC卡'
  504. case 'idcard':
  505. return '身份证'
  506. case 'manual_check':
  507. return '人工检票'
  508. case 'print_check':
  509. return '取票即检票'
  510. case 'buy_check':
  511. return '购买即检票'
  512. default:
  513. break
  514. }
  515. },
  516. formatCategory (input) {
  517. switch (input) {
  518. case 'ticket':
  519. return '景区门票'
  520. case 'batch':
  521. return '场次售票'
  522. case 'member':
  523. return '年卡次卡'
  524. case 'other':
  525. return '其他'
  526. default:
  527. break
  528. }
  529. },
  530. updateTypeFilter (input) {
  531. switch (input) {
  532. case 'updateOrderPayChannel':
  533. return '订单修改支付方式'
  534. case 'updatePlayDate':
  535. return '门票修改游玩日期'
  536. case 'updateScenicTimes':
  537. return '门票修改检票次数'
  538. default:
  539. break
  540. }
  541. },
  542. filterCardStatus (input) {
  543. switch (input) {
  544. case 0:
  545. return '未使用'
  546. case 1:
  547. return '使用中'
  548. case 2:
  549. return '已挂失'
  550. default:
  551. return input
  552. }
  553. }
  554. },
  555. methods: {
  556. getPayStatus,
  557. async getQrCodeImg (ticketNo) {
  558. const opts = {
  559. errorCorrectionLevel: 'H',
  560. type: 'image/png',
  561. quality: 1,
  562. color: {
  563. dark: '#000000ff', // Blue dots
  564. light: '#0000' // Transparent background
  565. }
  566. }
  567. const img = await QRCode.toDataURL(ticketNo, opts)
  568. return img
  569. },
  570. getValueDetail (row, key) {
  571. console.log(row, key)
  572. if (row.updateType === 'updatePlayDate') {
  573. try {
  574. const val = JSON.parse(row[key])
  575. if (val && val.playDateBegin && val.playDateEnd) {
  576. return `${val.playDateBegin} - ${val.playDateEnd}`
  577. }
  578. } catch (error) {
  579. return ''
  580. }
  581. }
  582. return row[key]
  583. },
  584. async show (data) {
  585. this.orderData = data
  586. this.visible = true
  587. if (data.pictureRemarks) {
  588. data.pictureRemarks = data.pictureRemarks.filter(i => i.url)
  589. }
  590. this.ticketCheckScenicList = []
  591. this.ticketCheckLogList = []
  592. this.ticketSecondPrintLogList = []
  593. if (this.orderData.ticketList) {
  594. this.orderData.ticketList.forEach(async ticket => {
  595. const { ticketNo, ticketTypeName, price, ticketCheckScenicList, ticketCheckLogList, ticketSecondPrintLogList } = ticket
  596. const ticketNoImg = await this.getQrCodeImg(ticketNo)
  597. this.$set(ticket, 'ticketNoImg', ticketNoImg)
  598. if (ticketCheckScenicList && ticketCheckScenicList.length) {
  599. ticketCheckScenicList.forEach((scenic) => {
  600. this.ticketCheckScenicList.push({
  601. ...scenic,
  602. ticketNo,
  603. ticketTypeName,
  604. price
  605. })
  606. })
  607. }
  608. if (ticketCheckLogList && ticketCheckLogList.length) {
  609. ticketCheckLogList.forEach((log) => {
  610. this.ticketCheckLogList.push({
  611. ...log,
  612. ticketNo,
  613. ticketTypeName,
  614. price
  615. })
  616. })
  617. }
  618. if (ticketSecondPrintLogList && ticketSecondPrintLogList.length) {
  619. ticketSecondPrintLogList.forEach((log) => {
  620. this.ticketSecondPrintLogList.push({
  621. ...log,
  622. ticketNo,
  623. ticketTypeName,
  624. price
  625. })
  626. })
  627. }
  628. })
  629. }
  630. },
  631. handleClose () {
  632. this.visible = false
  633. this.activeTab = 'ticketCheckInfo'
  634. this.orderData = null
  635. },
  636. copySuccess () {
  637. this.$message.success('复制成功')
  638. },
  639. copyError () {
  640. this.$message.error('复制失败')
  641. },
  642. showDetail (record) {
  643. this.record = record
  644. this.detailVisible = true
  645. }
  646. }
  647. }
  648. </script>
  649. <style lang="scss">
  650. .el-table__expanded-cell[class*=cell] {
  651. padding: 10px 20px !important;
  652. }
  653. </style>
  654. <style lang="scss" scoped>
  655. .dialog-info {
  656. .el-form-item {
  657. width: 25%;
  658. }
  659. }
  660. .el-icon-document {
  661. cursor: pointer
  662. }
  663. .pic-remark {
  664. li {
  665. display: flex;
  666. align-items: center;
  667. ::v-deep .el-image {
  668. margin-right: 10px;
  669. }
  670. }
  671. }
  672. </style>