OrderStatistic.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  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. <div class="block-title">
  10. 查询条件
  11. </div>
  12. <el-form-item
  13. label="起始时间"
  14. required
  15. verify
  16. prop="timeBegin">
  17. <el-date-picker
  18. v-model="form.timeBegin"
  19. type="datetime"
  20. placeholder="选择日期时间">
  21. </el-date-picker>
  22. </el-form-item>
  23. <el-form-item
  24. label="截止时间"
  25. required
  26. verify
  27. prop="timeEnd">
  28. <el-date-picker
  29. default-time="23:59:59"
  30. v-model="form.timeEnd"
  31. type="datetime"
  32. placeholder="选择日期时间">
  33. </el-date-picker>
  34. </el-form-item>
  35. <el-form-item
  36. label="票种列表"
  37. prop="ticketTypeIdList"
  38. >
  39. <el-select
  40. v-model="form.ticketTypeIdList"
  41. multiple
  42. collapse-tags
  43. filterable
  44. clearable
  45. placeholder="请选择"
  46. @change="selectAll">
  47. <el-option
  48. :value="0"
  49. label="全部票种">
  50. </el-option>
  51. <el-option
  52. v-for="item in ticketTypeList"
  53. :key="item.id"
  54. :value="item.id"
  55. :label="item.name">
  56. </el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item
  60. label="景点"
  61. prop="scenicIdList"
  62. >
  63. <el-select
  64. v-model="form.scenicIdList"
  65. placeholder="请选择"
  66. multiple
  67. clearable
  68. filterable>
  69. <el-option
  70. v-for="(item, idx) in scenicList"
  71. :key="`scene-${idx}`"
  72. :label="item.name"
  73. :value="item.id"
  74. />
  75. </el-select>
  76. </el-form-item>
  77. <el-form-item
  78. label="售票员"
  79. prop="adminIdList">
  80. <el-select
  81. multiple
  82. v-model="form.adminIdList">
  83. <el-option
  84. v-for="item in salesList"
  85. :key="item.id"
  86. :label="`${item.loginName}-${item.name}`"
  87. :value="item.id">
  88. </el-option>
  89. </el-select>
  90. </el-form-item>
  91. <el-form-item
  92. label="订单类型"
  93. prop="orderCategory"
  94. >
  95. <el-select
  96. v-model="form.orderCategory"
  97. clearable
  98. placeholder="请选择">
  99. <el-option
  100. :value="''"
  101. label="全部">
  102. </el-option>
  103. <el-option
  104. v-for="item in ticketCategoryList"
  105. :key="item.id"
  106. :value="item.id"
  107. :label="item.name">
  108. </el-option>
  109. </el-select>
  110. </el-form-item>
  111. <el-form-item
  112. label="销售渠道"
  113. prop="otaSourceNameList"
  114. >
  115. <el-select
  116. v-model="form.otaSourceNameList"
  117. placeholder="请选择"
  118. multiple
  119. clearable
  120. >
  121. <el-option
  122. v-for="(item,idx) in saleChannel"
  123. :key="idx"
  124. :label="item"
  125. :value="item"
  126. >
  127. </el-option>
  128. </el-select>
  129. </el-form-item>
  130. <!-- <el-form-item
  131. label="票状态列表"
  132. prop="ticketStatus">
  133. <el-select
  134. v-model="form.ticketStatus"
  135. multiple
  136. collapse-tags
  137. clearable
  138. placeholder="请选择">
  139. <el-option
  140. v-for="item in ticketStatusDic"
  141. :key="item.value"
  142. :label="item.label"
  143. :value="item.value">
  144. </el-option>
  145. </el-select>
  146. </el-form-item> -->
  147. <el-form-item
  148. label="支付方式"
  149. prop="payChannelList">
  150. <el-select
  151. v-model="form.payChannelList"
  152. filterable
  153. multiple
  154. clearable>
  155. <el-option
  156. v-for="item in payChannelOptions"
  157. :key="item"
  158. :label="item"
  159. :value="item">
  160. </el-option>
  161. </el-select>
  162. </el-form-item>
  163. <el-form-item
  164. label="是否去除小计"
  165. prop="removeSubtotal">
  166. <el-select
  167. v-model="form.removeSubtotal">
  168. <el-option :value="false" label="否"></el-option>
  169. <el-option :value="true" label="是"></el-option>
  170. </el-select>
  171. </el-form-item>
  172. <el-form-item
  173. label="分组筛选"
  174. style="width:100%">
  175. <el-checkbox-group
  176. v-model="selectKeys"
  177. :min="0"
  178. :max="4">
  179. <draggable :list="groupKeys">
  180. <el-checkbox
  181. :key="item.value"
  182. :label="item.value"
  183. v-for="(item) in groupKeys"
  184. :disabled="disabled(item)"
  185. >
  186. {{ item.label }}
  187. </el-checkbox>
  188. </draggable>
  189. </el-checkbox-group>
  190. (可拖拽排序)
  191. </el-form-item>
  192. <div class="btn-wrap">
  193. <el-button
  194. @click="reset">
  195. 重置
  196. </el-button>
  197. <el-button
  198. :disabled="loading"
  199. type="primary"
  200. @click="getSaleStatistic">
  201. 搜索
  202. </el-button>
  203. <el-button
  204. type="primary"
  205. @click="reportExport">
  206. 导出
  207. </el-button>
  208. <i class="el-icon-setting" style="cursor: pointer; margin-left: 10px;" title="设置显示列" @click="showColumnConfig" />
  209. </div>
  210. </el-form>
  211. <div class="table-box">
  212. <el-table
  213. border
  214. stripe
  215. :key="tableIndex"
  216. v-loading="loading"
  217. :data="tableData"
  218. :span-method="objectSpanMethod">
  219. <el-table-column
  220. v-for="(item) in finalGroup"
  221. :key="item.value"
  222. :prop="item.prop || item.value"
  223. :label="item.label">
  224. </el-table-column>
  225. <el-table-column
  226. v-if="isColumnVisible('salePrice')"
  227. prop="salePrice"
  228. label="售票金额">
  229. </el-table-column>
  230. <el-table-column
  231. v-if="isColumnVisible('saleSettlementPrice')"
  232. prop="saleSettlementPrice"
  233. label="售票结算金额">
  234. </el-table-column>
  235. <el-table-column
  236. v-if="isColumnVisible('saleNum')"
  237. prop="saleNum">
  238. <template
  239. slot="header">
  240. 售票张数
  241. <Tip msg="一码多人时算一张"></Tip>
  242. </template>
  243. </el-table-column>
  244. <el-table-column
  245. v-if="isColumnVisible('saleCheckNum')"
  246. prop="saleCheckNum"
  247. label="售票人数">
  248. <template
  249. slot="header">
  250. 售票人数
  251. <Tip msg="一码多人时算多张"></Tip>
  252. </template>
  253. </el-table-column>
  254. <!-- <el-table-column
  255. prop="actualCheckNum"
  256. label="售票总人次">
  257. <template
  258. slot="header">
  259. 售票总人次
  260. <Tip msg="售票人数 × 票种人数"></Tip>
  261. </template>
  262. </el-table-column> -->
  263. <el-table-column
  264. v-if="isColumnVisible('cancelPrice')"
  265. prop="cancelPrice"
  266. label="退票金额">
  267. </el-table-column>
  268. <el-table-column
  269. v-if="isColumnVisible('cancelSettlementPrice')"
  270. prop="cancelSettlementPrice"
  271. label="退票结算金额">
  272. </el-table-column>
  273. <el-table-column
  274. v-if="isColumnVisible('cancelNum')"
  275. width="100"
  276. prop="cancelNum"
  277. label="退票张数">
  278. <template
  279. slot="header">
  280. 退票张数
  281. <Tip msg="一码多人时算一张"></Tip>
  282. </template>
  283. </el-table-column>
  284. <el-table-column
  285. v-if="isColumnVisible('cancelCheckNum')"
  286. prop="cancelCheckNum"
  287. label="退票人数">
  288. <template
  289. slot="header">
  290. 退票人数
  291. <Tip msg="一码多人时算多张"></Tip>
  292. </template>
  293. </el-table-column>
  294. <el-table-column
  295. v-if="isColumnVisible('actualPrice')"
  296. prop="actualPrice"
  297. label="实售金额">
  298. </el-table-column>
  299. <el-table-column
  300. v-if="isColumnVisible('actualSettlementPrice')"
  301. prop="actualSettlementPrice"
  302. label="实售结算金额">
  303. </el-table-column>
  304. <el-table-column
  305. v-if="isColumnVisible('actualNum')"
  306. prop="actualNum"
  307. label="实售张数">
  308. </el-table-column>
  309. <el-table-column
  310. v-if="isColumnVisible('actualCheckNum')"
  311. prop="actualCheckNum"
  312. label="实售人数">
  313. </el-table-column>
  314. <!-- <el-table-column
  315. prop="actual_multi_people"
  316. width="110"
  317. label="实售总人次">
  318. <template slot-scope="scope">
  319. {{ scope.row.actualCheckNum - scope.row.cancel_multi_people }}
  320. </template>
  321. </el-table-column> -->
  322. <!-- <el-table-column
  323. v-if="selectKeys.includes('ticketTypeName')"
  324. prop="ticketTypeName"
  325. label="票种">
  326. </el-table-column>
  327. <el-table-column
  328. v-if="selectKeys.includes('adminName')"
  329. prop="adminName"
  330. label="售票员">
  331. </el-table-column>
  332. <el-table-column
  333. v-if="selectKeys.includes('otaSourceName')"
  334. prop="otaSourceName"
  335. label="销售渠道">
  336. </el-table-column>
  337. <el-table-column
  338. v-if="selectKeys.includes('payChannel')"
  339. prop="payChannel"
  340. label="支付方式">
  341. </el-table-column> -->
  342. </el-table>
  343. </div>
  344. <el-dialog title="选择显示列" :visible.sync="dialogVisible">
  345. <el-checkbox-group v-model="tempSelectedColumns">
  346. <el-checkbox v-for="column in fixedColumns" :key="column.value" :label="column.value">{{ column.label }}</el-checkbox>
  347. </el-checkbox-group>
  348. <span slot="footer" class="dialog-footer">
  349. <el-button @click="dialogVisible = false">取 消</el-button>
  350. <el-button type="primary" @click="saveUserConfig">确 定</el-button>
  351. </span>
  352. </el-dialog>
  353. </div>
  354. </template>
  355. <script>
  356. import { getScenic, getTicketTypeList } from '@/api/ticketType'
  357. import { getOrderStatistics } from '@/api/order'
  358. import { exportCustomizeOrderStatistics } from '@/api/queryReport'
  359. import { ticketStatusDic } from '@/assets/staticData'
  360. import { getSystemConfigList } from '@/api/systemConfig'
  361. import { addUserConfig, getUserConfig } from '@/api/configSetting'
  362. import draggable from 'vuedraggable'
  363. import Tip from '@/components/Tip'
  364. import moment from 'moment'
  365. const groupKeys = [
  366. { value: 'adminName', label: '售票员', prop: 'adminName' },
  367. { value: 'ticketTypeName', label: '票种', prop: 'ticketTypeName' },
  368. { value: 'payChannel', label: '支付方式' },
  369. { value: 'ticketTypeGroupName', label: '票种分组' },
  370. { value: 'unitPrice', label: '单价', prop: 'unitPrice' },
  371. { value: 'otaSourceName', label: '销售渠道' },
  372. { value: 'team', label: '团体' },
  373. { value: 'teamIndividual', label: '团散' },
  374. { value: 'guide', label: '导游' },
  375. { value: 'batch', label: '场次' },
  376. { value: 'orderDateDay', label: '统计日期' },
  377. { value: 'orderDateMonth', label: '统计月份' },
  378. { value: 'orderDateYear', label: '统计年份' }
  379. ]
  380. const fixedColumns = [
  381. { value: 'salePrice', label: '售票金额' },
  382. { value: 'saleSettlementPrice', label: '售票结算金额' },
  383. { value: 'saleNum', label: '售票张数' },
  384. { value: 'saleCheckNum', label: '售票人数' },
  385. { value: 'cancelPrice', label: '退票金额' },
  386. { value: 'cancelSettlementPrice', label: '退票结算金额' },
  387. { value: 'cancelNum', label: '退票张数' },
  388. { value: 'cancelCheckNum', label: '退票人数' },
  389. { value: 'actualPrice', label: '实售金额' },
  390. { value: 'actualSettlementPrice', label: '实售结算金额' },
  391. { value: 'actualNum', label: '实售张数' },
  392. { value: 'actualCheckNum', label: '实售人数' }
  393. ]
  394. const STAT_KEY = 'orderSaleStatistics'
  395. export default {
  396. computed: {
  397. ticketCategoryList () {
  398. return this.$store.state.app.ticketCategory
  399. },
  400. salesList () {
  401. return this.$store.state.user.salesList
  402. },
  403. saleChannel () {
  404. return this.$store.state.app.saleChannel
  405. },
  406. payChannelOptions () {
  407. return this.$store.getters.payChannelOptions
  408. },
  409. userScenic () {
  410. return this.$store.state.app.account.managerScenicMatrix ? this.$store.state.app.account.managerScenicMatrix : this.scenicList
  411. }
  412. },
  413. components: {
  414. Tip,
  415. draggable
  416. },
  417. data () {
  418. return {
  419. dialogVisible: false,
  420. selectedColumns: fixedColumns.map(i => i.value),
  421. tempSelectedColumns: fixedColumns.map(i => i.value),
  422. fixedColumns,
  423. finalGroup: [
  424. { value: 'ticketTypeName', label: '票种', prop: 'ticketTypeName' },
  425. { value: 'adminName', label: '售票员', prop: 'adminName' },
  426. { value: 'payChannel', label: '支付方式' }
  427. ],
  428. selectKeys: ['ticketTypeName', 'adminName', 'payChannel'],
  429. ticketStatusDic,
  430. ticketTypeList: [],
  431. oldTicketTypeOptions: [[]],
  432. oldTicketCateOptions: [[]],
  433. scenicList: [],
  434. ticketSpotList: [],
  435. groupKeys,
  436. form: {
  437. timeBegin: new Date(moment().startOf('day').format('YYYY-MM-DD HH:mm:ss')),
  438. timeEnd: new Date(moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')),
  439. isStorage: null,
  440. ticketTypeIdList: [],
  441. ticketStatus: [],
  442. orderCategory: '',
  443. otaSourceNameList: [], // 渠道id
  444. payChannelList: [],
  445. removeSubtotal: true,
  446. adminIdList: [], // 售票员id
  447. scenicIdList: [], // 景点id
  448. groupByList: ['ticketTypeName'],
  449. pageSize: 10,
  450. pageNum: 1
  451. },
  452. tableData: [],
  453. loading: false,
  454. orderTagList: [],
  455. ticketTagList: [],
  456. OrderIndexArr: [],
  457. index: 0,
  458. tableIndex: 1
  459. }
  460. },
  461. async created () {
  462. this.getTicketTypeList()
  463. this.getScenicList()
  464. this.getSaleStatistic()
  465. this.loadUserConfig()
  466. const res = await getSystemConfigList()
  467. /*
  468. const orderTagList = res.list.find(v => v.configKey === 'orderTagList')?.configValue || []
  469. this.orderTagList = orderTagList.replace(/\s+/g, '').split(',')
  470. */
  471. this.orderTagList = (res.data || []).find(v => v.configKey === 'orderTagList')?.configValue?.replace(/\s+/g, '')?.split(',') || []
  472. },
  473. methods: {
  474. showColumnConfig () {
  475. this.dialogVisible = true
  476. this.loadUserConfig(false)
  477. },
  478. loadUserConfig (applyToTable = true) {
  479. getUserConfig({ statKey: STAT_KEY }).then(config => {
  480. const columns = config?.data?.columns || config?.columns || config?.data || []
  481. let nextSelected = []
  482. if (Array.isArray(columns) && columns.length) {
  483. nextSelected = columns
  484. .filter(i => Number(i.isShow) === 1)
  485. .map(i => i.fieldKey)
  486. } else {
  487. nextSelected = fixedColumns.map(i => i.value)
  488. }
  489. if (applyToTable) {
  490. this.selectedColumns = nextSelected
  491. }
  492. this.tempSelectedColumns = [...nextSelected]
  493. }).catch(() => {
  494. const nextSelected = fixedColumns.map(i => i.value)
  495. if (applyToTable) {
  496. this.selectedColumns = nextSelected
  497. }
  498. this.tempSelectedColumns = [...nextSelected]
  499. })
  500. },
  501. saveUserConfig () {
  502. const columns = this.fixedColumns.map(item => ({
  503. fieldKey: item.value,
  504. fieldName: item.label,
  505. isShow: this.tempSelectedColumns.includes(item.value) ? 1 : 0
  506. }))
  507. addUserConfig({ statKey: STAT_KEY, fields: columns }).then(() => {
  508. this.selectedColumns = [...this.tempSelectedColumns]
  509. this.dialogVisible = false
  510. })
  511. },
  512. isColumnVisible (columnKey) {
  513. return this.selectedColumns.includes(columnKey)
  514. },
  515. // 单元格颜色边框设置
  516. handleCellStyle ({ row, column, rowIndex, columnIndex }) {
  517. if (columnIndex > 4 && columnIndex <= 8) {
  518. if (columnIndex === 8) {
  519. return 'greenBg boldBorder'
  520. }
  521. return 'greenBg'
  522. }
  523. if (columnIndex > 8 && columnIndex <= 12) {
  524. if (columnIndex === 12) {
  525. return 'redBg boldBorder'
  526. }
  527. return 'redBg'
  528. }
  529. if (columnIndex === 4) {
  530. return 'boldBorder'
  531. }
  532. },
  533. disabled (item) {
  534. if (item.value.includes('orderDate')) {
  535. if (this.selectKeys.find(v => v.includes('orderDate'))) {
  536. if (item.value === this.selectKeys.find(v => v.includes('orderDate'))) {
  537. return false
  538. } else {
  539. return true
  540. }
  541. } else {
  542. return false
  543. }
  544. } else {
  545. return false
  546. }
  547. },
  548. selectAll (val) {
  549. let allValues = this.ticketTypeList.map(i => i.id)
  550. allValues.unshift(0) // 添加全部
  551. // 用来储存上一次的值,可以进行对比
  552. const oldVal = this.oldTicketTypeOptions.length === 1 ? [] : this.oldTicketTypeOptions[1]
  553. // 若是全部选择
  554. if (val.includes(0)) this.form.ticketTypeIdList = allValues
  555. // 取消全部选中 上次有 当前没有 表示取消全选
  556. if (oldVal.includes(0) && !val.includes(0)) this.form.ticketTypeIdList = []
  557. // 点击非全部选中 需要排除全部选中 以及 当前点击的选项
  558. // 新老数据都有全部选中
  559. if (oldVal.includes(0) && val.includes(0)) {
  560. const index = val.indexOf(0)
  561. val.splice(index, 1) // 排除全选选项
  562. this.form.ticketTypeIdList = val
  563. }
  564. // 全选未选 但是其他选项全部选上 则全选选上 上次和当前 都没有全选
  565. if (!oldVal.includes(0) && !val.includes(0)) {
  566. if (val.length === allValues.length - 1) this.form.ticketTypeIdList = [0].concat(val)
  567. }
  568. // 储存当前最后的结果 作为下次的老数据
  569. this.oldTicketTypeOptions[1] = this.form.ticketTypeIdList
  570. },
  571. selectAllCate (val) {
  572. let allValues = this.orderCategory.map(i => i.id)
  573. allValues.unshift(0) // 添加全部
  574. // 用来储存上一次的值,可以进行对比
  575. const oldVal = this.oldTicketCateOptions.length === 1 ? [] : this.oldTicketCateOptions[1]
  576. // 若是全部选择
  577. if (val.includes(0)) this.form.orderCategory = allValues
  578. // 取消全部选中 上次有 当前没有 表示取消全选
  579. if (oldVal.includes(0) && !val.includes(0)) this.form.orderCategory = []
  580. // 点击非全部选中 需要排除全部选中 以及 当前点击的选项
  581. // 新老数据都有全部选中
  582. if (oldVal.includes(0) && val.includes(0)) {
  583. const index = val.indexOf(0)
  584. val.splice(index, 1) // 排除全选选项
  585. this.form.orderCategory = val
  586. }
  587. // 全选未选 但是其他选项全部选上 则全选选上 上次和当前 都没有全选
  588. if (!oldVal.includes(0) && !val.includes(0)) {
  589. if (val.length === allValues.length - 1) this.form.orderCategory = [0].concat(val)
  590. }
  591. // 储存当前最后的结果 作为下次的老数据
  592. this.oldTicketCateOptions[1] = this.form.orderCategory
  593. },
  594. reset () {
  595. this.$refs.form.resetFields()
  596. },
  597. reportExport () {
  598. this.$confirm(`是否要导出明细数据`, '确认提示', {
  599. confirmButtonText: '是',
  600. cancelButtonText: '否',
  601. type: 'warning'
  602. }).then(() => {
  603. this.handleExport({
  604. ...this.form,
  605. export: true,
  606. exportDetail: true
  607. })
  608. }).catch(() => {
  609. this.handleExport({
  610. ...this.form,
  611. export: true,
  612. exportDetail: false
  613. })
  614. })
  615. },
  616. handleExport (params) {
  617. exportCustomizeOrderStatistics(params).then(() => {
  618. this.$message.success('导出成功。')
  619. this.goToDownload()
  620. }, () => {
  621. this.$message.success('导出失败。')
  622. })
  623. },
  624. // 获取票种列表
  625. getTicketTypeList () {
  626. return getTicketTypeList({
  627. pageNum: 1,
  628. pageSize: 999
  629. }).then(res => {
  630. this.ticketTypeList = res.data?.records || []
  631. })
  632. },
  633. // 获取景点列表
  634. getScenicList () {
  635. return getScenic().then(res => {
  636. this.scenicList = res.data?.records || []
  637. })
  638. },
  639. // 获取表格数据
  640. getSaleStatistic () {
  641. if (this.form.timeBegin) {
  642. this.form.timeBegin = moment(this.form.timeBegin).format('YYYY-MM-DD HH:mm:ss')
  643. } else {
  644. this.$message.error('请选择起始时间')
  645. return
  646. }
  647. if (this.form.timeEnd) {
  648. this.form.timeEnd = moment(this.form.timeEnd).format('YYYY-MM-DD HH:mm:ss')
  649. } else {
  650. this.$message.error('请选择截止时间')
  651. return
  652. }
  653. this.loading = true
  654. this.tableData = []
  655. this.tableIndex++
  656. let groupArray = []
  657. let orderIndexArr = []
  658. this.finalGroup = this.groupKeys.filter(i => {
  659. return this.selectKeys.includes(i.value)
  660. })
  661. this.form.groupByList = this.finalGroup.map(i => i.value)
  662. getOrderStatistics(this.form).then(res => {
  663. this.tableData = res.data || []
  664. this.finalGroup.forEach(i => {
  665. groupArray.push({})
  666. })
  667. groupArray.forEach((group, index) => {
  668. const keyName = this.finalGroup[index].prop || this.finalGroup[index].value
  669. this.tableData.forEach((el, index) => {
  670. if (el[keyName] === '小计') {
  671. this.index++
  672. }
  673. !group[el[keyName] + '_' + this.index] && (group[el[keyName] + '_' + this.index] = [])
  674. group[el[keyName] + '_' + this.index].push(index)
  675. })
  676. const arr = []
  677. for (let k in group) {
  678. if (group[k].length > 1) {
  679. arr.push(group[k])
  680. }
  681. }
  682. orderIndexArr.push(arr)
  683. })
  684. this.OrderIndexArr = orderIndexArr
  685. }).finally(() => {
  686. this.loading = false
  687. sessionStorage.setItem('统计表-自定义售票统计-查询条件', JSON.stringify(this.form)) // 下次记住
  688. sessionStorage.setItem('统计表-自定义售票统计-查询条件-selectKeys', JSON.stringify(this.selectKeys)) // 下次记住
  689. })
  690. },
  691. totalRowClassName ({ row, rowIndex }) {
  692. for (let key in row) {
  693. if (row[key] === '小计') {
  694. return 'table-total-row table-total-row2'
  695. }
  696. if (row[key] === '总计') {
  697. return 'table-total-row'
  698. }
  699. }
  700. },
  701. objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
  702. if (this.form.removeSubtotal) {
  703. return {
  704. rowspan: 1,
  705. colspan: 1
  706. }
  707. }
  708. if (columnIndex < this.finalGroup.length) {
  709. if (!(this.OrderIndexArr[columnIndex] && this.OrderIndexArr[columnIndex].length)) return
  710. for (let i = 0; i < this.OrderIndexArr[columnIndex].length; i++) {
  711. let element = this.OrderIndexArr[columnIndex][i]
  712. for (let j = 0; j < element.length; j++) {
  713. let item = element[j]
  714. if (rowIndex === item) {
  715. if (j === 0) {
  716. return {
  717. rowspan: element.length,
  718. colspan: 1
  719. }
  720. } else if (j !== 0) {
  721. return {
  722. rowspan: 0,
  723. colspan: 0
  724. }
  725. }
  726. }
  727. }
  728. }
  729. }
  730. }
  731. }
  732. }
  733. </script>
  734. <style lang="scss" scoped>
  735. </style>