From 74068508c07461845c73ab54cce332657a268344 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Tue, 10 Feb 2026 15:15:07 +0800
Subject: [PATCH] =?UTF-8?q?feat(shop):=20=E9=85=8D=E9=80=81=E5=91=98?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E6=96=B0=E5=A2=9E=E9=97=A8?=
=?UTF-8?q?=E5=BA=97=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在ShopStoreRider模型中增加storeId和storeName字段
- 为配送员编辑表单添加门店选择组件和验证规则
- 实现门店选择的Modal组件和数据表格展示
- 添加门店搜索和筛选功能
- 优化表单回显逻辑支持门店名称显示
- 更新表单提交时的门店ID关联逻辑
---
src/api/shop/shopStoreRider/model/index.ts | 4 +
.../components/select-data.vue | 106 ++++++++++++++++++
src/components/SelectShopStore/index.vue | 63 +++++++++++
.../components/shopStoreRiderEdit.vue | 56 +++++++++
4 files changed, 229 insertions(+)
create mode 100644 src/components/SelectShopStore/components/select-data.vue
create mode 100644 src/components/SelectShopStore/index.vue
diff --git a/src/api/shop/shopStoreRider/model/index.ts b/src/api/shop/shopStoreRider/model/index.ts
index 5818a51..577b32d 100644
--- a/src/api/shop/shopStoreRider/model/index.ts
+++ b/src/api/shop/shopStoreRider/model/index.ts
@@ -6,6 +6,10 @@ import type { PageParam } from '@/api';
export interface ShopStoreRider {
// 主键ID
id?: string;
+ // 门店ID(shop_store.id)
+ storeId?: number;
+ // 门店名称(后端联表返回,提交时可不传)
+ storeName?: string;
// 配送点ID(shop_dealer.id)
dealerId?: number;
// 骑手编号(可选)
diff --git a/src/components/SelectShopStore/components/select-data.vue b/src/components/SelectShopStore/components/select-data.vue
new file mode 100644
index 0000000..a2c5de9
--- /dev/null
+++ b/src/components/SelectShopStore/components/select-data.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
diff --git a/src/components/SelectShopStore/index.vue b/src/components/SelectShopStore/index.vue
new file mode 100644
index 0000000..ec1f3f5
--- /dev/null
+++ b/src/components/SelectShopStore/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
diff --git a/src/views/shop/shopStoreRider/components/shopStoreRiderEdit.vue b/src/views/shop/shopStoreRider/components/shopStoreRiderEdit.vue
index 1bc818b..600b1e8 100644
--- a/src/views/shop/shopStoreRider/components/shopStoreRiderEdit.vue
+++ b/src/views/shop/shopStoreRider/components/shopStoreRiderEdit.vue
@@ -5,6 +5,7 @@
:visible="visible"
:maskClosable="false"
:maxable="maxable"
+ :confirm-loading="loading"
:title="isUpdate ? '编辑配送员' : '添加配送员'"
:body-style="{ paddingBottom: '28px' }"
@update:visible="updateVisible"
@@ -28,6 +29,14 @@
@done="onChooseUser"
/>
+
+
+
([]);
const selectedUserText = ref('');
const selectedCommunityText = ref('');
+ const selectedStoreText = ref('');
// 用户信息
const form = reactive({
id: undefined,
+ storeId: undefined,
dealerId: undefined,
riderNo: undefined,
realName: undefined,
@@ -236,6 +252,17 @@
// 表单验证规则
const rules = reactive({
+ storeId: [
+ {
+ validator: (_rule: unknown, value: number | undefined) => {
+ if (!value) {
+ return Promise.reject(new Error('请选择门店'));
+ }
+ return Promise.resolve();
+ },
+ trigger: 'change'
+ }
+ ]
// userId: [
// {
// required: true,
@@ -317,6 +344,16 @@
selectedCommunityText.value = community.name ?? String(community.id ?? '');
};
+ const onChooseStore = (store?: ShopStore) => {
+ if (!store) {
+ selectedStoreText.value = '';
+ form.storeId = undefined;
+ return;
+ }
+ form.storeId = store.id;
+ selectedStoreText.value = store.name ?? String(store.id ?? '');
+ };
+
const { resetFields } = useForm(form, rules);
/* 保存编辑 */
@@ -356,6 +393,7 @@
images.value = [];
selectedUserText.value = '';
selectedCommunityText.value = '';
+ selectedStoreText.value = '';
if (props.data) {
assignObject(form, props.data);
if (props.data.avatar) {
@@ -382,6 +420,24 @@
selectedUserText.value = String(form.userId ?? '');
});
}
+ if (form.storeId) {
+ // 优先使用列表接口返回的 storeName 回显,避免额外请求
+ if ((props.data as any)?.storeName) {
+ selectedStoreText.value = String((props.data as any).storeName);
+ } else {
+ const sid = form.storeId;
+ getShopStore(form.storeId)
+ .then((store) => {
+ if (form.storeId !== sid) return;
+ selectedStoreText.value =
+ store.name ?? String(store.id ?? '');
+ })
+ .catch(() => {
+ if (form.storeId !== sid) return;
+ selectedStoreText.value = String(form.storeId ?? '');
+ });
+ }
+ }
if (form.dealerId) {
const dealerId = form.dealerId;
getShopCommunity(form.dealerId)