| | |
| | | internalAuditCheck.setEndTime(checkDate.atTime(endTime)); |
| | | } |
| | | |
| | | // 5. 部门ID转换安全处理:避免非数字字符串导致NumberFormatException |
| | | Integer deptId1 = internalAuditCarryDept.getDeptId(); |
| | | Long deptId; |
| | | try { |
| | | deptId = Long.valueOf(deptId1); |
| | | } catch (NumberFormatException e) { |
| | | continue; |
| | | } |
| | | |
| | | // 6. 查询结果空防护:避免deptDetialVo为null导致后续getSysDeptResponsibilitys()报错 |
| | | DeptDetialVo deptDetialVo = sysDeptService.selectDeptById(deptId); |
| | | // 查询结果空防护:避免deptDetialVo为null导致后续getSysDeptResponsibilitys()报错 |
| | | DeptDetialVo deptDetialVo = sysDeptService.selectDeptById(Long.valueOf(internalAuditCarryDept.getDeptId())); |
| | | if (deptDetialVo == null) { |
| | | continue; |
| | | } |
| | |
| | | InternalAuditCheckCatalogue internalAuditCheckCatalogue = new InternalAuditCheckCatalogue(); |
| | | // 8. clauseId安全转换:避免null导致Math.toIntExact()报错 |
| | | Long clauseId = sysDeptResponsibility.getClauseId(); |
| | | if (clauseId != null) { |
| | | internalAuditCheckCatalogue.setCatalogueId(Math.toIntExact(clauseId)); |
| | | } else { |
| | | continue; |
| | | } |
| | | |
| | | // 9. 条款查询结果空防护:避免sysClauseManagement为null导致getPoints()报错 |
| | | SysClauseManagement sysClauseManagement = sysClauseManagementMapper.selectById(clauseId); |
| | | if (sysClauseManagement == null) { |
| | | continue; |
| | | } |
| | | |
| | | // 简化集合创建(原逻辑不变,仅优化初始化) |
| | | List<InternalAuditCheckContent> internalAuditCheckContents = new ArrayList<>(); |
| | | InternalAuditCheckContent internalAuditCheckContent = new InternalAuditCheckContent(); |
| | | internalAuditCheckContent.setPointKey(sysClauseManagement.getPoints()); |
| | | internalAuditCheckContents.add(internalAuditCheckContent); |
| | | |
| | | internalAuditCheckCatalogue.setCheckContents(internalAuditCheckContents); |
| | | internalAuditCheckCatalogue.setCatalogueId(Math.toIntExact(clauseId)); |
| | | internalAuditCheckCatalogue.setPointKey(sysClauseManagement.getPoints()); |
| | | internalAuditCheckCatalogues.add(internalAuditCheckCatalogue); |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | private CommonResult updateInternalAuditCheck(InternalAuditCarry carry) { |
| | | // 2. 空指针防护:避免deptList为null导致循环NPE |
| | | List<InternalAuditCarryDept> deptList = carry.getDeptList(); |
| | | if (CollectionUtils.isEmpty(deptList)) { |
| | | log.warn("保存/更新内部审计检查:部门列表为空,companyId={}, year={}"); |
| | | return CommonResult.success(); |
| | | } |
| | | |
| | | for (InternalAuditCarryDept internalAuditCarryDept : deptList) { |
| | | // 3. 跳过空的部门项,避免后续NPE |
| | | if (internalAuditCarryDept == null) { |
| | | log.warn("保存/更新内部审计检查:部门项为null,跳过"); |
| | | continue; |
| | | } |
| | | |
| | | InternalAuditCheck internalAuditCheck = new InternalAuditCheck(); |
| | | // 基础字段赋值(保留原逻辑不变) |
| | | internalAuditCheck.setCompanyId(carry.getCompanyId()); |
| | | internalAuditCheck.setYear(carry.getYear()); |
| | | internalAuditCheck.setDeptId(internalAuditCarryDept.getDeptId()); |
| | | internalAuditCheck.setPersonId(internalAuditCarryDept.getCheckId()); |
| | | internalAuditCheck.setCheckTime(internalAuditCarryDept.getDate()); |
| | | |
| | | // 4. 时间字段安全赋值:避免date/startTime/endTime为null导致atTime()报错 |
| | | LocalDate checkDate = internalAuditCarryDept.getDate(); |
| | | LocalTime startTime = internalAuditCarryDept.getStartTime(); |
| | | LocalTime endTime = internalAuditCarryDept.getEndTime(); |
| | | if (checkDate != null && startTime != null) { |
| | | internalAuditCheck.setStartTime(checkDate.atTime(startTime)); |
| | | } else { |
| | | log.warn("保存/更新内部审计检查:开始时间构造失败(日期/时段为空),deptId={}"); |
| | | } |
| | | if (checkDate != null && endTime != null) { |
| | | internalAuditCheck.setEndTime(checkDate.atTime(endTime)); |
| | | } else { |
| | | log.warn("保存/更新内部审计检查:结束时间构造失败(日期/时段为空),deptId={}"); |
| | | } |
| | | |
| | | // 5. 部门ID转换安全处理:避免非数字字符串导致NumberFormatException |
| | | Integer deptIdStr = internalAuditCarryDept.getDeptId(); |
| | | |
| | | Long deptId; |
| | | try { |
| | | deptId = Long.valueOf(deptIdStr); |
| | | } catch (NumberFormatException e) { |
| | | continue; |
| | | } |
| | | |
| | | // 6. 查询部门详情空防护:避免deptDetialVo为null导致后续NPE |
| | | DeptDetialVo deptDetialVo = sysDeptService.selectDeptById(deptId); |
| | | DeptDetialVo deptDetialVo = sysDeptService.selectDeptById(Long.valueOf(internalAuditCarryDept.getDeptId())); |
| | | if (deptDetialVo == null) { |
| | | log.warn("保存/更新内部审计检查:未查询到部门详情,deptId={}"); |
| | | continue; |
| | | } |
| | | List<SysDeptResponsibility> sysDeptResponsibilitys = deptDetialVo.getSysDeptResponsibilitys(); |
| | | |
| | | List<InternalAuditCheckCatalogue> internalAuditCheckCatalogues = new ArrayList<>(); |
| | | |
| | | // 7. 构建查询条件(保留原逻辑,仅优化日志) |
| | | Map<String, Object> queryMap = new HashMap<>(); |
| | | queryMap.put("dept_id", internalAuditCheck.getDeptId()); |
| | |
| | | queryMap.put("company_id", internalAuditCheck.getCompanyId()); |
| | | queryMap.put("del_flag", 0); |
| | | List<InternalAuditCheck> internalAuditChecks = internalAuditCheckService.selectByMap(queryMap); |
| | | log.debug("保存/更新内部审计检查:查询已有记录,条件={},查询结果数={}"); |
| | | |
| | | |
| | | |
| | | // 9. 循环构建新检查项(增加多层空防护) |
| | | List<InternalAuditCheckCatalogue> checkCatalogues = new ArrayList<>(); |
| | | if (!CollectionUtils.isEmpty(internalAuditChecks)){ |
| | | batchLoadCheckDetails(internalAuditChecks); |
| | | checkCatalogues = internalAuditChecks.get(0).getCheckCatalogues(); |
| | | } |
| | | // 循环构建新检查项 |
| | | if (!CollectionUtils.isEmpty(sysDeptResponsibilitys)) { |
| | | for (SysDeptResponsibility sysDeptResponsibility : sysDeptResponsibilitys) { |
| | | if (sysDeptResponsibility == null) { |
| | | log.warn("保存/更新内部审计检查:部门责任项为null,跳过"); |
| | | continue; |
| | | } |
| | | |
| | | // 防护:clauseId为空跳过,避免Math.toIntExact()报错 |
| | | Long clauseId = sysDeptResponsibility.getClauseId(); |
| | | if (clauseId == null) { |
| | | log.warn("保存/更新内部审计检查:条款ID为空,跳过该责任项"); |
| | | continue; |
| | | } |
| | | |
| | | InternalAuditCheckCatalogue catalogue = new InternalAuditCheckCatalogue(); |
| | | catalogue.setCatalogueId(Math.toIntExact(clauseId)); |
| | | |
| | | // 防护:条款查询为空跳过,避免getPoints()报错 |
| | | SysClauseManagement clauseManagement = sysClauseManagementMapper.selectById(clauseId); |
| | | catalogue.setCatalogueId(Math.toIntExact(sysDeptResponsibility.getClauseId())); |
| | | SysClauseManagement clauseManagement = sysClauseManagementMapper.selectById(sysDeptResponsibility.getClauseId()); |
| | | if (clauseManagement == null) { |
| | | continue; |
| | | } |
| | | |
| | | // 构建检查内容(保留原逻辑) |
| | | List<InternalAuditCheckContent> checkContents = new ArrayList<>(); |
| | | InternalAuditCheckContent content = new InternalAuditCheckContent(); |
| | | content.setPointKey(clauseManagement.getPoints()); |
| | | checkContents.add(content); |
| | | catalogue.setCheckContents(checkContents); |
| | | catalogue.setPointKey(clauseManagement.getPoints()); |
| | | if (!CollectionUtils.isEmpty(checkCatalogues)){ |
| | | for (InternalAuditCheckCatalogue checkCatalogue : checkCatalogues) { |
| | | if (checkCatalogue.getCatalogueId().equals(catalogue.getCatalogueId())){ |
| | | catalogue.setFind(checkCatalogue.getFind()); |
| | | // catalogue.setPointKey(checkCatalogue.getPointKey()); |
| | | catalogue.setResult(checkCatalogue.getResult()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | internalAuditCheckCatalogues.add(catalogue); |
| | | } |
| | | } else { |
| | | log.debug("保存/更新内部审计检查:部门无责任项,deptId={}"); |
| | | } |
| | | |
| | | // 8. 批量加载详情 + 合并已有检查项(关键防护:避免internalAuditChecks为空导致get(0)索引越界) |
| | | if (!CollectionUtils.isEmpty(internalAuditChecks)) { |
| | | batchLoadCheckDetails(internalAuditChecks); |
| | | InternalAuditCheck firstCheck = internalAuditChecks.get(0); |
| | | List<InternalAuditCheckCatalogue> existingCatalogues = firstCheck.getCheckCatalogues(); |
| | | |
| | | // 仅当旧数据非空、且新数据已存在时,才筛选合并旧数据 |
| | | if (!CollectionUtils.isEmpty(existingCatalogues) && !internalAuditCheckCatalogues.isEmpty()) { |
| | | // 提取新数据的所有catalogue_id(用Set实现O(1)快速匹配) |
| | | Set<Integer> newCatalogueIds = internalAuditCheckCatalogues.stream() |
| | | .map(InternalAuditCheckCatalogue::getCatalogueId) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 筛选旧数据:仅保留与新数据catalogue_id匹配的记录(避免无用旧数据) |
| | | List<InternalAuditCheckCatalogue> matchedOldCatalogues = existingCatalogues.stream() |
| | | .filter(oldCata -> newCatalogueIds.contains(oldCata.getCatalogueId())) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 合并筛选后的旧数据(新数据已在列表中,旧数据仅加匹配项) |
| | | internalAuditCheckCatalogues.addAll(matchedOldCatalogues); |
| | | } else if (CollectionUtils.isEmpty(internalAuditCheckCatalogues)) { |
| | | log.warn("保存/更新内部审计检查:无新构建的检查项,不合并旧数据,deptId={}, year={}"); |
| | | } else { |
| | | log.warn("保存/更新内部审计检查:已有记录无检查项,deptId={}, year={}"); |
| | | } |
| | | } |
| | | |
| | | // 去重优化:按catalogue_id可靠去重(核心修改:替代distinct(),避免依赖equals/hashCode) |
| | | List<InternalAuditCheckCatalogue> uniqueCatalogues = internalAuditCheckCatalogues.stream() |
| | | .collect(Collectors.toMap( |
| | | InternalAuditCheckCatalogue::getCatalogueId, // 唯一键:catalogue_id(确保去重逻辑) |
| | | Function.identity(), // 值:检查项对象 |
| | | (oldVal, newVal) -> newVal // 冲突策略:保留新数据(如需保留旧数据,改为oldVal) |
| | | )) |
| | | .values() |
| | | .stream() |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 最终设置(新数据全部保留,旧数据仅保留匹配项) |
| | | internalAuditCheck.setCheckCatalogues(uniqueCatalogues); |
| | | internalAuditCheck.setCheckCatalogues(uniqueCatalogues); |
| | | |
| | | internalAuditCheck.setCheckCatalogues(internalAuditCheckCatalogues); |
| | | // 新增/更新判断(保留原逻辑,增加日志) |
| | | if (CollectionUtils.isEmpty(internalAuditChecks)) { |
| | | |
| | | internalAuditCheckService.insertInternalAuditCheck(internalAuditCheck); |
| | | } else { |
| | | InternalAuditCheck existingCheck = internalAuditChecks.get(0); |
| | |
| | | internalAuditCheckService.updateByYearAndDeptId(internalAuditCheck); |
| | | } |
| | | } |
| | | |
| | | return CommonResult.success(); |
| | | } |
| | | |
| | | |
| | | |
| | | private void batchLoadCheckDetails(List<InternalAuditCheck> checks) { |
| | |
| | | .map(InternalAuditCheck::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | if (CollectionUtils.isEmpty(checkIds)){ |
| | | return; |
| | | } |
| | | //批量查询所有目录 |
| | | List<InternalAuditCheckCatalogue> allCatalogues = checkCatalogueMapper.selectByCheckIds(checkIds); |
| | | |
| | | if (CollectionUtils.isEmpty(allCatalogues)) { |
| | | return; |
| | | } |
| | | |
| | | //收集所有目录ID |
| | | List<Integer> catalogueIds = allCatalogues.stream() |
| | | .map(InternalAuditCheckCatalogue::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | //批量查询所有内容 |
| | | List<InternalAuditCheckContent> allContents = checkContentMapper.selectByCatalogueIds(catalogueIds); |
| | | |
| | | //按目录ID分组内容 |
| | | Map<Integer, List<InternalAuditCheckContent>> contentMap = allContents.stream() |
| | | .collect(Collectors.groupingBy(InternalAuditCheckContent::getCheckCatalogueId)); |
| | | |
| | | //按检查ID分组目录 |
| | | Map<Integer, List<InternalAuditCheckCatalogue>> catalogueMap = allCatalogues.stream() |
| | | .collect(Collectors.groupingBy(InternalAuditCheckCatalogue::getCheckId)); |
| | |
| | | for (InternalAuditCheck check : checks) { |
| | | List<InternalAuditCheckCatalogue> catalogues = catalogueMap.get(check.getId()); |
| | | if (!CollectionUtils.isEmpty(catalogues)) { |
| | | for (InternalAuditCheckCatalogue catalogue : catalogues) { |
| | | List<InternalAuditCheckContent> contents = contentMap.get(catalogue.getId()); |
| | | catalogue.setCheckContents(contents != null ? contents : new ArrayList<>()); |
| | | } |
| | | check.setCheckCatalogues(catalogues); |
| | | } |
| | | } |