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
|
||||
|
@ -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