diff --git a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitDefaults.java b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitDefaults.java new file mode 100644 index 0000000..8195191 --- /dev/null +++ b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitDefaults.java @@ -0,0 +1,48 @@ +package cn.iocoder.lyzsys.module.tjt.service.outputsplit; + +import cn.iocoder.lyzsys.module.tjt.dal.dataobject.outputsplit.ProjectOutputSplitDO; +import cn.iocoder.lyzsys.module.tjt.dal.dataobject.planning.ProjectPlanningDO; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 页面 4 拆分比例默认值构造器。 + * + *

所有“没有拆分记录时的默认比例”都从这里生成,避免页面、专业内分配、报表之间规则漂移。

+ * + * @author Codex + */ +public final class ProjectOutputSplitDefaults { + + private static final int RATIO_SCALE = 4; + private static final BigDecimal ZERO_RATIO = BigDecimal.ZERO.setScale(RATIO_SCALE, RoundingMode.HALF_UP); + private static final BigDecimal ONE_RATIO = BigDecimal.ONE.setScale(RATIO_SCALE, RoundingMode.HALF_UP); + + private ProjectOutputSplitDefaults() { + } + + public static ProjectOutputSplitDO build(ProjectPlanningDO planning) { + return build(planning, 0); + } + + public static ProjectOutputSplitDO build(ProjectPlanningDO planning, Integer fallbackYear) { + ProjectOutputSplitDO outputSplit = new ProjectOutputSplitDO(); + if (planning != null) { + outputSplit.setProjectId(planning.getProjectId()); + outputSplit.setPlanningId(planning.getId()); + outputSplit.setYear(planning.getPlanningStartYear() == null ? fallbackYear : planning.getPlanningStartYear()); + } + outputSplit.setProjectLeadRatio(ZERO_RATIO); + outputSplit.setOfficeRatio(ONE_RATIO); + outputSplit.setArchRatio(ONE_RATIO); + outputSplit.setDecorRatio(ZERO_RATIO); + outputSplit.setStructRatio(ZERO_RATIO); + outputSplit.setWaterRatio(ZERO_RATIO); + outputSplit.setElecRatio(ZERO_RATIO); + outputSplit.setHvacRatio(ZERO_RATIO); + outputSplit.setDigitalRatio(ZERO_RATIO); + return outputSplit; + } + +} diff --git a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitServiceImpl.java b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitServiceImpl.java index 5914624..1d27c5b 100644 --- a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitServiceImpl.java +++ b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitServiceImpl.java @@ -62,7 +62,7 @@ public class ProjectOutputSplitServiceImpl implements ProjectOutputSplitService ProjectDO project = validateProjectExists(planning.getProjectId()); ProjectOutputSplitDO outputSplit = projectOutputSplitMapper.selectByPlanningId(planningId); if (outputSplit == null) { - outputSplit = buildDefaultOutputSplit(planning); + outputSplit = ProjectOutputSplitDefaults.build(planning); } return buildRespVO(outputSplit, planning, project); } @@ -112,7 +112,7 @@ public class ProjectOutputSplitServiceImpl implements ProjectOutputSplitService if (outputSplit != null) { return outputSplit; } - ProjectOutputSplitDO createObj = buildDefaultOutputSplit(planning); + ProjectOutputSplitDO createObj = ProjectOutputSplitDefaults.build(planning); try { projectOutputSplitMapper.insert(createObj); return createObj; @@ -205,23 +205,6 @@ public class ProjectOutputSplitServiceImpl implements ProjectOutputSplitService return project; } - private ProjectOutputSplitDO buildDefaultOutputSplit(ProjectPlanningDO planning) { - ProjectOutputSplitDO outputSplit = new ProjectOutputSplitDO(); - outputSplit.setProjectId(planning.getProjectId()); - outputSplit.setPlanningId(planning.getId()); - outputSplit.setYear(getPlanningYear(planning)); - outputSplit.setProjectLeadRatio(ZERO_RATIO); - outputSplit.setOfficeRatio(ONE_RATIO); - outputSplit.setArchRatio(ONE_RATIO); - outputSplit.setDecorRatio(ZERO_RATIO); - outputSplit.setStructRatio(ZERO_RATIO); - outputSplit.setWaterRatio(ZERO_RATIO); - outputSplit.setElecRatio(ZERO_RATIO); - outputSplit.setHvacRatio(ZERO_RATIO); - outputSplit.setDigitalRatio(ZERO_RATIO); - return outputSplit; - } - private Integer getPlanningYear(ProjectPlanningDO planning) { return planning.getPlanningStartYear() == null ? 0 : planning.getPlanningStartYear(); } diff --git a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/report/ProjectOutputReportServiceImpl.java b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/report/ProjectOutputReportServiceImpl.java index 1e82b66..fe37116 100644 --- a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/report/ProjectOutputReportServiceImpl.java +++ b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/report/ProjectOutputReportServiceImpl.java @@ -30,6 +30,7 @@ import cn.iocoder.lyzsys.module.tjt.dal.mysql.yearkvalue.YearKValueMapper; import cn.iocoder.lyzsys.module.tjt.enums.OutputSplitBizConstants; import cn.iocoder.lyzsys.module.tjt.enums.ProjectPlanningBizTypeConstants; import cn.iocoder.lyzsys.module.tjt.enums.ProjectStatusEnum; +import cn.iocoder.lyzsys.module.tjt.service.outputsplit.ProjectOutputSplitDefaults; import cn.iocoder.lyzsys.module.tjt.service.outputsplit.ProjectOutputSplitService; import cn.iocoder.lyzsys.module.tjt.service.planningguidedetail.ProjectPlanningGuideDetailService; import cn.iocoder.lyzsys.module.tjt.service.report.builder.*; @@ -405,10 +406,10 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic List planningList = Collections.singletonList(anchorPlanning); Map> quarterMap = getQuarterMap(planningList); List relevantPlanningList = getSpecialtyPersonRelevantPlanningList(anchorPlanning); - Map outputSplitMap = getOutputSplitMap(relevantPlanningList); + Map outputSplitMap = getDefaultedOutputSplitMap(relevantPlanningList); Map> roleSplitMap = getRoleSplitMap(relevantPlanningList); List anchorRoleList = - specialtyRoleSplitService.getSpecialtyRoleSplitListByPlanningId(anchorPlanning.getId()); + roleSplitMap.getOrDefault(anchorPlanning.getId(), Collections.emptyList()); SpecialtyPersonOutputPreviewRespVO respVO = new SpecialtyPersonOutputPreviewRespVO(); respVO.setPlanningId(anchorPlanning.getId()); @@ -647,13 +648,11 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic List planningList = Collections.singletonList(anchorPlanning); Map> quarterMap = getQuarterMap(planningList); List relevantPlanningList = getSpecialtyPersonRelevantPlanningList(anchorPlanning); - Map outputSplitMap = getOutputSplitMap(relevantPlanningList); + Map outputSplitMap = getDefaultedOutputSplitMap(relevantPlanningList); Map> roleSplitMap = getRoleSplitMap(relevantPlanningList); List projectRolePersons = projectRolePersonMapper.selectListByProjectId(project.getId()); - List anchorRoleList = roleSplitMap.get(anchorPlanning.getId()); - if (anchorRoleList == null) { - anchorRoleList = specialtyRoleSplitService.getSpecialtyRoleSplitListByPlanningId(anchorPlanning.getId()); - } + List anchorRoleList = + roleSplitMap.getOrDefault(anchorPlanning.getId(), Collections.emptyList()); SpecialtyRoleSplitRespVO projectManagerRow = findRoleRow(anchorRoleList, OutputSplitBizConstants.SPECIALTY_PROJECT_LEAD, OutputSplitBizConstants.ROLE_PROJECT_MANAGER); SpecialtyRoleSplitRespVO engineeringPrincipalRow = findRoleRow(anchorRoleList, @@ -734,7 +733,7 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic Map projectMap = getProjectMap(planningList); Map> quarterMap = getQuarterMap(planningList); Map> roleSplitMap = getRoleSplitMap(planningList); - Map outputSplitMap = getExistingOutputSplitMap(planningList); + Map outputSplitMap = getDefaultedOutputSplitMap(planningList); Map accumulatorMap = new LinkedHashMap<>(); for (ProjectPlanningDO planning : planningList) { @@ -810,7 +809,7 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic List relevantPlanningList = getEmployeeOutputSummaryPlanningList(reqVO.getYear(), employeeIds); Map> quarterMap = getQuarterMap(relevantPlanningList); - Map outputSplitMap = getOutputSplitMap(relevantPlanningList); + Map outputSplitMap = getDefaultedOutputSplitMap(relevantPlanningList); Map> roleSplitMap = getRoleSplitMap(relevantPlanningList); Map accumulatorMap = new LinkedHashMap<>(); employeeIds.forEach(id -> accumulatorMap.put(id, new EmployeeAccumulator())); @@ -1721,32 +1720,13 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic private ProjectOutputSplitDO resolveQuarterOutputSplit(ProjectPlanningDO planning, Map outputSplitMap) { if (planning == null) { - return buildQuarterOutputDefaultSplit(null); + return ProjectOutputSplitDefaults.build(null); } ProjectOutputSplitDO outputSplit = outputSplitMap == null ? null : outputSplitMap.get(planning.getId()); if (outputSplit != null) { return outputSplit; } - return buildQuarterOutputDefaultSplit(planning); - } - - private ProjectOutputSplitDO buildQuarterOutputDefaultSplit(ProjectPlanningDO planning) { - ProjectOutputSplitDO outputSplit = new ProjectOutputSplitDO(); - if (planning != null) { - outputSplit.setProjectId(planning.getProjectId()); - outputSplit.setPlanningId(planning.getId()); - outputSplit.setYear(resolveReportYear(planning)); - } - outputSplit.setProjectLeadRatio(ZERO_RATIO); - outputSplit.setOfficeRatio(FULL_RATIO); - outputSplit.setArchRatio(FULL_RATIO); - outputSplit.setDecorRatio(ZERO_RATIO); - outputSplit.setStructRatio(ZERO_RATIO); - outputSplit.setWaterRatio(ZERO_RATIO); - outputSplit.setElecRatio(ZERO_RATIO); - outputSplit.setHvacRatio(ZERO_RATIO); - outputSplit.setDigitalRatio(ZERO_RATIO); - return outputSplit; + return ProjectOutputSplitDefaults.build(planning, resolveReportYear(planning)); } private int designPartOrder(String designPart) { @@ -1797,13 +1777,15 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic .collect(Collectors.groupingBy(ProjectPlanningQuarterDO::getPlanningId, LinkedHashMap::new, Collectors.toList())); } - private Map getOutputSplitMap(Collection planningList) { + private Map getDefaultedOutputSplitMap(Collection planningList) { if (planningList == null || planningList.isEmpty()) { return Collections.emptyMap(); } - Map map = new LinkedHashMap<>(); + Map map = new LinkedHashMap<>(getExistingOutputSplitMap(planningList)); for (ProjectPlanningDO planning : planningList) { - map.put(planning.getId(), projectOutputSplitService.getOrCreateProjectOutputSplit(planning.getId())); + if (planning != null && planning.getId() != null && !map.containsKey(planning.getId())) { + map.put(planning.getId(), ProjectOutputSplitDefaults.build(planning, resolveReportYear(planning))); + } } return map; } @@ -1824,7 +1806,7 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic .map(ProjectPlanningDO::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); - return specialtyRoleSplitService.getExistingSpecialtyRoleSplitListMapByPlanningIds(planningIds); + return specialtyRoleSplitService.getReadonlySpecialtyRoleSplitListMapByPlanningIds(planningIds); } private Map getProjectMap(Collection planningList) { diff --git a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitService.java b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitService.java index 7983b9e..409930d 100644 --- a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitService.java +++ b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitService.java @@ -20,6 +20,8 @@ public interface SpecialtyRoleSplitService { Map> getExistingSpecialtyRoleSplitListMapByPlanningIds(Collection planningIds); + Map> getReadonlySpecialtyRoleSplitListMapByPlanningIds(Collection planningIds); + void saveSpecialtyRoleSplitBatch(SpecialtyRoleSplitBatchSaveReqVO reqVO); void deleteByOutputSplitId(Long outputSplitId); diff --git a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitServiceImpl.java b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitServiceImpl.java index 10f2b52..7c505e4 100644 --- a/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitServiceImpl.java +++ b/lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/specialtyrolesplit/SpecialtyRoleSplitServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.lyzsys.module.tjt.dal.mysql.specialtyrolesplit.SpecialtyRoleSp import cn.iocoder.lyzsys.module.tjt.dal.mysql.specialtyrolesplitperson.SpecialtyRoleSplitPersonMapper; import cn.iocoder.lyzsys.module.tjt.enums.OutputSplitBizConstants; import cn.iocoder.lyzsys.module.tjt.service.employee.EmployeeService; +import cn.iocoder.lyzsys.module.tjt.service.outputsplit.ProjectOutputSplitDefaults; import cn.iocoder.lyzsys.module.tjt.service.outputsplit.ProjectOutputSplitService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -66,16 +67,21 @@ public class SpecialtyRoleSplitServiceImpl implements SpecialtyRoleSplitService @Override public Map> getSpecialtyRoleSplitListMapByPlanningIds(Collection planningIds) { - return getSpecialtyRoleSplitListMapByPlanningIds(planningIds, true); + return getSpecialtyRoleSplitListMapByPlanningIds(planningIds, true, false); } @Override public Map> getExistingSpecialtyRoleSplitListMapByPlanningIds(Collection planningIds) { - return getSpecialtyRoleSplitListMapByPlanningIds(planningIds, false); + return getSpecialtyRoleSplitListMapByPlanningIds(planningIds, false, false); + } + + @Override + public Map> getReadonlySpecialtyRoleSplitListMapByPlanningIds(Collection planningIds) { + return getSpecialtyRoleSplitListMapByPlanningIds(planningIds, false, true); } private Map> getSpecialtyRoleSplitListMapByPlanningIds( - Collection planningIds, boolean createMissingOutputSplit) { + Collection planningIds, boolean createMissingOutputSplit, boolean defaultMissingOutputSplit) { if (planningIds == null || planningIds.isEmpty()) { return Collections.emptyMap(); } @@ -112,6 +118,12 @@ public class SpecialtyRoleSplitServiceImpl implements SpecialtyRoleSplitService projectOutputSplitService.getOrCreateProjectOutputSplit(planning.getId())); } } + } else if (defaultMissingOutputSplit) { + for (ProjectPlanningDO planning : planningMap.values()) { + if (!outputSplitMap.containsKey(planning.getId())) { + outputSplitMap.put(planning.getId(), ProjectOutputSplitDefaults.build(planning)); + } + } } List outputSplitIds = outputSplitMap.values().stream()