TableList.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <template>
  2. <page-header-wrapper>
  3. <a-card :bordered="false">
  4. <div class="table-page-search-wrapper">
  5. <a-form layout="inline">
  6. <a-row :gutter="48">
  7. <a-col :md="8" :sm="24">
  8. <a-form-item label="订单编号">
  9. <a-input v-model="queryParam.id" placeholder="请输入"/>
  10. </a-form-item>
  11. </a-col>
  12. <a-col :md="8" :sm="24">
  13. <a-form-item label="申请打包的物流单号">
  14. <a-input v-model="queryParam.tracking_no" placeholder="请输入"/>
  15. </a-form-item>
  16. </a-col>
  17. <a-col :md="8" :sm="24">
  18. <a-form-item label="国际物流单号">
  19. <a-input v-model="queryParam.new_tracking_no" placeholder="请输入"/>
  20. </a-form-item>
  21. </a-col>
  22. <a-col :md="8" :sm="24">
  23. <a-form-item label="唛头">
  24. <a-input v-model="queryParam.member_id" placeholder="请输入"/>
  25. </a-form-item>
  26. </a-col>
  27. <a-col :md="8" :sm="24">
  28. <a-form-item label="订单状态">
  29. <!-- 5拆包中 10 未付款 20待发货 29已发货 30已完成 -->
  30. <a-select v-model="queryParam.status" placeholder="请选择" default-value="0">
  31. <a-select-option value="0">全部</a-select-option>
  32. <a-select-option value="5">拆包中</a-select-option>
  33. <a-select-option value="10">未付款</a-select-option>
  34. <a-select-option value="20">待发货</a-select-option>
  35. <a-select-option value="29">已发货</a-select-option>
  36. <a-select-option value="30">已完成</a-select-option>
  37. </a-select>
  38. </a-form-item>
  39. </a-col>
  40. <a-col :md="!advanced && 8 || 24" :sm="24">
  41. <span class="table-page-search-submitButtons" :style="advanced && { float: 'right', overflow: 'hidden' } || {} ">
  42. <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
  43. <a-button style="margin-left: 8px" @click="() => { this.queryParam = {}; this.$refs.table.refresh(true) }">重置</a-button>
  44. </span>
  45. </a-col>
  46. </a-row>
  47. </a-form>
  48. </div>
  49. <!-- <div class="table-operator">
  50. <a-button type="primary" icon="plus" @click="handleAdd">入库</a-button>
  51. </div> -->
  52. <s-table
  53. ref="table"
  54. size="default"
  55. rowKey="id"
  56. :columns="columns"
  57. :data="loadData"
  58. showPagination="auto"
  59. >
  60. <span slot="serial" slot-scope="text, record, index">
  61. {{ index + 1 }}
  62. </span>
  63. <span slot="status" slot-scope="text">
  64. <a-badge :status="text | statusTypeFilter" :text="text | statusFilter" />
  65. </span>
  66. <span slot="description" slot-scope="text">
  67. <ellipsis :length="4" tooltip>{{ text }}</ellipsis>
  68. </span>
  69. <span slot="package" slot-scope="text, record">
  70. <template>
  71. <!-- 假设 text 是你传递的对象或数组 -->
  72. <div v-for="(item, index) in record.package" :key="index">
  73. {{ item.tracking_no }} ({{ item.item_names }})
  74. </div>
  75. </template>
  76. </span>
  77. <span slot="address" slot-scope="text, record">
  78. <template>
  79. <!-- 假设 text 是你传递的对象或数组 -->
  80. <div v-if="record.address">收件人: {{ record.address.receiver_name }}</div>
  81. <div v-if="record.address">手机号: {{ record.address.receiver_phone }}</div>
  82. <div v-if="record.address">国家: {{ record.address.receiver_country }}</div>
  83. <div v-if="record.address">城市: {{ record.address.receiver_city }}</div>
  84. <div v-if="record.address">详情地址: {{ record.address.receive_address }}</div>
  85. <div v-if="record.address">邮编: {{ record.address.receiver_zip_code }}</div>
  86. </template>
  87. </span>
  88. <span slot="action" slot-scope="text, record">
  89. <template>
  90. <a @click="handleSub(record)">详情</a>
  91. <a-divider v-if="record && (record.order_status === 5 || record.order_status === 20 || record.order_status === 29)" type="vertical" />
  92. <a @click="handleEdit(record)" v-if="record && (record.order_status === 5 || record.order_status === 20 || record.order_status === 29)">
  93. {{ record.order_status === 5 ? '打包完成' : (record.order_status === 20 ? '已发货':(record.order_status === 29 ? '完成':'')) }}</a>
  94. </template>
  95. </span>
  96. </s-table>
  97. <!-- 发货 -->
  98. <delivery-form
  99. ref="deliveryModal"
  100. :visible="visibleDelivery"
  101. :loading="confirmLoading"
  102. :model="mdl"
  103. @cancel="handleCancel"
  104. @ok="deliveryOk"
  105. />
  106. <!-- 订单详情 -->
  107. <detail-form
  108. ref="detailModal"
  109. :visible="visibleDetail"
  110. :loading="confirmLoading"
  111. :model="mdl"
  112. @cancel="handleCancel"
  113. />
  114. <!-- 包裹入库 -->
  115. <create-form
  116. ref="createModal"
  117. :visible="visible"
  118. :loading="confirmLoading"
  119. :model="mdl"
  120. @cancel="handleCancel"
  121. @ok="handleOk"
  122. />
  123. <step-by-step-modal ref="modal" @ok="handleOk"/>
  124. </a-card>
  125. </page-header-wrapper>
  126. </template>
  127. <script>
  128. import moment from 'moment'
  129. import { STable, Ellipsis } from '@/components'
  130. import { getOrderList, packageWarehousing, delivery, complete, packComplete } from '@/api/manage'
  131. import StepByStepModal from './modules/StepByStepModal'
  132. import CreateForm from './modules/CreateForm'
  133. import deliveryForm from './modules/deliveryForm'
  134. import detailForm from './modules/detailForm'
  135. const columns = [
  136. {
  137. title: '订单id',
  138. dataIndex: 'id'
  139. },
  140. {
  141. title: '订单号',
  142. dataIndex: 'order_sn'
  143. },
  144. {
  145. title: '物流',
  146. dataIndex: 'line.name'
  147. },
  148. {
  149. title: '用户打包备注',
  150. dataIndex: 'pack_remark'
  151. },
  152. {
  153. title: '唛头',
  154. dataIndex: 'member_id'
  155. },
  156. {
  157. title: '名称',
  158. dataIndex: 'pack_item_name'
  159. },
  160. {
  161. title: '申请包裹列表',
  162. dataIndex: 'package',
  163. scopedSlots: { customRender: 'package' }
  164. },
  165. {
  166. title: '收件人信息',
  167. dataIndex: 'address',
  168. scopedSlots: { customRender: 'address' }
  169. },
  170. // {
  171. // title: '订单金额',
  172. // dataIndex: 'order_amount'
  173. // scopedSlots: { customRender: 'description' }
  174. // },
  175. // {
  176. // title: '服务调用次数',
  177. // dataIndex: 'callNo',
  178. // sorter: true,
  179. // needTotal: true,
  180. // customRender: (text) => text + ' 次'
  181. // },
  182. // {
  183. // title: '订单状态',
  184. // dataIndex: 'status',
  185. // scopedSlots: { customRender: 'status' }
  186. // },
  187. {
  188. title: '订单状态',
  189. dataIndex: 'order_status_text'
  190. },
  191. {
  192. title: '支付状态',
  193. dataIndex: 'pay_status_text'
  194. },
  195. {
  196. title: '申请打包时间',
  197. dataIndex: 'create_time',
  198. sorter: true
  199. },
  200. {
  201. title: '操作',
  202. dataIndex: 'action',
  203. width: '150px',
  204. scopedSlots: { customRender: 'action' }
  205. }
  206. ]
  207. // 5拆包中 10 未付款 20待发货 29已发货 30已完成
  208. const statusMap = {
  209. 0: {
  210. status: 'default',
  211. text: '拆包中'
  212. },
  213. 1: {
  214. status: 'processing',
  215. text: '待发货'
  216. },
  217. 2: {
  218. status: 'success',
  219. text: '已完成'
  220. },
  221. 3: {
  222. status: 'error',
  223. text: '未付款'
  224. }
  225. }
  226. export default {
  227. name: 'TableList',
  228. components: {
  229. STable,
  230. Ellipsis,
  231. CreateForm,
  232. StepByStepModal,
  233. deliveryForm,
  234. detailForm
  235. },
  236. data () {
  237. try {
  238. console.log('TableList - initializing data')
  239. this.columns = columns
  240. return {
  241. visibleDetail: false,
  242. // create model
  243. visibleDelivery: false,
  244. visible: false,
  245. confirmLoading: false,
  246. mdl: null,
  247. // 高级搜索 展开/关闭
  248. advanced: false,
  249. // 查询参数
  250. queryParam: {},
  251. // 加载数据方法 必须为 Promise 对象
  252. loadData: parameter => {
  253. console.log('TableList - loadData called with params:', parameter)
  254. const requestParameters = Object.assign({}, parameter, this.queryParam)
  255. // Transform parameter names
  256. const transformedParams = {
  257. ...requestParameters,
  258. page: requestParameters.pageNo,
  259. page_size: requestParameters.pageSize,
  260. order_status: requestParameters.status ? requestParameters.status : '',
  261. order_sn: requestParameters.id
  262. }
  263. // Remove original parameters
  264. delete transformedParams.pageNo
  265. delete transformedParams.pageSize
  266. console.log('TableList - loadData request parameters:', transformedParams)
  267. return getOrderList(transformedParams)
  268. .then(res => {
  269. console.log('TableList - loadData response:', res)
  270. if (!res || !res.data || !res.data.list) {
  271. console.error('TableList - loadData invalid response:', res)
  272. return {
  273. data: [],
  274. pageSize: parameter.pageSize,
  275. pageNo: parameter.pageNo,
  276. totalCount: 0
  277. }
  278. }
  279. return {
  280. data: res.data.list,
  281. pageSize: parameter.pageSize,
  282. pageNo: parameter.pageNo,
  283. totalCount: res.data.count || res.data.list.length
  284. }
  285. })
  286. .catch(error => {
  287. console.error('TableList - loadData error:', error)
  288. return {
  289. data: [],
  290. pageSize: parameter.pageSize,
  291. pageNo: parameter.pageNo,
  292. totalCount: 0
  293. }
  294. })
  295. }
  296. }
  297. } catch (error) {
  298. console.error('TableList - data initialization error:', error)
  299. return {}
  300. }
  301. },
  302. filters: {
  303. statusFilter (type) {
  304. return statusMap[type].text
  305. },
  306. statusTypeFilter (type) {
  307. return statusMap[type].status
  308. }
  309. },
  310. computed: {
  311. },
  312. methods: {
  313. handleAdd () {
  314. this.mdl = null
  315. this.visible = true
  316. },
  317. handleEdit (record) {
  318. this.visibleDelivery = true
  319. this.mdl = { ...record }
  320. },
  321. deliveryOk () {
  322. const form = this.$refs.deliveryModal.form
  323. this.confirmLoading = true
  324. form.validateFields((errors, values) => {
  325. console.log('TableList - loadData response:', values)
  326. if (!errors) {
  327. values.order_sn = this.mdl.order_sn
  328. if (this.mdl.order_status === 20) {
  329. delivery(values)
  330. .then(res => {
  331. if (res) {
  332. form.resetFields()
  333. console.log('res', res)
  334. // this.$message.info('已发货')
  335. this.visibleDelivery = false
  336. this.$refs.table.refresh()
  337. }
  338. })
  339. .catch(error => {
  340. this.$message.error(error.message)
  341. console.error('TableList - loadData error:', error)
  342. }).finally(() => {
  343. this.mdl = null
  344. this.confirmLoading = false
  345. })
  346. } else if (this.mdl.order_status === 29) {
  347. complete(values)
  348. .then(res => {
  349. if (res) {
  350. form.resetFields()
  351. console.log('res', res)
  352. // this.$message.info('已发货')
  353. this.visibleDelivery = false
  354. this.$refs.table.refresh()
  355. }
  356. })
  357. .catch(error => {
  358. this.$message.error(error.message)
  359. console.error('TableList - loadData error:', error)
  360. }).finally(() => {
  361. this.mdl = null
  362. this.confirmLoading = false
  363. })
  364. } else if (this.mdl.order_status === 5) {
  365. packComplete(values)
  366. .then(res => {
  367. if (res) {
  368. form.resetFields()
  369. console.log('res', res)
  370. // this.$message.info('已发货')
  371. this.visibleDelivery = false
  372. this.$refs.table.refresh()
  373. }
  374. })
  375. .catch(error => {
  376. this.$message.error(error.message)
  377. console.error('TableList - loadData error:', error)
  378. }).finally(() => {
  379. this.mdl = null
  380. this.confirmLoading = false
  381. })
  382. }
  383. } else {
  384. this.confirmLoading = false
  385. }
  386. })
  387. },
  388. handleOk () {
  389. const form = this.$refs.createModal.form
  390. this.confirmLoading = true
  391. form.validateFields((errors, values) => {
  392. if (!errors) {
  393. console.log('TableList - loadData response:', values)
  394. values.tracking_no_list = values.tracking_no_list
  395. .split('\n')
  396. .map(line => line.trim())
  397. .filter(line => line !== '')
  398. packageWarehousing(values)
  399. .then(res => {
  400. if (res) {
  401. console.log('TableList - loadData response:', res)
  402. form.resetFields()
  403. // this.$message.info('入库成功')
  404. this.confirmLoading = false
  405. this.visible = false
  406. this.$refs.table.refresh()
  407. }
  408. })
  409. .catch(error => {
  410. console.error('TableList - loadData error:', error)
  411. })
  412. } else {
  413. this.confirmLoading = false
  414. }
  415. })
  416. },
  417. handleCancel () {
  418. this.visible = false
  419. this.visibleDelivery = false
  420. this.visibleDetail = false
  421. const form = this.$refs.createModal.form
  422. form.resetFields() // 清理表单数据(可不做)
  423. this.mdl = null
  424. },
  425. handleSub (record) {
  426. this.visibleDetail = true
  427. this.mdl = { ...record }
  428. },
  429. toggleAdvanced () {
  430. this.advanced = !this.advanced
  431. },
  432. resetSearchForm () {
  433. this.queryParam = {
  434. date: moment(new Date())
  435. }
  436. }
  437. }
  438. }
  439. </script>