You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

5.9 KiB

Answer

Status: resolved(直属销售总监 = 组织架构推导,已由用户在 grill Q12 拍板 A)

A. 流程模型(定稿,两段式)

发起交接(离职人员→接收总监)  →  客户分配(接收总监→具体销售)
   owner 变为总监               owner 变为销售
   生成交接单(待分配)            逐客户/批量分配
  • 只允许离职/调动/区域调整的销售本人发起本人名下客户的交接(主管/管理员不可代办,原型二.2 明文)。
  • 可交接客户 = 该销售为唯一负责人 且 未删除 且 非公海;仅协同人的客户不纳入。
  • 接收总监:离职 = 系统自动确定唯一直属销售总监;调动/区域调整 = 在本人启用的直属销售总监范围内搜索选择。
  • 交接单:全部变更成功才生成(整批原子);生成唯一交接编号 + 状态「待分配」+ 进度 0/N。

B. 实体(定稿)

B1. 交接单 customer_transfer

Java 字段 列名 类型 说明
id id bigint 主键
transferNo transfer_no varchar(32) 交接编号(唯一,生成规则对称商机编号)
fromUserId / fromUserName from_user_id / from_user_name 离职/调动人员快照
toDirectorId / toDirectorName to_director_id / to_director_name 接收总监快照
reason reason varchar(20) 交接原因字典:员工离职/岗位调动/区域调整
remark remark varchar(500) 备注(选填)
totalCount total_count int 本次交接客户总数
assignedCount assigned_count int 已分配数(进度 = assigned/total)
status status tinyint 0待分配 / 1已完成
createBy / createTime / updateBy / updateTime BaseEntity

无孤立单大写字母陷阱。

B2. 交接明细 customer_transfer_detail

Java 字段 列名 类型 说明
id id bigint 主键
transferId transfer_id bigint 交接单 id
customerId customer_id bigint 客户 id
assignStatus assign_status tinyint 0待分配 / 1已分配
assignUserId / assignUserName assign_user_id / assign_user_name 分配对象快照(待分配时 NULL)
assignTime assign_time datetime 分配时间
  • UNIQUE(transfer_id, customer_id) 去重。

C. 事务语义(定稿,跨模块)

  1. 发起交接(整批原子):
    • 遍历本次客户,对每个客户:owner_user_id → to_director_id;移出 from_user 团队身份;保留原协同人。
    • 对每个客户的关联商机(crm-opportunity)owner_user_id → to_director_id
    • 关联项目 owner 同步 = seam(A5 未建;本图只定义 port 契约,实现时项目侧跳过并标注)。
    • 任一失败 → 全部回滚,不生成交接单(原型三.确认交接 §7 明文)。
  2. 客户分配(整批/单个):
    • 待分配明细 → 选分配对象(接收总监有权分配范围 + 启用的销售 + 不得为 from_user 本人 + 不得是当前负责人)→ owner_user_id → assign_user_id,同步关联商机/项目 owner。
    • 单个失败不整体回滚(批量按逐条独立事务),失败项列原因。
  3. 防重入:同一 from_user 存在未完成交接单时,禁止再次发起(原型三.确认交接 §1)。

D. 契约(定稿)

POST /api/customer/transfer/initiate         发起交接(整批原子,返回交接编号)
GET  /api/customer/transfer/{id}/preview     发起前客户预览(按原因算可交接客户)
GET  /api/customer/transfer/{id}             交接详情
GET  /api/customer/transfer/page             交接记录(交接编号/人员/原因/状态过滤)
POST /api/customer/transfer/{id}/assign      客户分配(单个或批量 customerIds + assignUserId)
GET  /api/customer/transfer/{id}/assignable  可分配销售列表(接收总监范围 + 启用)

E. 直属销售总监 — 已拍板(grill Q12,组织架构推导)

原型要求:离职时系统自动确定唯一直属销售总监;调动/区域调整时在启用的直属销售总监范围选择。核心是「直属销售总监」的确定口径:

我的推荐不加 SysUser 字段,用组织架构现有层级推导——按 from_user 所在部门向上找「部门负责人」(dept.leader_user_id 或等价),若该负责人是「销售总监」角色则命中;无/停用/多条则按原型阻断并提示「联系管理员维护组织关系」。

理由:① 组织架构已有部门负责人概念,不引入新字段;② 直属关系是组织属性而非用户属性,加 superior_user_id 会带来维护和一致性问题;③ 原型明说「无/停用/多条直属关系 → 阻断」,天然容忍推导失败。

备选SysUsersuperior_user_id(直属上级),由后台维护;查询 O(1),但需改 auth 模块 + 维护成本。

已拍板(grill Q12,用户选 A):组织架构推导(dept.leader 向上找销售总监角色),不改 crm-auth,不加 superior_user_id

F. 回填 / 下游

  • 票 03:owner 变更(分配=换主)复用 oplog 语义;交割是分配动作的跨模块扩展版。
  • 票 07:oplog 记录 TRANSFER 动作 + customer_transfer 表变更;跨模块同步操作人显「系统」+ 交接编号。
  • crm-opportunity:需要商机侧提供「按 customer_id 批量改 owner」的 port(或复用商机分配逻辑)。
  • A5 项目:项目 owner 同步 seam(port 契约占位)。
  • crm-dicttransfer_reason 分组(员工离职/岗位调动/区域调整)。

G. 产品确认项 — 已随 grill 全部销号

# 问题 影响
P0-1 交接单「已完成」的判定 已拍板(grill Q13):自动完成(assignedCount == totalCount 置为已完成),不设手动「完成交接」按钮 status 迁移