From 111392f8ae1f27c4cde93bd7974a5f16c8188188 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期四, 09 一月 2025 09:09:50 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- pages/order/after-sale/index.vue | 369 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 317 insertions(+), 52 deletions(-) diff --git a/pages/order/after-sale/index.vue b/pages/order/after-sale/index.vue index d9d5e89..b1b99cf 100644 --- a/pages/order/after-sale/index.vue +++ b/pages/order/after-sale/index.vue @@ -1,9 +1,29 @@ <template> - <el-bus-crud ref="crud" v-bind="tableConfig"></el-bus-crud> + <el-bus-crud ref="crud" v-bind="tableConfig"> + <template #table="{ list }"> + <template v-if="list && list.length > 0"> + <after-sale-table :list="list" @detail="onDetail" @handle="onHandle" /> + </template> + <el-bus-empty v-else /> + </template> + </el-bus-crud> </template> <script> +import AfterSaleTable from '@/components/order/after-sale-table' +const feeKeys = [ + 'feeSupplier', + 'feePlatform', + 'feePartner', + 'feePlatformPack', + 'feePlatformCheck', + 'feePlatformTransport', + 'feePackingTransport', +] export default { + components: { + AfterSaleTable, + }, data() { return { tableConfig: { @@ -11,48 +31,27 @@ hasNew: false, hasEdit: false, hasDelete: false, - onResetView: (row) => { - this.$router.push(`${this.$route.path}/view/${row.id}`) - }, - operationAttrs: { - width: 120, - fixed: 'right', - }, - extraButtons: [ - { - text: '售后处理', - show: (row) => row.status === 'PENDING', - atClick: (row) => { - this.$router.push(`${this.$route.path}/handle/${row.id}`) - }, - }, - ], - columns: [ - { label: '订单号', prop: 'orderNo', minWidth: 150, fixed: 'left' }, - { label: '售后单号', prop: 'salesNo', minWidth: 150 }, - { label: '收货人', prop: 'customer', minWidth: 120 }, - { label: '收货人电话', prop: 'customerTel', minWidth: 120 }, - { - label: '收货地址', - formatter: (row) => - `${row.customerProvince || ''}${row.customerCity || ''}${ - row.customerRegion || '' - }${row.customerAddress || ''}`, - minWidth: 250, - }, - { label: '订单金额', prop: 'totalOrderAmount', minWidth: 150 }, - { label: '售后理由', prop: 'reason', minWidth: 200 }, - { label: '售后状态', prop: 'statusStr', minWidth: 120 }, - { label: '审核状态', prop: 'auditStatusStr', minWidth: 120 }, - { label: '申请时间', prop: 'createTime', minWidth: 180 }, - { label: '处理时间', prop: 'auditTime', minWidth: 180 }, - ], + hasExport: true, + exportUrl: 'flower/api/sales/list/export', + exportText: '售后导出', searchFormAttrs: { labelWidth: 'auto', + }, + beforeRequest: (params) => { + const searchForm = this.$refs.crud?.$refs?.searchForm + if (searchForm) { + const statusComp = searchForm.getComponentById('status') + if (statusComp) { + // 组件内部不会修改这个prop直接修改可忽略警告 + statusComp.extraQuery = { ...params, status: '' } + statusComp.getOtherOptions() + } + } }, searchForm: [ { type: 'row', + id: 'row', items: [ { label: '售后状态:', @@ -60,29 +59,254 @@ type: 'bus-radio', el: { hasAll: true, + otherInterfaceUri: 'flower/api/sales/status/count', childType: 'el-radio-button', - code: 'SALES_STATUS', + filterOptions: (list) => { + return list.map((item) => { + return { + ...item, + label: `${item.label}(${item.orderCount})`, + } + }) + }, + // code: 'ORDER_SALES_STATUS', }, - default: '', + default: this.$route.query.status || '', span: 24, searchImmediately: true, - }, - { - label: '审核状态:', - id: 'auditStatus', - type: 'bus-radio', - el: { - hasAll: true, - childType: 'el-radio-button', - code: 'SALES_AUDIT_STATUS', + on: { + optionsChange: (e, updateForm, { currentComp }) => { + if (Array.isArray(e[0]) && e[0].length > 0) { + const totalCount = e[0].reduce((total, current) => { + return (total += current.orderCount) + }, 0) + // 组件内部不会修改这个prop直接修改可忽略警告 + currentComp.props = { + allLabel: `不限(${totalCount})`, + } + } + }, }, - default: '', - span: 24, - searchImmediately: true, }, + { label: '商品名称:', id: 'flowerName', type: 'input' }, { label: '订单号:', id: 'orderNo', type: 'input' }, { label: '售后单号:', id: 'salesNo', type: 'input' }, + { label: '收货人姓名:', id: 'customer', type: 'input' }, + { label: '收货人电话:', id: 'customerTel', type: 'input' }, + { label: '供应商:', id: 'supplierName', type: 'input' }, + { + label: '下单时间:', + id: 'orderStartDateStr', + component: 'el-bus-date-range', + commonFormat: true, + commonFormatProps: ['orderStartDateStr', 'orderEndDateStr'], + customClass: 'in-bus-form', + }, + { + label: '售后时间:', + id: 'salesStartDateStr', + component: 'el-bus-date-range', + commonFormat: true, + commonFormatProps: ['salesStartDateStr', 'salesEndDateStr'], + customClass: 'in-bus-form', + }, + { + label: '售后类别', + id: 'salesType', + type: 'bus-select-dict', + el: { + code: 'after_sale_type', + clearable: true, + style: 'width:100%', + }, + }, ], + }, + ], + form: [ + { + type: 'row', + items: [ + { label: '商品名称:', id: 'flowerName', type: 'input' }, + { label: '合伙人加价(元):', id: 'markupPartner', type: 'input' }, + { label: '原价(元):', id: 'price', type: 'input' }, + { label: '券后单价(元):', id: 'realPrice', type: 'input' }, + { label: '券后总金额(元):', id: 'realTotal', type: 'input' }, + { label: '供应商价格(元):', id: 'supplierPrice', type: 'input' }, + { label: '商品数量:', id: 'flowerNum', type: 'input' }, + { label: '申请售后数量:', id: 'num', type: 'input' }, + ], + }, + { + type: 'row', + items: [ + { + label: '质检总扣款(元):', + id: 'checkTotalAmount', + type: 'input', + span: 24, + customClass: 'to-red to-bold', + }, + { + label: '降级数量:', + id: 'reduceNum', + type: 'input', + }, + { + label: '降级总金额(元):', + id: 'reduceAmount', + type: 'input', + }, + { + label: '缺货数量:', + id: 'lackNum', + type: 'input', + span: 24, + }, + { + label: '已退总金额(元):', + id: 'refundTotalAmount', + type: 'input', + span: 24, + customClass: 'to-red to-bold', + }, + ], + }, + ], + extraDialogs: [ + { + title: '售后处理', + readonly: true, + confirmText: '通过', + cancelText: '不通过', + confirmButtonAttrs: { + type: 'success', + }, + cancelButtonAttrs: { + type: 'danger', + }, + dialogAttrs: { + width: '70%', + }, + form: [ + { + type: 'row', + items: [ + { + label: '供应商(元):', + id: 'feeSupplier', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '平台(元):', + id: 'feePlatform', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '合伙人(元):', + id: 'feePartner', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '打包(元):', + id: 'feePlatformPack', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '质检(元):', + id: 'feePlatformCheck', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '物流(元):', + id: 'feePlatformTransport', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '打包运费(元)(散户):', + id: 'feePackingTransport', + type: 'input-number', + el: { min: 0, precision: 2, controls: false }, + }, + { + label: '实际总扣款(元):', + id: 'tempTotal', + component: 'simple-text', + readonly: true, + forceDisabled: true, + el: (row) => ({ + text: feeKeys + .reduce((total, current) => { + total += row[current] ?? 0 + return total + }, 0) + .toFixed(2), + }), + span: 24, + customClass: 'to-bold-label', + }, + { + label: '申请理由:', + id: 'reason', + type: 'input', + el: { + type: 'textarea', + }, + readonly: true, + span: 24, + }, + { + label: '平台回复:', + id: 'remarks', + type: 'input', + el: { + type: 'textarea', + rows: 6, + }, + rules: { + required: true, + message: '请输入平台回复', + trigger: 'blur', + }, + span: 24, + }, + ], + }, + ], + atConfirm: async (val) => { + const { code } = await this.$elBusHttp.request( + 'flower/api/sales/audit/agree', + { method: 'post', data: val } + ) + if (code === 0) { + this.$message.success('操作成功') + } else { + return false + } + }, + atCancel: async (val) => { + const { code } = await this.$elBusHttp.request( + 'flower/api/sales/audit/reject', + { + method: 'post', + data: { + id: val.id, + remarks: val.remarks, + }, + } + ) + if (code === 0) { + this.$message.success('操作成功') + } else { + return false + } + }, }, ], }, @@ -93,7 +317,48 @@ title: '售后理赔', } }, + methods: { + onDetail(item) { + this.$router.push(`${this.$route.path}/view/${item.id}`) + }, + async onHandle(item) { + const { code, data } = await this.$elBusHttp.request( + 'flower/api/sales/list/view', + { params: { id: item.id } } + ) + if (code === 0) { + feeKeys.forEach((key) => { + data[key] = data[key] ?? undefined + }) + this.$refs.crud.$refs.extraDialog[0].show(data) + } + }, + }, } </script> -<style lang="scss" scoped></style> +<style lang="scss" scoped> +::v-deep { + .el-form-item { + &.to-bold { + .el-form-item__label, + .simple-text, + .el-bus-form-item__normal { + font-weight: bold; + } + } + &.to-red { + .el-form-item__label, + .simple-text, + .el-bus-form-item__normal { + color: $danger-color; + } + } + &.to-bold-label { + .el-form-item__label { + font-weight: bold; + } + } + } +} +</style> -- Gitblit v1.9.3