parent
734afe1ed9
commit
6c3e9c5863
@ -1,2 +1,2 @@
|
|||||||
VITE_BASE_URL=https://gateway-test.mashibing.cn
|
VITE_BASE_URL=http://k8s-horse-gateway.mashibing.cn/
|
||||||
VITE_REQUEST_TIMEOUT=20000
|
VITE_REQUEST_TIMEOUT=20000
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
import request from '@/utils/request.js';
|
||||||
|
export const search = (params) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/page',
|
||||||
|
method: 'get',
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const detail = (id) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/refundInfo/' + id,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const returnDetail = (id) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/returnInfo/' + id,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const logistics = (id) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/logistics/' + id,
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const summary = () => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/tradeOrder/statistics',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const resolveReceive = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/agreeReceiving',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const rejectReceive = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/disagreeReceiving',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const resolveRefund = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/agreeRefund',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const rejectRefund = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/disagreeRefund',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const resolveReturn = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/agreeReturn',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const rejectReturn = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/mall/trade/admin/refundOrder/disagreeReturn',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,143 @@
|
|||||||
|
import * as api from '@/api/sales/service.js';
|
||||||
|
import { ElMessage } from '@/plugins/element-plus';
|
||||||
|
const state = () => ({
|
||||||
|
code: 'ServiceOrderManagement',
|
||||||
|
condition: {},
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
summary: [],
|
||||||
|
opts: {
|
||||||
|
init: false,
|
||||||
|
type: [
|
||||||
|
{ label: '仅退款', value: 1 },
|
||||||
|
{ label: '退货退款', value: 2 },
|
||||||
|
],
|
||||||
|
handle: [
|
||||||
|
{ label: '待处理', value: 1 },
|
||||||
|
{ label: '同意退款', value: 2, count: 0 },
|
||||||
|
{ label: '拒绝退款', value: 3, count: 0 },
|
||||||
|
{ label: '同意退货', value: 4, count: 0 },
|
||||||
|
{ label: '拒绝退货', value: 5, count: 0 },
|
||||||
|
{ label: '确认收货', value: 6, count: 0 },
|
||||||
|
{ label: '拒绝收货', value: 7, count: 0 },
|
||||||
|
],
|
||||||
|
status: [
|
||||||
|
{ label: '全部', value: 0, count: 0 },
|
||||||
|
{ label: '已申请', value: 1, count: 0 },
|
||||||
|
{ label: '已关闭', value: 2, count: 0 },
|
||||||
|
{ label: '待退货', value: 3, count: 0 },
|
||||||
|
{ label: '退货中', value: 4, count: 0 },
|
||||||
|
{ label: '退款中', value: 5, count: 0 },
|
||||||
|
{ label: '退款成功', value: 6, count: 0 },
|
||||||
|
{ label: '退款失败', value: 7, count: 0 },
|
||||||
|
],
|
||||||
|
shipFees: [
|
||||||
|
{
|
||||||
|
label: '不退运费',
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '退运费',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
receivePoint: [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const getters = {};
|
||||||
|
const mutations = {
|
||||||
|
setCode: (state, data) => (state.code = data),
|
||||||
|
setCondition: (state, data) => (state.condition = data),
|
||||||
|
setList: (state, data) => (state.list = data),
|
||||||
|
setTotal: (state, data) => (state.total = data),
|
||||||
|
setSummary: (state, data) => (state.summary = data),
|
||||||
|
setOpts: (state, data) => (state.opts = data),
|
||||||
|
};
|
||||||
|
const actions = {
|
||||||
|
search: async ({ state, commit, rootGetters }) => {
|
||||||
|
let data = { ...state.condition };
|
||||||
|
if (data.dateRange?.length) {
|
||||||
|
data.applyStartTime = data.dateRange[0];
|
||||||
|
data.applyEndTime = data.dateRange[1];
|
||||||
|
}
|
||||||
|
delete data.dateRange;
|
||||||
|
data.refundStatus = (data.refundStatus || []).join(',');
|
||||||
|
if (data.refundStatus === '0') {
|
||||||
|
delete data.refundStatus;
|
||||||
|
}
|
||||||
|
let res = await api.search({ ...rootGetters['local/page'](state.code), ...data });
|
||||||
|
commit('setList', res?.records || []);
|
||||||
|
commit('setTotal', res?.total || 0);
|
||||||
|
if (!res) {
|
||||||
|
ElMessage.error('查询订单列表失败');
|
||||||
|
}
|
||||||
|
res = await api.summary();
|
||||||
|
if (res) {
|
||||||
|
commit(
|
||||||
|
'setSummary',
|
||||||
|
['allCount', 'unpaidCount', 'closeCount', 'waitDeliveryCount', 'deliveredCount', '', 'finishCount'].map(
|
||||||
|
(prop) => res[prop]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
ElMessage.error('查询订单统计失败');
|
||||||
|
commit('setSummary', []);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
load: async ({ commit, state }) => {
|
||||||
|
commit('setOpts', {
|
||||||
|
...state.opts,
|
||||||
|
init: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
detail: async (context, id) => {
|
||||||
|
let res = await api.detail(id);
|
||||||
|
if (!res) {
|
||||||
|
ElMessage.error('加载详情失败');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
resolveRefund: async (context, data) => {
|
||||||
|
let res = await api.resolveRefund(data);
|
||||||
|
if (res) {
|
||||||
|
ElMessage.success('同意退款成功');
|
||||||
|
} else {
|
||||||
|
ElMessage.error('同意退款失败');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
rejectRefund: async (context, data) => {
|
||||||
|
let res = await api.rejectRefund(data);
|
||||||
|
if (res) {
|
||||||
|
ElMessage.success('拒绝退款成功');
|
||||||
|
} else {
|
||||||
|
ElMessage.error('拒绝退款失败');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
resolveReturn: async (context, data) => {
|
||||||
|
data = _.cloneDeep(data);
|
||||||
|
data.province = data.addressInfo[0];
|
||||||
|
data.city = data.addressInfo[1];
|
||||||
|
data.area = data.addressInfo[2];
|
||||||
|
delete data.addressInfo;
|
||||||
|
data.provinceCode = data.address[0];
|
||||||
|
data.cityCode = data.address[1];
|
||||||
|
data.areaCode = data.address[2];
|
||||||
|
delete data.address;
|
||||||
|
let res = await api.resolveReturn(data);
|
||||||
|
if (res) {
|
||||||
|
ElMessage.success('同意退货成功');
|
||||||
|
} else {
|
||||||
|
ElMessage.error('同意退货失败');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
export default {
|
||||||
|
state,
|
||||||
|
getters,
|
||||||
|
mutations,
|
||||||
|
actions,
|
||||||
|
};
|
@ -0,0 +1,233 @@
|
|||||||
|
<template>
|
||||||
|
<div class="list-container">
|
||||||
|
<ul class="order-status">
|
||||||
|
<li v-for="(item, index) in opts.status" :key="index">
|
||||||
|
<el-button
|
||||||
|
:type="state.condition.refundStatus.includes(item.value) ? 'primary' : 'default'"
|
||||||
|
@click="handleStatus(item.value)"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
{{ item.label }}
|
||||||
|
</span>
|
||||||
|
<span>(</span>
|
||||||
|
<span class="num">{{ summary[index] || 0 }}</span>
|
||||||
|
<span>)</span>
|
||||||
|
</el-button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<TableList
|
||||||
|
v-loading="loading"
|
||||||
|
:code="code"
|
||||||
|
:config="config"
|
||||||
|
:data="list"
|
||||||
|
:operation="['search', 'export']"
|
||||||
|
:reset="handleReset"
|
||||||
|
title="订单"
|
||||||
|
:total="total"
|
||||||
|
@export="handleExport"
|
||||||
|
@search="handleSearch"
|
||||||
|
>
|
||||||
|
<template #search>
|
||||||
|
<el-form inline>
|
||||||
|
<el-form-item label="服务单号" prop="orderNo">
|
||||||
|
<el-input v-model="state.condition.orderNo" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="售后类型" prop="refundType">
|
||||||
|
<el-select v-model="state.condition.refundType" :opts="opts.type" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理状态" prop="handleStatus">
|
||||||
|
<el-select v-model="state.condition.handleStatus" :opts="opts.handle" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="用户账号" prop="userPhone">
|
||||||
|
<el-input v-model="state.condition.userPhone" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间" prop="dateRange">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="state.condition.dateRange"
|
||||||
|
:default-time="[new Date(0, 0, 0, 0, 0, 0), new Date(0, 0, 0, 23, 59, 59)]"
|
||||||
|
type="datetimerange"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
</TableList>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="jsx">
|
||||||
|
import ElButton from '@/components/extra/ElButton.vue';
|
||||||
|
const router = useRouter();
|
||||||
|
const store = useStore();
|
||||||
|
const loading = ref(false);
|
||||||
|
const code = computed(() => store.state.service.code);
|
||||||
|
const list = computed(() => store.state.service.list);
|
||||||
|
const total = computed(() => store.state.service.total);
|
||||||
|
const summary = computed(() => store.state.service.summary);
|
||||||
|
const opts = computed(() => store.state.service.opts);
|
||||||
|
if (!unref(opts).init) {
|
||||||
|
store.dispatch('service/load');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 查询订单 */
|
||||||
|
const state = reactive({
|
||||||
|
condition: {
|
||||||
|
orderNo: null,
|
||||||
|
userPhone: null,
|
||||||
|
orderSource: null,
|
||||||
|
refundStatus: [0],
|
||||||
|
dateRange: [],
|
||||||
|
startTime: null,
|
||||||
|
endTime: null,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
watch(
|
||||||
|
() => state.condition,
|
||||||
|
(value) => {
|
||||||
|
store.commit('service/setCondition', _.cloneDeep(value));
|
||||||
|
},
|
||||||
|
{ immediate: true, deep: true }
|
||||||
|
);
|
||||||
|
watch(
|
||||||
|
() => state.condition.refundStatus,
|
||||||
|
() => {
|
||||||
|
handleSearch();
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
const handleReset = () => {
|
||||||
|
state.condition = {
|
||||||
|
orderNo: null,
|
||||||
|
userPhone: null,
|
||||||
|
orderSource: null,
|
||||||
|
refundStatus: [0],
|
||||||
|
dateRange: [],
|
||||||
|
startTime: null,
|
||||||
|
endTime: null,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const handleStatus = (status) => {
|
||||||
|
let index = state.condition.refundStatus.indexOf(status);
|
||||||
|
if (index === -1) {
|
||||||
|
if (status === 0) {
|
||||||
|
state.condition.refundStatus = [0];
|
||||||
|
} else {
|
||||||
|
state.condition.refundStatus.push(status);
|
||||||
|
state.condition.refundStatus = state.condition.refundStatus.filter((item) => item > 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (status !== 0) {
|
||||||
|
state.condition.refundStatus.splice(index, 1);
|
||||||
|
if (state.condition.refundStatus.length) {
|
||||||
|
state.condition.refundStatus = state.condition.refundStatus.filter((item) => item > 0);
|
||||||
|
} else {
|
||||||
|
state.condition.refundStatus = [0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const handleSearch = async () => {
|
||||||
|
loading.value = true;
|
||||||
|
await store.dispatch('service/search');
|
||||||
|
loading.value = false;
|
||||||
|
};
|
||||||
|
onActivated(handleSearch);
|
||||||
|
|
||||||
|
/* 导出订单 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
console.info('export');
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 查看详情 */
|
||||||
|
const handleDetail = (row) => {
|
||||||
|
router.push({
|
||||||
|
name: 'ServiceDetail',
|
||||||
|
params: {
|
||||||
|
id: row.refundId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 列表配置 */
|
||||||
|
const config = reactive({
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
type: 'selection',
|
||||||
|
fixed: 'left',
|
||||||
|
width: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '服务单号',
|
||||||
|
prop: 'refundNo',
|
||||||
|
minWidth: 160,
|
||||||
|
fixed: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '申请时间',
|
||||||
|
prop: 'applyTime',
|
||||||
|
width: 180,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '用户账号',
|
||||||
|
prop: 'userPhone',
|
||||||
|
width: 140,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '退款金额',
|
||||||
|
prop: 'applyAmount',
|
||||||
|
minWidth: 120,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '售后类型',
|
||||||
|
prop: 'refundTypeDesc',
|
||||||
|
width: 120,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '服务单状态',
|
||||||
|
width: 120,
|
||||||
|
prop: 'refundStatusDesc',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '处理状态',
|
||||||
|
width: 120,
|
||||||
|
prop: 'handleStatusDesc',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '处理时间',
|
||||||
|
width: 180,
|
||||||
|
prop: 'handleTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '操作',
|
||||||
|
fixed: 'right',
|
||||||
|
width: 160,
|
||||||
|
slots: {
|
||||||
|
default: ({ row }) => (
|
||||||
|
<ElButton type="text" onClick={() => handleDetail(row)}>
|
||||||
|
查看详情
|
||||||
|
</ElButton>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.list-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.common-list {
|
||||||
|
flex-shrink: 1;
|
||||||
|
}
|
||||||
|
.order-status {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: @layout-space;
|
||||||
|
li {
|
||||||
|
+ li {
|
||||||
|
margin-left: @layout-space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue