员工亲属实体关联

This commit is contained in:
wkc
2026-04-24 13:29:13 +08:00
parent b7db711906
commit aa08ab4711
51 changed files with 2070 additions and 845 deletions

View File

@@ -0,0 +1,37 @@
# 员工信息维护双 Sheet 导入后端实施计划
## 目标
- 将员工信息维护导入模板改为 `员工信息` + `员工资产信息` 双 Sheet。
- 统一由 `/ccdi/baseStaff/importData` 接收单文件上传,并按有数据的 Sheet 分别调用现有员工导入与员工资产导入方法。
- 员工信息导入取消“更新已存在员工”能力,命中现有员工 ID 或身份证号时直接记失败。
- 两类失败记录统一补充 `sheetName``rowNum``errorMessage`,便于直接定位 Excel 中的失败位置。
## 实施内容
- 控制器改造
- 修改 `CcdiBaseStaffController#importTemplate`,下载双 Sheet 模板,文件名统一为“员工信息维护导入模板”。
- 修改 `CcdiBaseStaffController#importData`,按 Sheet 名分别读取 `CcdiBaseStaffExcel``CcdiBaseStaffAssetInfoExcel`
- 两个 Sheet 均为空时返回错误;任一 Sheet 有数据时,仅提交对应导入任务。
- 返回新的双任务提交结果对象,包含 `staffTaskId``assetTaskId``message`
- 服务改造
- 修改 `ICcdiBaseStaffService``CcdiBaseStaffServiceImpl`,移除 `updateSupport` 参数。
- 修改 `ICcdiBaseStaffImportService``CcdiBaseStaffImportServiceImpl`,移除更新分支与 `insertOrUpdateBatch` 调用。
- 员工导入校验统一为:
- 员工 ID 已存在:失败
- 身份证号已存在:失败
- Excel 内重复:失败
- 员工资产导入补充重复校验:
- 数据库中存在同一 `personId + assetMainType + assetSubType + assetName`:失败
- 导入文件中存在同一组合重复:失败
- VO 修正
- 新增员工双 Sheet 提交结果 VO。
- 修正员工导入失败记录 VO 字段名为 `staffId`,与前端表格字段保持一致。
- 员工与员工资产失败记录 VO 均增加 `sheetName``rowNum`
## 验证
- `mvn -pl ccdi-info-collection,ruoyi-admin -am -DskipTests compile`
- 补充控制器与服务层回归测试,覆盖双 Sheet 分发与“已存在即失败”规则。
## 影响范围
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/`

View File

@@ -0,0 +1,26 @@
# 2026-04-22 招投标导入失败展示增强后端实施计划
## 1. 目标
- 为招投标导入失败记录补充失败来源 `Sheet`
- 为失败记录补充 Excel 失败行号
- 保持现有导入校验逻辑不变,仅增强失败记录元数据
## 2. 涉及范围
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/PurchaseTransactionImportFailureVO.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiPurchaseTransactionImportServiceImpl.java`
## 3. 实施步骤
1. 在失败记录 VO 中新增 `sheetName``sheetRowNum` 字段,供前端弹窗直接读取
2. 在导入服务中为主信息 Sheet 和供应商明细 Sheet 建立“Excel 数据行号”上下文
3. 在主信息校验、供应商校验、主从关系校验、空采购事项 ID 供应商校验等失败分支中,统一写入对应的 `Sheet` 与行号
4. 对跨多行触发的失败场景,行号以合并字符串形式返回,便于页面直接展示
5. 保留原有失败原因与业务字段,避免影响已有失败记录查询接口
## 4. 验证方式
- 执行后端编译,确认新增字段和异常封装无编译错误
- 通过真实页面上传失败样本,核对失败记录接口返回 `sheetName / sheetRowNum / errorMessage`
- 覆盖至少一个主信息失败样本和一个供应商明细失败样本

View File

@@ -0,0 +1,39 @@
# 员工亲属关系维护双 Sheet 导入后端实施计划
## 目标
- 将员工亲属关系维护导入模板改为双 Sheet
- `员工亲属关系信息`
- `亲属资产信息`
- 将导入提交入口统一到 `/ccdi/staffFmyRelation/importData`
- 统一补充失败记录定位字段,支持前端展示 `Sheet / Excel行号 / 失败原因`
## 实施内容
- Controller 调整
- `CcdiStaffFmyRelationController#importTemplate` 改为输出双 Sheet 模板,模板文件名统一为“员工亲属关系维护导入模板”。
- `CcdiStaffFmyRelationController#importData` 一次读取两个 Sheet。
- 按有数据的 Sheet 分别提交亲属关系导入任务和亲属资产导入任务。
- 返回新的提交结果 VO包含 `relationTaskId``assetTaskId` 和提示文案。
- VO 调整
- `StaffFmyRelationImportFailureVO` 增加 `sheetName``rowNum`
- `AssetImportFailureVO` 增加 `sheetName``rowNum`
- 新增 `StaffFmyRelationImportSubmitResultVO`
- 导入服务调整
- `CcdiStaffFmyRelationImportServiceImpl` 失败记录写入固定 `sheetName=员工亲属关系信息`,并记录 Excel 数据行号。
- `CcdiAssetInfoImportServiceImpl` 失败记录写入固定 `sheetName=亲属资产信息`,并记录 Excel 数据行号。
- 兼容策略
- 保留原 `CcdiAssetInfoController` 的状态查询与失败记录查询接口,前端继续复用原有资产任务轮询与失败记录查看能力。
## 验证
- 后端优先验证:
- `CcdiStaffFmyRelationControllerTest`
- `CcdiAssetInfoControllerTest`
- 编译验证:
- `mvn -pl ccdi-info-collection -am -Dmaven.test.skip=true compile`
## 影响范围
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiStaffFmyRelationController.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiStaffFmyRelationImportServiceImpl.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiAssetInfoImportServiceImpl.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/StaffFmyRelationImportFailureVO.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/AssetImportFailureVO.java`
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/StaffFmyRelationImportSubmitResultVO.java`

View File

@@ -0,0 +1,32 @@
# 员工信息导入机构号校验后端实施计划
## 目标
- 在员工信息 Excel 导入链路中校验 `所属部门IDdeptId` 是否对应有效机构号。
- 有效口径统一为 `sys_dept` 中“正常且未删除”的部门,即 `status = '0'``del_flag = '0'`
- 命中不存在、已停用或已删除的部门时,不入库,直接进入员工导入失败记录。
## 实施内容
- 导入服务改造
- 修改 `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiBaseStaffImportServiceImpl.java`
-`validateStaffData` 中于必填校验后增加 `deptId` 有效性校验。
- 新增私有方法按 `deptId` 查询部门并校验 `status``delFlag`
- 校验失败时抛出统一错误文案:`所属部门ID[xxx]不存在或已停用/删除,请检查机构号`
- 部门 Mapper 对齐
- 修改 `ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml`
-`selectDeptById` 查询补齐 `d.del_flag` 字段,保证导入服务可同时判断停用与逻辑删除状态。
- 单元测试补充
- 修改 `ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffImportServiceImplTest.java`
- 增加部门存在、停用、删除三类校验测试。
- 修改 `ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffDualImportServiceTest.java`
- 增加混合导入场景测试,验证合法员工成功入库、非法 `deptId` 写入失败记录且任务状态为 `PARTIAL_SUCCESS`
## 验证
- 定向单测:
- `mvn -pl ccdi-info-collection -am -Dsurefire.failIfNoSpecifiedTests=false -Dtest=CcdiBaseStaffImportServiceImplTest,CcdiBaseStaffDualImportServiceTest test`
- 编译校验:
- `mvn -pl ccdi-info-collection,ruoyi-admin -am -DskipTests compile`
## 影响范围
- 员工信息导入后端异步校验逻辑
- 系统部门主键查询字段映射
- 员工导入相关单元测试

View File

@@ -0,0 +1,23 @@
# 招投标供应商校验后端实施计划
## 目标
- 让招投标信息维护页面的新增、编辑接口仅保留供应商名称和统一信用代码必填校验。
- 移除供应商联系人、联系电话、银行账户,以及供应商名称/统一信用代码的内容格式校验,避免页面保存被接口层拦截。
## 实施内容
- 调整 `CcdiPurchaseTransactionSupplierDTO`
- 保留 `supplierName``@NotBlank`
-`supplierUscc` 增加 `@NotBlank` 必填校验。
- 移除 `supplierName` 的长度校验。
- 移除 `supplierUscc` 的格式校验。
- 移除 `contactPerson``contactPhone``supplierBankAccount` 的内容校验注解。
## 验证
- `mvn -pl ccdi-info-collection -am -DskipTests compile`
- `sh bin/restart_java_backend.sh`
- 结合真实页面验证:
- 新增弹窗提交 `supplierUscc=ABC``contactPhone=123` 成功
- 编辑弹窗提交 `supplierUscc=XYZ``contactPhone=abc123` 成功
## 产出文件
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiPurchaseTransactionSupplierDTO.java`

View File

@@ -0,0 +1,38 @@
# 员工信息维护双 Sheet 导入前端实施计划
## 目标
- 将员工信息维护页面的两个导入按钮合并为一个。
- 统一使用双 Sheet 模板上传,并根据后端返回的 `staffTaskId``assetTaskId` 分别沿用原有轮询与失败记录能力。
- 保留员工失败记录与员工资产失败记录两个独立查看入口。
- 两个失败记录弹窗都需要展示失败来源 Sheet、Excel 行号和失败原因。
## 实施内容
- 页面入口调整
- 删除“导入资产信息”按钮,仅保留一个“导入”按钮。
- 删除独立员工资产上传弹窗,保留一个统一上传弹窗。
- 上传交互调整
- 去掉“是否更新已经存在的员工数据”复选框。
- 模板提示调整为双 Sheet 说明,明确支持只填一个或同时填写两个 Sheet。
- 下载模板文件名统一为“员工信息维护导入模板”。
- 任务处理调整
- 上传成功后解析 `staffTaskId``assetTaskId`
- 有员工任务 ID 时,启动原员工导入轮询。
- 有资产任务 ID 时,启动原资产导入轮询。
- 未返回的任务类型不清空对应历史失败记录状态。
- 失败记录展示调整
- 员工失败记录弹窗增加 `Sheet``Excel行号` 列。
- 员工资产失败记录弹窗增加 `Sheet``Excel行号` 列。
- API 调整
- `ruoyi-ui/src/api/ccdiBaseStaff.js` 去掉 `updateSupport` 参数,保持单文件上传定义。
## 验证
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && npm run build:prod`
- 页面联调覆盖:
- 只导员工 Sheet
- 只导资产 Sheet
- 双 Sheet 同时导入
- 两类失败记录入口分别展示
## 影响范围
- `ruoyi-ui/src/views/ccdiBaseStaff/index.vue`
- `ruoyi-ui/src/api/ccdiBaseStaff.js`

View File

@@ -0,0 +1,23 @@
# 2026-04-22 招投标导入失败展示增强前端实施计划
## 1. 目标
- 调整招投标信息维护页面的“导入失败记录”弹窗
- 让失败列表直接展示失败来源 `Sheet`、失败行号、失败原因
## 2. 涉及范围
- `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue`
## 3. 实施步骤
1. 在失败记录弹窗表格中新增 `失败Sheet`
2. 在失败记录弹窗表格中新增 `失败行号`
3. 保留现有 `采购事项ID / 项目名称 / 标的物名称 / 失败原因` 上下文信息
4. 对多行场景直接展示后端返回的合并行号,不在前端重复解析
## 4. 验证方式
- 使用真实页面上传失败样本
- 打开“查看导入失败记录”弹窗,核对主信息失败能显示 `招投标主信息 + 行号 + 原因`
- 核对供应商失败能显示 `供应商明细 + 行号 + 原因`

View File

@@ -0,0 +1,35 @@
# 员工亲属关系维护双 Sheet 导入前端实施计划
## 目标
- 将员工亲属关系维护页面顶部两个导入按钮合并为一个。
- 上传弹窗改为双 Sheet 提示和统一模板下载。
- 保留原有两套任务轮询与失败记录入口,但失败记录列表统一展示 `Sheet / Excel行号 / 失败原因`
## 实施内容
- 页面入口调整
- 删除“导入亲属资产信息”独立按钮。
- 删除独立资产上传弹窗,仅保留统一导入弹窗。
- 上传交互调整
- 导入弹窗提示模板包含 `员工亲属关系信息``亲属资产信息` 两个 Sheet。
- 下载模板文件名统一为“员工亲属关系维护导入模板”。
- 上传成功后解析后端返回的 `relationTaskId``assetTaskId`
- 状态管理调整
-`relationTaskId` 时沿用原亲属关系任务轮询与失败记录缓存。
-`assetTaskId` 时沿用原亲属资产任务轮询与失败记录缓存。
- 未返回的任务类型不主动清空既有历史失败记录状态。
- 失败记录展示调整
- 亲属关系失败记录弹窗新增 `Sheet``Excel行号` 列。
- 亲属资产失败记录弹窗新增 `Sheet``Excel行号` 列。
## 验证
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-detail-import-ui.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-submit-flow.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-maintenance-layout.test.js`
- 页面联调覆盖:
- 只导亲属关系 Sheet
- 只导亲属资产 Sheet
- 双 Sheet 同时导入
- 两类失败记录列表都显示 `Sheet / Excel行号 / 失败原因`
## 影响范围
- `ruoyi-ui/src/views/ccdiStaffFmyRelation/index.vue`

View File

@@ -0,0 +1,22 @@
# 招投标供应商校验前端实施计划
## 目标
- 将招投标信息维护页面新增、编辑弹窗中的供应商明细校验收敛为:
- 供应商名称必填
- 统一信用代码必填
- 移除联系人、联系电话、银行账户,以及供应商名称/统一信用代码的内容校验提示。
## 实施内容
- 调整 `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue` 中的 `getSupplierFieldRules`
- `supplierName` 仅保留必填规则。
- `supplierUscc` 改为仅保留必填规则。
- `contactPerson``contactPhone``supplierBankAccount` 不再返回校验规则。
## 验证
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && npm run build:prod`
- 使用 Playwright 打开真实页面 `http://127.0.0.1:62319/maintain/purchaseTransaction`
- 新增弹窗录入 `supplierUscc=ABC``contactPhone=123` 后可保存
- 编辑弹窗录入 `supplierUscc=XYZ``contactPhone=abc123` 后可保存
## 产出文件
- `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue`

