feat: 订单查询、关闭订单

feature/task1.0.0__0514__ch
向文可 3 years ago
parent 83aacb995d
commit c66f265dca

@ -8,35 +8,68 @@ export const search = (params) => {
}; };
export const detail = (id) => { export const detail = (id) => {
return request({ return request({
url: '/uc/employee/' + id, url: '/mall/trade/admin/tradeOrder/' + id,
method: 'get', method: 'get',
}); });
}; };
export const create = (data) => { export const sendList = (orderIs) => {
return request({ return request({
url: '/uc/employee', url: '/mall/trade/admin/tradeOrder/listDeliveryOrder',
method: 'post', method: 'get',
params: { orderIs },
});
};
export const logistics = (id) => {
return request({
url: '/mall/trade/admin/tradeOrder/logistics/' + id,
method: 'get',
});
};
export const summary = () => {
return request({
url: '/mall/trade/admin/tradeOrder/statistics',
method: 'get',
});
};
export const updateFees = (data) => {
return request({
url: '/mall/trade/admin/tradeOrder/updateAmount',
method: 'put',
data, data,
}); });
}; };
export const update = (data) => { export const updateAddress = (data) => {
return request({ return request({
url: '/uc/employee', url: '/mall/trade/admin/tradeOrder/updateRecipient',
method: 'put', method: 'put',
data, data,
}); });
}; };
export const remove = (idList) => { export const cancel = (data) => {
return request({ return request({
url: '/uc/employee', url: '/mall/trade/admin/tradeOrder/cancel',
method: 'delete', method: 'put',
params: { idList }, data,
}); });
}; };
export const enable = (params) => { export const close = (data) => {
return request({ return request({
url: '/uc/employee/enable', url: '/mall/trade/admin/tradeOrder/close',
method: 'put', method: 'put',
params, data,
});
};
export const send = (data) => {
return request({
url: '/mall/trade/admin/tradeOrder/delivery',
method: 'put',
data,
});
};
export const sendAll = (data) => {
return request({
url: '/mall/trade/admin/tradeOrder/batchDelivery',
method: 'put',
data,
}); });
}; };

@ -292,9 +292,11 @@
// //
watch( watch(
search, search,
(value) => { (value, old) => {
if (value && props.code) { if (value && props.code) {
resetPage(value); if (_.cloneDeep(value) !== _.cloneDeep(old)) {
resetPage(value);
}
} }
handleSearch(); handleSearch();
}, },

@ -46,9 +46,4 @@
const slots = useSlots(); const slots = useSlots();
const render = () => <ElInput {...props} {...attrs} v-slots={slots}></ElInput>; const render = () => <ElInput {...props} {...attrs} v-slots={slots}></ElInput>;
</script> </script>
<style lang="less" scoped> <style lang="less" scoped></style>
.el-input,
.el-textarea {
width: 160px;
}
</style>

@ -71,8 +71,4 @@
); );
</script> </script>
<style lang="less" scoped> <style lang="less" scoped></style>
.el-select {
width: 160px;
}
</style>

