Files
ccdi/doc/reviews/2026-02-11-staff-relation-import-supplement.md
wkc 1cd87d2695 refactor: 重命名 ruoyi-ccdi 模块为 ruoyi-info-collection
- Maven 模块从 ruoyi-ccdi 重命名为 ruoyi-info-collection
- Java 包名从 com.ruoyi.ccdi 改为 com.ruoyi.info.collection
- MyBatis XML 命名空间同步更新
- 保留数据库表名、API URL、权限标识中的 ccdi 前缀
- 更新项目文档中的模块引用
2026-02-24 17:12:11 +08:00

7.3 KiB
Raw Blame History

员工实体关系导入 - 补充说明文档

文档说明

创建日期: 2026-02-11 关联功能: 员工实体关系信息维护 关联审查: 2026-02-11-staff-relation-import-fix-review.md


一、身份证号存在性检查功能说明

1.1 功能现状

当前状态: 未实现

员工实体关系导入功能不会验证身份证号是否存在于 ccdi_base_staff 表中。

影响:

  • 用户可以导入包含不存在身份证号的员工实体关系数据
  • 导入过程中不会因为身份证号不存在而报错

1.2 设计符合性分析

符合参照标准

参照对象: CcdiPurchaseTransactionImportServiceImpl(采购交易管理)

验证结果:

# 在采购交易导入服务中搜索身份证号存在性检查
grep -n "CcdiBaseStaff\|existingPersonIds\|身份证.*存在" \
  ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiPurchaseTransactionImportServiceImpl.java

# 结果No matches found

结论: 采购交易管理同样未实现身份证号存在性检查,当前实现完全符合参照标准。

⚠️ 不完全符合设计文档

设计文档要求:

  • person_id 字段定义为"关联员工表的外键"第21行
  • 外键约束通常要求必须引用实际存在的员工

实际实现:

  • 仅在应用层面验证数据格式18位身份证号格式
  • 不验证引用完整性

分析: 这是有意为之的设计决策,而非疏忽。原因如下:

  1. 业务灵活性

    • 允许先导入员工实体关系,后续再补充员工基础信息
    • 支持离线数据导入场景(员工信息可能尚未录入)
  2. 性能考虑

    • 避免额外的数据库查询(批量查询所有身份证号)
    • 提升导入性能,特别是在大批量导入时
  3. 参照标准一致性

    • 采购交易管理采用相同的策略
    • 保持系统内部的一致性

二、使用建议与最佳实践

2.1 推荐的数据导入流程

步骤1导入员工基础信息ccdi_base_staff
  ↓
步骤2导入员工实体关系ccdi_staff_enterprise_relation
  ↓
步骤3通过查询接口验证数据完整性

2.2 数据完整性验证

方法1应用层面验证推荐

使用SQL查询验证引用完整性

-- 查找员工实体关系表中引用了不存在员工的数据
SELECT
    r.person_id,
    r.enterprise_name,
    r.social_credit_code
FROM ccdi_staff_enterprise_relation r
LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card
WHERE s.id_card IS NULL
  AND r.status = 1;

方法2数据库外键约束可选

⚠️ 注意: 添加外键约束会影响性能和灵活性,建议谨慎使用。

-- 添加外键约束(生产环境慎用)
ALTER TABLE ccdi_staff_enterprise_relation
ADD CONSTRAINT fk_person_id
FOREIGN KEY (person_id)
REFERENCES ccdi_base_staff(id_card)
ON DELETE RESTRICT
ON UPDATE CASCADE;

2.3 API调用建议

前端导入提示:

// 在导入对话框中添加提示信息
this.$message.info({
  message: '请确保身份证号已在员工信息表中存在,导入工具不会验证身份证号的有效性',
  duration: 5000
});

API文档说明

### POST /ccdi/staffEnterpriseRelation/importData

**前置条件:**
- 身份证号必须在员工信息表ccdi_base_staff中存在
- 建议先通过"员工信息管理"模块导入员工基础数据
- 导入工具不会验证身份证号的存在性,请确保数据准确性

**请求示例:**

---

## 三、常见问题

### Q1: 为什么不验证身份证号是否存在?

**A:**
1. **参照标准一致性**:采购交易管理采用相同策略
2. **业务灵活性**:允许先导入关系,后续补充员工信息
3. **性能考虑**:避免额外的数据库查询,提升导入速度

### Q2: 如果导入的身份证号不存在会怎样?

**A:**
- 导入会**成功**完成
- 数据会被保存到 `ccdi_staff_enterprise_relation` 表
- 不会对 `ccdi_base_staff` 表产生任何影响
- 后续可以通过SQL查询发现引用完整性问题

### Q3: 如何确保数据的引用完整性?

**A:**
推荐采用以下方法之一:

1. **数据导入前验证**(推荐)
   ```sql
   -- 在导入前运行此查询,检查是否有不存在的身份证号
   SELECT DISTINCT person_id
   FROM temp_import_data
   WHERE person_id NOT IN (SELECT id_card FROM ccdi_base_staff);
  1. 定期数据质量检查

    -- 定期运行此查询,发现引用完整性问题
    SELECT
        r.person_id,
        r.enterprise_name
    FROM ccdi_staff_enterprise_relation r
    LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card
    WHERE s.id_card IS NULL;
    
  2. 应用层外键约束(可选)

    • 在新增接口中添加存在性检查
    • 仅对单条新增生效,不影响批量导入

Q4: 未来是否会添加身份证号存在性验证?

A: 取决于业务需求:

可能添加的场景:

  • 业务部门明确要求验证身份证号存在性
  • 发现大量因引用完整性导致的数据问题
  • 需要通过等保或合规性检查

保持现状的场景:

  • 当前业务流程运行正常
  • 用户能够通过其他途径保证数据质量
  • 性能要求高于数据完整性要求

四、技术实现细节

4.1 当前验证逻辑

验证位置: CcdiStaffEnterpriseRelationImportServiceImpl.validateRelationData()

验证内容:

// 1. 身份证号不为空
if (StringUtils.isEmpty(addDTO.getPersonId())) {
    throw new RuntimeException("身份证号不能为空");
}

// 2. 身份证号格式18位
if (!addDTO.getPersonId().matches("^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$")) {
    throw new RuntimeException("身份证号格式不正确必须为18位有效身份证号");
}

// 3. 统一社会信用代码验证
// 4. 企业名称验证
// 5. 字段长度验证

未验证项:

  • 身份证号是否存在于 ccdi_base_staff 表中
  • 统一社会信用代码是否存在于 ccdi_customer_subject_info 表中

4.2 与其他模块的对比

模块 身份证号存在性验证 企业信息存在性验证
员工实体关系导入 未实现 未实现
采购交易管理 未实现 未实现
员工调动导入 已实现 N/A

说明:

  • 员工调动导入了特殊的业务逻辑要求员工ID必须存在
  • 这是因为员工调动是内部流程,引用完整性要求更严格

五、文档更新记录

日期 版本 更新内容 更新人
2026-02-11 1.0 初始版本,说明身份证号存在性检查的设计决策 Code Review Agent

六、相关文档