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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+ 删除
+
+
+
+
+
+
+ {{ index + 1 }}
+
+ 修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+