Export.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <div class="container">
  3. <a-card class="mb-20" :bordered="false">
  4. <div class="card-title">{{ $route.meta.title }}</div>
  5. <a-alert class="mb-20" :showIcon="false" message="功能说明:此功能用于订单数据导出,导出后的文件请用Excel打开查看" banner />
  6. <a-form class="my-form" :form="myForm" layout="inline" @submit="handleSubmit">
  7. <a-row :gutter="24">
  8. <a-col :span="12">
  9. <a-form-item label="下单时间">
  10. <a-range-picker
  11. format="YYYY-MM-DD"
  12. v-decorator="['betweenTime', { rules: [{ required: true, message: '请选择下单时间' }] }]"
  13. />
  14. </a-form-item>
  15. </a-col>
  16. <a-col :span="12">
  17. <a-form-item label="订单来源">
  18. <a-select v-decorator="['orderSource', { initialValue: -1 }]">
  19. <a-select-option :value="-1">全部</a-select-option>
  20. <a-select-option
  21. v-for="(item, index) in OrderSourceEnum.data"
  22. :key="index"
  23. :value="item.value"
  24. >{{ item.name }}</a-select-option>
  25. </a-select>
  26. </a-form-item>
  27. </a-col>
  28. <a-col :span="12">
  29. <a-form-item label="支付方式">
  30. <a-select
  31. v-decorator="['payType', { initialValue: -1, rules: [{ required: true, message: '请选择支付方式' }] } ]"
  32. >
  33. <a-select-option :value="-1">全部</a-select-option>
  34. <a-select-option
  35. v-for="(item, index) in PayTypeEnum.data"
  36. :key="index"
  37. :value="item.value"
  38. >{{ item.name }}</a-select-option>
  39. </a-select>
  40. </a-form-item>
  41. </a-col>
  42. <a-col :span="12">
  43. <a-form-item label="配送方式">
  44. <a-select v-decorator="['deliveryType', { initialValue: -1 }]">
  45. <a-select-option :value="-1">全部</a-select-option>
  46. <a-select-option
  47. v-for="(item, index) in DeliveryTypeEnum.data"
  48. :key="index"
  49. :value="item.value"
  50. >{{ item.name }}</a-select-option>
  51. </a-select>
  52. </a-form-item>
  53. </a-col>
  54. <a-col :span="24">
  55. <a-form-item class="item-main" label="导出的字段">
  56. <a-checkbox-group
  57. v-decorator="['columns', { initialValue: columnValue, rules: [{ required: true, message: '请选择导出的字段' }] }]"
  58. :options="columnData"
  59. />
  60. </a-form-item>
  61. </a-col>
  62. <a-col :span="24">
  63. <a-form-item class="form-btn">
  64. <a-button
  65. class="btn-main"
  66. type="primary"
  67. icon="download"
  68. html-type="submit"
  69. :loading="isBtnLoading"
  70. >导出</a-button>
  71. <a-button @click="handleReset">重置</a-button>
  72. </a-form-item>
  73. </a-col>
  74. </a-row>
  75. </a-form>
  76. </a-card>
  77. <a-card :bordered="false">
  78. <div class="card-title">历史导出记录</div>
  79. <ExportList ref="ExportList" />
  80. </a-card>
  81. </div>
  82. </template>
  83. <script>
  84. import storage from 'store'
  85. import moment from 'moment'
  86. import { assignment, inArray, isEmpty } from '@/utils/util'
  87. import * as Api from '@/api/order/export'
  88. import { DeliveryTypeEnum, OrderSourceEnum, PayTypeEnum, OrderStatusEnum } from '@/common/enum/order'
  89. import { ExportList } from './modules'
  90. // 订单字段记录
  91. const columnData = [
  92. { label: '订单ID', value: 'order_id' },
  93. { label: '订单号', value: 'order_no' },
  94. { label: '商品信息', value: 'goods_detail' },
  95. { label: '商品总额', value: 'total_price' },
  96. { label: '优惠券抵扣金额', value: 'coupon_money' },
  97. { label: '积分抵扣金额', value: 'points_money' },
  98. { label: '后台改价', value: 'update_price' },
  99. { label: '运费金额', value: 'express_price' },
  100. { label: '订单实付款', value: 'pay_price' },
  101. { label: '支付方式', value: 'pay_type' },
  102. { label: '下单时间', value: 'create_time' },
  103. { label: '买家信息', value: 'user_info' },
  104. { label: '买家留言', value: 'buyer_remark' },
  105. { label: '配送方式', value: 'delivery_type' },
  106. { label: '收货人', value: 'receipt_name' },
  107. { label: '联系电话', value: 'receipt_phone' },
  108. { label: '收货地址', value: 'receipt_address' },
  109. { label: '物流公司', value: 'express_company' },
  110. { label: '物流单号', value: 'express_no' },
  111. { label: '付款状态', value: 'pay_status' },
  112. { label: '付款时间', value: 'pay_time' },
  113. { label: '发货状态', value: 'delivery_status' },
  114. { label: '发货时间', value: 'delivery_time' },
  115. { label: '收货状态', value: 'receipt_status' },
  116. { label: '收货时间', value: 'receipt_time' },
  117. { label: '订单状态', value: 'order_status' },
  118. { label: '是否已评价', value: 'is_comment' },
  119. { label: '订单来源', value: 'order_source' }
  120. ]
  121. // 默认选中的字段
  122. const columnValue = [
  123. 'order_no',
  124. 'goods_detail',
  125. 'total_price',
  126. 'coupon_money',
  127. 'points_money',
  128. 'update_price',
  129. 'express_price',
  130. 'pay_price',
  131. 'pay_type',
  132. 'create_time',
  133. 'user_info',
  134. 'buyer_remark',
  135. 'delivery_type',
  136. 'receipt_name',
  137. 'receipt_phone',
  138. 'receipt_address',
  139. 'express_company',
  140. 'express_no',
  141. 'pay_status',
  142. 'pay_time',
  143. 'delivery_status',
  144. 'delivery_time',
  145. 'receipt_status',
  146. 'receipt_time',
  147. 'order_status',
  148. 'order_source'
  149. ]
  150. const LOCAL_DATA_KEY = 'order_export_form'
  151. export default {
  152. name: 'Export',
  153. components: {
  154. ExportList
  155. },
  156. data () {
  157. return {
  158. // 当前表单元素
  159. myForm: this.$form.createForm(this),
  160. // 正在加载
  161. isLoading: false,
  162. isBtnLoading: false,
  163. // 标签布局属性
  164. labelCol: { span: 8 },
  165. // 输入框布局属性
  166. wrapperCol: { span: 16 },
  167. // 订单字段数据
  168. columnData,
  169. columnValue
  170. }
  171. },
  172. created () {
  173. // 设置默认值
  174. this.setFieldsValue()
  175. },
  176. beforeCreate () {
  177. // 批量给当前实例赋值
  178. assignment(this, {
  179. inArray,
  180. DeliveryTypeEnum,
  181. OrderSourceEnum,
  182. OrderStatusEnum,
  183. PayTypeEnum
  184. })
  185. },
  186. methods: {
  187. // 设置默认值
  188. setFieldsValue () {
  189. // 从本地获取缓存数据
  190. const data = storage.get(LOCAL_DATA_KEY)
  191. if (!isEmpty(data)) {
  192. data.betweenTime = [moment(data.betweenTime[0]), moment(data.betweenTime[1])]
  193. // 设置默认表单内容
  194. const { myForm: { setFieldsValue } } = this
  195. this.$nextTick(() => setFieldsValue(data))
  196. }
  197. },
  198. // 表单提交
  199. handleSubmit (e) {
  200. e.preventDefault()
  201. this.myForm.validateFields((error, values) => {
  202. if (!error) {
  203. // 将表单数据保存到本地
  204. this.onSave2Local(values)
  205. // 提交到后端api
  206. this.onFormSubmit(values)
  207. }
  208. })
  209. },
  210. // 将表单数据保存到本地 (15天)
  211. onSave2Local (data) {
  212. storage.set(LOCAL_DATA_KEY, data, 15 * 24 * 60 * 60 * 1000)
  213. },
  214. // 提交到后端api
  215. onFormSubmit (data) {
  216. const app = this
  217. app.isLoading = true
  218. app.isBtnLoading = true
  219. Api.exportOrder(data)
  220. .then(result => {
  221. // 显示提示信息
  222. app.$message.success(result.message, 1.5)
  223. // 刷新历史导出记录
  224. app.$refs.ExportList.handleRefresh()
  225. })
  226. .finally(result => {
  227. app.isLoading = false
  228. app.isBtnLoading = false
  229. })
  230. },
  231. // 重置搜索表单
  232. handleReset () {
  233. this.myForm.resetFields()
  234. storage.remove(LOCAL_DATA_KEY)
  235. }
  236. }
  237. }
  238. </script>
  239. <style lang="less" scoped>
  240. // 表单样式
  241. .my-form {
  242. width: 980px;
  243. padding-left: 15px;
  244. /deep/.ant-form-item {
  245. margin-bottom: 0;
  246. min-height: 57px;
  247. .ant-form-item-label {
  248. width: 85px;
  249. margin-right: 15px;
  250. text-align: right;
  251. }
  252. .ant-form-item-control-wrapper {
  253. min-width: 220px;
  254. }
  255. &.item-main {
  256. .ant-form-item-control-wrapper {
  257. width: 805px;
  258. padding-top: 12px;
  259. }
  260. }
  261. &.form-btn {
  262. margin-top: 12px;
  263. width: auto;
  264. .btn-main {
  265. margin-right: 10px;
  266. }
  267. }
  268. }
  269. // 多选框元素
  270. /deep/.ant-checkbox-group-item {
  271. width: 160px;
  272. margin-bottom: 12px;
  273. }
  274. }
  275. </style>