From 8db1014ad0c02e88609ef3e46a0236f40820ed1d Mon Sep 17 00:00:00 2001
From: mayf <m13160102112@163.com>
Date: 星期五, 23 八月 2024 17:49:19 +0800
Subject: [PATCH] 售后相关改动 内容管理改动
---
components/order/video-list.vue | 30 +
pages/content/banner.vue | 1
pages/order/after-sale/index.vue | 253 ++++++++++++---
pages/content/notice.vue | 1
layouts/default.vue | 2
pages/order/list/_id.vue | 47 ++
pages/content/advertisement.vue | 1
assets/main.scss | 6
components/simple-text.vue | 29 +
pages/order/after-sale/_action/_id.vue | 263 ++++++----------
assets/variable.scss | 2
pages/feedback.vue | 155 +++++++++
components/order/after-sale-table.vue | 139 ++++++++
13 files changed, 705 insertions(+), 224 deletions(-)
diff --git a/assets/main.scss b/assets/main.scss
index f29c4c2..686fc10 100644
--- a/assets/main.scss
+++ b/assets/main.scss
@@ -120,4 +120,10 @@
background-color: #fff;
padding: 24px;
border-radius: 4px;
+ &__line {
+ width: calc(100% + 48px);
+ height: 10px;
+ background-color: $bg-color;
+ margin: 20px -24px;
+ }
}
diff --git a/assets/variable.scss b/assets/variable.scss
index ac42f6c..1a45681 100644
--- a/assets/variable.scss
+++ b/assets/variable.scss
@@ -6,7 +6,7 @@
$success-color: #67c23a;
$padding-vertical: 24px;
$padding-horizontal: 24px;
-$bg-color: #f5f6fa;
+$bg-color: #ebf2f9;
$page-padding: 20px;
$danger-color: rgb(245, 108, 108);
$warning-color: #e6a23c;
diff --git a/components/order/after-sale-table.vue b/components/order/after-sale-table.vue
new file mode 100644
index 0000000..956bf0f
--- /dev/null
+++ b/components/order/after-sale-table.vue
@@ -0,0 +1,139 @@
+<template>
+ <div class="after-sale-table">
+ <div class="table-header">
+ <div class="table-th">商品信息</div>
+ <div class="table-th">合计详情</div>
+ <div class="table-th !flex-none w-120">供应商信息</div>
+ <div class="table-th">收货人信息</div>
+ <div class="table-th !flex-none w-180">操作</div>
+ </div>
+ <div v-for="item in list" :key="item.id" class="table-item">
+ <div class="table-item__title">
+ <span class="font-bold">订单号:{{ item.orderNo }}</span>
+ <span class="font-bold">售后单号:{{ item.salesNo }}</span>
+ <span>申请时间:{{ item.createTime }}</span>
+ <span
+ >售后状态:<span
+ :class="{ 'text-primary': item.status === 'PENDING' }"
+ >{{ item.statusStr }}</span
+ ></span
+ >
+ <el-tag v-if="item.title" type="danger" size="mini" class="ml-4"
+ >第二次售后</el-tag
+ >
+ </div>
+ <div class="table-body">
+ <div class="table-td">
+ <div class="flex">
+ <el-bus-image :src="item.flowerCover" class="w-60 h-60 mr-8" />
+ <div class="leading-20">
+ <div class="text-14 font-bold">
+ {{ item.flowerName }} × {{ item.flowerNum }}
+ </div>
+ <div class="leading-20">
+ <span>等级:{{ item.flowerLevelStr }}</span>
+ <span class="ml-8">颜色:{{ item.flowerColor }}</span>
+ </div>
+ <div class="leading-20">
+ <span>单价:¥{{ item.price }}</span>
+ <span class="ml-8">订单总额:¥{{ item.total }}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="table-td">
+ <div class="leading-20">申请数量:{{ item.num }}</div>
+ <div class="leading-20">实际退款:{{ item.totalFee }}</div>
+ <div class="leading-20 flex">
+ 申请理由:
+ <div class="flex-1 text-overflow-2 w-0">{{ item.reason }}</div>
+ </div>
+ </div>
+ <div class="table-td !flex-none w-120 flex items-center">
+ {{ item.supplierName }}
+ </div>
+ <div class="table-td">
+ <div class="leading-20">姓名:{{ item.customer }}</div>
+ <div class="leading-20">联系方式:{{ item.customerTel }}</div>
+ <div class="leading-20 flex">
+ 用户地址:
+ <div class="flex-1 w-0">
+ {{ item.customerProvince }}{{ item.customerCity
+ }}{{ item.customerRegion }}{{ item.customerAddress }}
+ </div>
+ </div>
+ </div>
+ <div class="table-td !flex-none w-180 flex items-center">
+ <el-button type="text" @click="onDetail(item)">查看详情</el-button>
+ <el-button type="text" @click="onHandle(item)">售后处理</el-button>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+ props: {
+ list: {
+ type: Array,
+ default: () => [],
+ },
+ },
+ methods: {
+ onDetail(item) {
+ this.$emit('detail', item)
+ },
+ onHandle(item) {
+ this.$emit('handle', item)
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.after-sale-table {
+ .table-header {
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+ color: $main-title-color;
+ background-color: #f4f4f5;
+ .table-th {
+ flex: 1;
+ height: 45px;
+ line-height: 45px;
+ padding: 0 10px;
+ font-weight: bold;
+ }
+ }
+ .table-item {
+ margin-top: 10px;
+ border-bottom: 1px solid #eee;
+ &__title {
+ height: 35px;
+ line-height: 35px;
+ background-color: #f4f4f5;
+ font-size: 14px;
+ color: $main-title-color;
+ padding: 0 10px;
+ & > span {
+ margin-right: 10px;
+ }
+ }
+ .table-body {
+ display: flex;
+ align-items: stretch;
+ font-size: 12px;
+ color: $main-title-color;
+ .table-td {
+ flex: 1;
+ padding: 15px 10px;
+ &:not(:last-child) {
+ border-right: 1px solid #eee;
+ }
+ }
+ }
+ }
+}
+</style>
diff --git a/components/order/video-list.vue b/components/order/video-list.vue
new file mode 100644
index 0000000..1266e54
--- /dev/null
+++ b/components/order/video-list.vue
@@ -0,0 +1,30 @@
+<template>
+ <div class="video-list">
+ <video
+ v-for="(item, index) in value"
+ :key="index"
+ controls
+ width="300px"
+ height="200"
+ class="mr-20 mb-15"
+ >
+ <source :src="item" />
+ </video>
+ </div>
+</template>
+
+<script>
+export default {
+ props: {
+ value: {
+ type: Array,
+ default: () => [],
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.video-list {
+}
+</style>
diff --git a/components/simple-text.vue b/components/simple-text.vue
new file mode 100644
index 0000000..0e90fd2
--- /dev/null
+++ b/components/simple-text.vue
@@ -0,0 +1,29 @@
+<template>
+ <div class="simple-text" :class="{ 'is-primary': type === 'primary' }">
+ {{ value }}
+ </div>
+</template>
+
+<script>
+export default {
+ props: {
+ value: {
+ type: [String, Number],
+ default: null,
+ },
+ type: {
+ type: String,
+ default: '',
+ },
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+.simple-text {
+ display: inline-block;
+ &.is-primary {
+ color: $primary-color;
+ }
+}
+</style>
diff --git a/layouts/default.vue b/layouts/default.vue
index 56a1144..7aea5b1 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -67,7 +67,7 @@
}
&__main {
flex: 1;
- background-color: #ebf2f9;
+ background-color: $bg-color;
overflow: auto;
padding: 20px;
}
diff --git a/pages/content/advertisement.vue b/pages/content/advertisement.vue
index 773b6f3..013b75f 100644
--- a/pages/content/advertisement.vue
+++ b/pages/content/advertisement.vue
@@ -8,6 +8,7 @@
return {
tableConfig: {
url: 'flower/api/advertisement/page',
+ dialogNeedRequest: true,
persistSelection: true,
columns: [
{ type: 'selection' },
diff --git a/pages/content/banner.vue b/pages/content/banner.vue
index 117391e..61798af 100644
--- a/pages/content/banner.vue
+++ b/pages/content/banner.vue
@@ -8,6 +8,7 @@
return {
tableConfig: {
url: 'flower/api/banner/page',
+ dialogNeedRequest: true,
persistSelection: true,
columns: [
{ type: 'selection' },
diff --git a/pages/content/notice.vue b/pages/content/notice.vue
index 70a1d29..d8e4427 100644
--- a/pages/content/notice.vue
+++ b/pages/content/notice.vue
@@ -8,6 +8,7 @@
return {
tableConfig: {
url: 'flower/api/announcement/page',
+ dialogNeedRequest: true,
persistSelection: true,
columns: [
{ type: 'selection' },
diff --git a/pages/feedback.vue b/pages/feedback.vue
new file mode 100644
index 0000000..da8b832
--- /dev/null
+++ b/pages/feedback.vue
@@ -0,0 +1,155 @@
+<template>
+ <el-bus-crud ref="crud" v-bind="tableConfig" />
+</template>
+
+<script>
+import { dateRangeOptions } from '@/utils/options'
+import CustomDateRange from '@/components/custom-date-range.vue'
+export default {
+ data() {
+ return {
+ tableConfig: {
+ url: 'flower/api/feedback/page',
+ hasNew: false,
+ hasEdit: false,
+ hasDelete: false,
+ columns: [
+ { label: '反馈人', prop: 'customerName', minWidth: 120 },
+ { label: '反馈人电话', prop: 'customerTel', minWidth: 150 },
+ {
+ label: '反馈内容',
+ prop: 'feedBack',
+ minWidth: 250,
+ showOverflowTooltip: true,
+ },
+ { label: '反馈时间', prop: 'createTime', minWidth: 180 },
+ {
+ label: '回复内容',
+ prop: 'reply',
+ minWidth: 250,
+ showOverflowTooltip: true,
+ },
+ { label: '回复时间', prop: 'replyTime', minWidth: 180 },
+ ],
+ operationAttrs: {
+ width: 120,
+ fixed: 'right',
+ },
+ searchFormAttrs: {
+ labelWidth: 'auto',
+ },
+ searchForm: [
+ {
+ type: 'row',
+ items: [
+ {
+ label: '处理状态:',
+ id: 'handled',
+ type: 'bus-radio',
+ el: {
+ hasAll: true,
+ childType: 'el-radio-button',
+ fromDict: false,
+ options: [
+ { label: '已处理', value: true },
+ { label: '待处理', value: false },
+ ],
+ },
+ default: '',
+ span: 24,
+ searchImmediately: true,
+ },
+ {
+ label: '反馈日期:',
+ id: 'dateType',
+ component: CustomDateRange,
+ el: {
+ options: dateRangeOptions,
+ },
+ searchImmediately: true,
+ commonFormat: true,
+ commonFormatProps: [
+ 'dateType',
+ 'createDateBeginStr',
+ 'createDateEndStr',
+ ],
+ span: 24,
+ },
+ { label: '反馈人:', id: 'name', type: 'input' },
+ { label: '反馈人电话:', id: 'tel', type: 'input' },
+ ],
+ },
+ ],
+ form: [
+ { label: '反馈人:', id: 'customerName', type: 'input' },
+ { label: '反馈人电话:', id: 'customerTel', type: 'input' },
+ {
+ label: '反馈内容:',
+ id: 'feedBack',
+ type: 'input',
+ el: { type: 'textarea' },
+ },
+ { label: '反馈时间:', id: 'createTime', type: 'input' },
+ {
+ label: '回复内容:',
+ id: 'reply',
+ type: 'input',
+ el: { type: 'textarea' },
+ },
+ { label: '回复时间:', id: 'replyTime', type: 'input' },
+ ],
+ extraButtons: [
+ {
+ text: '回复',
+ show: (row) => !row.handled,
+ atClick: (row) => {
+ this.$refs.crud.$refs.extraDialog[0].show(row)
+ },
+ },
+ ],
+ extraDialogs: [
+ {
+ title: '回复',
+ hiddenReverseItems: [],
+ form: [
+ {
+ label: '回复内容:',
+ id: 'reply',
+ type: 'input',
+ el: {
+ rows: 6,
+ type: 'textarea',
+ },
+ rules: {
+ required: true,
+ message: '请输入回复内容',
+ trigger: 'blur',
+ },
+ },
+ ],
+ atConfirm: async (val) => {
+ const { code } = await this.$elBusHttp.request(
+ 'flower/api/feedback/page/reply',
+ {
+ method: 'post',
+ data: val,
+ }
+ )
+ if (code === 0) {
+ this.$message.success('回复成功')
+ }
+ },
+ },
+ ],
+ },
+ }
+ },
+ head() {
+ return {
+ title: '投诉反馈',
+ }
+ },
+}
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/pages/order/after-sale/_action/_id.vue b/pages/order/after-sale/_action/_id.vue
index f384226..24e68b8 100644
--- a/pages/order/after-sale/_action/_id.vue
+++ b/pages/order/after-sale/_action/_id.vue
@@ -1,59 +1,26 @@
<template>
<div v-loading="wholeLoading" class="base-page-wrapper sale-detail">
- <el-bus-title title="订单信息" size="small"></el-bus-title>
- <el-bus-form
- ref="form"
- label-width="auto"
- :content="formContent"
- readonly
- ></el-bus-form>
- <div
- v-if="detail.imageListFormat && detail.imageListFormat.length > 0"
- class="mb-20"
- >
- <el-bus-title title="售后图片" size="small"></el-bus-title>
- <el-bus-upload
- :value="detail.imageListFormat"
- disabled
- list-type="picture-card"
- ></el-bus-upload>
- </div>
- <div v-if="detail.videoList && detail.videoList.length > 0" class="mb-20">
- <el-bus-title title="售后视频" size="small"></el-bus-title>
- <video
- v-for="(item, index) in detail.videoList"
- :key="index"
- controls
- width="300px"
- height="200"
- class="mr-20 mb-15"
- >
- <source :src="item" />
- </video>
- </div>
- <el-bus-title title="售后处理" size="small"></el-bus-title>
- <el-bus-form
- ref="auditForm"
- label-width="auto"
- :content="auditFormContent"
- :readonly="!editable"
- ></el-bus-form>
+ <el-bus-form ref="form" label-width="auto" :content="formContent" readonly>
+ <template #id:baseInfo>
+ <el-bus-title title="基本信息" size="small"></el-bus-title>
+ </template>
+ <template #id:refundInfo>
+ <div class="base-page-wrapper__line"></div>
+ <el-bus-title title="退款信息" size="small"></el-bus-title>
+ </template>
+ <template #id:goodsInfo>
+ <div class="base-page-wrapper__line"></div>
+ <el-bus-title title="商品信息" size="small"></el-bus-title>
+ </template>
+ </el-bus-form>
<div class="text-center mt-20">
- <el-button
- v-if="editable"
- class="min-w-100"
- :loading="loading"
- type="primary"
- @click="save"
- >处理完成</el-button
- >
<el-button class="min-w-100" @click="goBack">返回</el-button>
</div>
</div>
</template>
<script>
-import AfterSaleItems from '@/components/order/after-sale-items.vue'
+import VideoList from '@/components/order/video-list'
export default {
data() {
return {
@@ -63,57 +30,100 @@
formContent: [
{
type: 'row',
+ id: 'baseInfo',
items: [
{ label: '订单号:', id: 'orderNo', type: 'input' },
- { label: '售后单号:', id: 'salesNo', type: 'input' },
- { label: '用户账号:', id: 'createName', type: 'input' },
+ { label: '下单时间:', id: 'orderTime', type: 'input' },
+ { label: '申请时间:', id: 'createTime', type: 'input' },
+ { label: '审核时间:', id: 'auditTime', type: 'input' },
{ label: '收货人:', id: 'customer', type: 'input' },
{ label: '收货人电话:', id: 'customerTel', type: 'input' },
{ label: '收货地址:', id: 'customerWholeAddress', type: 'input' },
- { label: '下单时间:', id: 'createTime', type: 'input' },
- { label: '订单金额:', id: 'totalOrderAmount', type: 'input' },
- { label: '售后状态:', id: 'statusStr', type: 'input' },
- { label: '售后理由:', id: 'reason', type: 'input', span: 24 },
- { label: '处理时间:', id: 'auditTime', type: 'input' },
],
},
- ],
- auditFormContent: [
{
- label: '处理意见:',
- id: 'auditStatus',
- type: 'bus-radio',
- el: {
- code: 'SALES_AUDIT_STATUS',
- },
- rules: { required: true, message: '请选择处理意见' },
- on: {
- change: (e, updateForm) => {
- updateForm({ auditRemarks: '' })
+ type: 'row',
+ id: 'refundInfo',
+ items: [
+ { id: 'status', type: 'input', hidden: () => true },
+ {
+ label: '订单状态:',
+ id: 'statusStr',
+ component: 'simple-text',
+ el: (row) => ({
+ type: row.status === 'PENDING' ? 'primary' : '',
+ }),
+ forceDisabled: true,
},
- },
- str: true,
+ { label: '售后单号:', id: 'salesNo', type: 'input' },
+ { label: '退款金额(元):', id: 'totalFee', type: 'input' },
+ { label: '供应商扣款(元):', id: 'feeSupplier', type: 'input' },
+ { label: '平台扣款(元):', id: 'feePlatform', type: 'input' },
+ { label: '合伙人扣款(元):', id: 'feePartner', type: 'input' },
+ { label: '打包扣款(元):', id: 'feePlatformPack', type: 'input' },
+ { label: '质检扣款(元):', id: 'feePlatformCheck', type: 'input' },
+ {
+ label: '物流扣款(元):',
+ id: 'feePlatformTransport',
+ type: 'input',
+ },
+ { label: '实际总扣款(元):', id: 'totalFee', type: 'input' },
+ {
+ label: '申请理由:',
+ id: 'reason',
+ type: 'input',
+ el: { type: 'textarea' },
+ span: 24,
+ },
+ {
+ label: '平台回复:',
+ id: 'remarks',
+ type: 'input',
+ el: { type: 'textarea' },
+ span: 24,
+ },
+ {
+ label: '退款图片:',
+ id: 'pictureList',
+ type: 'bus-upload',
+ el: {
+ listType: 'picture-card',
+ size: 'small',
+ },
+ forceDisabled: true,
+ span: 24,
+ inputFormat: (row) => {
+ if ('pictureList' in row) {
+ return row?.pictureList?.length
+ ? row.pictureList.map((i) => ({ url: i }))
+ : []
+ }
+ },
+ },
+ {
+ label: '退款视频:',
+ id: 'videoList',
+ component: VideoList,
+ forceDisabled: true,
+ span: 24,
+ },
+ ],
},
{
- label: '不通过原因:',
- id: 'auditRemarks',
- type: 'input',
- el: {
- type: 'textarea',
- rows: 6,
- },
- rules: {
- required: true,
- message: '请输入不通过原因',
- trigger: 'blur',
- },
- hidden: (row) => row.auditStatus !== 'REJECT',
- },
- {
- label: '',
- id: 'items',
- component: AfterSaleItems,
- forceDisabled: true,
+ type: 'row',
+ id: 'goodsInfo',
+ items: [
+ { label: '商品名称:', id: 'flowerName' },
+ { label: '商品分类:', id: 'flowerCategory' },
+ { label: '级别:', id: 'flowerLevelStr' },
+ { label: '颜色:', id: 'flowerColor' },
+ { label: '规格:', id: 'flowerUnit' },
+ { label: '商品价格(元):', id: 'price' },
+ { label: '供应商价格(元):', id: 'supplierPrice' },
+ { label: '合伙人加价(元):', id: 'markupPartner' },
+ { label: '申请数量:', id: 'num' },
+ { label: '实际退款(元):', id: 'totalFee' },
+ ],
},
],
}
@@ -148,88 +158,10 @@
data.customerWholeAddress = `${data.customerProvince || ''}${
data.customerCity || ''
}${data.customerRegion || ''}${data.customerAddress || ''}`
- data.imageListFormat = Array.isArray(data.imageList)
- ? data.imageList.map((i) => ({ url: i }))
- : []
this.detail = data || {}
this.$refs.form.updateForm(data)
- this.$refs.auditForm.updateForm({
- ...data,
- auditStatus: data.status === 'PENDING' ? undefined : data.auditStatus,
- })
}
this.wholeLoading = false
- },
- save() {
- this.$refs.auditForm.validate((res) => {
- if (res) {
- const formValue = this.$refs.auditForm.getFormValue()
- if (formValue.auditStatus === 'REJECT') {
- this.$elBusUtil
- .confirm('确定处理完成吗?')
- .then(() => {
- this.doSave({ ...formValue, items: [] })
- })
- .catch(() => {})
- } else {
- // eslint-disable-next-line
- if (
- formValue.items.every(
- (i) =>
- this.$elBusUtil.isEmpty(i.amount) &&
- this.$elBusUtil.isTrueEmpty(i.personInCharge)
- )
- ) {
- this.$message.warning('请完善商品售后信息')
- } else if (
- // 理赔金额和责任方不能只有一个有值
- formValue.items.find(
- (i) =>
- (!this.$elBusUtil.isEmpty(i.amount) &&
- this.$elBusUtil.isTrueEmpty(i.personInCharge)) ||
- (this.$elBusUtil.isEmpty(i.amount) &&
- !this.$elBusUtil.isTrueEmpty(i.personInCharge))
- )
- ) {
- this.$message.warning('赔付金额和责任方必须同时填写')
- } else {
- const items = formValue.items.filter(
- (i) =>
- !this.$elBusUtil.isEmpty(i.amount) &&
- !this.$elBusUtil.isTrueEmpty(i.personInCharge)
- )
- // 当存在部分商品未设置赔付金额时提示但允许提交
- if (items.length !== formValue.items.length) {
- this.$elBusUtil
- .confirm('存在部分商品未设置赔付金额,确定处理完成吗?')
- .then(() => {
- this.doSave({ ...formValue, items })
- })
- .catch(() => {})
- } else {
- this.$elBusUtil
- .confirm('确定处理完成吗?')
- .then(() => {
- this.doSave({ ...formValue, items })
- })
- .catch(() => {})
- }
- }
- }
- }
- })
- },
- async doSave(data) {
- this.loading = true
- const { code } = await this.$elBusHttp.request('flower/api/sales/audit', {
- method: 'post',
- data: { ...data, id: this.$route.params.id },
- })
- if (code === 0) {
- this.$message.success('处理成功')
- this.goBack()
- }
- this.loading = false
},
},
}
@@ -237,6 +169,7 @@
<style lang="scss" scoped>
.sale-detail {
+ border-radius: 0;
.el-bus-title {
margin-bottom: 10px;
}
diff --git a/pages/order/after-sale/index.vue b/pages/order/after-sale/index.vue
index d9d5e89..36d7cdb 100644
--- a/pages/order/after-sale/index.vue
+++ b/pages/order/after-sale/index.vue
@@ -1,9 +1,20 @@
<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'
export default {
+ components: {
+ AfterSaleTable,
+ },
data() {
return {
tableConfig: {
@@ -11,48 +22,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 +50,184 @@
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: '',
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',
+ },
],
+ },
+ ],
+ form: [
+ {
+ type: 'row',
+ items: [
+ { label: '商品名称:', id: 'flowerName', type: 'input' },
+ { label: '合伙人加价(元):', id: 'markupPartner', type: 'input' },
+ { label: '商品价格(元):', id: 'price', type: 'input' },
+ { label: '供应商价格(元):', id: 'supplierPrice', type: 'input' },
+ { label: '商品数量:', id: 'flowerNum', type: 'input' },
+ { label: '申请售后数量:', id: 'num', type: 'input' },
+ ],
+ },
+ ],
+ 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: '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,6 +238,14 @@
title: '售后理赔',
}
},
+ methods: {
+ onDetail(item) {
+ this.$router.push(`${this.$route.path}/view/${item.id}`)
+ },
+ onHandle(item) {
+ this.$refs.crud.$refs.extraDialog[0].show(item)
+ },
+ },
}
</script>
diff --git a/pages/order/list/_id.vue b/pages/order/list/_id.vue
index 47086a7..9e243ad 100644
--- a/pages/order/list/_id.vue
+++ b/pages/order/list/_id.vue
@@ -138,15 +138,48 @@
<template v-if="afterSaleList && afterSaleList.length > 0">
<el-bus-title title="售后信息" size="small" class="mt-20"></el-bus-title>
<el-table :data="afterSaleList">
- <el-table-column label="原因" prop="reason"></el-table-column>
- <el-table-column label="售后时间" prop="createTime"></el-table-column>
- <el-table-column label="处理时间" prop="auditTime"></el-table-column>
- <el-table-column label="处理状态" prop="statusStr"></el-table-column>
<el-table-column
- label="处理结果"
- prop="auditStatusStr"
+ label="商品名称"
+ prop="flowerName"
+ min-width="150"
+ fixed="left"
></el-table-column>
- <el-table-column label="操作">
+ <el-table-column
+ label="级别"
+ prop="flowerLevelStr"
+ min-width="120"
+ ></el-table-column>
+ <el-table-column
+ label="颜色"
+ prop="flowerColor"
+ min-width="120"
+ ></el-table-column>
+ <el-table-column
+ label="原因"
+ prop="reason"
+ min-width="200"
+ ></el-table-column>
+ <el-table-column
+ label="售后时间"
+ prop="createTime"
+ min-width="180"
+ ></el-table-column>
+ <el-table-column
+ label="处理时间"
+ prop="auditTime"
+ min-width="180"
+ ></el-table-column>
+ <el-table-column
+ label="处理状态"
+ prop="statusStr"
+ min-width="120"
+ ></el-table-column>
+ <el-table-column
+ label="实际退款"
+ prop="totalFee"
+ min-width="120"
+ ></el-table-column>
+ <el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button type="text" @click="toDetail(row.id)"
>查看详情</el-button
--
Gitblit v1.9.3