feat(shop): 完善订单发货功能及配送方式展示

- 新增发货备注、快递公司、发货人信息等字段
- 优化发货表单验证逻辑,支持不同配送方式的动态校验
- 新增配送方式为"商家送货"和"无需发货"的处理逻辑
- 完善订单详情页配送信息展示,增加发货店铺和无需发货备注显示
- 修复发货模态框中部分字段重置逻辑
- 调整开发环境API配置注释状态
This commit is contained in:
2025-12-09 12:01:48 +08:00
parent a485faa0e4
commit a6a8915282
5 changed files with 110 additions and 16 deletions

View File

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

BIN
dist.zip Normal file

Binary file not shown.

View File

@@ -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[];
} }

View File

@@ -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();
// 加载快递公司列表 // 加载快递公司列表

View File

@@ -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,
// 优惠说明 // 优惠说明