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