refundStatistic.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div class="form-wrap">
  3. <el-form
  4. class="search-box"
  5. ref="form"
  6. :model="form"
  7. :inline="true"
  8. >
  9. <div class="block-title">
  10. 查询条件
  11. </div>
  12. <el-form-item
  13. label="起始时间"
  14. prop="cancelTimeBegin">
  15. <el-date-picker
  16. v-model="form.cancelTimeBegin"
  17. type="datetime"
  18. placeholder="选择日期时间">
  19. </el-date-picker>
  20. </el-form-item>
  21. <el-form-item
  22. label="结束时间"
  23. prop="cancelTimeEnd">
  24. <el-date-picker
  25. default-time="23:59:59"
  26. v-model="form.cancelTimeEnd"
  27. type="datetime"
  28. placeholder="选择日期时间">
  29. </el-date-picker>
  30. </el-form-item>
  31. <el-form-item
  32. label="票种"
  33. prop="ticketTypeIdList">
  34. <TicketTypeSelect
  35. v-model="form.ticketTypeIdList"
  36. :options="ticketTypeList"
  37. placeholder="请选择">
  38. </TicketTypeSelect>
  39. </el-form-item>
  40. <el-form-item
  41. label="销售来源"
  42. prop="otaSourceNameList">
  43. <el-select
  44. v-model="form.otaSourceNameList"
  45. multiple
  46. clearable
  47. filterable>
  48. <el-option
  49. v-for="item in otaSourceList"
  50. :key="item"
  51. :label="item"
  52. :value="item">
  53. </el-option>
  54. </el-select>
  55. </el-form-item>
  56. <!-- 新增分组筛选项 -->
  57. <el-form-item
  58. label="分组筛选"
  59. style="width:100%">
  60. <el-checkbox-group
  61. v-model="selectKeys"
  62. :min="0"
  63. :max="4">
  64. <draggable :list="groupKeys">
  65. <el-checkbox
  66. :key="item.value"
  67. :label="item.value"
  68. v-for="(item) in groupKeys"
  69. >
  70. {{ item.label }}
  71. </el-checkbox>
  72. </draggable>
  73. </el-checkbox-group>
  74. (可拖拽排序)
  75. </el-form-item>
  76. <div class="btn-wrap">
  77. <el-button
  78. @click="reset">
  79. 重置
  80. </el-button>
  81. <el-button
  82. :disabled="loading"
  83. type="primary"
  84. @click="getList">
  85. 搜索
  86. </el-button>
  87. <el-button
  88. type="primary"
  89. @click="reportExport">
  90. 导出
  91. </el-button>
  92. </div>
  93. </el-form>
  94. <div class="table-box">
  95. <!-- <div class="block-title">
  96. 统计信息
  97. </div> -->
  98. <el-table
  99. border
  100. stripe
  101. v-loading="loading"
  102. :data="tableData"
  103. :row-class-name="totalRowClassName"
  104. :span-method="objectSpanMethod">
  105. <el-table-column
  106. v-for="(item) in finalGroup"
  107. :key="item.prop"
  108. :prop="item.prop"
  109. :label="item.label">
  110. </el-table-column>
  111. </el-table>
  112. </div>
  113. </div>
  114. </template>
  115. <script>
  116. import { getCancelOrderStatistics } from '@/api/queryReport'
  117. import { getSaleChannelList } from '@/api/order'
  118. import { totalRowClassName } from '@/utils'
  119. import draggable from 'vuedraggable'
  120. import TicketTypeSelect from '@/components/TicketTypeSelect'
  121. import moment from 'moment'
  122. export default {
  123. name: 'refundStatistics',
  124. components: {
  125. draggable,
  126. TicketTypeSelect
  127. },
  128. data () {
  129. return {
  130. form: {
  131. cancelTimeBegin: new Date(moment().format('YYYY-MM-DD') + ' 00:00:00'),
  132. cancelTimeEnd: new Date(moment().format('YYYY-MM-DD') + ' 23:59:59'),
  133. ticketTypeIdList: [], // 票种
  134. otaSourceNameList: [],
  135. groupByList: []
  136. },
  137. groupKeys: [{ value: 'orderDateDay', label: '统计日期' }],
  138. finalGroup: [
  139. // { prop: 'orderDateDay', label: '统计日期' },
  140. { prop: 'otaSourceName', label: '销售渠道' },
  141. { prop: 'ticketTypeName', label: '票种' },
  142. { prop: 'unitPrice', label: '单价' },
  143. { prop: 'cancelCount', label: '退票数量' },
  144. { prop: 'cancelNum', label: '退票人数' },
  145. { prop: 'cancelPrice', label: '退票金额' },
  146. { prop: 'cancelSettlementPrice', label: '退票结算金额' }
  147. ],
  148. selectKeys: [], // 默认选中
  149. tableData: [],
  150. otaSourceList: [],
  151. OrderIndexArr: [],
  152. index: 0,
  153. tableIndex: 1,
  154. loading: false
  155. }
  156. },
  157. computed: {
  158. ticketTypeList () {
  159. const { ticketTypeList } = this.$store.state.app
  160. const { orderCategory } = this.form
  161. return orderCategory ? ticketTypeList.filter(item => item.category === orderCategory) : ticketTypeList
  162. },
  163. payChannelOptions () {
  164. return this.$store.getters.payChannelOptions
  165. }
  166. },
  167. created () {
  168. const searchParams = JSON.parse(sessionStorage.getItem('统计表-退票统计-查询条件'))
  169. if (searchParams) {
  170. this.form = searchParams // 记住上次搜索条件
  171. }
  172. let lastSelectKeys = JSON.parse(sessionStorage.getItem('统计表-退票统计-查询条件-selectKeys')) // 加载上次记住的分组信息
  173. if (lastSelectKeys) {
  174. this.selectKeys = lastSelectKeys
  175. }
  176. this.getSaleChannelList()
  177. this.getList()
  178. },
  179. methods: {
  180. totalRowClassName,
  181. objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
  182. if (columnIndex < this.finalGroup.length) {
  183. if (!(this.OrderIndexArr[columnIndex] && this.OrderIndexArr[columnIndex].length)) return
  184. for (let i = 0; i < this.OrderIndexArr[columnIndex].length; i++) {
  185. let element = this.OrderIndexArr[columnIndex][i]
  186. for (let j = 0; j < element.length; j++) {
  187. let item = element[j]
  188. if (rowIndex === item) {
  189. if (j === 0) {
  190. return {
  191. rowspan: element.length,
  192. colspan: 1
  193. }
  194. } else if (j !== 0) {
  195. return {
  196. rowspan: 0,
  197. colspan: 0
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. },
  205. getSaleChannelList () {
  206. getSaleChannelList().then(res => {
  207. this.otaSourceList = res.data
  208. })
  209. },
  210. reset () {
  211. this.$refs.form.resetFields()
  212. },
  213. setTime () {
  214. if (this.form.cancelTimeBegin) {
  215. this.form.cancelTimeBegin = moment(this.form.cancelTimeBegin).format('YYYY-MM-DD HH:mm:ss')
  216. } else {
  217. this.form.cancelTimeBegin = ''
  218. }
  219. if (this.form.cancelTimeEnd) {
  220. this.form.cancelTimeEnd = moment(this.form.cancelTimeEnd).format('YYYY-MM-DD HH:mm:ss')
  221. } else {
  222. this.form.cancelTimeEnd = ''
  223. }
  224. },
  225. reportExport () {
  226. this.setTime()
  227. if (!this.form.ticketTypeIdList) {
  228. this.form.ticketTypeIdList = []
  229. }
  230. if (!this.form.otaSourceNameList) {
  231. this.form.otaSourceNameList = []
  232. }
  233. this.$confirm(`是否要导出明细数据`, '确认提示', {
  234. confirmButtonText: '是',
  235. cancelButtonText: '否',
  236. type: 'warning'
  237. }).then(() => {
  238. this.handleExport({
  239. ...this.form,
  240. export: true,
  241. exportDetail: true
  242. })
  243. }).catch(() => {
  244. this.handleExport({
  245. ...this.form,
  246. export: true,
  247. exportDetail: false
  248. })
  249. })
  250. },
  251. handleExport (params) {
  252. getCancelOrderStatistics(params).then(() => {
  253. this.$message.success('导出成功。')
  254. this.goToDownload()
  255. }, () => {
  256. this.$message.success('导出失败。')
  257. })
  258. },
  259. getList () {
  260. if (this.selectKeys.length === 0) {
  261. this.finalGroup = [
  262. { prop: 'otaSourceName', label: '销售渠道' },
  263. { prop: 'ticketTypeName', label: '票种' },
  264. { prop: 'unitPrice', label: '单价' },
  265. { prop: 'cancelCount', label: '退票数量' },
  266. { prop: 'cancelNum', label: '退票人数' },
  267. { prop: 'cancelPrice', label: '退票金额' },
  268. { prop: 'cancelSettlementPrice', label: '退票结算金额' }
  269. ]
  270. } else {
  271. this.finalGroup = [
  272. { prop: 'orderDateDay', label: '统计日期' },
  273. { prop: 'otaSourceName', label: '销售渠道' },
  274. { prop: 'ticketTypeName', label: '票种' },
  275. { prop: 'unitPrice', label: '单价' },
  276. { prop: 'cancelCount', label: '退票数量' },
  277. { prop: 'cancelNum', label: '退票人数' },
  278. { prop: 'cancelPrice', label: '退票金额' },
  279. { prop: 'cancelSettlementPrice', label: '退票结算金额' }
  280. ]
  281. }
  282. this.form.groupByList = [...this.selectKeys] || []
  283. this.loading = true
  284. this.setTime()
  285. getCancelOrderStatistics(this.form).then(res => {
  286. this.tableData = res.data || []
  287. console.log('tableData', this.tableData)
  288. console.log('finalGroup', this.finalGroup)
  289. }).finally(() => {
  290. this.loading = false
  291. })
  292. sessionStorage.setItem('统计表-退票统计-查询条件', JSON.stringify(this.form)) // 下次记住
  293. sessionStorage.setItem('统计表-退票统计-查询条件-selectKeys', JSON.stringify(this.selectKeys)) // 下次记住
  294. }
  295. }
  296. }
  297. </script>