组织架构变动后,存在历史数据的组织架构变乱码

背景&操作步骤

做了什么操作后,出现的该问题

  1. 组织架构有调整,钉钉调整过后,原本的历史数据变成了乱码,导致数据有误,该问题如何解决。

问题

页面截图

前端控制台错误截图 (如果只是后端问题,可跳过)

接口返回数据截图 & 后端日志错误提示(如只是前端问题,可跳过)

期望效果

显示是部门id和名称的映射, 你是将之前的部门删除了吗

是的,历史部门删掉了 但是在职人员变更了新部门,显示的还是被删除的部门id

历史记录中的“部门”字段保存的是当时的部门 ID。删除旧部门并将人员调整到新部门后,只会更新组织架构中的人员归属,不会自动修改已有业务记录,因此重新同步组织架构不能修复历史数据。   

可以通过业务记录中的 memberId 匹配人员当前部门,批量替换已经失效的旧部门 ID。以下是 MySQL 8 修复模板,仅适用于:

  • 业务表中的人员字段保存 CorpMember.memberId
  • 部门字段为单选部门
  • 业务表与组织架构表位于同一数据库
  • 每名人员当前只有一个部门
    执行前请替换业务表名、字段名和组织架构 fullName,并先在测试环境验证。
-- ===== 需要修改的配置 =====
  SET @corp_full_name = 'corps.YourCorp';

  -- your_business_table:业务表
  -- id:业务表主键
  -- member_id:业务表人员 memberId 字段
  -- department_id:需要修复的部门字段

  -- ===== 1. 生成人员当前部门映射 =====
  DROP TEMPORARY TABLE IF EXISTS tmp_member_current_dept;

  CREATE TEMPORARY TABLE tmp_member_current_dept AS
  SELECT
      m.`memberId` AS member_id,
      m.`nick` AS member_name,
      MIN(dm.`deptId`) AS new_dept_id,
      MIN(d.`name`) AS new_dept_name
  FROM `corp_member` m
  JOIN `corp_dept_member` dm
    ON dm.`corpFullName` = m.`corpFullName`
   AND dm.`memberId` = m.`memberId`
  JOIN `corp_dept` d
    ON d.`corpFullName` = dm.`corpFullName`
   AND d.`deptId` = dm.`deptId`
  WHERE m.`corpFullName` = @corp_full_name
    AND m.`status` = 0
  GROUP BY m.`memberId`, m.`nick`
  HAVING COUNT(DISTINCT dm.`deptId`) = 1;

  ALTER TABLE tmp_member_current_dept
  ADD PRIMARY KEY (`member_id`);

  -- ===== 2. 预览待修复数据 =====
  SELECT
      b.`id`,
      b.`member_id`,
      mp.member_name,
      b.`department_id` AS old_dept_id,
      mp.new_dept_id,
      mp.new_dept_name
  FROM `your_business_table` b
  JOIN tmp_member_current_dept mp
    ON mp.member_id = b.`member_id`
  LEFT JOIN `corp_dept` old_d
    ON old_d.`corpFullName` = @corp_full_name
   AND old_d.`deptId` = b.`department_id`
  WHERE b.`department_id` IS NOT NULL
    AND b.`department_id` <> ''
    AND old_d.`deptId` IS NULL;

  -- ===== 3. 备份待修复记录 =====
  CREATE TABLE `your_business_table_dept_bak_20260909`
  LIKE `your_business_table`;

  INSERT INTO `your_business_table_dept_bak_20260909`
  SELECT b.*
  FROM `your_business_table` b
  JOIN tmp_member_current_dept mp
    ON mp.member_id = b.`member_id`
  LEFT JOIN `corp_dept` old_d
    ON old_d.`corpFullName` = @corp_full_name
   AND old_d.`deptId` = b.`department_id`
  WHERE b.`department_id` IS NOT NULL
    AND b.`department_id` <> ''
    AND old_d.`deptId` IS NULL;

  -- ===== 4. 执行修复 =====
  START TRANSACTION;

  UPDATE `your_business_table` b
  JOIN tmp_member_current_dept mp
    ON mp.member_id = b.`member_id`
  LEFT JOIN `corp_dept` old_d
    ON old_d.`corpFullName` = @corp_full_name
   AND old_d.`deptId` = b.`department_id`
  SET b.`department_id` = mp.new_dept_id
  WHERE b.`department_id` IS NOT NULL
    AND b.`department_id` <> ''
    AND old_d.`deptId` IS NULL;

  SELECT ROW_COUNT() AS updated_rows;

  -- 确认更新结果正确后执行
  COMMIT;

  如需恢复,可根据业务表主键执行:

  UPDATE `your_business_table` b
  JOIN `your_business_table_dept_bak_20260909` bak
    ON bak.`id` = b.`id`
  SET b.`department_id` = bak.`department_id`;预先格式化的文本

脚本会跳过当前属于多个部门的人员,避免错误替换。若存在一人多部门、人员字段不是 memberId、部门字段为多选部门,或使用 PostgreSQL/SQL Server,请不要直接执行,需要按实际表结构调整

数据库为jit默认的内置数据库,内置数据库应该在哪能找到对应的数据条?

你是服务器版本 还是 桌面版

服务器

服务器版的默认内置数据库是 MySQL,请使用服务器部署配置中的 MYSQL 连接信息访问;数据库名是应用 appId 将英文句点 . 替换为下划线 _,例如 org.app 对应 org_app。组织架构数据位于 corp_member、corp_dept_member、corp_dept,但需要修复的旧部门 ID 在具体业务模型 dbTable 对应的业务表中。请补充应用 appId、业务模型名称或 fullName、人员字段名和部门字段名,我们再按实际表结构给出查询及修复 SQL;确认前请勿直接执行之前的 UPDATE 脚本。

MYSQL 连不上,需要帮忙看下

容器内mysql端口映射出来了吗,默认用户名密码你知不知道