salesQuery.vue 106 KB

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