View File

@@ -0,0 +1,40 @@
# 员工信息维护双 Sheet 导入实施记录
## 本次修改
- 后端将员工信息维护导入模板改为双 Sheet
- `员工信息`
- `员工资产信息`
- 后端导入入口统一到 `/ccdi/baseStaff/importData`,按有数据的 Sheet 分别提交员工导入任务与员工资产导入任务。
- 员工信息导入移除了更新现有员工能力,现有员工 ID 或身份证号冲突统一进入失败记录。
- 员工资产导入补充了重复校验,当前按 `personId + assetMainType + assetSubType + assetName` 识别重复,命中数据库或导入文件内重复时直接进入失败记录。
- 前端删除独立“导入资产信息”按钮与独立资产上传弹窗,改为单入口上传双 Sheet 模板。
- 前端上传成功后,按返回的两个任务 ID 分别沿用原有轮询、失败记录缓存和失败记录弹窗能力。
- 修正员工导入失败记录字段为 `staffId`,保证失败记录列表能正确显示柜员号。
- 员工失败记录与员工资产失败记录都增加了 `Sheet``Excel行号``失败原因` 定位信息。
## 影响范围
- 后端
- `ccdi-info-collection` 员工导入控制器、服务接口、异步导入服务、导入结果 VO
- 前端
- `ruoyi-ui/src/views/ccdiBaseStaff/index.vue`
- `ruoyi-ui/src/api/ccdiBaseStaff.js`
## 验证情况
- 后端编译
- `mvn -pl ccdi-info-collection,ruoyi-admin -am -DskipTests compile`
- 结果:通过
- 前端构建
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && npm run build:prod`
- 结果:通过
- 备注:构建输出仍有既有体积告警,但未阻断构建
## 测试说明
- 已补充员工双 Sheet 导入相关单测文件,并执行:
- `mvn -pl ccdi-info-collection -am -Dtest=CcdiBaseStaffControllerTest,CcdiBaseStaffDualImportServiceTest,CcdiBaseStaffAssetImportServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 结果:通过
- 已通过 Playwright 在真实员工信息维护页面验证:
- 页面仅保留一个“导入”按钮
- 导入弹窗展示双 Sheet 提示文案
- 两个失败入口可恢复显示
- 员工失败弹窗显示 `Sheet / Excel行号 / 失败原因`
- 资产失败弹窗显示 `Sheet / Excel行号 / 失败原因`

View File

@@ -0,0 +1,51 @@
# 2026-04-22 员工信息维护真实页面测试执行记录
## 1. 执行内容
- 启动前端开发服务,端口使用 `1025`
- 使用真实浏览器进入“信息维护-员工信息维护”页面
- 完整验证以下链路:
- 列表加载
- 详情查看
- 新增员工及资产
- 编辑员工及资产
- 删除
- 导入模板下载
- 双 Sheet 导入
- 员工导入失败记录查看
- 员工资产导入失败记录查看
## 2. 环境信息
- 前端地址:`http://127.0.0.1:1025`
- 后端地址:`http://127.0.0.1:62318`
- Mock 服务:`http://127.0.0.1:8000`
- Node 版本:`v14.21.3`
- 浏览器方式Playwright headed 模式真实浏览器
## 3. 结果摘要
- 页面新增员工 `9260422` 成功,编辑成功,详情可正常展示资产明细。
- 双 Sheet 导入成功写入员工 `9260423`,并成功向员工 `9260422` 导入资产 `导入资产车位A-0422`
- 员工导入失败记录正确命中 `该员工ID已存在`
- 员工资产导入失败记录正确命中 `员工资产导入仅支持员工本人证件号`
- 本轮新增与导入成功数据均已通过真实页面删除清理。
- 页面本地导入缓存 `employee_import_last_task``employee_asset_import_last_task` 已清理。
## 4. 发现问题
- 员工详情弹窗中“所属部门”未正确回显。
- 同一员工在列表中显示 `若依科技`,进入详情后该字段显示为 `-`
## 5. 产出物
- 测试记录:
- `/Users/wkc/Desktop/ccdi/ccdi/docs/tests/records/2026-04-22-base-staff-maintenance-browser-test-record.md`
- 导入样本:
- `/Users/wkc/Desktop/ccdi/ccdi/output/spreadsheet/base_staff_import_browser_mixed.xlsx`
## 6. 收尾情况
- 已关闭 Playwright 浏览器会话
- 已关闭前端 `1025` 进程
- 已停止本轮通过 `bin/restart_java_backend.sh` 拉起的后端进程

