fix-0609-xwk
向文可 3 years ago
parent a7869c32b0
commit 63f7926a7c

@ -25,11 +25,11 @@ export const detail = (id) => {
method: 'get', method: 'get',
}); });
}; };
export const shipList = (orderIs) => { export const shipList = (orderIds) => {
return request({ return request({
url: '/mall/trade/admin/tradeOrder/listDeliveryOrder', url: '/mall/trade/admin/tradeOrder/listDeliveryOrder',
method: 'get', method: 'get',
params: { orderIs }, params: { orderIds },
}); });
}; };
export const logistics = (id) => { export const logistics = (id) => {
@ -85,6 +85,19 @@ export const send = (data) => {
data, data,
}); });
}; };
export const sendVirtual = (data) => {
return request({
url: '/mall/trade/admin/tradeOrder/virtualDelivery/' + data,
method: 'put',
});
};
export const sendVirtualAll = (data) => {
return request({
url: '/mall/trade/admin/tradeOrder/batchVirtualDelivery',
method: 'put',
data,
});
};
export const sendAll = (data) => { export const sendAll = (data) => {
return request({ return request({
url: '/mall/trade/admin/tradeOrder/batchDelivery', url: '/mall/trade/admin/tradeOrder/batchDelivery',

@ -3,7 +3,7 @@ import { ElMessage, ElMessageBox } from '@/plugins/element-plus';
const state = () => ({ const state = () => ({
code: 'CategoryManagement', code: 'CategoryManagement',
condition: { condition: {
orderIs: [], orderIds: [],
}, },
list: [], list: [],
total: 0, total: 0,

@ -4,7 +4,7 @@ import { dict } from '@/plugins/global-api';
const state = () => ({ const state = () => ({
code: 'OrderShipManagement', code: 'OrderShipManagement',
condition: { condition: {
orderIs: [], orderIds: [],
}, },
list: [], list: [],
total: 0, total: 0,
@ -25,7 +25,7 @@ const mutations = {
}; };
const actions = { const actions = {
search: async ({ state }) => { search: async ({ state }) => {
let res = await api.shipList(state.condition.orderIs.join(',')); let res = await api.shipList(state.condition.orderIds.join(','));
if (!res) { if (!res) {
ElMessage.error('查询发货订单列表失败'); ElMessage.error('查询发货订单列表失败');
} }
@ -37,11 +37,18 @@ const actions = {
company: await api.searchShip(), company: await api.searchShip(),
}); });
}, },
save: async ({ state }, data) => { save: async ({ state, dispatch }, data) => {
let res = null; let res = null;
if (data.every((item) => item.logistics.companyCode && item.logistics.trackingNo)) { if (data.every((item) => item.orderType === 4 || (item.logistics.companyCode && item.logistics.trackingNo))) {
res = await api.sendAll( res = await api.sendVirtualAll({
data.map((item) => { orderIds: data.filter((item) => item.orderType === 4).map((item) => item.orderId),
});
if (!res) {
ElMessage.error('虚拟发货失败');
}
data = data
.filter((item) => item.orderType !== 4)
.map((item) => {
return { return {
companyCode: item.logistics.companyCode, companyCode: item.logistics.companyCode,
companyName: dict(state.opts.company, item.logistics.companyCode, { companyName: dict(state.opts.company, item.logistics.companyCode, {
@ -51,10 +58,11 @@ const actions = {
orderId: item.orderId, orderId: item.orderId,
trackingNo: item.logistics.trackingNo, trackingNo: item.logistics.trackingNo,
}; };
}) });
); res = !data.length || (await api.sendAll(data));
if (res) { if (res) {
ElMessage.success('批量发货成功'); ElMessage.success('批量发货成功');
dispatch('order/search', {}, { root: true });
} else { } else {
ElMessage.error('批量发货失败'); ElMessage.error('批量发货失败');
} }

@ -4,7 +4,7 @@ import { ElMessage, ElMessageBox } from '@/plugins/element-plus';
const state = () => ({ const state = () => ({
code: 'ProductManagement', code: 'ProductManagement',
condition: { condition: {
orderIs: [], orderIds: [],
}, },
list: [], list: [],
total: 0, total: 0,
@ -137,10 +137,10 @@ const actions = {
enable: async ({ dispatch }, data) => { enable: async ({ dispatch }, data) => {
let res = await api.enable(data); let res = await api.enable(data);
if (res) { if (res) {
ElMessage.success('保存成功'); ElMessage.success((data.isEnable ? '上架' : '下架') + '成功');
dispatch('search'); dispatch('search');
} else { } else {
ElMessage.error('保存失败'); ElMessage.error((data.isEnable ? '上架' : '下架') + '失败');
} }
return res; return res;
}, },

@ -44,7 +44,7 @@
</el-form> </el-form>
</template> </template>
</table-list> </table-list>
<ProductPicker ref="refsPicker" @pick="handlePick" /> <ProductPicker ref="refsPicker" :ids="currentTimeRange?.productIdList || []" @pick="handlePick" />
<ProductSku ref="refsSku" @save="handleSkuSave" /> <ProductSku ref="refsSku" @save="handleSkuSave" />
</div> </div>
</template> </template>
@ -64,6 +64,10 @@
const total = computed(() => store.state.limitProduct.total); const total = computed(() => store.state.limitProduct.total);
const opts = computed(() => store.state.limitProduct.opts); const opts = computed(() => store.state.limitProduct.opts);
const currentTimeRange = computed(() =>
unref(opts).timeRange.find((item) => item.id === unref(state).condition.activityTimeId)
);
/* 查询订单 */ /* 查询订单 */
const state = reactive({ const state = reactive({
condition: { condition: {

@ -9,12 +9,16 @@
<div class="right"> <div class="right">
<template v-if="state.form.orderStatus !== 2"> <template v-if="state.form.orderStatus !== 2">
<template v-if="[1, 3].includes(state.form.orderStatus)"> <template v-if="[1, 3].includes(state.form.orderStatus)">
<el-button type="primary" @click="handleAddress"></el-button> <el-button :disabled="state.form.orderType === 4" type="primary" @click="handleAddress">
修改收货人信息
</el-button>
<template v-if="state.form.orderStatus === 3"> <template v-if="state.form.orderStatus === 3">
<el-button type="danger" @click="handleCancel"></el-button> <el-button type="danger" @click="handleCancel"></el-button>
</template> </template>
<template v-if="state.form.orderStatus === 1"> <template v-if="state.form.orderStatus === 1">
<el-button type="primary" @click="handleFees"></el-button> <el-button :disabled="state.form.orderType === 4" type="primary" @click="handleFees">
修改费用信息
</el-button>
<el-button type="danger" @click="handleClose"></el-button> <el-button type="danger" @click="handleClose"></el-button>
</template> </template>
</template> </template>
@ -27,8 +31,21 @@
<el-scrollbar class="body"> <el-scrollbar class="body">
<h3>基本信息</h3> <h3>基本信息</h3>
<el-table border :data="[state.form]"> <el-table border :data="[state.form]">
<el-table-column align="center" header-align="center" label="订单编号" prop="orderNo" width="240" /> <el-table-column align="center" header-align="center" label="订单编号" prop="orderNo" width="250" />
<!-- <el-table-column align="center" header-align="center" label="用户账号" prop="userId" width="240" /> --> <el-table-column
align="center"
header-align="center"
label="用户手机号"
prop="userPhone"
width="240"
>
<template #default="{ row }">
<div class="flex">
<span>{{ row.userPhone }}</span>
<el-button style="margin-left: 10px" type="text" @click="handleUser"></el-button>
</div>
</template>
</el-table-column>
<el-table-column <el-table-column
align="center" align="center"
header-align="center" header-align="center"
@ -37,9 +54,7 @@
width="240" width="240"
/> />
<el-table-column align="center" header-align="center" label="订单来源" prop="orderSourceDesc" /> <el-table-column align="center" header-align="center" label="订单来源" prop="orderSourceDesc" />
<el-table-column align="center" header-align="center" label="订单类型" prop="quantity"> <el-table-column align="center" header-align="center" label="订单类型" prop="orderTypeDesc" />
普通订单
</el-table-column>
</el-table> </el-table>
<el-table border :data="[state.form]" style="margin-top: -1px"> <el-table border :data="[state.form]" style="margin-top: -1px">
<el-table-column <el-table-column
@ -47,9 +62,11 @@
header-align="center" header-align="center"
label="配送方式" label="配送方式"
prop="logistics.companyName" prop="logistics.companyName"
width="240" width="250"
> >
<template #default="{ row }">{{ row.logistics?.companyName || '未发货' }}</template> <template #default="{ row }">
{{ row.orderType === 4 ? '自动发货' : row.logistics?.companyName || '未发货' }}
</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
align="center" align="center"
@ -58,7 +75,9 @@
prop="logistics.trackingNo" prop="logistics.trackingNo"
width="240" width="240"
> >
<template #default="{ row }">{{ row.logistics?.trackingNo || '未发货' }}</template> <template #default="{ row }">
{{ row.orderType === 4 ? '-' : row.logistics?.trackingNo || '未发货' }}
</template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="自动确认收货时间" prop="receiveExpire"> <el-table-column align="center" header-align="center" label="自动确认收货时间" prop="receiveExpire">
<template #default="{ row }">{{ row.receiveExpire }}</template> <template #default="{ row }">{{ row.receiveExpire }}</template>
@ -67,24 +86,15 @@
<br /> <br />
<h3>收货人信息</h3> <h3>收货人信息</h3>
<el-table border :data="[state.form]"> <el-table border :data="[state.form]">
<el-table-column <el-table-column align="center" header-align="center" label="收货人">
align="center" <template #default="{ row }">{{ row.logistics?.recipientName || '-' }}</template>
header-align="center" </el-table-column>
label="收货人" <el-table-column align="center" header-align="center" label="手机号码">
prop="logistics.recipientName" <template #default="{ row }">{{ row.logistics?.recipientPhone || '-' }}</template>
/> </el-table-column>
<el-table-column <el-table-column align="center" header-align="center" label="收货地址">
align="center" <template #default="{ row }">{{ row.logistics?.recipientAddress || '-' }}</template>
header-align="center" </el-table-column>
label="手机号码"
prop="logistics.recipientPhone"
/>
<el-table-column
align="center"
header-align="center"
label="收货地址"
prop="logistics.recipientAddress"
/>
</el-table> </el-table>
<br /> <br />
<h3>商品信息</h3> <h3>商品信息</h3>
@ -98,7 +108,11 @@
<el-table-column align="center" header-align="center" label="价格" prop="realPrice"> <el-table-column align="center" header-align="center" label="价格" prop="realPrice">
<template #default="{ row }">{{ new Number(row.realPrice).toFixed(2) }}</template> <template #default="{ row }">{{ new Number(row.realPrice).toFixed(2) }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="属性" prop="skuDescribe" /> <el-table-column align="center" header-align="center" label="规格属性" prop="skuDescribe">
<template #default="{ row }">
{{ row.skuDescribe || '默认规格' }}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="数量" prop="quantity" /> <el-table-column align="center" header-align="center" label="数量" prop="quantity" />
<el-table-column align="center" header-align="center" label="小计" prop="realAmount"> <el-table-column align="center" header-align="center" label="小计" prop="realAmount">
<template #default="{ row }">{{ new Number(row.realAmount).toFixed(2) }}</template> <template #default="{ row }">{{ new Number(row.realAmount).toFixed(2) }}</template>
@ -132,7 +146,7 @@
<cancel-order ref="refsCancelOrder" @close="handleLoad" /> <cancel-order ref="refsCancelOrder" @close="handleLoad" />
<update-address ref="refsUpdateAddress" @close="handleLoad" /> <update-address ref="refsUpdateAddress" @close="handleLoad" />
<update-fees ref="refsUpdateFees" @close="handleLoad" /> <update-fees ref="refsUpdateFees" @close="handleLoad" />
<order-track ref="refsOrderTrack" /> <order-track ref="refsOrderTrack" :copy="state.form.orderType !== 4" />
</div> </div>
</template> </template>
@ -144,6 +158,7 @@
import OrderTrack from './track.vue'; import OrderTrack from './track.vue';
const store = useStore(); const store = useStore();
const route = useRoute(); const route = useRoute();
const router = useRouter();
const opts = computed(() => store.state.order.opts); const opts = computed(() => store.state.order.opts);
if (!unref(opts).init) { if (!unref(opts).init) {
store.dispatch('order/load'); store.dispatch('order/load');
@ -217,12 +232,26 @@
const handleTrack = () => { const handleTrack = () => {
unref(refsOrderTrack).show(state.form.orderId); unref(refsOrderTrack).show(state.form.orderId);
}; };
const handleUser = () => {
router.push({
name: 'CustomerManagement',
query: {
account: state.form.userPhone,
},
});
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.detail-container { .detail-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.flex {
display: flex;
align-items: center;
justify-content: center;
}
.card { .card {
height: 100%; height: 100%;
flex-shrink: 1; flex-shrink: 1;

@ -54,7 +54,7 @@
</table-list> </table-list>
<close-order ref="refsCloseOrder" /> <close-order ref="refsCloseOrder" />
<order-track ref="refsOrderTrack" /> <order-track ref="refsOrderTrack" />
<order-ship ref="refsOrderShip" @save="handleSearch" /> <order-ship ref="refsOrderShip" />
</div> </div>
</template> </template>
@ -181,7 +181,7 @@
const handleSend = (selection) => { const handleSend = (selection) => {
if (selection.length) { if (selection.length) {
store.commit('orderShip/setCondition', { store.commit('orderShip/setCondition', {
orderIs: selection.map((item) => item.orderId), orderIds: selection.map((item) => item.orderId),
}); });
unref(refsOrderShip).show(); unref(refsOrderShip).show();
} else { } else {
@ -215,6 +215,11 @@
prop: 'userPhone', prop: 'userPhone',
width: 140, width: 140,
}, },
{
label: '订单类型',
prop: 'orderTypeDesc',
minWidth: 120,
},
{ {
label: '订单金额', label: '订单金额',
prop: 'payAmount', prop: 'payAmount',
@ -235,6 +240,11 @@
width: 120, width: 120,
prop: 'orderStatusDesc', prop: 'orderStatusDesc',
}, },
{
label: '用户留言',
width: 120,
prop: 'userMessage',
},
{ {
label: '提交时间', label: '提交时间',
prop: 'submitTime', prop: 'submitTime',

@ -1,5 +1,5 @@
<template> <template>
<el-dialog v-model="visible" title="批量发货" width="800px"> <el-dialog v-model="visible" title="批量发货" width="960px">
<table-list <table-list
v-loading="loading" v-loading="loading"
:code="code" :code="code"
@ -65,29 +65,39 @@
{ {
label: '订单编号', label: '订单编号',
prop: 'orderNo', prop: 'orderNo',
width: 120, width: 240,
fixed: 'left', fixed: 'left',
}, },
{ {
label: '收货人', label: '收货人',
prop: 'logistics.recipientName',
minWidth: 120, minWidth: 120,
slots: {
default: ({ row }) => (row.orderType === 4 ? '-' : row.logistics.recipientName || '无'),
},
}, },
{ {
label: '手机号码', label: '手机号码',
prop: 'logistics.recipientPhone',
width: 120, width: 120,
slots: {
default: ({ row }) => (row.orderType === 4 ? '-' : row.logistics.recipientPhone || '无'),
},
}, },
{ {
label: '收货地址', label: '收货地址',
prop: 'logistics.recipientAddress',
minWidth: 120, minWidth: 120,
slots: {
default: ({ row }) => (row.orderType === 4 ? '-' : row.logistics.recipientAddress || '无'),
},
}, },
{ {
label: '配送方式', label: '配送方式',
width: 140, width: 140,
fixed: 'right',
slots: { slots: {
default: ({ row }) => ( default: ({ row }) =>
row.orderType === 4 ? (
'-'
) : (
<ElSelect <ElSelect
v-model={row.logistics.companyCode} v-model={row.logistics.companyCode}
opts={unref(opts).company} opts={unref(opts).company}
@ -98,10 +108,10 @@
}, },
{ {
label: '物流单号', label: '物流单号',
width: 160, width: 180,
prop: 'logistics.trackingNo', fixed: 'right',
slots: { slots: {
default: ({ row }) => <ElInput v-model={row.logistics.trackingNo} />, default: ({ row }) => (row.orderType === 4 ? '-' : <ElInput v-model={row.logistics.trackingNo} />),
}, },
}, },
], ],

@ -1,7 +1,7 @@
<template> <template>
<el-dialog v-model="state.visible" title="物流跟踪"> <el-dialog v-model="state.visible" title="物流跟踪">
<div v-loading="state.loading" class="track-container"> <div v-loading="state.loading" class="track-container">
<h3> <h3 v-if="props.copy">
<span class="name">{{ state.info.companyName }}</span> <span class="name">{{ state.info.companyName }}</span>
<span class="no">{{ state.info.trackingNo }}</span> <span class="no">{{ state.info.trackingNo }}</span>
<el-button type="text" @click="$copy(`${state.info.companyName} ${state.info.trackingNo}`)"> <el-button type="text" @click="$copy(`${state.info.companyName} ${state.info.trackingNo}`)">
@ -33,6 +33,10 @@
type: Boolean, type: Boolean,
default: false, default: false,
}, },
copy: {
type: Boolean,
default: false,
},
}); });
const store = useStore(); const store = useStore();
const state = reactive({ const state = reactive({

@ -53,13 +53,13 @@
/> />
<el-table-column align="center" header-align="center" label="售价(元)" prop="sellPrice" width="160px"> <el-table-column align="center" header-align="center" label="售价(元)" prop="sellPrice" width="160px">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.sellPrice" /> <el-input-number v-model="row.sellPrice" :min="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="商品库存" prop="stock" width="160px"> <el-table-column align="center" header-align="center" label="商品库存" prop="stock" width="160px">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.id">{{ row.stock }}</span> <span v-if="row.id">{{ row.stock }}</span>
<el-input-number v-else v-model="row.stock" /> <el-input-number v-else v-model="row.stock" :min="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="增减库存" prop="stockChange" width="160px"> <el-table-column align="center" header-align="center" label="增减库存" prop="stockChange" width="160px">
@ -80,12 +80,12 @@
width="160px" width="160px"
> >
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.costPrice" /> <el-input-number v-model="row.costPrice" :min="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="库存预警值" prop="warn" width="160px"> <el-table-column align="center" header-align="center" label="库存预警值" prop="warn" width="160px">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.warn" /> <el-input-number v-model="row.warn" :min="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="SKU编号" min-width="100px" prop="id" /> <el-table-column align="center" header-align="center" label="SKU编号" min-width="100px" prop="id" />

@ -42,6 +42,12 @@
<script setup lang="jsx"> <script setup lang="jsx">
import ElImage from '@/components/extra/ElImage.vue'; import ElImage from '@/components/extra/ElImage.vue';
const props = defineProps({
ids: {
type: Array,
default: () => [],
},
});
const emits = defineEmits(['pick']); const emits = defineEmits(['pick']);
const store = useStore(); const store = useStore();
const loading = ref(false); const loading = ref(false);
@ -108,6 +114,7 @@
{ {
type: 'selection', type: 'selection',
width: 60, width: 60,
selectable: (row) => !props.ids.includes(row.id),
}, },
{ {
label: '编号', label: '编号',

@ -36,6 +36,7 @@
import ElSwitch from '@/components/extra/ElSwitch.vue'; import ElSwitch from '@/components/extra/ElSwitch.vue';
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const store = useStore(); const store = useStore();
const route = useRoute();
const loading = ref(false); const loading = ref(false);
const code = computed(() => store.state.customer.code); const code = computed(() => store.state.customer.code);
const list = computed(() => store.state.customer.list); const list = computed(() => store.state.customer.list);
@ -66,6 +67,10 @@
}; };
}; };
const handleSearch = async () => { const handleSearch = async () => {
if (route.query.account && !state.condition.account) {
state.condition.account = route.query.account;
store.commit('customer/setCondition', _.cloneDeep(state.condition));
}
loading.value = true; loading.value = true;
await store.dispatch('customer/search'); await store.dispatch('customer/search');
loading.value = false; loading.value = false;

Loading…
Cancel
Save