feat(shop): 完善订单发货功能及配送方式展示
- 新增发货备注、快递公司、发货人信息等字段 - 优化发货表单验证逻辑,支持不同配送方式的动态校验 - 新增配送方式为"商家送货"和"无需发货"的处理逻辑 - 完善订单详情页配送信息展示,增加发货店铺和无需发货备注显示 - 修复发货模态框中部分字段重置逻辑 - 调整开发环境API配置注释状态
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
VITE_APP_NAME=后台管理(开发环境)
|
VITE_APP_NAME=后台管理(开发环境)
|
||||||
VITE_API_URL=http://127.0.0.1:9200/api
|
#VITE_API_URL=http://127.0.0.1:9200/api
|
||||||
#VITE_SERVER_API_URL=http://127.0.0.1:8000/api
|
#VITE_SERVER_API_URL=http://127.0.0.1:8000/api
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,18 @@ export interface ShopOrder {
|
|||||||
deliveryStatus?: number;
|
deliveryStatus?: number;
|
||||||
// 发货时间
|
// 发货时间
|
||||||
deliveryTime?: string;
|
deliveryTime?: string;
|
||||||
|
// 发货备注/无需发货备注
|
||||||
|
deliveryNote?: string;
|
||||||
|
// 快递公司id
|
||||||
|
expressId?: number;
|
||||||
|
// 快递公司名称
|
||||||
|
expressName?: string;
|
||||||
|
// 发货人
|
||||||
|
sendName?: string;
|
||||||
|
// 发货人联系方式
|
||||||
|
sendPhone?: string;
|
||||||
|
// 发货地址
|
||||||
|
sendAddress?: string;
|
||||||
// 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡
|
// 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡
|
||||||
couponType?: number;
|
couponType?: number;
|
||||||
// 优惠说明
|
// 优惠说明
|
||||||
@@ -145,6 +157,8 @@ export interface ShopOrder {
|
|||||||
selfTakeCode?: string;
|
selfTakeCode?: string;
|
||||||
// 是否已收到赠品
|
// 是否已收到赠品
|
||||||
hasTakeGift?: string;
|
hasTakeGift?: string;
|
||||||
|
// 发货信息
|
||||||
|
shopOrderDelivery?: any;
|
||||||
// 订单商品
|
// 订单商品
|
||||||
orderGoods?: OrderGoods[];
|
orderGoods?: OrderGoods[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,11 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<!-- 发货类型 -->
|
<!-- 发货类型 -->
|
||||||
<a-form-item label="发货类型" name="deliveryMethod">
|
<a-form-item
|
||||||
|
v-if="form.deliveryType === 0"
|
||||||
|
label="发货类型"
|
||||||
|
name="deliveryMethod"
|
||||||
|
>
|
||||||
<a-radio-group v-model:value="form.deliveryMethod">
|
<a-radio-group v-model:value="form.deliveryMethod">
|
||||||
<a-radio value="manual">
|
<a-radio value="manual">
|
||||||
<span style="color: #1890ff">手动填写</span>
|
<span style="color: #1890ff">手动填写</span>
|
||||||
@@ -69,7 +73,7 @@
|
|||||||
</a-row>
|
</a-row>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<template v-if="form.deliveryType === 0">
|
<template v-if="form.deliveryType !== 1">
|
||||||
<a-form-item label="发货人" name="sendName">
|
<a-form-item label="发货人" name="sendName">
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.sendName"
|
v-model:value="form.sendName"
|
||||||
@@ -186,11 +190,18 @@
|
|||||||
// 表单验证规则
|
// 表单验证规则
|
||||||
const rules = {
|
const rules = {
|
||||||
deliveryType: [{ required: true, message: '请选择配送方式' }],
|
deliveryType: [{ required: true, message: '请选择配送方式' }],
|
||||||
deliveryMethod: [{ required: true, message: '请选择发货类型' }],
|
deliveryMethod: [
|
||||||
|
{
|
||||||
|
validator: (_: any, value: any) => {
|
||||||
|
if (form.deliveryType === 0 && !value) {
|
||||||
|
return Promise.reject('请选择发货类型');
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
expressId: [
|
expressId: [
|
||||||
{
|
{
|
||||||
required: true,
|
|
||||||
message: '请选择快递公司',
|
|
||||||
validator: (_: any, value: any) => {
|
validator: (_: any, value: any) => {
|
||||||
if (form.deliveryType === 0 && !value) {
|
if (form.deliveryType === 0 && !value) {
|
||||||
return Promise.reject('请选择快递公司');
|
return Promise.reject('请选择快递公司');
|
||||||
@@ -212,10 +223,36 @@
|
|||||||
// }
|
// }
|
||||||
// ],
|
// ],
|
||||||
deliveryTime: [{ required: true, message: '请选择发货时间' }],
|
deliveryTime: [{ required: true, message: '请选择发货时间' }],
|
||||||
sendName: [{ required: true, message: '请输入发货人' }],
|
sendName: [
|
||||||
sendPhone: [{ required: true, message: '请输入发货人联系方式' }],
|
{
|
||||||
sendAddress: [{ required: true, message: '请输入发货地址' }],
|
validator: (_: any, value: any) => {
|
||||||
|
if (form.deliveryType !== 1 && !value) {
|
||||||
|
return Promise.reject('请输入发货人');
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
sendPhone: [
|
||||||
|
{
|
||||||
|
validator: (_: any, value: any) => {
|
||||||
|
if (form.deliveryType !== 1 && !value) {
|
||||||
|
return Promise.reject('请输入发货人联系方式');
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
sendAddress: [
|
||||||
|
{
|
||||||
|
validator: (_: any, value: any) => {
|
||||||
|
if (form.deliveryType !== 1 && !value) {
|
||||||
|
return Promise.reject('请输入发货地址');
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
@@ -254,6 +291,23 @@
|
|||||||
expressModalVisible.value = true;
|
expressModalVisible.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 根据配送方式重置不需要的字段
|
||||||
|
watch(
|
||||||
|
() => form.deliveryType,
|
||||||
|
(type) => {
|
||||||
|
if (type !== 0) {
|
||||||
|
form.expressId = undefined;
|
||||||
|
form.expressName = '';
|
||||||
|
form.deliveryMethod = 'manual';
|
||||||
|
}
|
||||||
|
if (type === 1) {
|
||||||
|
form.sendName = '';
|
||||||
|
form.sendPhone = '';
|
||||||
|
form.sendAddress = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// 更新弹窗显示状态
|
// 更新弹窗显示状态
|
||||||
const updateVisible = (visible: boolean) => {
|
const updateVisible = (visible: boolean) => {
|
||||||
emit('update:visible', visible);
|
emit('update:visible', visible);
|
||||||
@@ -280,7 +334,7 @@
|
|||||||
deliveryStatus: 20, // 已发货
|
deliveryStatus: 20, // 已发货
|
||||||
deliveryType: form.deliveryType,
|
deliveryType: form.deliveryType,
|
||||||
deliveryTime: deliveryTime,
|
deliveryTime: deliveryTime,
|
||||||
deliveryNote: form.deliveryNote,
|
deliveryNote: form.deliveryNote
|
||||||
};
|
};
|
||||||
|
|
||||||
// 如果是快递配送,添加快递信息
|
// 如果是快递配送,添加快递信息
|
||||||
@@ -291,6 +345,18 @@
|
|||||||
updateData.sendAddress = form.sendAddress;
|
updateData.sendAddress = form.sendAddress;
|
||||||
// updateData.expressName = form.expressName;
|
// updateData.expressName = form.expressName;
|
||||||
// updateData.trackingNumber = form.trackingNumber;
|
// updateData.trackingNumber = form.trackingNumber;
|
||||||
|
} else if (form.deliveryType === 2) {
|
||||||
|
// 商家送货需要记录发货人信息,但不需要快递公司
|
||||||
|
updateData.sendName = form.sendName;
|
||||||
|
updateData.sendPhone = form.sendPhone;
|
||||||
|
updateData.sendAddress = form.sendAddress;
|
||||||
|
updateData.expressId = undefined;
|
||||||
|
} else {
|
||||||
|
// 无需发货,清理快递/发货信息
|
||||||
|
updateData.expressId = undefined;
|
||||||
|
updateData.sendName = undefined;
|
||||||
|
updateData.sendPhone = undefined;
|
||||||
|
updateData.sendAddress = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分单发货
|
// 分单发货
|
||||||
@@ -304,7 +370,7 @@
|
|||||||
emit('done');
|
emit('done');
|
||||||
updateVisible(false);
|
updateVisible(false);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.log(error)
|
console.log(error);
|
||||||
message.error(error.message || '发货失败');
|
message.error(error.message || '发货失败');
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -324,6 +390,9 @@
|
|||||||
form.trackingNumber = '';
|
form.trackingNumber = '';
|
||||||
form.partialDelivery = false;
|
form.partialDelivery = false;
|
||||||
form.deliveryNote = '';
|
form.deliveryNote = '';
|
||||||
|
form.sendName = '';
|
||||||
|
form.sendPhone = '';
|
||||||
|
form.sendAddress = '';
|
||||||
form.deliveryTime = dayjs();
|
form.deliveryTime = dayjs();
|
||||||
|
|
||||||
// 加载快递公司列表
|
// 加载快递公司列表
|
||||||
|
|||||||
@@ -346,7 +346,8 @@
|
|||||||
:labelStyle="{ width: '90px', color: '#808080' }"
|
:labelStyle="{ width: '90px', color: '#808080' }"
|
||||||
>
|
>
|
||||||
<a-tag v-if="form.deliveryType === 0">快递配送</a-tag>
|
<a-tag v-if="form.deliveryType === 0">快递配送</a-tag>
|
||||||
<a-tag v-else-if="form.deliveryType === 1" color="blue">自提</a-tag>
|
<a-tag v-else-if="form.deliveryType === 1" color="blue">无需发货</a-tag>
|
||||||
|
<a-tag v-else-if="form.deliveryType === 2" color="purple">商家送货</a-tag>
|
||||||
<a-tag v-else>未设置</a-tag>
|
<a-tag v-else>未设置</a-tag>
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item
|
<a-descriptions-item
|
||||||
@@ -359,21 +360,29 @@
|
|||||||
<span v-else class="text-gray-400">未设置</span>
|
<span v-else class="text-gray-400">未设置</span>
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item
|
<a-descriptions-item
|
||||||
v-if="form.deliveryType === 1"
|
v-if="form.deliveryType === 1 && form.selfTakeMerchantName"
|
||||||
label="自提店铺"
|
label="关联店铺"
|
||||||
:labelStyle="{ width: '90px', color: '#808080' }"
|
:labelStyle="{ width: '90px', color: '#808080' }"
|
||||||
:span="2"
|
:span="2"
|
||||||
>
|
>
|
||||||
{{ form.selfTakeMerchantName || '未设置' }}
|
{{ form.selfTakeMerchantName || '未设置' }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item
|
<a-descriptions-item
|
||||||
v-if="form.deliveryType === 0"
|
v-if="form.deliveryType === 0 || form.deliveryType === 2"
|
||||||
label="发货店铺"
|
label="发货店铺"
|
||||||
:labelStyle="{ width: '90px', color: '#808080' }"
|
:labelStyle="{ width: '90px', color: '#808080' }"
|
||||||
:span="2"
|
:span="2"
|
||||||
>
|
>
|
||||||
{{ form.expressMerchantName || '未设置' }}
|
{{ form.expressMerchantName || '未设置' }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
|
<a-descriptions-item
|
||||||
|
v-if="form.deliveryType === 1 && form.deliveryNote"
|
||||||
|
label="无需发货备注"
|
||||||
|
:labelStyle="{ width: '90px', color: '#808080' }"
|
||||||
|
:span="2"
|
||||||
|
>
|
||||||
|
{{ form.deliveryNote }}
|
||||||
|
</a-descriptions-item>
|
||||||
<a-descriptions-item
|
<a-descriptions-item
|
||||||
v-if="form.selfTakeCode"
|
v-if="form.selfTakeCode"
|
||||||
label="自提码"
|
label="自提码"
|
||||||
@@ -625,6 +634,8 @@ const form = reactive<ShopOrder>({
|
|||||||
deliveryStatus: undefined,
|
deliveryStatus: undefined,
|
||||||
// 发货时间
|
// 发货时间
|
||||||
deliveryTime: undefined,
|
deliveryTime: undefined,
|
||||||
|
// 无需发货备注
|
||||||
|
deliveryNote: undefined,
|
||||||
// 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡
|
// 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡
|
||||||
couponType: undefined,
|
couponType: undefined,
|
||||||
// 优惠说明
|
// 优惠说明
|
||||||
|
|||||||
Reference in New Issue
Block a user