From 66cce2fc175d1092005efd0db2e2c09b76d3c0ec Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Wed, 8 Apr 2026 15:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=91=E6=89=8B=E9=85=8D=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- .env.development | 3 + src/api/admin/user.ts | 9 + src/api/canteen/canteenRiderConfig.ts | 61 +++ .../admin/system/sysDeptBuilding/index.vue | 39 +- .../sysDeptBuilding/rider-config-drawer.vue | 454 ++++++++++++++++++ src/views/admin/system/user/form.vue | 15 + src/views/admin/system/user/index.vue | 7 + 8 files changed, 583 insertions(+), 7 deletions(-) create mode 100644 src/api/canteen/canteenRiderConfig.ts create mode 100644 src/views/admin/system/sysDeptBuilding/rider-config-drawer.vue diff --git a/.env b/.env index 3cf395d8..5e253f45 100644 --- a/.env +++ b/.env @@ -36,7 +36,7 @@ VITE_VERIFY_ENABLE = false VITE_VERIFY_IMAGE_ENABLE = true # 是否开启websocket 消息接受, -VITE_WEBSOCKET_ENABLE = false +VITE_WEBSOCKET_ENABLE = true # 是否开启注册 VITE_REGISTER_ENABLE = false diff --git a/.env.development b/.env.development index 75886bab..ffb1dea1 100644 --- a/.env.development +++ b/.env.development @@ -15,6 +15,9 @@ VITE_ADMIN_PROXY_PATH = http://localhost:9999/ # VITE_ADMIN_PROXY_PATH = http://192.168.101.196:9999 # 邓-本地 # VITE_ADMIN_PROXY_PATH = http://59.202.170.152:81/api # 正式环境线上 +# 食堂配送:骑手角色编码(用于楼栋/骑手池可选用户列表,与 /admin/user/getUserListByRoleCodeAndDept 的 code 一致) +# VITE_CANTEEN_RIDER_ROLE_CODE = CANTEEN_RIDER + # 图片访问基础地址 # VITE_IMAGE_BASE_PATH = http://123.157.250.162:8089/api/ # 测试线上 # VITE_IMAGE_BASE_PATH = http://123.156.230.15:8089/api/ # 测试线上-过期 diff --git a/src/api/admin/user.ts b/src/api/admin/user.ts index b3240dcf..a0c69f45 100644 --- a/src/api/admin/user.ts +++ b/src/api/admin/user.ts @@ -165,3 +165,12 @@ export function getSimpleUserAll(params?: { name?: string; mobile?: string; user params, }) } + +/** 查询单位下具有指定角色编码的用户(如骑手) */ +export function getUserListByRoleCodeAndDept(params: { code: string; deptId: string | number }) { + return request({ + url: "/admin/user/getUserListByRoleCodeAndDept", + method: "get", + params, + }) +} diff --git a/src/api/canteen/canteenRiderConfig.ts b/src/api/canteen/canteenRiderConfig.ts new file mode 100644 index 00000000..2b1dce96 --- /dev/null +++ b/src/api/canteen/canteenRiderConfig.ts @@ -0,0 +1,61 @@ +import request from "/@/utils/request" + +/** 楼栋 — 骑手绑定列表 */ +export function listBuildingBind(params: { deptId: string | number }) { + return request({ + url: "/canteen/canteenRiderConfig/building-bind/list", + method: "get", + params, + }) +} + +/** 新增楼栋绑定(同 deptId + buildingId 唯一) */ +export function addBuildingBind(params: { + deptId: string | number + buildingId: string | number + riderUserId: string | number +}) { + return request({ + url: "/canteen/canteenRiderConfig/building-bind", + method: "post", + params, + }) +} + +/** 删除楼栋绑定 */ +export function delBuildingBind(id: string | number) { + return request({ + url: `/canteen/canteenRiderConfig/building-bind/${id}`, + method: "delete", + }) +} + +/** 默认骑手池列表 */ +export function listRiderPool(params: { deptId: string | number }) { + return request({ + url: "/canteen/canteenRiderConfig/pool/list", + method: "get", + params, + }) +} + +/** 新增默认池骑手(sortOrder 越小越靠前) */ +export function addRiderPool(params: { + deptId: string | number + riderUserId: string | number + sortOrder?: number +}) { + return request({ + url: "/canteen/canteenRiderConfig/pool", + method: "post", + params, + }) +} + +/** 移除默认池骑手 */ +export function delRiderPool(id: string | number) { + return request({ + url: `/canteen/canteenRiderConfig/pool/${id}`, + method: "delete", + }) +} diff --git a/src/views/admin/system/sysDeptBuilding/index.vue b/src/views/admin/system/sysDeptBuilding/index.vue index bd0fcba5..089da139 100644 --- a/src/views/admin/system/sysDeptBuilding/index.vue +++ b/src/views/admin/system/sysDeptBuilding/index.vue @@ -66,6 +66,15 @@ > 新增楼栋 + + 骑手绑定 + @@ -89,7 +98,9 @@
{{ item.buildingName }}
-
排序:{{ item.sortOrder ?? 0 }}
+ + 排序 {{ item.sortOrder ?? 0 }} +
@@ -110,7 +121,7 @@ size="small" icon="edit-pen" v-auth="'admin_sysDeptBuilding_edit'" - @click="formDialogRef.openDialog(item.id)" + @click.stop="formDialogRef.openDialog(item.id)" > 编辑 @@ -120,9 +131,7 @@ size="small" icon="Delete" v-auth="'admin_sysDeptBuilding_del'" - @click="handleDelete([item.id])" - > - 删除 + @click.stop="handleDelete([item.id])"
@@ -146,6 +155,11 @@ + import("./form.vue")) const UnitForm = defineAsyncComponent(() => import("./unit-form.vue")) const RoomForm = defineAsyncComponent(() => import("./room-form.vue")) +const RiderConfigDrawer = defineAsyncComponent(() => import("./rider-config-drawer.vue")) const formDialogRef = ref() +const riderConfigVisible = ref(false) const unitDialogRef = ref() const roomDialogRef = ref() @@ -374,6 +390,14 @@ const openAddBuilding = () => { formDialogRef.value?.openDialog() } +const openRiderBindDrawer = () => { + if (!currentDept.value) { + useMessage().warning("请先选择单位") + return + } + riderConfigVisible.value = true +} + const selectionChangHandle = (objs: { id: string | number }[]) => { selectObjs.value = objs.map(({ id }) => id) multiple.value = !objs.length @@ -598,13 +622,16 @@ onMounted(() => { } .building-card-footer { display: flex; - align-items: center; + align-items: flex-start; justify-content: space-between; + gap: 12px; margin-top: 4px; } .building-card-footer .actions { display: flex; gap: 6px; + align-items: flex-start; + flex-shrink: 0; } .manage-entry { display: flex; diff --git a/src/views/admin/system/sysDeptBuilding/rider-config-drawer.vue b/src/views/admin/system/sysDeptBuilding/rider-config-drawer.vue new file mode 100644 index 00000000..ef5b6f76 --- /dev/null +++ b/src/views/admin/system/sysDeptBuilding/rider-config-drawer.vue @@ -0,0 +1,454 @@ + + + diff --git a/src/views/admin/system/user/form.vue b/src/views/admin/system/user/form.vue index 17c0ddad..5ec7b0d5 100644 --- a/src/views/admin/system/user/form.vue +++ b/src/views/admin/system/user/form.vue @@ -26,6 +26,15 @@ + + + + 未知 + 男 + 女 + + + @@ -151,6 +160,8 @@ const dataForm = reactive({ nickname: "", name: "", email: "", + /** 0 未知 / 1 男 / 2 女 */ + gender: 0 as number, staffingType: "2", post: [] as string[], role: [] as string[], @@ -210,6 +221,9 @@ const openDialog = async (id: string) => { // 重置表单数据 nextTick(() => { dataFormRef.value?.resetFields() + if (!id) { + dataForm.gender = 0 + } }) // 修改获取用户信息 @@ -269,6 +283,7 @@ const getUserData = async (id: string) => { loading.value = true const { data } = await getObj(id) Object.assign(dataForm, data) + dataForm.gender = data.gender != null && data.gender !== "" ? Number(data.gender) : 0 if (data.roleList) { dataForm.role = data.roleList.map((item: any) => item.roleId) } diff --git a/src/views/admin/system/user/index.vue b/src/views/admin/system/user/index.vue index 18e0a3f8..814ff5f4 100644 --- a/src/views/admin/system/user/index.vue +++ b/src/views/admin/system/user/index.vue @@ -65,6 +65,13 @@ + + +