11 KiB
实体库管理设计文档
1. 背景
当前仓库已经存在企业主体表 ccdi_enterprise_base_info,并且“中介管理”中的实体中介部分已经在复用该表完成部分新增、编辑、详情和导入能力。
本次需求不是新建表,也不是扩展复杂关联能力,而是基于现有企业主体表,单独建设一个“实体库管理”页面,并严格参照“员工信息维护”的实现方式交付完整的新增、查看、编辑、删除、导入能力。
2. 目标
建设一套独立的“实体库管理”模块,满足以下要求:
- 页面名称固定为“实体库管理”
- 数据表固定为
ccdi_enterprise_base_info - 功能范围仅包含单表维护,不引入子表或聚合编辑
- 支持新建、查看、编辑、删除、导入
- 页面交互、接口组织、异步导入、失败记录查看方式整体对齐员工信息维护
riskLevel、entSource允许维护,不写死- 导入时若统一社会信用代码已存在,一律按失败处理,不覆盖更新
3. 非目标
- 不改造“中介管理”现有混合页面
- 不在本次中引入企业附属信息子表
- 不在本次中引入员工企业关系、客户企业关系、中介关系联动维护
- 不设计兼容性补丁式方案,不保留中介实体 DTO 命名给新模块复用
4. 现状分析
4.1 已有基础
仓库中已经存在以下可复用基础:
- 实体表对应领域对象:
CcdiEnterpriseBaseInfo - 实体表 Mapper:
CcdiEnterpriseBaseInfoMapper - 中介模块中的实体新增、编辑、详情、导入能力
- 员工信息维护的完整单表维护范式:
- 独立 Controller
- 独立 DTO / VO / Excel / ImportFailureVO
- 独立前端页面与 API
- 异步导入状态轮询
- 失败记录分页查看
4.2 已有问题
当前实体企业数据虽然已经能在中介模块中被部分维护,但存在以下问题:
- 业务语义属于“中介管理”,不等于“实体库管理”
- DTO / VO / Excel 命名与字段口径绑定在
IntermediaryEntity语义上 - 现有实体中介字段未完整覆盖本次需要维护的
status、riskLevel、entSource、dataSource - 页面是中介混合模式,不符合“完全按照员工信息维护方式实现”的要求
因此本次应建设独立模块,而不是继续把“实体库管理”能力挂靠在中介模块之下。
5. 方案比较
5.1 方案一:新建独立实体库管理模块
做法:
- 新建独立的后端 Controller / Service / DTO / VO / Excel / 导入服务
- 新建独立前端页面、独立 API、独立菜单和权限
- 底层复用
ccdi_enterprise_base_info
优点:
- 与“员工信息维护”模式最一致
- 业务语义清晰,后续维护成本最低
- 不会把“实体库管理”和“中介管理”概念揉在一起
缺点:
- 开发量略高于直接复用中介实体代码
5.2 方案二:直接复用中介管理中的实体部分
做法:
- 将中介管理中的“实体中介”能力直接暴露为实体库入口
优点:
- 改动少
缺点:
- 模块语义错误
- DTO / VO / 页面命名与业务不一致
- 后续权限、菜单、字段扩展容易混乱
5.3 方案三:页面独立,后端继续复用中介实体 DTO / 导入类
做法:
- 页面新建
- 后端尽量套用
IntermediaryEntity的类和导入逻辑
优点:
- 开发速度较快
缺点:
- 代码命名混乱
- 字段口径不完整
- 后续扩展时会继续带来语义污染
5.4 结论
采用方案一:新建独立“实体库管理”模块,底层复用 ccdi_enterprise_base_info,实现方式全面对齐员工信息维护。
6. 总体设计
6.1 模块边界
本次实体库管理模块只负责维护 ccdi_enterprise_base_info 单表数据,不承担其他关系表维护职责。
6.2 后端结构
新增独立链路:
CcdiEnterpriseBaseInfoControllerICcdiEnterpriseBaseInfoServiceCcdiEnterpriseBaseInfoServiceImplCcdiEnterpriseBaseInfoQueryDTOCcdiEnterpriseBaseInfoAddDTOCcdiEnterpriseBaseInfoEditDTOCcdiEnterpriseBaseInfoVOCcdiEnterpriseBaseInfoExcelEnterpriseBaseInfoImportFailureVOICcdiEnterpriseBaseInfoImportServiceCcdiEnterpriseBaseInfoImportServiceImpl
Mapper 层优先复用现有 CcdiEnterpriseBaseInfoMapper,若分页查询或批量导入需要独立 SQL,则在现有 Mapper 基础上补充对应方法。
6.3 前端结构
新增独立页面与 API:
ruoyi-ui/src/views/ccdiEnterpriseBaseInfo/index.vueruoyi-ui/src/api/ccdiEnterpriseBaseInfo.js
页面交互模式整体对齐员工信息维护:
- 查询表单
- 工具栏按钮
- 数据表格
- 新增/编辑弹窗
- 详情弹窗
- 导入弹窗
- 导入失败记录查看
7. 数据口径设计
7.1 主键
主键固定为 socialCreditCode。
规则如下:
- 新增时必填
- 编辑时不可修改
- 详情、删除、导入去重均以该字段为准
7.2 维护字段
本次页面维护字段覆盖 ccdi_enterprise_base_info 核心单表字段:
socialCreditCodeenterpriseNameenterpriseTypeenterpriseNatureindustryClassindustryNameestablishDateregisterAddresslegalRepresentativelegalCertTypelegalCertNoshareholder1shareholder2shareholder3shareholder4shareholder5statusriskLevelentSourcedataSource
7.3 字段策略
riskLevel允许查询、展示、编辑、导入entSource允许查询、展示、编辑、导入dataSource允许查询、展示、编辑、导入- 不新增动态股东列表,继续保持
shareholder1-5固定字段结构
8. 页面设计
8.1 查询区
查询条件按员工信息维护的密度设计,包含:
- 企业名称
- 统一社会信用代码
- 企业类型
- 企业性质
- 行业分类
- 经营状态
- 风险等级
- 企业来源
8.2 列表区
建议展示列:
- 企业名称
- 统一社会信用代码
- 企业类型
- 企业性质
- 行业分类
- 所属行业
- 法定代表人
- 经营状态
- 风险等级
- 企业来源
- 数据来源
- 创建时间
- 操作
操作列固定为:
- 详情
- 编辑
- 删除
8.3 新增/编辑弹窗
交互方式对齐员工信息维护,采用整页弹窗表单。
表单项包含:
- 统一社会信用代码
- 企业名称
- 企业类型
- 企业性质
- 行业分类
- 所属行业
- 成立日期
- 注册地址
- 法定代表人
- 法定代表人证件类型
- 法定代表人证件号码
- 股东1
- 股东2
- 股东3
- 股东4
- 股东5
- 经营状态
- 风险等级
- 企业来源
- 数据来源
其中:
- 新增时
socialCreditCode可填写 - 编辑时
socialCreditCode禁止修改
8.4 详情弹窗
详情展示字段与编辑表单保持同口径,采用只读方式展示。
8.5 导入交互
导入流程完全对齐员工信息维护:
- 下载模板
- 上传 Excel
- 提交异步导入任务
- 轮询导入状态
- 本地缓存最近一次任务信息
- 导入失败时展示“查看导入失败记录”按钮
- 失败记录支持分页查看
9. 接口设计
接口前缀建议统一为 /ccdi/enterpriseBaseInfo。
9.1 列表查询
GET /ccdi/enterpriseBaseInfo/list
入参为查询 DTO,返回分页表格结构。
9.2 详情查询
GET /ccdi/enterpriseBaseInfo/{socialCreditCode}
9.3 新增
POST /ccdi/enterpriseBaseInfo
9.4 编辑
PUT /ccdi/enterpriseBaseInfo
9.5 删除
DELETE /ccdi/enterpriseBaseInfo/{socialCreditCodes}
支持批量删除。
9.6 导入模板
POST /ccdi/enterpriseBaseInfo/importTemplate
9.7 导入数据
POST /ccdi/enterpriseBaseInfo/importData
9.8 查询导入状态
GET /ccdi/enterpriseBaseInfo/importStatus/{taskId}
9.9 查询导入失败记录
GET /ccdi/enterpriseBaseInfo/importFailures/{taskId}
10. 权限与菜单设计
新增菜单名称固定为“实体库管理”。
建议菜单与权限如下:
- 菜单路径:
enterpriseBaseInfo - 组件路径:
ccdiEnterpriseBaseInfo/index - 列表权限:
ccdi:enterpriseBaseInfo:list - 查询权限:
ccdi:enterpriseBaseInfo:query - 新增权限:
ccdi:enterpriseBaseInfo:add - 修改权限:
ccdi:enterpriseBaseInfo:edit - 删除权限:
ccdi:enterpriseBaseInfo:remove - 导入权限:
ccdi:enterpriseBaseInfo:import
菜单应挂到“信息维护”目录下,方式与员工信息维护等现有业务菜单一致。
11. 校验规则
11.1 新增/编辑校验
- 企业名称不能为空
- 统一社会信用代码不能为空
- 统一社会信用代码必须符合 18 位社会信用代码格式
- 新增时若数据库中已存在相同统一社会信用代码,则报错
- 编辑时若记录不存在,则报错
status、riskLevel、entSource、dataSource必须在允许值内- 其他字段按长度、日期格式做基础校验
11.2 导入校验
- Excel 至少包含一条数据
- 企业名称不能为空
- 统一社会信用代码不能为空
- 统一社会信用代码格式必须正确
- 同一导入文件中若统一社会信用代码重复,则该重复记录失败
- 数据库中若已存在相同统一社会信用代码,则该记录失败
12. 导入策略
本次导入采用“严格新增”策略,不支持覆盖更新。
即:
- 不提供
updateSupport覆盖更新能力 - 已存在统一社会信用代码的记录直接记为失败
- Excel 内重复记录直接记为失败
- 成功记录批量插入
- 失败记录落 Redis,保留最近任务失败明细查询能力
导入状态结构与员工信息维护保持一致:
PROCESSINGSUCCESSPARTIAL_SUCCESS
13. 错误处理
错误处理遵循现有员工维护风格,使用直接明确的业务提示:
- “该统一社会信用代码已存在”
- “实体信息不存在”
- “至少需要一条数据”
- “任务不存在或已过期”
不引入额外异常框架或复杂回退逻辑。
14. 测试设计
14.1 后端测试重点
- 列表分页和多条件查询正确
- 详情返回正确
- 新增成功,主键重复时报错
- 编辑成功,编辑不存在记录时报错
- 删除成功
- 导入成功、部分成功、失败状态正确
- 导入失败记录查询正确
14.2 前端测试重点
- 查询、重置、分页交互正常
- 新增、详情、编辑、删除链路正常
- 编辑态主键不可修改
- 导入弹窗、状态轮询、失败记录查看正常
- 最近一次导入任务缓存与失败按钮显示逻辑正常
- 权限按钮显示与菜单路由正确
15. 实施文档要求
由于本次需求涉及前后端改动,后续实施阶段需按仓库规范输出两份实施计划:
- 后端实施计划:
docs/plans/backend/ - 前端实施计划:
docs/plans/frontend/
16. 最终结论
本次采用“独立实体库管理模块 + 复用现有企业主体表”的实现方式,以最短路径满足业务目标,同时保证:
- 业务语义清晰
- 代码结构与员工信息维护一致
riskLevel、entSource、dataSource均可维护- 导入严格新增,重复统一社会信用代码直接失败
- 不引入超出需求范围的扩展能力