From 3a1d2defbe11235532176bd90f53100b4a8468da Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 22 Jul 2025 18:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E7=89=B9=20=E5=8D=8A=E5=B9=B4?= =?UTF-8?q?=E5=BA=A6=E3=80=81=E5=B9=B4=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryacct/bo/CalculateFormulaVarBO.java | 28 +++++++------ .../entity/salarysob/bo/SalarySobCycleBO.java | 10 +++++ .../salary/enums/SalaryCycleTypeEnum.java | 4 +- .../impl/SalaryAcctCalculateServiceImpl.java | 3 +- .../engine/salary/util/SalaryDateUtil.java | 39 +++++++++++++++++++ 5 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java index 17810a758..97afc713d 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java @@ -280,17 +280,25 @@ public class CalculateFormulaVarBO { // 调薪计薪规则 Map salarySobAdjustRulePOMap = SalaryEntityUtil.convert2Map(salaryAcctCalculateBO.getSalarySobAdjustRulePOS(), SalarySobAdjustRulePO::getSalaryItemId); - boolean isSeasonSob = false; + int monthCount = 1; if (attendCycleType != null && (attendCycleType.equals(SalaryCycleTypeEnum.THIS_SEASON.getValue()) || attendCycleType.equals(SalaryCycleTypeEnum.LAST_SEASON.getValue()) )) { // 联特 是季度账套 - isSeasonSob = true; + monthCount = 3; + } + if (attendCycleType != null && attendCycleType.equals(SalaryCycleTypeEnum.HALF_YEAR.getValue())) { + // 联特 是季度账套 + monthCount = 6; + } + if (attendCycleType != null && attendCycleType.equals(SalaryCycleTypeEnum.FULL_YEAR.getValue())) { + // 联特 是季度账套 + monthCount = 12; } for (SalaryArchiveDataDTO salaryArchiveDataDTO : salaryArchiveData) { for (SalaryArchiveTaxAgentDataDTO salaryArchiveTaxAgentDataDTO : salaryArchiveDataDTO.getTaxAgents()) { String key = salaryArchiveDataDTO.getEmployeeId() + "_" + salaryArchiveTaxAgentDataDTO.getTaxAgentId(); List formulaVarValues = resultMap.computeIfAbsent(key, k -> Lists.newArrayList()); // 将薪资档案的值转换成公式中的变量,填充到返回结果集中 - formulaVarValues.addAll(handleSalaryArchiveItemVal(salaryAcctCalculateBO, salaryArchiveTaxAgentDataDTO.getSalaryItemValues(), salarySobAdjustRulePOMap, kqGroupService, salaryArchiveDataDTO.getEmployeeId(), isSeasonSob)); + formulaVarValues.addAll(handleSalaryArchiveItemVal(salaryAcctCalculateBO, salaryArchiveTaxAgentDataDTO.getSalaryItemValues(), salarySobAdjustRulePOMap, kqGroupService, salaryArchiveDataDTO.getEmployeeId(), monthCount)); } } } @@ -329,7 +337,7 @@ public class CalculateFormulaVarBO { Map salarySobAdjustRulePOMap, KQGroupService kqGroupService, Long employeeId, - boolean isSeasonSob) { + int mounthCount) { // 薪资周期 LocalDateRange salaryCycle = salaryAcctCalculateBO.getSalarySobCycleDTO().getSalaryCycle(); // key:薪资项目的id、value:薪资项目的code @@ -364,18 +372,18 @@ public class CalculateFormulaVarBO { // } if (entry.getValue().size() > 2) { // 如果薪资项目在薪资周期内经历了多次调薪,则默认分段计薪 - value = calculateBySalarySobAdjustRule(salaryCycle, SalarySobAdjustRuleTypeEnum.PARTITION, entry.getValue(), kqGroupService, employeeId, isSeasonSob); + value = calculateBySalarySobAdjustRule(salaryCycle, SalarySobAdjustRuleTypeEnum.PARTITION, entry.getValue(), kqGroupService, employeeId, mounthCount); } else if (salaryAdjustmentRulePO == null || entry.getValue().size() < 2) { // 如果薪资项目没有设置调薪计薪规则,默认取薪资周期内薪资档案中最新的值 // 如果薪资项目在薪资周期内没有调薪,默认取薪资周期内薪资档案中最新的值 - value = calculateBySalarySobAdjustRule(salaryCycle, SalarySobAdjustRuleTypeEnum.USE_AFTER_ADJUSTMENT, entry.getValue(), kqGroupService, employeeId, isSeasonSob); + value = calculateBySalarySobAdjustRule(salaryCycle, SalarySobAdjustRuleTypeEnum.USE_AFTER_ADJUSTMENT, entry.getValue(), kqGroupService, employeeId, mounthCount); } else { // 如果薪资项目在薪资周期内只有一次调薪,则根据调薪计薪规则处理 SalarySobAdjustRuleTypeEnum adjustRuleTypeEnum = salaryAdjustmentRulePO.getDayOfMonth() < SalaryDateUtil.dateToLocalDate(entry.getValue().get(0).getEffectiveDateRange().getEndDate()).getDayOfMonth() ? SalarySobAdjustRuleTypeEnum.parseByValue(salaryAdjustmentRulePO.getAfterAdjustmentType()) : SalarySobAdjustRuleTypeEnum.parseByValue(salaryAdjustmentRulePO.getBeforeAdjustmentType()); // 根据调薪计薪规则处理薪资档案的调薪 - value = calculateBySalarySobAdjustRule(salaryCycle, adjustRuleTypeEnum, entry.getValue(), kqGroupService, employeeId, isSeasonSob); + value = calculateBySalarySobAdjustRule(salaryCycle, adjustRuleTypeEnum, entry.getValue(), kqGroupService, employeeId, mounthCount); } String fieldId = SalaryFormulaReferenceEnum.SALARY_ARCHIVES.getValue() + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR @@ -397,7 +405,7 @@ public class CalculateFormulaVarBO { List salaryArchiveItemDataDTOS, KQGroupService kqGroupService, Long employeeId, - boolean isSeasonSob) { + int mounthCount) { if (Objects.isNull(adjustRuleTypeEnum)) { return StringUtils.EMPTY; } @@ -416,9 +424,7 @@ public class CalculateFormulaVarBO { // BigDecimal valueSum = BigDecimal.ZERO; BigDecimal firstValue = BigDecimal.ZERO; BigDecimal baseValue = new BigDecimal("21.75"); - if (isSeasonSob) { - baseValue = baseValue.multiply(new BigDecimal(3)); - } + baseValue = baseValue.multiply(new BigDecimal(String.valueOf(mounthCount))); // 调薪补差金额 BigDecimal needAddValue = new BigDecimal(0); if (CollectionUtils.isNotEmpty(salaryArchiveItemDataDTOS)) { diff --git a/src/com/engine/salary/entity/salarysob/bo/SalarySobCycleBO.java b/src/com/engine/salary/entity/salarysob/bo/SalarySobCycleBO.java index 8b5d12588..a0c082e3b 100644 --- a/src/com/engine/salary/entity/salarysob/bo/SalarySobCycleBO.java +++ b/src/com/engine/salary/entity/salarysob/bo/SalarySobCycleBO.java @@ -58,6 +58,16 @@ public class SalarySobCycleBO { salarySobCycleDTO.setAttendCycle(attendCycle); salarySobCycleDTO.setAttendCycleFromDate(attendCycle.getFromDate()); salarySobCycleDTO.setAttendCycleEndDate(attendCycle.getEndDate()); + } else if (salarySob.getAttendCycleType().equals(SalaryCycleTypeEnum.HALF_YEAR.getValue())) { + LocalDateRange attendCycle = SalaryDateUtil.getHalfYearRangeByDate(salaryMonth); + salarySobCycleDTO.setAttendCycle(attendCycle); + salarySobCycleDTO.setAttendCycleFromDate(attendCycle.getFromDate()); + salarySobCycleDTO.setAttendCycleEndDate(attendCycle.getEndDate()); + } else if (salarySob.getAttendCycleType().equals(SalaryCycleTypeEnum.FULL_YEAR.getValue())) { + LocalDateRange attendCycle = SalaryDateUtil.getFullYearRangeByDate(salaryMonth); + salarySobCycleDTO.setAttendCycle(attendCycle); + salarySobCycleDTO.setAttendCycleFromDate(attendCycle.getFromDate()); + salarySobCycleDTO.setAttendCycleEndDate(attendCycle.getEndDate()); } else { LocalDateRange attendCycle = salarySobCycleDTO.getAttendCycle(); salarySobCycleDTO.setAttendCycleFromDate(attendCycle.getFromDate()); diff --git a/src/com/engine/salary/enums/SalaryCycleTypeEnum.java b/src/com/engine/salary/enums/SalaryCycleTypeEnum.java index d7558df37..b6dac28c1 100644 --- a/src/com/engine/salary/enums/SalaryCycleTypeEnum.java +++ b/src/com/engine/salary/enums/SalaryCycleTypeEnum.java @@ -19,7 +19,9 @@ public enum SalaryCycleTypeEnum implements BaseEnum { NEXT_MONTH(4, "下月", 86073), AFTER_NEXT_MONTH(5, "下下月", 0), THIS_SEASON(10, "本季度", 0), - LAST_SEASON(11, "上季度", 0); + LAST_SEASON(11, "上季度", 0), + HALF_YEAR(12, "半年度", 0), + FULL_YEAR(13, "全年", 0); private int value; diff --git a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java index 744fbb82f..1898e77e0 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java @@ -145,7 +145,8 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc List salaryArchiveData = getSalaryArchiveService(user).getSalaryArchiveData(salarySobCycleDTO.getSalaryCycle(), employeeIds, taxAgentIds); // 联特二开,需要判断考勤周期是不是设置的季度 Integer attendCycleType = salaryAcctCalculateBO.getSalarySobPO().getAttendCycleType(); - if (attendCycleType.equals(SalaryCycleTypeEnum.THIS_SEASON.getValue()) || attendCycleType.equals(SalaryCycleTypeEnum.LAST_SEASON.getValue())) { + if (attendCycleType.equals(SalaryCycleTypeEnum.THIS_SEASON.getValue()) || attendCycleType.equals(SalaryCycleTypeEnum.LAST_SEASON.getValue()) + || attendCycleType.equals(SalaryCycleTypeEnum.HALF_YEAR.getValue()) || attendCycleType.equals(SalaryCycleTypeEnum.FULL_YEAR.getValue())) { salaryArchiveData = getSalaryArchiveService(user).getSalaryArchiveData(salarySobCycleDTO.getAttendCycle(), employeeIds, taxAgentIds); } diff --git a/src/com/engine/salary/util/SalaryDateUtil.java b/src/com/engine/salary/util/SalaryDateUtil.java index 3012b8b4c..db5350ac8 100644 --- a/src/com/engine/salary/util/SalaryDateUtil.java +++ b/src/com/engine/salary/util/SalaryDateUtil.java @@ -14,6 +14,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; import java.util.Calendar; import java.util.Date; import java.util.Objects; @@ -644,6 +645,44 @@ public class SalaryDateUtil { .endDate(localDateToDate(endDate)) .build(); } + + public static LocalDateRange getHalfYearRangeByDate(YearMonth yearMonth) { + if (yearMonth == null) { + return LocalDateRange.builder().build(); + } + int month = yearMonth.getMonthValue(); + int year = yearMonth.getYear(); + + // 半年度开始月份 + int halfStartMonth = month <= 6 ? 1 : 7; + // 半年度结束月份 + int halfEndMonth = halfStartMonth + 5; + LocalDate startDate = LocalDate.of(year, halfStartMonth, 1); + LocalDate endDate = LocalDate.of(year, halfEndMonth, 1); + // endDate调整为当月最后一天 + endDate = endDate.with(TemporalAdjusters.lastDayOfMonth()); + + return LocalDateRange.builder() + .fromDate(localDateToDate(startDate)) + .endDate(localDateToDate(endDate)) + .build(); + } + + + public static LocalDateRange getFullYearRangeByDate(YearMonth yearMonth) { + if (yearMonth == null) { + return LocalDateRange.builder().build(); + } + int year = yearMonth.getYear(); + + LocalDate startDate = LocalDate.of(year, 1, 1); + LocalDate endDate = LocalDate.of(year, 12, 31); + + return LocalDateRange.builder() + .fromDate(localDateToDate(startDate)) + .endDate(localDateToDate(endDate)) + .build(); + } }