refundStatistic.vue 8.4 KB

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