@ -5,6 +5,7 @@ const state = () => ({
condition: {}, condition: {},
list: [], list: [],
total: 0, total: 0,
summary: [],
opts: { opts: {
init: false, init: false,
source: [], source: [],
@ -17,17 +18,38 @@ const mutations = {
setCondition: (state, data) => (state.condition = data), setCondition: (state, data) => (state.condition = data),
setList: (state, data) => (state.list = data), setList: (state, data) => (state.list = data),
setTotal: (state, data) => (state.total = data), setTotal: (state, data) => (state.total = data),
setSummary: (state, data) => (state.summary = data),
setOpts: (state, data) => (state.opts = data), setOpts: (state, data) => (state.opts = data),
}; };
const actions = { const actions = {
search: async ({ state, commit, rootGetters }) => { search: async ({ state, commit, rootGetters }) => {
let res = await api.search({ ...rootGetters['local/page'](state.code), ...state.condition }); let data = { ...state.condition };
if (data.dateRange?.length) {
data.startTime = data.dateRange[0];
data.endTime = data.dateRange[1];
}
delete data.dateRange;
data.orderStatus = (data.orderStatus || []).join(',');
if (data.orderStatus === '0') {
delete data.orderStatus;
}
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) { if (res) {
commit('setList', res.records); commit(
commit('setTotal', res.total); 'setSummary',
['allCount', 'unpaidCount', 'closeCount', 'waitDeliveryCount', '', 'deliveredCount', 'finishCount'].map(
(prop) => res[prop]
)
);
} else { } else {
ElMessage.error('查询失败'); ElMessage.error('查询订单统计失败');
commit('setList', []); commit('setSummary', []);
} }
return res; return res;
}, },
@ -40,12 +62,13 @@ const actions = {
{ label: 'IOS端APP', value: 3 }, { label: 'IOS端APP', value: 3 },
], ],
status: [ status: [
{ label: '待支付', value: 1 }, { label: '全部', value: 0, count: 0 },
{ label: '已关闭', value: 2 }, { label: '待支付', value: 1, count: 0 },
{ label: '待发货', value: 3 }, { label: '已关闭', value: 2, count: 0 },
{ label: '已发货', value: 4 }, { label: '待发货', value: 3, count: 0 },
{ label: '已收货', value: 5 }, { label: '已发货', value: 4, count: 0 },
{ label: '已完成', value: 6 }, { label: '已收货', value: 5, count: 0 },
{ label: '已完成', value: 6, count: 0 },
], ],
}); });
}, },
@ -56,6 +79,16 @@ const actions = {
} }
return res; return res;
}, },
close: async ({ dispatch }, data) => {
let res = await api.close(data);
if (res) {
ElMessage.success('关闭订单成功');
dispatch('search');
} else {
ElMessage.error('关闭订单失败');
}
return res;
},
save: async ({ dispatch }, data) => { save: async ({ dispatch }, data) => {
let save = data.id ? api.update : api.create; let save = data.id ? api.update : api.create;
let res = await save(data); let res = await save(data);

@ -0,0 +1,58 @@
<template>
<el-dialog v-model="state.visible" title="关闭订单">
<el-form ref="refsForm" v-loading="state.submitting" :model="state.form" :rules="state.rules">
<el-form-item label="操作备注" prop="remark">
<el-input v-model="state.form.remark" type="textarea" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="close"></el-button>
<el-button :loading="state.submitting" type="primary" @click="handleSave"></el-button>
</template>
</el-dialog>
</template>
<script setup lang="jsx">
const store = useStore();
const refsForm = ref(null);
const state = reactive({
submitting: false,
visible: false,
form: {
orderId: null,
remark: null,
},
rules: {
orderId: [{ required: true, message: '订单ID不能为空' }],
remark: [{ required: true, message: '操作备注不能为空' }],
},
});
const show = (orderId) => {
state.form.orderId = orderId;
state.form.remark = null;
state.visible = true;
};
const close = () => {
state.visible = false;
};
defineExpose({
show,
close,
});
const handleSave = async () => {
state.submitting = true;
try {
await unref(refsForm).validate();
let res = await store.dispatch('order/close', state.form);
if (res) {
state.visible = false;
}
} catch (e) {
console.info('取消关闭', e);
}
state.submitting = false;
};
</script>
<style lang="less" scoped></style>

@ -1,51 +1,83 @@
<template> <template>
<TableList <div class="list-container">
v-loading="loading" <ul class="order-status">
:code="code" <li v-for="(item, index) in opts.status" :key="index">
:config="config" <el-button
:data="list" :type="state.condition.orderStatus.includes(item.value) ? 'primary' : 'default'"
:operation="['search', 'export']" @click="handleStatus(item.value)"
:reset="handleReset" >
title="订单" <span>
:total="total" {{ item.label }}
@export="handleExport" </span>
@search="handleSearch" <span>(</span>
> <span class="num">{{ summary[index] || 0 }}</span>
<template #search> <span>)</span>
<el-form inline> </el-button>
<el-form-item label="订单编号" prop="userName"> </li>
<el-input v-model="state.condition.userName" /> </ul>
</el-form-item> <TableList
<el-form-item label="手机号" prop="userName"> v-loading="loading"
<el-input v-model="state.condition.userName" /> :code="code"
</el-form-item> :config="config"
<el-form-item label="来源" prop="userName"> :data="list"
<el-input v-model="state.condition.userName" /> :operation="['search', 'export']"
</el-form-item> :reset="handleReset"
<el-form-item label="提交时间" prop="userName"> title="订单"
<el-input v-model="state.condition.userName" /> :total="total"
</el-form-item> @export="handleExport"
</el-form> @search="handleSearch"
</template> >
</TableList> <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="userPhone">
<el-input v-model="state.condition.userPhone" />
</el-form-item>
<el-form-item label="来源" prop="orderSource">
<el-select v-model="state.condition.orderSource" :opts="opts.source" />
</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>
<CloseOrder ref="refsCloseOrder" />
</div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import ElButton from '@/components/extra/ElButton.vue'; import ElButton from '@/components/extra/ElButton.vue';
const { proxy } = getCurrentInstance(); import CloseOrder from './close.vue';
const router = useRouter(); const router = useRouter();
const store = useStore(); const store = useStore();
const loading = ref(false); const loading = ref(false);
const code = computed(() => store.state.employee.code); const code = computed(() => store.state.order.code);
const list = computed(() => store.state.employee.list); const list = computed(() => store.state.order.list);
const total = computed(() => store.state.employee.total); const total = computed(() => store.state.order.total);
const opts = computed(() => store.state.employee.opts); const summary = computed(() => store.state.order.summary);
const opts = computed(() => store.state.order.opts);
if (!unref(opts).init) { if (!unref(opts).init) {
store.dispatch('order/load'); store.dispatch('order/load');
} }
/* 查询订单 */
const state = reactive({ const state = reactive({
condition: { condition: {
userName: null, orderNo: null,
userPhone: null,
orderSource: null,
orderStatus: [0],
dateRange: [],
startTime: null,
endTime: null,
}, },
}); });
watch( watch(
@ -55,17 +87,56 @@
}, },
{ immediate: true, deep: true } { immediate: true, deep: true }
); );
watch(
() => state.condition.orderStatus,
() => {
handleSearch();
},
{ deep: true }
);
const handleReset = () => { const handleReset = () => {
state.condition = { state.condition = {
orderName: null, orderNo: null,
phone: null, userPhone: null,
orderSource: null,
orderStatus: [0],
dateRange: [],
startTime: null,
endTime: null,
}; };
}; };
const handleStatus = (status) => {
let index = state.condition.orderStatus.indexOf(status);
if (index === -1) {
if (status === 0) {
state.condition.orderStatus = [0];
} else {
state.condition.orderStatus.push(status);
}
state.condition.orderStatus = state.condition.orderStatus.filter((item) => item > 0);
} else {
if (status !== 0) {
state.condition.orderStatus.splice(index, 1);
if (state.condition.orderStatus.length) {
state.condition.orderStatus = state.condition.orderStatus.filter((item) => item > 0);
} else {
state.condition.orderStatus = [0];
}
}
}
};
const handleSearch = async () => { const handleSearch = async () => {
loading.value = true; loading.value = true;
await store.dispatch('order/search'); await store.dispatch('order/search');
loading.value = false; loading.value = false;
}; };
/* 导出订单 */
const handleExport = async () => {
console.info('export');
};
/* 查看详情 */
const handleDetail = (row) => { const handleDetail = (row) => {
router.push({ router.push({
name: 'OrderDetail', name: 'OrderDetail',
@ -74,14 +145,15 @@
}, },
}); });
}; };
const handleExport = async () => {
console.info('export'); /* 关闭订单 */
}; const refsCloseOrder = ref(null);
const handleClose = async () => { const handleClose = (row) => {
console.info('close'); unref(refsCloseOrder).show(row.orderId);
}; };
/* 列表配置 */
const config = reactive({ const config = reactive({
//
columns: [ columns: [
{ {
type: 'selection', type: 'selection',
@ -90,61 +162,80 @@
}, },
{ {
label: '订单编号', label: '订单编号',
prop: 'employeeName', prop: 'orderNo',
minWidth: 160, minWidth: 300,
fixed: 'left', fixed: 'left',
}, },
{ {
label: '手机号', label: '手机号',
prop: 'userName', prop: 'userPhone',
minWidth: 160, width: 140,
}, },
{ {
label: '订单金额', label: '订单金额',
prop: 'phone', prop: 'payAmount',
width: 160, minWidth: 120,
}, },
{ {
label: '支付方式', label: '支付方式',
prop: 'email', prop: 'payTypeDesc',
width: 160, width: 120,
}, },
{ {
label: '订单来源', label: '订单来源',
width: 120, width: 120,
slots: { prop: 'payTypeDesc',
default: ({ row }) => proxy.$dict(unref(opts).source, row.source),
},
}, },
{ {
label: '订单状态', label: '订单状态',
prop: 'remark', width: 120,
width: 180, prop: 'orderStatusDesc',
}, },
{ {
label: '提交时间', label: '提交时间',
prop: 'updateTime', prop: 'submitTime',
width: 180, width: 180,
}, },
{ {
label: '操作', label: '操作',
fixed: 'right', fixed: 'right',
width: 160,
slots: { slots: {
default: ({ row }) => ( default: ({ row }) => (
<div> <div>
<ElButton type="text" onClick={() => handleDetail(row)}> <ElButton type="text" onClick={() => handleDetail(row)}>
查看订单 查看订单
</ElButton> </ElButton>
<ElButton type="text" onClick={() => handleClose(row)}> {row.orderStatus === 1 ? (
关闭订单 <ElButton type="text" onClick={() => handleClose(row)}>
</ElButton> 关闭订单
</ElButton>
) : (
''
)}
</div> </div>
), ),
}, },
width: 120,
}, },
], ],
}); });
</script> </script>
<style lang="less" scoped></style> <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…
Cancel
Save