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

255 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 员工实体关系导入 - 补充说明文档
## 文档说明
**创建日期:** 2026-02-11
**关联功能:** 员工实体关系信息维护
**关联审查:** [2026-02-11-staff-relation-import-fix-review.md](./2026-02-11-staff-relation-import-fix-review.md)
---
## 一、身份证号存在性检查功能说明
### 1.1 功能现状
**当前状态:****未实现**
员工实体关系导入功能**不会验证**身份证号是否存在于 `ccdi_base_staff` 表中。
**影响:**
- 用户可以导入包含不存在身份证号的员工实体关系数据
- 导入过程中不会因为身份证号不存在而报错
### 1.2 设计符合性分析
#### ✅ 符合参照标准
**参照对象:** `CcdiPurchaseTransactionImportServiceImpl`(采购交易管理)
**验证结果:**
```bash
# 在采购交易导入服务中搜索身份证号存在性检查
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查询验证引用完整性
```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数据库外键约束可选**
⚠️ **注意:** 添加外键约束会影响性能和灵活性,建议谨慎使用。
```sql
-- 添加外键约束(生产环境慎用)
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调用建议
**前端导入提示:**
```javascript
// 在导入对话框中添加提示信息
this.$message.info({
message: '请确保身份证号已在员工信息表中存在,导入工具不会验证身份证号的有效性',
duration: 5000
});
```
**API文档说明**
```markdown
### 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);
```
2. **定期数据质量检查**
```sql
-- 定期运行此查询,发现引用完整性问题
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;
```
3. **应用层外键约束**(可选)
- 在新增接口中添加存在性检查
- 仅对单条新增生效,不影响批量导入
### Q4: 未来是否会添加身份证号存在性验证?
**A:**
取决于业务需求:
**可能添加的场景:**
- 业务部门明确要求验证身份证号存在性
- 发现大量因引用完整性导致的数据问题
- 需要通过等保或合规性检查
**保持现状的场景:**
- 当前业务流程运行正常
- 用户能够通过其他途径保证数据质量
- 性能要求高于数据完整性要求
---
## 四、技术实现细节
### 4.1 当前验证逻辑
**验证位置:** `CcdiStaffEnterpriseRelationImportServiceImpl.validateRelationData()`
**验证内容:**
```java
// 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 |
---
## 六、相关文档
- [员工实体关系信息维护功能设计文档](../design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md)
- [2026-02-11 员工实体关系导入代码审查报告(修复后复审)](./2026-02-11-staff-relation-import-fix-review.md)
- [采购交易管理功能实现](../../ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiPurchaseTransactionImportServiceImpl.java)