From 26792e73f06b3ae1f478d28980676db3878b6de0 Mon Sep 17 00:00:00 2001 From: halo Date: Thu, 9 Jul 2026 15:53:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=BB=8F=E7=90=86=E7=AE=A1=E7=90=86(=E6=9F=A5=E8=AF=A2/?= =?UTF-8?q?=E6=96=B0=E5=A2=9E/=E4=BF=AE=E6=94=B9/=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mock-server/routes/baseConfig.js | 81 ++++++++ src/api/baseConfig.js | 6 + src/views/base-config/manager/ManagerList.vue | 184 ++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 src/views/base-config/manager/ManagerList.vue diff --git a/mock-server/routes/baseConfig.js b/mock-server/routes/baseConfig.js index 02a64bc..57665df 100644 --- a/mock-server/routes/baseConfig.js +++ b/mock-server/routes/baseConfig.js @@ -1,6 +1,7 @@ import express from 'express' import { orgs } from '../data/orgs.js' import { channels, nextChannelId } from '../data/channels.js' +import { managers, nextManagerId } from '../data/managers.js' import { requireAuth } from '../middleware/requireAuth.js' const router = express.Router() @@ -104,4 +105,84 @@ router.delete('/channel/batch', (req, res) => { res.json({ code: 200, msg: 'ok', data: { successIds, failed } }) }) +// ---------------- 客户经理管理 ---------------- + +router.get('/manager/list', (req, res) => { + const { orgCode, orgName: orgNameQuery, name, jobNumber, page = 1, pageSize = 10 } = req.query || {} + let list = managers + if (orgCode) list = list.filter((m) => m.orgCode.includes(orgCode)) + if (orgNameQuery) list = list.filter((m) => m.orgName.includes(orgNameQuery)) + if (name) list = list.filter((m) => m.name.includes(name)) + if (jobNumber) list = list.filter((m) => m.jobNumber.includes(jobNumber)) + + const total = list.length + const start = (Number(page) - 1) * Number(pageSize) + const pageList = list.slice(start, start + Number(pageSize)) + res.json({ code: 200, msg: 'ok', data: { list: pageList, total } }) +}) + +router.post('/manager', (req, res) => { + const { orgCode, orgName: managerOrgName, jobNumber, name } = req.body || {} + if (!orgCode) return res.json({ code: 40030, msg: '请输入机构号', data: null }) + if (!managerOrgName) return res.json({ code: 40031, msg: '请输入机构名称', data: null }) + if (!jobNumber) return res.json({ code: 40032, msg: '请输入工号', data: null }) + if (!name) return res.json({ code: 40033, msg: '请输入客户经理姓名', data: null }) + if (managers.some((m) => m.jobNumber === jobNumber)) { + return res.json({ code: 40034, msg: '工号已存在', data: null }) + } + + const manager = { + id: nextManagerId(), + orgCode, + orgName: managerOrgName, + jobNumber, + name, + createdAt: nowStr() + } + managers.push(manager) + res.json({ code: 200, msg: 'ok', data: manager }) +}) + +router.put('/manager/:id', (req, res) => { + const { id } = req.params + const { orgCode, orgName: managerOrgName, jobNumber, name } = req.body || {} + const manager = managers.find((m) => m.id === id) + if (!manager) return res.json({ code: 40404, msg: '客户经理不存在', data: null }) + if (!orgCode) return res.json({ code: 40030, msg: '请输入机构号', data: null }) + if (!managerOrgName) return res.json({ code: 40031, msg: '请输入机构名称', data: null }) + if (!jobNumber) return res.json({ code: 40032, msg: '请输入工号', data: null }) + if (!name) return res.json({ code: 40033, msg: '请输入客户经理姓名', data: null }) + if (managers.some((m) => m.jobNumber === jobNumber && m.id !== id)) { + return res.json({ code: 40034, msg: '工号已存在', data: null }) + } + + manager.orgCode = orgCode + manager.orgName = managerOrgName + manager.jobNumber = jobNumber + manager.name = name + res.json({ code: 200, msg: 'ok', data: manager }) +}) + +router.delete('/manager/batch', (req, res) => { + const { ids } = req.body || {} + if (!Array.isArray(ids) || ids.length === 0) { + return res.json({ code: 40024, msg: '请选择要删除的客户经理', data: null }) + } + const successIds = [] + const failed = [] + ids.forEach((id) => { + const manager = managers.find((m) => m.id === id) + if (!manager) { + failed.push({ id, name: id, reason: '客户经理不存在' }) + return + } + successIds.push(id) + }) + successIds.forEach((id) => { + const index = managers.findIndex((m) => m.id === id) + if (index !== -1) managers.splice(index, 1) + }) + res.json({ code: 200, msg: 'ok', data: { successIds, failed } }) +}) + export default router diff --git a/src/api/baseConfig.js b/src/api/baseConfig.js index a1b7309..0ffc03f 100644 --- a/src/api/baseConfig.js +++ b/src/api/baseConfig.js @@ -5,3 +5,9 @@ export const fetchChannelListApi = (params) => request.get('/base-config/channel export const createChannelApi = (data) => request.post('/base-config/channel', data) export const updateChannelApi = (id, data) => request.put(`/base-config/channel/${id}`, data) export const batchDeleteChannelApi = (ids) => request.delete('/base-config/channel/batch', { data: { ids } }) + +// ---------------- 客户经理管理 ---------------- +export const fetchManagerListApi = (params) => request.get('/base-config/manager/list', { params }) +export const createManagerApi = (data) => request.post('/base-config/manager', data) +export const updateManagerApi = (id, data) => request.put(`/base-config/manager/${id}`, data) +export const batchDeleteManagerApi = (ids) => request.delete('/base-config/manager/batch', { data: { ids } }) diff --git a/src/views/base-config/manager/ManagerList.vue b/src/views/base-config/manager/ManagerList.vue new file mode 100644 index 0000000..0838052 --- /dev/null +++ b/src/views/base-config/manager/ManagerList.vue @@ -0,0 +1,184 @@ + + +