From 33c5fe89b6a1e27eec40adc0ce7bc8bdee50c6b8 Mon Sep 17 00:00:00 2001
From: lzm <2316711944@qq.com>
Date: Wed, 3 Jun 2026 18:10:03 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ProjectOutputSplitDefaults.java | 48 ++++++++++++++++++
.../ProjectOutputSplitServiceImpl.java | 21 +-------
.../ProjectOutputReportServiceImpl.java | 50 ++++++-------------
.../SpecialtyRoleSplitService.java | 2 +
.../SpecialtyRoleSplitServiceImpl.java | 18 +++++--
5 files changed, 83 insertions(+), 56 deletions(-)
create mode 100644 lyzsys-module-tjt/src/main/java/cn/iocoder/lyzsys/module/tjt/service/outputsplit/ProjectOutputSplitDefaults.java
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()