View File

@@ -0,0 +1,46 @@
# 2026-04-22 招投标导入失败展示增强实施记录
## 1. 本次变更
- 招投标导入失败记录新增失败来源 `Sheet`
- 招投标导入失败记录新增 Excel 失败行号
- 招投标信息维护页面失败弹窗新增 `失败Sheet``失败行号` 展示列
## 2. 文档落点确认
- 后端实施计划:`/Users/wkc/Desktop/ccdi/ccdi/docs/plans/backend/2026-04-22-bidding-import-failure-display-backend-implementation.md`
- 前端实施计划:`/Users/wkc/Desktop/ccdi/ccdi/docs/plans/frontend/2026-04-22-bidding-import-failure-display-frontend-implementation.md`
- 实施记录:`/Users/wkc/Desktop/ccdi/ccdi/docs/reports/implementation/2026-04-22-bidding-import-failure-display-implementation.md`
## 3. 实施内容
- 在后端失败记录 VO 中新增 `sheetName``sheetRowNum`
- 在导入服务中为主信息、供应商明细两类导入行建立行号上下文
- 在主信息校验失败、供应商校验失败、主从关系失败等场景下统一返回失败来源 Sheet 与行号
- 在前端失败弹窗中新增 `失败Sheet``失败行号` 列,直接展示后端返回值
## 4. 预期验证点
- 主信息失败记录显示 `招投标主信息`
- 供应商失败记录显示 `供应商明细`
- 失败行号与 Excel 实际数据行一致
- 同一失败由多行触发时,页面可直接展示合并行号
## 5. 实际验证结果
- 后端执行 `mvn -pl ccdi-info-collection -am compile -DskipTests` 编译通过
- 后端通过 `bin/restart_java_backend.sh` 完成重启,前端通过 `nvm use` 后启动真实页面进行验证
- 在真实页面上传 `bidding_import_structure.xlsx` 后,导入任务 `f1026563-4bf3-4f1d-ae27-d3f9623547f4` 成功生成失败记录
- 页面“查看导入失败记录”弹窗已展示以下表头:
- `失败Sheet`
- `失败行号`
- `采购事项ID`
- `项目名称`
- `标的物名称`
- `失败原因`
- 真实页面已验证的失败展示样例:
- `供应商明细 | 第8行 | 供应商明细Sheet中的采购事项ID不能为空`
- `招投标主信息 | 第2行 | 采购事项ID[LSFXMOCKP2PUR001]已存在,请勿重复导入`
- `招投标主信息 | 第3、4行 | 采购事项ID[IMPCOV20260422154511STR03]在招投标主信息Sheet中重复`
- `供应商明细 | 第4、5行 | 采购事项ID[IMPCOV20260422154511STR02]缺少招投标主信息`
- 本次验证样本未产生成功导入数据,无需额外回滚业务数据

View File

@@ -0,0 +1,48 @@
# 员工亲属关系维护双 Sheet 导入实施记录
## 本次修改
- 将员工亲属关系维护顶部两个导入按钮合并为一个统一导入入口。
- 导入模板改为双 Sheet
- `员工亲属关系信息`
- `亲属资产信息`
- 导入提交入口统一到 `/ccdi/staffFmyRelation/importData`,按有数据的 Sheet 分别提交亲属关系任务和亲属资产任务。
- 新增 `StaffFmyRelationImportSubmitResultVO`,返回 `relationTaskId``assetTaskId` 和提交提示文案。
- 员工亲属关系失败记录与亲属资产失败记录都增加了 `Sheet``Excel行号``失败原因` 定位信息。
- 前端删除独立亲属资产上传弹窗,但保留原有两套轮询和失败记录查看入口。
## 影响范围
- 后端
- `ccdi-info-collection` 员工亲属关系导入控制器、两类异步导入服务、失败记录 VO、导入提交结果 VO、相关控制器测试
- 前端
- `ruoyi-ui/src/views/ccdiStaffFmyRelation/index.vue`
- `ruoyi-ui/tests/unit/staff-family-asset-detail-import-ui.test.js`
## 验证情况
- 后端构建
- `sh bin/restart_java_backend.sh restart`
- 结果:通过,`ruoyi-admin` 已基于本次代码重新打包并启动成功。
- 前端单测
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-detail-import-ui.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-submit-flow.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && node tests/unit/staff-family-asset-maintenance-layout.test.js`
- 结果:通过
- 后端编译/测试
- `mvn -pl ccdi-info-collection -am -Dtest=CcdiStaffFmyRelationControllerTest,CcdiAssetInfoControllerTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 结果:通过,`Tests run: 10, Failures: 0, Errors: 0`
- 真实页面实测
- 前端端口:`1026`
- 使用 Playwright 打开真实页面 `/maintain/staffFmyRelation`
- 实测结果:
- 页面顶部仅保留一个“导入”按钮
- 从页面内下载到新的双 Sheet 模板,实际包含 `员工亲属关系信息``亲属资产信息` 两张表
- 通过双 Sheet 失败样本上传后,页面同时出现“查看导入失败记录”和“查看亲属资产导入失败记录”两个失败入口
- 后端接口核验
- 使用双 Sheet 失败样本调用 `/ccdi/staffFmyRelation/importData`
- 再分别查询 `/ccdi/staffFmyRelation/importFailures/{relationTaskId}``/ccdi/assetInfo/importFailures/{assetTaskId}`
- 返回结果已确认包含:
- 亲属关系失败记录:`sheetName=员工亲属关系信息``rowNum=2``errorMessage=员工身份证号格式不正确`
- 亲属资产失败记录:`sheetName=亲属资产信息``rowNum=2``errorMessage=未找到亲属资产归属员工`
## 后续实测
- 本轮已完成真实页面双 Sheet 导入实测与失败接口核验。
- 若后续需要补充界面截图或失败弹窗截图,可直接复用 `output/playwright/base-staff-maintenance-test/` 下本轮产物继续追踪。

