枚举更换、归属类型调整

This commit is contained in:
lzm
2026-05-21 10:40:43 +08:00
parent 62b83546a1
commit b7b23f7613
17 changed files with 229 additions and 166 deletions

View File

@@ -18,10 +18,10 @@ public class ProjectPlanningPageReqVO extends PageParam {
@Schema(description = "项目 ID", example = "1")
private Long projectId;
@Schema(description = "归属类型", example = "专业所")
@Schema(description = "归属类型", example = "major")
private String ownershipType;
@Schema(description = "产值计算方式", example = "指导价法")
@Schema(description = "产值计算方式", example = "guidance_price")
private String calculationMethod;
@Schema(description = "项目任务包,模糊匹配", example = "建筑")

View File

@@ -24,12 +24,12 @@ public class ProjectPlanningSaveReqVO {
@Schema(description = "排序", example = "0")
private Integer sortNo;
@Schema(description = "归属类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "专业所")
@Schema(description = "归属类型major/comprehensive/special_subcontract_major/special_subcontract_source_coop/special_subcontract_comprehensive", requiredMode = Schema.RequiredMode.REQUIRED, example = "major")
@NotBlank(message = "归属类型不能为空")
@Size(max = 20, message = "归属类型长度不能超过 20 个字符")
@Size(max = 64, message = "归属类型长度不能超过 64 个字符")
private String ownershipType;
@Schema(description = "产值计算方式,页面 2 维护", example = "指导价法")
@Schema(description = "产值计算方式guidance_price/contract_price/virtual_output,页面 2 维护", example = "guidance_price")
@Size(max = 30, message = "产值计算方式长度不能超过 30 个字符")
private String calculationMethod;
@@ -73,7 +73,7 @@ public class ProjectPlanningSaveReqVO {
@Schema(description = "面积", example = "30000")
private BigDecimal planningArea;
@Schema(description = "设计阶段", example = "方案设计")
@Schema(description = "设计阶段scheme/construction_drawing/scheme_and_construction_drawing", example = "scheme")
@Size(max = 50, message = "设计阶段长度不能超过 50 个字符")
private String designStage;
@@ -119,7 +119,7 @@ public class ProjectPlanningSaveReqVO {
@Schema(description = "内部指导单价(元/m²", example = "80.00")
private BigDecimal internalGuidanceUnitPrice;
@Schema(description = "虚拟产值计算方式:指导单价法/指导总价法/工日法", example = "工日法")
@Schema(description = "虚拟产值计算方式:guidance_price/guidance_total_price/working_day", example = "working_day")
@Size(max = 30, message = "虚拟产值计算方式长度不能超过 30 个字符")
private String virtualCalculationMethod;

View File

@@ -17,7 +17,7 @@ public class ProjectPlanningGuideDetailSaveReqVO {
@Schema(description = "明细 ID", example = "1")
private Long id;
@Schema(description = "设计部位", requiredMode = Schema.RequiredMode.REQUIRED, example = "地上部分")
@Schema(description = "设计部位above_ground/underground/other", requiredMode = Schema.RequiredMode.REQUIRED, example = "above_ground")
@NotBlank(message = "设计部位不能为空")
@Size(max = 20, message = "设计部位长度不能超过 20 个字符")
private String designPart;

View File

@@ -34,15 +34,18 @@ public class ProjectProfitRespVO {
@Schema(description = "综合所人工成本")
private BigDecimal comprehensivePlanningAmount;
@Schema(description = "专项/源头合作分包人工成本合计")
@Schema(description = "专项分包人工成本合计")
private BigDecimal subcontractPlanningAmount;
@Schema(description = "专项分包人工成本")
@Schema(description = "专项分包-专业所人工成本")
private BigDecimal specialSubcontractPlanningAmount;
@Schema(description = "源头合作分包人工成本")
@Schema(description = "专项分包-源头合作分包人工成本")
private BigDecimal sourceCoopSubcontractPlanningAmount;
@Schema(description = "专项分包-综合所人工成本")
private BigDecimal comprehensiveSubcontractPlanningAmount;
@Schema(description = "专业所考核产值")
private BigDecimal majorOutputValue;

View File

@@ -24,7 +24,7 @@ public class ProjectPageReqVO extends PageParam {
@Schema(description = "项目开始年度", example = "2026")
private Integer projectStartYear;
@Schema(description = "项目状态", example = "进行中")
@Schema(description = "项目状态in_progress/completed/paused/terminated", example = "in_progress")
private String projectStatus;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

View File

@@ -72,7 +72,7 @@ public class ProjectSaveReqVO {
@NotNull(message = "项目开始年度不能为空")
private Integer projectStartYear;
@Schema(description = "项目状态", example = "进行中")
@Schema(description = "项目状态in_progress/completed/paused/terminated", example = "in_progress")
@Size(max = 20, message = "项目状态长度不能超过 20 个字符")
private String projectStatus;

View File

@@ -11,6 +11,7 @@ public interface ErrorCodeConstants {
// ========== 项目管理 1-020-001-000 ==========
ErrorCode PROJECT_NOT_EXISTS = new ErrorCode(1_020_001_000, "项目不存在");
ErrorCode PROJECT_STATUS_INVALID = new ErrorCode(1_020_001_001, "项目状态不正确");
// ========== 合约规划管理 1-020-002-000 ==========
ErrorCode PROJECT_PLANNING_NOT_EXISTS = new ErrorCode(1_020_002_000, "合约规划不存在");
@@ -25,6 +26,7 @@ public interface ErrorCodeConstants {
ErrorCode PROJECT_PLANNING_DESIGN_PART_INVALID = new ErrorCode(1_020_002_009, "设计部位不正确");
ErrorCode PROJECT_PLANNING_GUIDE_DETAIL_NOT_EXISTS = new ErrorCode(1_020_002_010, "指导价法明细不存在");
ErrorCode PROJECT_PLANNING_GUIDE_DETAIL_SCENE_INVALID = new ErrorCode(1_020_002_011, "当前合约规划不是专业所指导价法,不能维护指导价法明细");
ErrorCode PROJECT_PLANNING_DESIGN_STAGE_INVALID = new ErrorCode(1_020_002_012, "设计阶段不正确");
// ========== 季度分配管理 1-020-003-000 ==========
ErrorCode PROJECT_PLANNING_QUARTER_NOT_EXISTS = new ErrorCode(1_020_003_000, "季度分配明细不存在");

View File

@@ -15,55 +15,55 @@ import java.util.Map;
*/
public final class OutputSplitBizConstants {
public static final String SPECIALTY_PROJECT_LEAD = "project_lead";
public static final String SPECIALTY_ARCH = "arch";
public static final String SPECIALTY_DECOR = "decor";
public static final String SPECIALTY_STRUCT = "struct";
public static final String SPECIALTY_WATER = "water";
public static final String SPECIALTY_ELEC = "elec";
public static final String SPECIALTY_HVAC = "hvac";
public static final String SPECIALTY_DIGITAL = "digital";
public static final String SPECIALTY_PROJECT_LEAD = OutputSplitSpecialtyEnum.PROJECT_LEAD.getCode();
public static final String SPECIALTY_ARCH = OutputSplitSpecialtyEnum.ARCH.getCode();
public static final String SPECIALTY_DECOR = OutputSplitSpecialtyEnum.DECOR.getCode();
public static final String SPECIALTY_STRUCT = OutputSplitSpecialtyEnum.STRUCT.getCode();
public static final String SPECIALTY_WATER = OutputSplitSpecialtyEnum.WATER.getCode();
public static final String SPECIALTY_ELEC = OutputSplitSpecialtyEnum.ELEC.getCode();
public static final String SPECIALTY_HVAC = OutputSplitSpecialtyEnum.HVAC.getCode();
public static final String SPECIALTY_DIGITAL = OutputSplitSpecialtyEnum.DIGITAL.getCode();
public static final String ROLE_DIRECTOR = "director";
public static final String ROLE_CHECK = "check";
public static final String ROLE_REVIEW = "review";
public static final String ROLE_APPROVE = "approve";
public static final String ROLE_DESIGN = "design";
public static final String ROLE_PROJECT_MANAGER = "project_manager";
public static final String ROLE_ENGINEERING_PRINCIPAL = "engineering_principal";
public static final String ROLE_DIRECTOR = OutputSplitRoleEnum.DIRECTOR.getCode();
public static final String ROLE_CHECK = OutputSplitRoleEnum.CHECK.getCode();
public static final String ROLE_REVIEW = OutputSplitRoleEnum.REVIEW.getCode();
public static final String ROLE_APPROVE = OutputSplitRoleEnum.APPROVE.getCode();
public static final String ROLE_DESIGN = OutputSplitRoleEnum.DESIGN.getCode();
public static final String ROLE_PROJECT_MANAGER = OutputSplitRoleEnum.PROJECT_MANAGER.getCode();
public static final String ROLE_ENGINEERING_PRINCIPAL = OutputSplitRoleEnum.ENGINEERING_PRINCIPAL.getCode();
public static final List<SpecialtyItem> ASSIGNMENT_SPECIALTY_ITEMS = Arrays.asList(
new SpecialtyItem(SPECIALTY_PROJECT_LEAD, "项目经理/工程负责人", 0),
new SpecialtyItem(SPECIALTY_ARCH, "建筑", 1),
new SpecialtyItem(SPECIALTY_DECOR, "装饰", 2),
new SpecialtyItem(SPECIALTY_STRUCT, "结构", 3),
new SpecialtyItem(SPECIALTY_WATER, "给排水", 4),
new SpecialtyItem(SPECIALTY_ELEC, "电气", 5),
new SpecialtyItem(SPECIALTY_HVAC, "暖通", 6),
new SpecialtyItem(SPECIALTY_DIGITAL, "数字化设计", 7)
new SpecialtyItem(SPECIALTY_PROJECT_LEAD, OutputSplitSpecialtyEnum.PROJECT_LEAD.getLabel(), 0),
new SpecialtyItem(SPECIALTY_ARCH, OutputSplitSpecialtyEnum.ARCH.getLabel(), 1),
new SpecialtyItem(SPECIALTY_DECOR, OutputSplitSpecialtyEnum.DECOR.getLabel(), 2),
new SpecialtyItem(SPECIALTY_STRUCT, OutputSplitSpecialtyEnum.STRUCT.getLabel(), 3),
new SpecialtyItem(SPECIALTY_WATER, OutputSplitSpecialtyEnum.WATER.getLabel(), 4),
new SpecialtyItem(SPECIALTY_ELEC, OutputSplitSpecialtyEnum.ELEC.getLabel(), 5),
new SpecialtyItem(SPECIALTY_HVAC, OutputSplitSpecialtyEnum.HVAC.getLabel(), 6),
new SpecialtyItem(SPECIALTY_DIGITAL, OutputSplitSpecialtyEnum.DIGITAL.getLabel(), 7)
);
public static final List<SpecialtyItem> SPECIALTY_ITEMS = Arrays.asList(
new SpecialtyItem(SPECIALTY_ARCH, "建筑", 1),
new SpecialtyItem(SPECIALTY_DECOR, "装饰", 2),
new SpecialtyItem(SPECIALTY_STRUCT, "结构", 3),
new SpecialtyItem(SPECIALTY_WATER, "给排水", 4),
new SpecialtyItem(SPECIALTY_ELEC, "电气", 5),
new SpecialtyItem(SPECIALTY_HVAC, "暖通", 6),
new SpecialtyItem(SPECIALTY_DIGITAL, "数字化设计", 7)
new SpecialtyItem(SPECIALTY_ARCH, OutputSplitSpecialtyEnum.ARCH.getLabel(), 1),
new SpecialtyItem(SPECIALTY_DECOR, OutputSplitSpecialtyEnum.DECOR.getLabel(), 2),
new SpecialtyItem(SPECIALTY_STRUCT, OutputSplitSpecialtyEnum.STRUCT.getLabel(), 3),
new SpecialtyItem(SPECIALTY_WATER, OutputSplitSpecialtyEnum.WATER.getLabel(), 4),
new SpecialtyItem(SPECIALTY_ELEC, OutputSplitSpecialtyEnum.ELEC.getLabel(), 5),
new SpecialtyItem(SPECIALTY_HVAC, OutputSplitSpecialtyEnum.HVAC.getLabel(), 6),
new SpecialtyItem(SPECIALTY_DIGITAL, OutputSplitSpecialtyEnum.DIGITAL.getLabel(), 7)
);
public static final List<RoleItem> SPECIALTY_ROLE_ITEMS = Arrays.asList(
new RoleItem(ROLE_DIRECTOR, "专业负责人", 1),
new RoleItem(ROLE_CHECK, "校对", 2),
new RoleItem(ROLE_REVIEW, "审核", 3),
new RoleItem(ROLE_APPROVE, "审定", 4),
new RoleItem(ROLE_DESIGN, "设计", 5)
new RoleItem(ROLE_DIRECTOR, OutputSplitRoleEnum.DIRECTOR.getLabel(), 1),
new RoleItem(ROLE_CHECK, OutputSplitRoleEnum.CHECK.getLabel(), 2),
new RoleItem(ROLE_REVIEW, OutputSplitRoleEnum.REVIEW.getLabel(), 3),
new RoleItem(ROLE_APPROVE, OutputSplitRoleEnum.APPROVE.getLabel(), 4),
new RoleItem(ROLE_DESIGN, OutputSplitRoleEnum.DESIGN.getLabel(), 5)
);
public static final List<RoleItem> PROJECT_LEAD_ROLE_ITEMS = Arrays.asList(
new RoleItem(ROLE_PROJECT_MANAGER, "项目经理", 1),
new RoleItem(ROLE_ENGINEERING_PRINCIPAL, "工程负责人", 2)
new RoleItem(ROLE_PROJECT_MANAGER, OutputSplitRoleEnum.PROJECT_MANAGER.getLabel(), 1),
new RoleItem(ROLE_ENGINEERING_PRINCIPAL, OutputSplitRoleEnum.ENGINEERING_PRINCIPAL.getLabel(), 2)
);
private OutputSplitBizConstants() {

View File

@@ -1,74 +1,62 @@
package cn.iocoder.lyzsys.module.tjt.enums;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* 合约规划业务类型常量
* 合约规划业务类型常量
*
* <p>数据库存储稳定 code页面和 Excel 按 label 展示。</p>
*
* @author Codex
*/
public final class ProjectPlanningBizTypeConstants {
public static final String OWNERSHIP_TYPE_MAJOR = "专业所";
public static final String OWNERSHIP_TYPE_COMPREHENSIVE = "综合所";
public static final String OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT = "专项分包";
public static final String OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT = "源头合作分包";
public static final String DESIGN_PART_REAL_ESTATE = "地上部分";
public static final String DESIGN_PART_UNDERGROUND = "地下部分";
public static final String DESIGN_PART_OTHER = "其他";
public static final String OWNERSHIP_TYPE_MAJOR = ProjectPlanningOwnershipTypeEnum.MAJOR.getCode();
public static final String OWNERSHIP_TYPE_COMPREHENSIVE = ProjectPlanningOwnershipTypeEnum.COMPREHENSIVE.getCode();
public static final String OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT =
ProjectPlanningOwnershipTypeEnum.SPECIAL_SUBCONTRACT_MAJOR.getCode();
public static final String OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT =
ProjectPlanningOwnershipTypeEnum.SPECIAL_SUBCONTRACT_SOURCE_COOP.getCode();
public static final String OWNERSHIP_TYPE_COMPREHENSIVE_SUBCONTRACT =
ProjectPlanningOwnershipTypeEnum.SPECIAL_SUBCONTRACT_COMPREHENSIVE.getCode();
public static final String CALCULATION_METHOD_GUIDANCE_PRICE = "指导价法";
public static final String CALCULATION_METHOD_CONTRACT_PRICE = "合同价法";
public static final String CALCULATION_METHOD_VIRTUAL_OUTPUT = "虚拟产值法";
public static final String DESIGN_PART_REAL_ESTATE = ProjectPlanningDesignPartEnum.ABOVE_GROUND.getCode();
public static final String DESIGN_PART_UNDERGROUND = ProjectPlanningDesignPartEnum.UNDERGROUND.getCode();
public static final String DESIGN_PART_OTHER = ProjectPlanningDesignPartEnum.OTHER.getCode();
public static final String VIRTUAL_CALCULATION_METHOD_GUIDANCE_PRICE = "指导单价法";
public static final String VIRTUAL_CALCULATION_METHOD_GUIDANCE_TOTAL_PRICE = "指导总价法";
public static final String VIRTUAL_CALCULATION_METHOD_WORKING_DAY = "工日法";
public static final String CALCULATION_METHOD_GUIDANCE_PRICE =
ProjectPlanningCalculationMethodEnum.GUIDANCE_PRICE.getCode();
public static final String CALCULATION_METHOD_CONTRACT_PRICE =
ProjectPlanningCalculationMethodEnum.CONTRACT_PRICE.getCode();
public static final String CALCULATION_METHOD_VIRTUAL_OUTPUT =
ProjectPlanningCalculationMethodEnum.VIRTUAL_OUTPUT.getCode();
private static final Set<String> OWNERSHIP_TYPES = new HashSet<>(Arrays.asList(
OWNERSHIP_TYPE_MAJOR,
OWNERSHIP_TYPE_COMPREHENSIVE,
OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT,
OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT
));
private static final Set<String> CALCULATION_METHODS = new HashSet<>(Arrays.asList(
CALCULATION_METHOD_GUIDANCE_PRICE,
CALCULATION_METHOD_CONTRACT_PRICE,
CALCULATION_METHOD_VIRTUAL_OUTPUT
));
private static final Set<String> DESIGN_PARTS = new HashSet<>(Arrays.asList(
DESIGN_PART_REAL_ESTATE,
DESIGN_PART_UNDERGROUND,
DESIGN_PART_OTHER
));
private static final Set<String> VIRTUAL_CALCULATION_METHODS = new HashSet<>(Arrays.asList(
VIRTUAL_CALCULATION_METHOD_GUIDANCE_PRICE,
VIRTUAL_CALCULATION_METHOD_GUIDANCE_TOTAL_PRICE,
VIRTUAL_CALCULATION_METHOD_WORKING_DAY
));
public static final String VIRTUAL_CALCULATION_METHOD_GUIDANCE_PRICE =
ProjectPlanningVirtualCalculationMethodEnum.GUIDANCE_PRICE.getCode();
public static final String VIRTUAL_CALCULATION_METHOD_GUIDANCE_TOTAL_PRICE =
ProjectPlanningVirtualCalculationMethodEnum.GUIDANCE_TOTAL_PRICE.getCode();
public static final String VIRTUAL_CALCULATION_METHOD_WORKING_DAY =
ProjectPlanningVirtualCalculationMethodEnum.WORKING_DAY.getCode();
private ProjectPlanningBizTypeConstants() {
}
public static boolean isValidOwnershipType(String value) {
return OWNERSHIP_TYPES.contains(value);
return ProjectPlanningOwnershipTypeEnum.contains(value);
}
public static boolean isValidCalculationMethod(String value) {
return CALCULATION_METHODS.contains(value);
return ProjectPlanningCalculationMethodEnum.contains(value);
}
public static boolean isValidDesignStage(String value) {
return ProjectPlanningDesignStageEnum.contains(value);
}
public static boolean isValidDesignPart(String value) {
return DESIGN_PARTS.contains(value);
return ProjectPlanningDesignPartEnum.contains(value);
}
public static boolean isValidVirtualCalculationMethod(String value) {
return VIRTUAL_CALCULATION_METHODS.contains(value);
return ProjectPlanningVirtualCalculationMethodEnum.contains(value);
}
public static boolean isMajor(String value) {
@@ -80,7 +68,7 @@ public final class ProjectPlanningBizTypeConstants {
}
public static boolean isSubcontract(String value) {
return isSpecialSubcontract(value) || isSourceCoopSubcontract(value);
return isSpecialSubcontract(value) || isSourceCoopSubcontract(value) || isComprehensiveSubcontract(value);
}
public static boolean isSpecialSubcontract(String value) {
@@ -91,6 +79,10 @@ public final class ProjectPlanningBizTypeConstants {
return OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT.equals(value);
}
public static boolean isComprehensiveSubcontract(String value) {
return OWNERSHIP_TYPE_COMPREHENSIVE_SUBCONTRACT.equals(value);
}
public static boolean isGuidancePrice(String value) {
return CALCULATION_METHOD_GUIDANCE_PRICE.equals(value);
}
@@ -119,4 +111,24 @@ public final class ProjectPlanningBizTypeConstants {
return VIRTUAL_CALCULATION_METHOD_GUIDANCE_TOTAL_PRICE.equals(value);
}
public static String getOwnershipTypeLabel(String value) {
return ProjectPlanningOwnershipTypeEnum.labelOf(value);
}
public static String getCalculationMethodLabel(String value) {
return ProjectPlanningCalculationMethodEnum.labelOf(value);
}
public static String getDesignStageLabel(String value) {
return ProjectPlanningDesignStageEnum.labelOf(value);
}
public static String getDesignPartLabel(String value) {
return ProjectPlanningDesignPartEnum.labelOf(value);
}
public static String getVirtualCalculationMethodLabel(String value) {
return ProjectPlanningVirtualCalculationMethodEnum.labelOf(value);
}
}

View File

@@ -276,24 +276,28 @@ public class ProjectOutputSplitServiceImpl implements ProjectOutputSplitService
}
private BigDecimal getSpecialtyRatio(ProjectOutputSplitDO outputSplit, String specialtyCode) {
switch (specialtyCode) {
case OutputSplitBizConstants.SPECIALTY_ARCH:
return ratio(outputSplit.getArchRatio());
case OutputSplitBizConstants.SPECIALTY_DECOR:
return ratio(outputSplit.getDecorRatio());
case OutputSplitBizConstants.SPECIALTY_STRUCT:
return ratio(outputSplit.getStructRatio());
case OutputSplitBizConstants.SPECIALTY_WATER:
return ratio(outputSplit.getWaterRatio());
case OutputSplitBizConstants.SPECIALTY_ELEC:
return ratio(outputSplit.getElecRatio());
case OutputSplitBizConstants.SPECIALTY_HVAC:
return ratio(outputSplit.getHvacRatio());
case OutputSplitBizConstants.SPECIALTY_DIGITAL:
return ratio(outputSplit.getDigitalRatio());
default:
return ZERO_RATIO;
if (OutputSplitBizConstants.SPECIALTY_ARCH.equals(specialtyCode)) {
return ratio(outputSplit.getArchRatio());
}
if (OutputSplitBizConstants.SPECIALTY_DECOR.equals(specialtyCode)) {
return ratio(outputSplit.getDecorRatio());
}
if (OutputSplitBizConstants.SPECIALTY_STRUCT.equals(specialtyCode)) {
return ratio(outputSplit.getStructRatio());
}
if (OutputSplitBizConstants.SPECIALTY_WATER.equals(specialtyCode)) {
return ratio(outputSplit.getWaterRatio());
}
if (OutputSplitBizConstants.SPECIALTY_ELEC.equals(specialtyCode)) {
return ratio(outputSplit.getElecRatio());
}
if (OutputSplitBizConstants.SPECIALTY_HVAC.equals(specialtyCode)) {
return ratio(outputSplit.getHvacRatio());
}
if (OutputSplitBizConstants.SPECIALTY_DIGITAL.equals(specialtyCode)) {
return ratio(outputSplit.getDigitalRatio());
}
return ZERO_RATIO;
}
private BigDecimal multiplyAmount(BigDecimal left, BigDecimal right) {

View File

@@ -31,6 +31,7 @@ import java.util.Objects;
import static cn.iocoder.lyzsys.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_PLANNING_CALCULATION_METHOD_INVALID;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_PLANNING_DESIGN_STAGE_INVALID;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_PLANNING_NOT_EXISTS;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_PLANNING_OWNERSHIP_TYPE_IMMUTABLE;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_PLANNING_OWNERSHIP_TYPE_INVALID;
@@ -181,6 +182,10 @@ public class ProjectPlanningServiceImpl implements ProjectPlanningService {
&& !ProjectPlanningBizTypeConstants.isValidVirtualCalculationMethod(reqVO.getVirtualCalculationMethod())) {
throw exception(PROJECT_PLANNING_VIRTUAL_CALCULATION_METHOD_INVALID);
}
if (StrUtil.isNotBlank(reqVO.getDesignStage())
&& !ProjectPlanningBizTypeConstants.isValidDesignStage(reqVO.getDesignStage())) {
throw exception(PROJECT_PLANNING_DESIGN_STAGE_INVALID);
}
if (ProjectPlanningBizTypeConstants.isWorkingDay(reqVO.getVirtualCalculationMethod())) {
if (reqVO.getWorkingDayCount() == null) {
throw exception(PROJECT_PLANNING_WORKING_DAY_COUNT_REQUIRED);

View File

@@ -83,6 +83,7 @@ public class ProjectProfitServiceImpl implements ProjectProfitService {
BigDecimal comprehensivePlanningAmount = ZERO_AMOUNT;
BigDecimal specialSubcontractPlanningAmount = ZERO_AMOUNT;
BigDecimal sourceCoopSubcontractPlanningAmount = ZERO_AMOUNT;
BigDecimal comprehensiveSubcontractPlanningAmount = ZERO_AMOUNT;
BigDecimal majorOutputValue = ZERO_AMOUNT;
List<ProjectPlanningDO> majorPlanningList = safePlanningList.stream()
.filter(planning -> ProjectPlanningBizTypeConstants.isMajor(planning.getOwnershipType()))
@@ -101,6 +102,10 @@ public class ProjectProfitServiceImpl implements ProjectProfitService {
sourceCoopSubcontractPlanningAmount = sourceCoopSubcontractPlanningAmount.add(amount(planning.getPlanningAmount()));
continue;
}
if (ProjectPlanningBizTypeConstants.isComprehensiveSubcontract(planning.getOwnershipType())) {
comprehensiveSubcontractPlanningAmount = comprehensiveSubcontractPlanningAmount.add(amount(planning.getPlanningAmount()));
continue;
}
if (ProjectPlanningBizTypeConstants.isMajor(planning.getOwnershipType())) {
majorOutputValue = majorOutputValue.add(amount(planning.getAssessmentOutputValue()));
}
@@ -117,7 +122,9 @@ public class ProjectProfitServiceImpl implements ProjectProfitService {
? ZERO_AMOUNT
: contractAmount.multiply(innovationOutputRate).setScale(2, RoundingMode.HALF_UP);
BigDecimal otherCost = amount(project.getOtherCost());
BigDecimal subcontractPlanningAmount = specialSubcontractPlanningAmount.add(sourceCoopSubcontractPlanningAmount);
BigDecimal subcontractPlanningAmount = specialSubcontractPlanningAmount
.add(sourceCoopSubcontractPlanningAmount)
.add(comprehensiveSubcontractPlanningAmount);
BigDecimal profitLossValue = effectiveSettlementAmount
.subtract(comprehensivePlanningAmount)
.subtract(subcontractPlanningAmount)
@@ -141,6 +148,7 @@ public class ProjectProfitServiceImpl implements ProjectProfitService {
respVO.setSubcontractPlanningAmount(subcontractPlanningAmount.setScale(2, RoundingMode.HALF_UP));
respVO.setSpecialSubcontractPlanningAmount(specialSubcontractPlanningAmount.setScale(2, RoundingMode.HALF_UP));
respVO.setSourceCoopSubcontractPlanningAmount(sourceCoopSubcontractPlanningAmount.setScale(2, RoundingMode.HALF_UP));
respVO.setComprehensiveSubcontractPlanningAmount(comprehensiveSubcontractPlanningAmount.setScale(2, RoundingMode.HALF_UP));
respVO.setMajorOutputValue(majorOutputValue.setScale(2, RoundingMode.HALF_UP));
respVO.setMajorExpectedPerformance(majorExpectedPerformance);
respVO.setInnovationOutputRate(innovationOutputRate);

View File

@@ -18,6 +18,8 @@ import cn.iocoder.lyzsys.module.tjt.dal.mysql.planning.ProjectPlanningMapper;
import cn.iocoder.lyzsys.module.tjt.dal.mysql.planningquarter.ProjectPlanningQuarterMapper;
import cn.iocoder.lyzsys.module.tjt.dal.mysql.project.ProjectMapper;
import cn.iocoder.lyzsys.module.tjt.dal.mysql.projectroleperson.ProjectRolePersonMapper;
import cn.iocoder.lyzsys.module.tjt.enums.OutputSplitBizConstants;
import cn.iocoder.lyzsys.module.tjt.enums.ProjectStatusEnum;
import cn.iocoder.lyzsys.module.tjt.service.employee.EmployeeService;
import cn.iocoder.lyzsys.module.tjt.service.outputsplit.ProjectOutputSplitService;
import cn.iocoder.lyzsys.module.tjt.service.planningguidedetail.ProjectPlanningGuideDetailService;
@@ -37,6 +39,7 @@ import java.util.stream.Collectors;
import static cn.iocoder.lyzsys.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_NOT_EXISTS;
import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_STATUS_INVALID;
/**
* 项目 Service 实现类
@@ -47,14 +50,12 @@ import static cn.iocoder.lyzsys.module.tjt.enums.ErrorCodeConstants.PROJECT_NOT_
@Validated
public class ProjectServiceImpl implements ProjectService {
private static final String ROLE_CODE_PROJECT_MANAGER = "project_manager";
private static final String ROLE_CODE_ENGINEERING_PRINCIPAL = "engineering_principal";
private static final String ROLE_NAME_PROJECT_MANAGER = "项目经理";
private static final String ROLE_NAME_ENGINEERING_PRINCIPAL = "工程负责人";
private static final String STATUS_IN_PROGRESS = "进行中";
private static final String STATUS_COMPLETED = "完成";
private static final String STATUS_PAUSED = "暂停";
private static final String STATUS_TERMINATED = "中止";
private static final String ROLE_CODE_PROJECT_MANAGER = OutputSplitBizConstants.ROLE_PROJECT_MANAGER;
private static final String ROLE_CODE_ENGINEERING_PRINCIPAL = OutputSplitBizConstants.ROLE_ENGINEERING_PRINCIPAL;
private static final String STATUS_IN_PROGRESS = ProjectStatusEnum.IN_PROGRESS.getCode();
private static final String STATUS_COMPLETED = ProjectStatusEnum.COMPLETED.getCode();
private static final String STATUS_PAUSED = ProjectStatusEnum.PAUSED.getCode();
private static final String STATUS_TERMINATED = ProjectStatusEnum.TERMINATED.getCode();
@Resource
private ProjectMapper projectMapper;
@@ -141,6 +142,9 @@ public class ProjectServiceImpl implements ProjectService {
if (project.getProjectStatus() == null || project.getProjectStatus().trim().isEmpty()) {
project.setProjectStatus(dbProject == null ? STATUS_IN_PROGRESS : dbProject.getProjectStatus());
}
if (!ProjectStatusEnum.contains(project.getProjectStatus())) {
throw exception(PROJECT_STATUS_INVALID);
}
if (project.getArchiveFlag() == null) {
project.setArchiveFlag(dbProject != null && Boolean.TRUE.equals(dbProject.getArchiveFlag()));
}
@@ -203,10 +207,10 @@ public class ProjectServiceImpl implements ProjectService {
private String getRoleName(String roleCode) {
if (Objects.equals(roleCode, ROLE_CODE_PROJECT_MANAGER)) {
return ROLE_NAME_PROJECT_MANAGER;
return OutputSplitBizConstants.getRoleName(roleCode);
}
if (Objects.equals(roleCode, ROLE_CODE_ENGINEERING_PRINCIPAL)) {
return ROLE_NAME_ENGINEERING_PRINCIPAL;
return OutputSplitBizConstants.getRoleName(roleCode);
}
return roleCode;
}

View File

@@ -28,6 +28,7 @@ import cn.iocoder.lyzsys.module.tjt.dal.mysql.specialtyrolesplitperson.Specialty
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.ProjectOutputSplitService;
import cn.iocoder.lyzsys.module.tjt.service.planningguidedetail.ProjectPlanningGuideDetailService;
import cn.iocoder.lyzsys.module.tjt.service.report.builder.*;
@@ -937,7 +938,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_MAJOR,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE_SUBCONTRACT
)));
}
@@ -963,7 +965,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_MAJOR,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE_SUBCONTRACT
)))
.stream()
.map(ProjectPlanningDO::getId)
@@ -1009,7 +1012,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_MAJOR,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SPECIAL_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_SOURCE_COOP_SUBCONTRACT,
ProjectPlanningBizTypeConstants.OWNERSHIP_TYPE_COMPREHENSIVE_SUBCONTRACT
)))
.stream()
.map(ProjectPlanningDO::getId)
@@ -1311,11 +1315,13 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
return;
}
for (ProjectPlanningGuideDetailDO detail : partPlanningList) {
rows.add(buildBudgetDetailRow(planning, planningContent, designPart, detail));
rows.add(buildBudgetDetailRow(planning, planningContent,
ProjectPlanningBizTypeConstants.getDesignPartLabel(designPart), detail));
}
if (partPlanningList.size() > 2) {
rows.add(buildBudgetSummaryRow(ProjectBudgetExcelBuilder.BudgetRowType.PART_SUBTOTAL,
planning, planningContent, designPart + "总计", partPlanningList));
planning, planningContent,
ProjectPlanningBizTypeConstants.getDesignPartLabel(designPart) + "总计", partPlanningList));
}
}
@@ -1356,7 +1362,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
}
private ProjectBudgetExcelBuilder.BudgetRow buildBudgetEmptyRow(String designPart) {
return initBudgetRow(ProjectBudgetExcelBuilder.BudgetRowType.PART_EMPTY, null, "", designPart);
return initBudgetRow(ProjectBudgetExcelBuilder.BudgetRowType.PART_EMPTY, null, "",
ProjectPlanningBizTypeConstants.getDesignPartLabel(designPart));
}
private ProjectBudgetExcelBuilder.BudgetRow buildBudgetSummaryRow(ProjectBudgetExcelBuilder.BudgetRowType rowType,
@@ -1754,24 +1761,28 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
if (outputSplit == null || specialtyCode == null) {
return ZERO_RATIO;
}
switch (specialtyCode) {
case OutputSplitBizConstants.SPECIALTY_ARCH:
return ratio(outputSplit.getArchRatio());
case OutputSplitBizConstants.SPECIALTY_DECOR:
return ratio(outputSplit.getDecorRatio());
case OutputSplitBizConstants.SPECIALTY_STRUCT:
return ratio(outputSplit.getStructRatio());
case OutputSplitBizConstants.SPECIALTY_WATER:
return ratio(outputSplit.getWaterRatio());
case OutputSplitBizConstants.SPECIALTY_ELEC:
return ratio(outputSplit.getElecRatio());
case OutputSplitBizConstants.SPECIALTY_HVAC:
return ratio(outputSplit.getHvacRatio());
case OutputSplitBizConstants.SPECIALTY_DIGITAL:
return ratio(outputSplit.getDigitalRatio());
default:
return ZERO_RATIO;
if (OutputSplitBizConstants.SPECIALTY_ARCH.equals(specialtyCode)) {
return ratio(outputSplit.getArchRatio());
}
if (OutputSplitBizConstants.SPECIALTY_DECOR.equals(specialtyCode)) {
return ratio(outputSplit.getDecorRatio());
}
if (OutputSplitBizConstants.SPECIALTY_STRUCT.equals(specialtyCode)) {
return ratio(outputSplit.getStructRatio());
}
if (OutputSplitBizConstants.SPECIALTY_WATER.equals(specialtyCode)) {
return ratio(outputSplit.getWaterRatio());
}
if (OutputSplitBizConstants.SPECIALTY_ELEC.equals(specialtyCode)) {
return ratio(outputSplit.getElecRatio());
}
if (OutputSplitBizConstants.SPECIALTY_HVAC.equals(specialtyCode)) {
return ratio(outputSplit.getHvacRatio());
}
if (OutputSplitBizConstants.SPECIALTY_DIGITAL.equals(specialtyCode)) {
return ratio(outputSplit.getDigitalRatio());
}
return ZERO_RATIO;
}
private String buildSpecialtySummary(ProjectOutputSplitDO outputSplit, BigDecimal baseAmount) {
@@ -1798,10 +1809,13 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
return "六大专业考核产值";
}
if (ProjectPlanningBizTypeConstants.isSpecialSubcontract(ownershipType)) {
return "专项分包产值";
return "专项分包-专业所产值";
}
if (ProjectPlanningBizTypeConstants.isSourceCoopSubcontract(ownershipType)) {
return "源头合作分包产值";
return "专项分包-源头合作分包产值";
}
if (ProjectPlanningBizTypeConstants.isComprehensiveSubcontract(ownershipType)) {
return "专项分包-综合所产值";
}
if (ProjectPlanningBizTypeConstants.isComprehensive(ownershipType)) {
return "内部协作产值";
@@ -1814,16 +1828,19 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
if (Objects.equals(outputType, "六大专业考核产值")) {
return 1;
}
if (Objects.equals(outputType, "专项分包产值")) {
if (Objects.equals(outputType, "专项分包-专业所产值")) {
return 2;
}
if (Objects.equals(outputType, "源头合作分包产值")) {
if (Objects.equals(outputType, "专项分包-源头合作分包产值")) {
return 3;
}
if (Objects.equals(outputType, "内部协作产值")) {
if (Objects.equals(outputType, "专项分包-综合所产值")) {
return 4;
}
return 5;
if (Objects.equals(outputType, "内部协作产值")) {
return 5;
}
return 6;
}
private String buildPlanningDisplayName(ProjectPlanningDO planning) {
@@ -1831,7 +1848,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
return "";
}
String planningContent = defaultString(planning.getPlanningContent());
String ownershipType = defaultString(planning.getOwnershipType());
String ownershipType = defaultString(ProjectPlanningBizTypeConstants.getOwnershipTypeLabel(
planning.getOwnershipType()));
if (planningContent.isEmpty()) {
return ownershipType;
}
@@ -2195,7 +2213,8 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
if (!planningContent.isEmpty()) {
return planningContent;
}
return defaultString(planning == null ? null : planning.getDesignStage());
return defaultString(ProjectPlanningBizTypeConstants.getDesignStageLabel(
planning == null ? null : planning.getDesignStage()));
}
private List<ProjectOverviewOutputExcelBuilder.EmployeeColumn> buildProjectOverviewEmployeeColumns(
@@ -2321,7 +2340,7 @@ public class ProjectOutputReportServiceImpl implements ProjectOutputReportServic
}
private String buildProgressText(ProjectDO project, ProjectPlanningDO planning) {
String projectStatus = project == null ? "" : defaultString(project.getProjectStatus());
String projectStatus = project == null ? "" : defaultString(ProjectStatusEnum.labelOf(project.getProjectStatus()));
String planningRemark = planning == null ? "" : defaultString(planning.getProgressRemark());
if (projectStatus.isEmpty()) {
return planningRemark;

View File

@@ -28,8 +28,9 @@ public class ProjectLeadQuarterOutputExcelBuilder extends AbstractProjectOutputE
private static final String DEFAULT_PROJECT_SIGNER = "项目经理/工程负责人(签名):";
private static final List<String> OUTPUT_TYPE_ORDER = Arrays.asList(
"六大专业考核产值",
"专项分包产值",
"源头合作分包产值",
"专项分包-专业所产值",
"专项分包-源头合作分包产值",
"专项分包-综合所产值",
"内部协作产值",
"其他产值"
);

View File

@@ -36,16 +36,18 @@ public class ProjectQuarterOutputExcelBuilder extends AbstractProjectOutputExcel
private static final List<String> OUTPUT_TYPE_ORDER = Arrays.asList(
"六大专业考核产值",
"专项分包产值",
"源头合作分包产值",
"专项分包-专业所产值",
"专项分包-源头合作分包产值",
"专项分包-综合所产值",
"内部协作产值",
"其他产值"
);
private static final List<String> FIXED_OUTPUT_TYPES = Arrays.asList(
"六大专业考核产值",
"专项分包产值",
"源头合作分包产值",
"专项分包-专业所产值",
"专项分包-源头合作分包产值",
"专项分包-综合所产值",
"内部协作产值"
);

View File

@@ -534,15 +534,18 @@ public class SpecialtyPersonOutputExcelBuilder extends AbstractProjectOutputExce
if (Objects.equals(current, "六大专业考核产值")) {
return 1;
}
if (Objects.equals(current, "专项分包产值")) {
if (Objects.equals(current, "专项分包-专业所产值")) {
return 2;
}
if (Objects.equals(current, "源头合作分包产值")) {
if (Objects.equals(current, "专项分包-源头合作分包产值")) {
return 3;
}
if (Objects.equals(current, "内部协作产值")) {
if (Objects.equals(current, "专项分包-综合所产值")) {
return 4;
}
if (Objects.equals(current, "内部协作产值")) {
return 5;
}
return 9;
}