From c0d916c2860ebc5d1ff59306b36e0a38c46c05b3 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 6 Dec 2022 15:29:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E5=9B=9E=E7=AE=97=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=B7=A5=E8=B5=84=E5=8D=95=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...aryTemplateSalaryItemSetGroupConstant.java | 6 + .../report/bo/SalaryAcctResultReportBO.java | 1 + .../report/po/SalaryAcctResultReportPO.java | 4 + .../salaryBill/bo/SalaryTemplateBO.java | 28 +++- .../salaryBill/dto/SalarySendListDTO.java | 15 ++- .../dto/SalaryTemplateBaseFormDTO.java | 3 +- .../salaryBill/dto/SalaryTemplateListDTO.java | 4 + .../report/SalaryAcctResultReportMapper.xml | 6 + .../mapper/salarybill/SalarySendMapper.xml | 8 +- .../salarybill/SalaryTemplateMapper.xml | 51 +++++++ .../service/SalaryAcctResultService.java | 9 ++ .../salary/service/SalarySendService.java | 2 +- .../salary/service/SalaryTemplateService.java | 2 +- .../impl/SalaryAcctRecordServiceImpl.java | 6 +- .../impl/SalaryAcctResultServiceImpl.java | 15 ++- .../service/impl/SalarySendServiceImpl.java | 124 +++++++++++++++--- .../impl/SalaryTemplateServiceImpl.java | 4 +- .../salary/web/SalaryBillController.java | 5 +- .../salary/wrapper/SalarySendWrapper.java | 30 +++-- .../salary/wrapper/SalaryTemplateWrapper.java | 71 +++++----- 20 files changed, 318 insertions(+), 76 deletions(-) diff --git a/src/com/engine/salary/constant/SalaryTemplateSalaryItemSetGroupConstant.java b/src/com/engine/salary/constant/SalaryTemplateSalaryItemSetGroupConstant.java index c2747dee0..3c4083c61 100644 --- a/src/com/engine/salary/constant/SalaryTemplateSalaryItemSetGroupConstant.java +++ b/src/com/engine/salary/constant/SalaryTemplateSalaryItemSetGroupConstant.java @@ -16,4 +16,10 @@ public class SalaryTemplateSalaryItemSetGroupConstant { * 无分类组id */ public static final String NO_TYPE_GROUP_ID = String.valueOf(222222222222222222L); + + /** + * 已发补发 + */ + public static final String REPLENISH_GROUP_ID = String.valueOf(333333333333333333L); + } diff --git a/src/com/engine/salary/entity/report/bo/SalaryAcctResultReportBO.java b/src/com/engine/salary/entity/report/bo/SalaryAcctResultReportBO.java index b7534567d..6a23857a5 100644 --- a/src/com/engine/salary/entity/report/bo/SalaryAcctResultReportBO.java +++ b/src/com/engine/salary/entity/report/bo/SalaryAcctResultReportBO.java @@ -78,6 +78,7 @@ public class SalaryAcctResultReportBO { .taxAgentId(e.getTaxAgentId()) .salaryItemId(e.getSalaryItemId()) .resultValue(e.getResultValue()) + .originResultValue(e.getOriginResultValue()) .creator(e.getCreator()) .createTime(e.getCreateTime()) .updateTime(e.getUpdateTime()) diff --git a/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java b/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java index 400a8ab2d..61f85af7d 100644 --- a/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java +++ b/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java @@ -45,6 +45,10 @@ public class SalaryAcctResultReportPO { * 计算后的值 */ private String resultValue; + /** + * 回算前的值 + */ + private String originResultValue; /** * 创建人 */ diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index 99a288704..be7723928 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -8,6 +8,7 @@ import com.engine.salary.entity.salaryBill.param.SalaryTemplateSaveParam; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.util.JsonUtil; +import com.engine.salary.util.SalaryI18nUtil; import org.apache.commons.collections.CollectionUtils; import java.util.Date; @@ -59,7 +60,7 @@ public class SalaryTemplateBO { .build(); } - public static List convertSalarySobItemAggregateToSalaryItemSet(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Long currentEmployeeId) { + public static List convertSalarySobItemAggregateToSalaryItemSet(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Long currentEmployeeId, boolean isReplenish) { List groups = new LinkedList<>(); if (salarySobItemAggregateDTO!=null) { // 1.员工信息 @@ -125,6 +126,31 @@ public class SalaryTemplateBO { .items(items) .build()); } + + if (isReplenish) { + // 4.已发补发 + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(salarySobItemAggregateDTO.getBackCalcItems())) { + List items = new LinkedList<>(); + salarySobItemAggregateDTO.getBackCalcItems().forEach(e -> { + items.add( + SalaryTemplateSalaryItemListDTO.builder() + .id(String.valueOf(e.getSalaryItemId())) +// .salaryItemId(String.valueOf(e.getSalaryItemId())) + .name(e.getName()) + .sortedIndex(e.getSortedIndex()) + .build() + ); + }); + groups.add( + SalaryTemplateSalaryItemSetListDTO.builder() + .groupId(SalaryTemplateSalaryItemSetGroupConstant.REPLENISH_GROUP_ID) + .groupName(SalaryI18nUtil.getI18nLabel(139698, "已发补发")) + .sortedIndex(groups.size() + 1) + .items(items) + .build()); + } + } + } return groups; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java index c3d525076..faca0b4bf 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java @@ -9,8 +9,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.Date; /** @@ -113,4 +111,17 @@ public class SalarySendListDTO { // 最后发送时间 @SalaryTableColumn(text = "最后发送时间", width = "15%", column = "lastSendTime") private Date lastSendTime; + + + /** + * 发放状态。0:未冻结、1:已冻结 + */ + private Integer sendStatus; + + /** + * 核算类型。0:正常,1:补发 + */ + private Integer salaryAcctType; + + } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java index f328b6032..18ca1ebc4 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; import java.util.Map; /** @@ -22,5 +23,5 @@ public class SalaryTemplateBaseFormDTO { private Map salaryTemplateBaseSet; // 补发规则设置下拉列表 - private Map replenishRuleSetOption; + private List> replenishRuleSetOption; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java index ee1cfe07b..d59c4d231 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java @@ -31,6 +31,10 @@ public class SalaryTemplateListDTO { @SalaryTableColumn(text = "工资单模板名称", width = "20%", column = "name") private String name; + //补发工资单模板名称 + @SalaryTableColumn(text = "补发工资单模板名称", width = "20%", column = "replenishName") + private String replenishName; + //所属薪资账套 @SalaryTableColumn(text = "所属薪资账套", width = "20%", column = "salarySob") diff --git a/src/com/engine/salary/mapper/report/SalaryAcctResultReportMapper.xml b/src/com/engine/salary/mapper/report/SalaryAcctResultReportMapper.xml index b91e131a4..16860033d 100644 --- a/src/com/engine/salary/mapper/report/SalaryAcctResultReportMapper.xml +++ b/src/com/engine/salary/mapper/report/SalaryAcctResultReportMapper.xml @@ -149,6 +149,9 @@ result_value, + + origin_result_value, + salary_acct_emp_id, @@ -205,6 +208,9 @@ #{resultValue}, + + #{originResultValue}, + #{salaryAcctEmpId}, diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml index ba9ea2438..978a8eec4 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml @@ -34,6 +34,8 @@ t1.id, + t1.send_status AS sendStatus, + t1.salary_acct_type AS salaryAcctType, t2.salary_month AS salaryYearMonth, t3.name AS salarySob, t3.id AS salarySobId, @@ -83,7 +85,9 @@ salary_sob_id, send_num, send_total, - last_send_time + last_send_time, + send_status, + salary_acct_type FROM hrsa_salary_send WHERE delete_type = 0 AND id = #{id} @@ -140,7 +144,7 @@ update hrsa_salary_send set salary_acct_type = 0 - where send_status is NULL + where salary_acct_type is NULL diff --git a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml index 67beaeb48..501f72ec0 100644 --- a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml @@ -18,6 +18,9 @@ + + + @@ -43,6 +46,9 @@ , t.salary_item_null_status , t.salary_item_zero_status , t.salary_item_setting + , replenish_name + , replenish_rule + , replenish_item_setting , t.create_time , t.update_time , t.creator @@ -277,6 +283,15 @@ AND salary_item_setting = #{salaryItemSetting} + + AND replenish_name = #{replenishName} + + + AND replenish_rule = #{replenishRule} + + + AND replenish_salary_item_setting = #{replenishSalaryItemSetting} + AND create_time = #{createTime} @@ -352,6 +367,15 @@ salary_item_setting=#{salaryItemSetting}, + + replenish_name=#{replenishName}, + + + replenish_rule=#{replenishRule}, + + + replenish_salary_item_setting=#{replenishSalaryItemSetting}, + create_time=#{createTime}, @@ -489,6 +513,15 @@ #{salaryItemSetting}, + + #{replenishName}, + + + #{replenishRule}, + + + #{replenishSalaryItemSetting}, + #{createTime}, @@ -561,6 +594,15 @@ salary_item_setting, + + replenish_name, + + + replenish_rule, + + + replenish_salary_item_setting, + create_time, @@ -623,6 +665,15 @@ #{salaryItemSetting}, + + #{replenishName}, + + + #{replenishRule}, + + + #{replenishSalaryItemSetting}, + #{createTime}, diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index c62164439..6404a7281 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -181,4 +181,13 @@ public interface SalaryAcctResultService { * @date 2022/11/24 20:26 */ void reCalc(Long id); + + /** + * 根据薪资核算记录的id、个税扣缴义务人查询薪资核算结果 + * + * @param salaryAcctRecordIds 薪资核算记录的id + * @param salaryItemIds 薪资项目id + * @return + */ + List listBySalaryAcctRecordIdsAndSalaryItemIds(Collection salaryAcctRecordIds, Collection salaryItemIds); } diff --git a/src/com/engine/salary/service/SalarySendService.java b/src/com/engine/salary/service/SalarySendService.java index 40a6db481..eed4cf8e6 100644 --- a/src/com/engine/salary/service/SalarySendService.java +++ b/src/com/engine/salary/service/SalarySendService.java @@ -107,7 +107,7 @@ public interface SalarySendService { * @param salaryTemplatePO * @return */ - List getSalaryItemsSetting(SalaryTemplatePO salaryTemplatePO); + List getSalaryItemsSetting(SalaryTemplatePO salaryTemplatePO, boolean isReplenish); /** * 构建详情列表 diff --git a/src/com/engine/salary/service/SalaryTemplateService.java b/src/com/engine/salary/service/SalaryTemplateService.java index 200db51af..8bfd9cd54 100644 --- a/src/com/engine/salary/service/SalaryTemplateService.java +++ b/src/com/engine/salary/service/SalaryTemplateService.java @@ -86,7 +86,7 @@ public interface SalaryTemplateService { * @param salarySobId * @return */ - List getSalaryItemSet(Long salarySobId); + List getSalaryItemSet(Long salarySobId, boolean isReplenish); /** * 获取默认工资单模板 diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 53dbaf4a2..816a840bc 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -525,12 +525,14 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe if (CollectionUtils.isEmpty(salaryAcctResultPOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99691, "尚未核算,请先核算后再归档")); } + + // 生成工资单 + getSalarySendService(user).generateSalaryBill(salaryAcctRecordId); + // 更新薪资核算记录的状态 salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.ARCHIVED.getValue()); salaryAcctRecordPO.setUpdateTime(new Date()); getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO); - // 生成工资单 - getSalarySendService(user).generateSalaryBill(salaryAcctRecordId); // 记录日志 // String targetName = getLogTargetNameById(salaryAcctRecordId); diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 82d71faf8..fd2f2c635 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -341,7 +341,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe boolean isBackCalc = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1); // 查询薪资核算所用的薪资账套的员工信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); - // 查询薪资核算所用薪资账套的薪资项目 TODO ?是否包含回算薪资项目 ? --不包含 + // 查询薪资核算所用薪资账套的薪资项目 List salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); // 是否是回算 @@ -352,7 +352,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe salaryItemIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList())); } List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); - // 查询薪资核算结果 TODO: ?是否包含薪资回算项目结果? --包含 + // 查询薪资核算结果 Set salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId); List salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); // 查询人员信息 @@ -374,7 +374,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } // 查询公式详情 Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); - // 获取回算公式 TODO: ?是回算项目? + // 获取回算公式 if (isBackCalc) { formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO :: getFormulaId ).collect(Collectors.toList())); } @@ -853,6 +853,15 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe batchUpdateOriginResultValue(salaryAcctResultPOS); } + @Override + public List listBySalaryAcctRecordIdsAndSalaryItemIds(Collection salaryAcctRecordIds, Collection salaryItemIds) { + if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(salaryItemIds) || Objects.equals( ((List)salaryItemIds).get(0), 0 ) ) { + return Collections.emptyList(); + } + return SalaryAcctResultPOEncrypt.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).salaryItemIds(salaryItemIds).build())); + + } + @Override public void batchUpdateOriginResultValue(List salaryAcctResultValues) { int batchSize = 1000; diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index f19a590b9..a9de0aec7 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -24,11 +24,14 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; +import com.engine.salary.enums.salaryarchive.SalaryArchiveFieldTypeEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; +import com.engine.salary.enums.salarybill.SalaryTemplateReplenishRuleEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper; import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper; @@ -120,6 +123,22 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } + private SalarySobService getSalarySobService(User user) { + return ServiceUtil.getService(SalarySobServiceImpl.class, user); + } + + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + // @RpcReference // private FileDownloadClient fileDownloadClient; @@ -189,23 +208,69 @@ public class SalarySendServiceImpl extends Service implements SalarySendService } - SalarySendPO sendPO = new SalarySendPO(); - sendPO.setDeleteType(0); - sendPO.setSalaryAccountingId(salaryAccountingId); - List salarySends = mapper.listSome(sendPO); - if (CollectionUtils.isNotEmpty(salarySends)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100499, "工资单已生成过,不可再重复生成")); + List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(salaryAccountingId)); + // 根据人员id去重 + salaryAcctEmployees = salaryAcctEmployees.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SalaryAcctEmployeePO::getEmployeeId))), ArrayList::new)); + + // 1.回算:如果是回算,todo 要等原始核算发完或者上一个回算记录发完才行,目前最多只有一个回算记录 + if (acctRecords.get(0).getBackCalcStatus().equals(NumberUtils.INTEGER_ONE)) { + SalarySendPO sendPO = new SalarySendPO(); + sendPO.setDeleteType(0); + sendPO.setSalaryAccountingId(salaryAccountingId); + List salarySends = mapper.listSome(sendPO); + if (CollectionUtils.isEmpty(salarySends)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139700, "还没有正常核算,不能进行回算")); + } + // todo 一般只有一个未冻结,同一个原始核算id,后面如果有多级回算,就会换成不同核算id + SalarySendPO salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null); + + // 根据工资单补发模板规则过滤人员,已发补发的合计项目不等于0的进行过滤 + SalarySobPO salarySob = getSalarySobService(user).getById(acctRecords.get(0).getSalarySobId()); + List salaryTemplates = getSalaryTemplateService(user) + .getDefaultTemplates(Arrays.asList(acctRecords.get(0).getSalarySobId(), salarySob == null ? 0L : salarySob.getId())); + // 如果有默认模板,且规则不是全部 + if (CollectionUtils.isNotEmpty(salaryTemplates) && StringUtils.isEmpty(salaryTemplates.get(0).getReplenishRule())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140649, "请维护补发工资单模板信息")); + } + Long backCalcItemId = + CollectionUtils.isNotEmpty(salaryTemplates) && !SalaryTemplateReplenishRuleEnum.ALL.getValue().equals(salaryTemplates.get(0).getReplenishRule()) ? Long + .parseLong(salaryTemplates.get(0).getReplenishRule()) : 0L; + SalaryItemPO salaryItem = getSalaryItemService(user).getById(backCalcItemId); + if (salaryItem != null && salaryItem.getDataType().equals(SalaryArchiveFieldTypeEnum.NUMBER.getValue())) { + // 目前是单个薪资项目 + List salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singleton(salaryAccountingId), Collections.singleton(backCalcItemId)); + Set salaryAcctEmployeeIds = salaryAcctResultValues.stream() + .filter(salaryAcctResultPO -> SalaryEntityUtil.empty2Zero(salaryAcctResultPO.getResultValue()).compareTo(BigDecimal.ZERO) + != 0) + .map(SalaryAcctResultPO::getSalaryAcctEmpId) + .collect(Collectors.toSet()); + salaryAcctEmployees = salaryAcctEmployees.stream().filter(se -> salaryAcctEmployeeIds.contains(se.getId())).collect(Collectors.toList()); + } + + // 将未冻结的给冻结掉 + if (salarySend != null) { + salarySend.setSendStatus(NumberUtils.INTEGER_ONE); + this.mapper.updateById(salarySend); + } + // 2.正常核算 + } else { + SalarySendPO sendPO = new SalarySendPO(); + sendPO.setDeleteType(0); + sendPO.setSalaryAccountingId(salaryAccountingId); + List salarySends = mapper.listSome(sendPO); + if (CollectionUtils.isNotEmpty(salarySends)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100499, "工资单已生成过,不可再重复生成")); + } } - SalaryAcctEmployeePO employeePO = new SalaryAcctEmployeePO(); - employeePO.setDeleteType(0); - employeePO.setSalaryAcctRecordId(salaryAccountingId); - List salaryAcctEmployees = getSalaryAcctEmployeeMapper().listSome(employeePO); Long salarySendId = IdGenerator.generate(); - SalaryAcctRecordPO salaryAcctRecord = acctRecords.get(0); + // 工资单模板类型:0,正常核算,1是回算,todo 后续可能还有别的算,需要改这里 + Integer templateType = salaryAcctRecord.getBackCalcStatus(); + // 构建工资单发放数据 List salarySendInfos = salaryAcctEmployees.stream().map(m -> SalarySendInfoPO.builder() .id(IdGenerator.generate()) @@ -216,6 +281,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService .salaryAcctRecordId(m.getSalaryAcctRecordId()) .sendStatus(SalarySendStatusEnum.UNSEND.getValue()) .salaryTemplate("") + .salaryAcctType(templateType) .creator((long) user.getUID()) .createTime(new Date()) .updateTime(new Date()) @@ -229,6 +295,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService .salarySobId(salaryAcctRecord.getSalarySobId()) .sendNum(0) .sendTotal(salarySendInfos.size()) + .sendStatus(NumberUtils.INTEGER_ZERO) // 未冻结 + .salaryAcctType(templateType) .lastSendTime(new Date()) .creator((long) user.getUID()) .createTime(new Date()) @@ -336,7 +404,14 @@ public class SalarySendServiceImpl extends Service implements SalarySendService // 获取默认模板 List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); if (CollectionUtils.isNotEmpty(salaryTemplates)) { - template = salaryTemplates.get(0).getName(); + // 是否是回算 + SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId()); + boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE)); + if(isReplenish){ + template = salaryTemplates.get(0).getReplenishName(); + }else{ + template = salaryTemplates.get(0).getName(); + } } return SalarySendBaseInfoDTO.builder() @@ -663,19 +738,28 @@ public class SalarySendServiceImpl extends Service implements SalarySendService * @return */ @Override - public List getSalaryItemsSetting(SalaryTemplatePO salaryTemplate) { + public List getSalaryItemsSetting(SalaryTemplatePO salaryTemplate, boolean isReplenish) { List salaryItems = new ArrayList<>(); if (salaryTemplate == null) { return salaryItems; } - if (StringUtils.isNotEmpty(salaryTemplate.getSalaryItemSetting())) { + // 正常模板 + if (!isReplenish && StringUtils.isNotEmpty(salaryTemplate.getSalaryItemSetting())) { List salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> { salaryItems.addAll(e.getItems()); }); } + // 补发模板 + if (isReplenish && StringUtils.isNotEmpty(salaryTemplate.getReplenishSalaryItemSetting())) { + List salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getReplenishSalaryItemSetting(), + SalaryTemplateSalaryItemSetListDTO.class); + salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> { + salaryItems.addAll(e.getItems()); + }); + } return salaryItems; } @@ -689,6 +773,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Collection ids = param.getIds(); SalarySendPO salarySend = mapper.getById(salarySendId); + // 已经冻结不能操作 + if (Objects.equals(salarySend.getSendStatus() , NumberUtils.INTEGER_ONE)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结")); + } if (salarySend == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); } @@ -863,7 +951,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService private List> getEnableSendList(SalarySendPO salarySend, Collection ids, SalaryTemplatePO salaryTemplate) { // 1.根据模板获取薪资项目设置 - List salaryItems = getSalaryItemsSetting(salaryTemplate); + SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId()); + boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE)); + List salaryItems = getSalaryItemsSetting(salaryTemplate,isReplenish); SalarySendDetailQueryParam queryParam = new SalarySendDetailQueryParam(); queryParam.setSalarySendId(salarySend.getId()); // 空就是所有 @@ -1095,8 +1185,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService public XSSFWorkbook exportDetailList(SalarySendPO salarySend, SalarySendDetailQueryParam queryParam) { // 1.根据模板获取薪资项目设置 + SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId()); + boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE)); List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); - List salaryItems = getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null); + List salaryItems = getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null , isReplenish); // 2.获取基本数据 //排序配置 diff --git a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java index cba8b37a6..023444c7c 100644 --- a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java @@ -264,9 +264,9 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate } @Override - public List getSalaryItemSet(Long salarySobId) { + public List getSalaryItemSet(Long salarySobId, boolean isReplenish) { SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId); - return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID())); + return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish); } @Override diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index 31100fa22..3adb3c1e0 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -14,7 +14,6 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.web.bind.annotation.RequestParam; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; @@ -209,9 +208,9 @@ public class SalaryBillController { @GET @Path("/template/getReplenishRuleSetOptions") @Produces(MediaType.APPLICATION_JSON) - public String getReplenishRuleSetOptions(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestParam Long salarySobId) { + public String getReplenishRuleSetOptions(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam("salarySobId") Long salarySobId) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult(user).run(getSalaryTemplateWrapper(user)::getReplenishRuleSetOptions, salarySobId); + return new ResponseResult>>(user).run(getSalaryTemplateWrapper(user)::getReplenishRuleSetOptions, salarySobId); } diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 43c1d0fdd..5c2de9291 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -17,20 +17,15 @@ import com.engine.salary.entity.salaryBill.dto.*; import com.engine.salary.entity.salaryBill.param.*; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.dto.TaxAgentListDTO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salarybill.SalarySendMapper; -import com.engine.salary.service.SalarySendService; -import com.engine.salary.service.SalarySobService; -import com.engine.salary.service.SalaryTemplateService; -import com.engine.salary.service.TaxAgentService; -import com.engine.salary.service.impl.SalarySendServiceImpl; -import com.engine.salary.service.impl.SalarySobServiceImpl; -import com.engine.salary.service.impl.SalaryTemplateServiceImpl; -import com.engine.salary.service.impl.TaxAgentServiceImpl; +import com.engine.salary.service.*; +import com.engine.salary.service.impl.*; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; @@ -71,6 +66,11 @@ public class SalarySendWrapper extends Service { return ServiceUtil.getService(SalarySobServiceImpl.class, user); } + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + + /** * 工资单发放列表 * @@ -119,6 +119,7 @@ public class SalarySendWrapper extends Service { // 工资单模板 Optional optional = salaryTemplates.stream().filter(s -> s.getSalarySobId().equals(e.getSalarySobId())).findFirst(); if (optional.isPresent()) { + // todo 目前就一个回算,那么没有冻结且是回算,就展示补发名称 e.setTemplate(optional.get().getName()); e.setTemplateId(optional.get().getId()); } @@ -164,6 +165,7 @@ public class SalarySendWrapper extends Service { idColumn.setDisplay(WeaBoolAttr.FALSE); list.add(new WeaTableColumn("10%", "薪资所属月", "salaryYearMonth")); list.add(new WeaTableColumn("35%", "薪资账套", "salarySob")); + list.add(new WeaTableColumn("25%", "次数", "acctTimes")); list.add(new WeaTableColumn("25%", "工资单模板", "template")); list.add(new WeaTableColumn("15%", "已发放", "sendSituation")); list.add(new WeaTableColumn("15%", "最后发送时间", "lastSendTime")); @@ -478,9 +480,17 @@ public class SalarySendWrapper extends Service { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100510, "工资发放不存在")); } + SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId()); + boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE)); + + // 1.根据模板获取薪资项目设置 - List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); - List salaryItems = getSalarySendService(user).getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null); + SalarySobPO salarySob = getSalarySobService(user).getById(salarySend.getSalarySobId()); + List salaryTemplates = getSalaryTemplateService(user) + .getDefaultTemplates(Arrays.asList(salarySend.getSalarySobId(), salarySob == null ? 0L : salarySob.getId())); + + List salaryItems = getSalarySendService(user) + .getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null, isReplenish); // 2.获取基本数据 PageInfo pageInfo = getSalarySendService(user).salarySendInfoDetailListPage(queryParam); diff --git a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java index b1310e560..554499b46 100644 --- a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java @@ -70,6 +70,7 @@ public class SalaryTemplateWrapper extends Service { String fields = " t.id" + " , t.name" + + " , t.replenish_name as replenishName" + " , s.name as salarySob" + " , t.use_type as useType" + " , t.description"; @@ -137,7 +138,7 @@ public class SalaryTemplateWrapper extends Service { SalaryTemplateBaseSetDTO salaryTemplateBaseSetDTO = new SalaryTemplateBaseSetDTO(); - Map replenishRuleSetOptionList = Collections.emptyMap(); + List> replenishRuleSetOptionList = Collections.emptyList(); if (id != null) { SalaryTemplatePO po = getSalaryTemplateService(user).getById(id); if (po == null) { @@ -248,7 +249,11 @@ public class SalaryTemplateWrapper extends Service { * @return */ public List getSalaryItemSet(Long salarySobId) { - return getSalaryTemplateService(user).getSalaryItemSet(salarySobId); + return getSalaryTemplateService(user).getSalaryItemSet(salarySobId, false); + } + + public List getReplenishSalaryItemSet(Long salarySobId) { + return getSalaryTemplateService(user).getSalaryItemSet(salarySobId, true); } /** @@ -317,13 +322,13 @@ public class SalaryTemplateWrapper extends Service { * @param salarySobId * @return */ - public Map getReplenishRuleSetOptions(Long salarySobId) { + public List> getReplenishRuleSetOptions(Long salarySobId) { if (salarySobId == null) { - return Collections.emptyMap(); + return Collections.emptyList(); } SalarySobPO salarySob = getSalarySobService(user).getById(salarySobId); if (salarySob == null) { - return Collections.emptyMap(); + return Collections.emptyList(); } // 查询薪资账套的回算薪资项目 List salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId); @@ -341,10 +346,11 @@ public class SalaryTemplateWrapper extends Service { return map; }).collect(Collectors.toList()); - if(result!= null && result.size()>0){ - return result.get(0); - } - return Collections.emptyMap(); + return result; +// if(result!= null && result.size()>0){ +// return result.get(0); +// } +// return Collections.emptyMap(); } /** @@ -354,29 +360,30 @@ public class SalaryTemplateWrapper extends Service { * @return */ public SalaryTemplateReplenishFormDTO getReplenishForm(ReplenishFormQueryParam replenishFormQueryParam) { -// Long id = replenishFormQueryParam.getId(); -// // 补发薪资项目设置 -// List replenishSalaryItemSetting; -// if (id != null) { -// SalaryTemplatePO po = salaryTemplateService.getById(id); -// if (po == null) { -// throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100533, "工资单模板不存在")+"[id:%s]", id)); -// } -// org.springframework.beans.BeanUtils.copyProperties(po, salaryTemplateReplenishSetDTO); -// if (StringUtils.isNotEmpty(po.getReplenishSalaryItemSetting())) { -// replenishSalaryItemSetting = JsonUtil.parseList(po.getReplenishSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); -// } else { -// replenishSalaryItemSetting = this.getSalaryItemSet(salarySobId, true); -// } -// } else { -// replenishSalaryItemSetting = this.getSalaryItemSet(salarySobId, true); -// } -// -// return SalaryTemplateReplenishFormDTO.builder() -// .id(id) -// .replenishSalaryTemplateSalaryItemSet(replenishSalaryItemSetting) -// .build(); - return null; + Long id = replenishFormQueryParam.getId(); + SalaryTemplateReplenishFormDTO salaryTemplateReplenishSetDTO = new SalaryTemplateReplenishFormDTO(); + + // 补发薪资项目设置 + List replenishSalaryItemSetting; + if (id != null) { + SalaryTemplatePO po = getSalaryTemplateService(user).getById(id); + if (po == null) { + throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100533, "工资单模板不存在")+"[id:%s]", id)); + } + BeanUtils.copyProperties(po, salaryTemplateReplenishSetDTO); + if (StringUtils.isNotEmpty(po.getReplenishSalaryItemSetting())) { + replenishSalaryItemSetting = JsonUtil.fromJson(po.getReplenishSalaryItemSetting(), List.class); + } else { + replenishSalaryItemSetting = getReplenishSalaryItemSet(replenishFormQueryParam.getSalarySobId()); + } + } else { + replenishSalaryItemSetting = getReplenishSalaryItemSet(replenishFormQueryParam.getSalarySobId()); + } + + return SalaryTemplateReplenishFormDTO.builder() + .id(id) + .replenishSalaryTemplateSalaryItemSet(replenishSalaryItemSetting) + .build(); } }