View File

@@ -0,0 +1,63 @@
# 2026-04-23 `116.62.17.81:9444` Docker 部署记录
## 保存路径确认
- 目标目录:`docs/reports/implementation/`
- 文档用途:记录本次部署执行过程、影响范围与验证结果
- 路径检查结果:符合仓库实施记录归档规范
## 本次操作
- 在本地仓库 `/Users/wkc/Desktop/ccdi/ccdi` 执行部署
- 前端先通过 `nvm use` 切换到 `ruoyi-ui/.nvmrc` 指定版本:`Node v14.21.3`
- 执行后端打包:`mvn clean package -DskipTests`
- 执行前端打包:`cd ruoyi-ui && npm run build:prod`
- 执行部署脚本:`./deploy/deploy-to-nas.sh`
- 部署目标:
- SSH`116.62.17.81:9444`
- 远端目录:`/volume1/webapp/ccdi`
- 宿主机内网地址:`192.168.0.111`
## 影响范围
- 远端部署目录 `/volume1/webapp/ccdi` 已刷新为本次构建产物
- Docker 服务已重建:
- `ccdi-backend`
- `ccdi-frontend`
- `ccdi-lsfx-mock`
- 本次仓库内仅新增本实施记录文档,无业务代码改动
## 验证结果
### 构建验证
- Maven 聚合打包成功,`ruoyi-admin/target/ruoyi-admin.jar` 已生成
- Vue 生产构建成功,`ruoyi-ui/dist` 已生成
- 前端构建期间仅出现体积告警,无构建失败
### 远端容器验证
- `docker compose ps` 结果:
- `ccdi-backend``Up`
- `ccdi-frontend``Up`
- `ccdi-lsfx-mock``Up`
- 端口监听结果:
- `62318 -> backend:8080`
- `62319 -> frontend:80`
- `62320 -> backend network / mock:8000`
### 应用可用性验证
- 宿主机本机访问 `127.0.0.1` 返回正常:
- `http://127.0.0.1:62319` 返回 `200 OK`
- `http://127.0.0.1:62318/swagger-ui/index.html` 返回 `200`
- `http://127.0.0.1:62320/docs` 返回 `200 OK`
- 后端日志确认:
- `nas` profile 已启用
- TongWeb `8080` 已启动
- `RuoYiApplication` 启动完成
## 额外说明
- 通过公网地址 `116.62.17.81:62318/62319/62320` 访问时,当前观测到的是 `Empty reply from server`
- 由于宿主机实际网卡地址为 `192.168.0.111``116.62.17.81` 属于外层公网映射地址,因此当前应用侧与 Docker 侧均已正常,剩余问题若需继续处理,应排查公网入口到宿主机 `62318/62319/62320` 的端口转发或 NAT/网关链路

View File

@@ -0,0 +1,28 @@
# 员工信息导入机构号校验实施记录
## 文档信息
- 保存路径:`docs/reports/implementation/2026-04-23-base-staff-import-dept-validation-implementation.md`
- 实施日期2026-04-23
- 关联范围:员工信息维护后端导入链路
## 本次修改内容
1.`CcdiBaseStaffImportServiceImpl` 中新增 `deptId` 校验逻辑,要求导入员工的所属部门必须在 `sys_dept` 中存在且处于正常、未删除状态。
2. 机构号校验失败时,导入记录不入库,失败原因统一写入现有失败记录字段 `errorMessage`,错误文案为 `所属部门ID[xxx]不存在或已停用/删除,请检查机构号`
3. 补齐 `SysDeptMapper.xml``selectDeptById``del_flag` 字段映射,避免导入服务误把逻辑删除部门识别为有效部门。
4. 补充员工导入服务层与异步导入流程单元测试,覆盖部门不存在、部门停用、部门删除和合法/非法混合导入场景。
## 影响范围
- 后端:
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiBaseStaffImportServiceImpl.java`
- `ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml`
- 测试:
- `ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffImportServiceImplTest.java`
- `ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffDualImportServiceTest.java`
## 验证情况
1. 定向单测:
- 命令:`mvn -pl ccdi-info-collection -am -Dsurefire.failIfNoSpecifiedTests=false -Dtest=CcdiBaseStaffImportServiceImplTest,CcdiBaseStaffDualImportServiceTest test`
- 结果:通过,`Tests run: 13, Failures: 0, Errors: 0, Skipped: 0`
2. 编译校验:
- 命令:`mvn -pl ccdi-info-collection,ruoyi-admin -am -DskipTests compile`
- 结果通过Reactor Summary 中 `ccdi-info-collection``ruoyi-admin` 及其依赖模块均为 `SUCCESS`

View File

@@ -0,0 +1,44 @@
# 招投标供应商校验调整实施记录
## 本次改动
- 招投标信息维护页面新增、编辑弹窗中的供应商明细校验调整为仅保留:
- 供应商名称必填
- 统一信用代码必填
- 移除了前端弹窗中供应商名称长度、统一信用代码格式、联系人长度、联系电话格式、银行账户长度校验。
- 移除了新增/编辑接口 DTO 中对应的供应商内容校验,确保真实页面保存链路与弹窗规则一致。
## 关键文件
- 前端
- `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue`
- 后端
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiPurchaseTransactionSupplierDTO.java`
## 验证结果
- 后端编译
- 命令:`mvn -pl ccdi-info-collection -am -DskipTests compile`
- 结果:通过。
- 后端重启
- 命令:`sh bin/restart_java_backend.sh`
- 结果:构建并重启成功。
- 前端构建
- 命令:`source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && npm run build:prod`
- 结果:通过,仅有既有产物体积 warning。
- Playwright 实页验证
- 页面:`http://127.0.0.1:62319/maintain/purchaseTransaction`
- 新增验证:
- 采购事项ID`AUTOBID20260423145630`
- 供应商统一信用代码:`ABC`
- 供应商联系电话:`123`
- 结果:新增成功。
- 编辑验证:
- 项目名称改为:`校验放开回归项目-145630-编辑`
- 供应商统一信用代码改为:`XYZ`
- 供应商联系电话改为:`abc123`
- 结果:修改成功。
- 清理验证:
- 删除 `AUTOBID20260423145630`
- 结果:删除成功,列表总数回到 `2004`
## 过程说明
- 首轮真实页验证发现,前端规则放开后,新增接口仍因 `CcdiPurchaseTransactionSupplierDTO` 的 Bean Validation 拦截 `supplierUscc``contactPhone`
- 因此本次最终方案同时调整了前端弹窗规则与后端 DTO 校验,保证页面行为与需求一致。

View File

@@ -0,0 +1,188 @@
# 信息维护页面搜索区四列栅格统一实施记录
## 1. 实施目标
将信息维护同批页面的搜索区统一为每行 4 个字段位的栅格布局,超过 4 个字段自动换行,最后一行不足 4 项时保留空白字段位,不拉伸现有字段;同时清理查询区内遗留的固定像素宽度写法。
## 2. 实施范围
本次实际调整的前端文件如下:
- `ruoyi-ui/src/views/ccdiBaseStaff/index.vue`
- `ruoyi-ui/src/views/ccdiStaffRecruitment/index.vue`
- `ruoyi-ui/src/views/ccdiStaffTransfer/index.vue`
- `ruoyi-ui/src/views/ccdiStaffFmyRelation/index.vue`
- `ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue`
- `ruoyi-ui/src/views/ccdiCreditInfo/index.vue`
- `ruoyi-ui/src/views/ccdiEnterpriseBaseInfo/index.vue`
- `ruoyi-ui/src/views/ccdiIntermediary/components/SearchForm.vue`
- `ruoyi-ui/src/views/ccdiAccountInfo/index.vue`
- `ruoyi-ui/src/views/ccdiCustFmyRelation/index.vue`
- `ruoyi-ui/src/views/ccdiCustEnterpriseRelation/index.vue`
- `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue`
本轮未提交的临时验证文件:
- `output/playwright/info-maintenance-search-grid-check.js`
## 3. 实施内容
### 3.1 查询区统一为四列栅格
- 将目标页面的头部查询表单从 `:inline="true"` 流式排布改为 `el-row + el-col :span="6"` 栅格排布
- 每个查询项固定占一个字段位
- 超过 4 个字段自动换到下一行
- 最后一行不足 4 项时保留空白字段位,不做横向拉伸
### 3.2 字段内部控件统一铺满字段位
- 将查询区里的输入框、下拉框、日期范围、树选择统一改为 `style="width: 100%"`
- 清理查询区中遗留的固定像素宽度写法,不再依赖 `style="width: Npx"` 控制布局
- 补充查询区专用样式,使 `el-row` 使用换行布局,`el-col` 不再依赖旧浮动行为导致错位
### 3.3 保持原有交互和业务逻辑不变
- 未修改 `queryParams``handleQuery``resetQuery`
- 未修改搜索、重置、业务按钮、`right-toolbar` 的行为
- 日期范围仍按一个字段位处理,仅在所属字段位内铺满
## 4. TDD / 结构校验
### 4.1 先写临时结构校验脚本
新增临时脚本:
- `output/playwright/info-maintenance-search-grid-check.js`
脚本校验口径:
- 只识别头部查询表单,不误扫弹窗表单
- 查询区是否采用 `el-col :span="6"`
- 查询项数量是否符合预期
- 查询区内是否仍保留 `style="width: Npx"` 固定像素宽度
- 账户库管理页是否仍残留旧的查询区局部覆盖样式
### 4.2 先失败,再通过
首次执行命令:
```bash
source ~/.nvm/nvm.sh && cd ruoyi-ui && nvm use >/dev/null && cd .. && node output/playwright/info-maintenance-search-grid-check.js
```
初次结果:
- 12 个目标页面全部报出“未使用 `span=6`”和“仍存在固定像素宽度”的失败
页面改造完成后再次执行同一命令,结果为:
- `信息维护搜索区四列栅格结构校验通过`
## 5. 构建验证
### 5.1 Node 版本
执行命令:
```bash
source ~/.nvm/nvm.sh && cd ruoyi-ui && nvm use
```
结果:
- 命中项目 `nvm` 配置
- 使用项目要求的 Node 版本完成后续脚本和构建
### 5.2 前端构建
执行命令:
```bash
source ~/.nvm/nvm.sh && cd ruoyi-ui && nvm use >/dev/null && npm run build:prod
```
结果:
- 构建成功
- 无新增模板语法错误
- 仅保留项目原有的体积告警
## 6. 真实页面浏览器验证
### 6.1 启动服务
前端开发服务:
```bash
source ~/.nvm/nvm.sh && cd ruoyi-ui && nvm use >/dev/null && npm_config_port=1025 npm run dev
```
后端服务:
```bash
sh bin/restart_java_backend.sh start
```
说明:
- 本轮验证时后端原本未运行,因此使用仓库规定脚本启动
- 使用真实登录页进入系统,账号为 `admin / admin123`
### 6.2 布局验证结果
使用 Playwright 进入以下代表页并读取查询区实际列位位置:
- `/maintain/baseStaff`
- `/maintain/enterpriseBaseInfo`
- `/maintain/accountInfo`
- `/maintain/creditInfo`
- `/maintain/intermediary`
- `/maintain/staffTransfer`
- `/maintain/purchaseTransaction`
验证结果:
- 员工信息维护5 个字段,实际排布为 `4 + 1`
- 实体库管理8 个字段,实际排布为 `4 + 4`
- 账户库管理9 个字段,实际排布为 `4 + 4 + 1`
- 征信维护2 个字段,实际排布为单行 2 项,未拉伸成半屏布局
- 中介库管理4 个字段,实际排布为单行 4 列
- 员工调动记录6 个字段,实际排布为 `4 + 2`
- 招投标信息维护4 个字段,日期范围与其他查询项等宽,占 1 个字段位
浏览器读取到的列位位置表现一致:
- 同一行 4 列的左边界稳定为四等分位置
- 超过 4 个字段的新一行从第一列起始位置重新排列
- 最后一行不足 4 项时未发生拉伸
### 6.3 重置验证
在真实业务页面中使用 Playwright 做了两组输入与重置验证:
1. 员工信息维护
- 向“姓名”输入框填入 `测试姓名`
- 点击页面 `重置`
- 再次读取输入框值,结果为空字符串
2. 账户库管理
- 向“员工姓名”输入框填入 `验证员工`
- 点击页面 `重置`
- 再次读取输入框值,结果为空字符串
结论:
- 搜索区改为四列栅格后,`重置` 交互未受影响
## 7. 进程清理
本轮验证结束后已关闭:
- 前端开发服务 `npm run dev`
- 后端服务 `sh bin/restart_java_backend.sh start` 启动的后端进程,使用 `sh bin/restart_java_backend.sh stop` 停止
- Playwright 浏览器会话
## 8. 风险与说明
- 当前工作区存在其他与本任务无关的未提交改动,本次未回退这些既有改动,仅在搜索区四列栅格范围内继续修改目标页面
- 临时结构校验脚本位于 `output/playwright/`,用于本轮 TDD 校验,不纳入 git 提交