From 3ff3fd8e44c6558e6fa495c8e70fc0a7977d8341 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Fri, 2 Dec 2022 17:35:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E5=9B=9E=E7=AE=97-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E6=A0=B8=E7=AE=97=E9=83=A8=E5=88=86=EF=BC=88=E5=89=A9?= =?UTF-8?q?=E4=BD=99=E6=A0=B8=E7=AE=97=E5=BD=92=E6=A1=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SalarySendBiz.java | 22 ++++ .../salaryacct/SalaryAcctResultPOEncrypt.java | 2 + .../salaryBill/bo/SalaryTemplateBO.java | 4 + .../salaryBill/dto/SalarySendCheckDTO.java | 28 ++++ .../dto/SalaryTemplateBaseFormDTO.java | 3 + .../dto/SalaryTemplateBaseSetDTO.java | 23 +++- .../dto/SalaryTemplateReplenishFormDTO.java | 29 +++++ .../param/ReplenishFormQueryParam.java | 22 ++++ .../param/SalarySendQueryParam.java | 3 + .../param/SalaryTemplateSaveParam.java | 29 +++++ .../salaryBill/po/SalarySendInfoPO.java | 7 +- .../entity/salaryBill/po/SalarySendPO.java | 16 ++- .../salaryBill/po/SalaryTemplatePO.java | 19 +++ .../salaryacct/bo/CalculateFormulaVarBO.java | 17 ++- .../salaryacct/bo/SalaryAcctCalculateBO.java | 6 + .../bo/SalaryAcctCalculatePriorityBO.java | 36 ++++- .../salaryacct/bo/SalaryAcctRecordBO.java | 12 +- .../salaryacct/bo/SalaryAcctResultBO.java | 66 +++++++++- .../dto/SalaryAcctRecordListDTO.java | 4 + .../dto/SalaryAcctResultDetailDTO.java | 6 + .../salaryacct/po/SalaryAcctRecordPO.java | 19 +++ .../salaryacct/po/SalaryAcctResultPO.java | 6 + .../salaryacct/po/SalaryAcctResultTempPO.java | 5 + .../bo/SalarySobItemAggregateBO.java | 31 ++++- .../dto/SalarySobItemAggregateDTO.java | 3 + .../SalaryTemplateReplenishRuleEnum.java | 38 ++++++ .../salaryformula/ReferenceTypeEnum.java | 3 +- .../SalaryFormulaReferenceEnum.java | 1 + .../salaryacct/SalaryAcctRecordMapper.xml | 4 + .../salaryacct/SalaryAcctResultMapper.java | 11 +- .../salaryacct/SalaryAcctResultMapper.xml | 36 ++++- .../salaryacct/SalaryAcctResultTempMapper.xml | 12 +- .../mapper/salarybill/SalarySendMapper.java | 5 +- .../mapper/salarybill/SalarySendMapper.xml | 29 ++++- .../salarybill/SalaryTemplateMapper.xml | 9 ++ .../service/SalaryAcctCalculateService.java | 5 +- .../service/SalaryAcctRecordService.java | 8 ++ .../service/SalaryAcctResultService.java | 16 +++ .../salary/service/SalarySendService.java | 22 +++- .../salary/service/SalarySobItemService.java | 2 +- .../service/impl/RemoteExcelServiceImpl.java | 11 ++ .../impl/SalaryAcctCalculateServiceImpl.java | 21 ++- .../impl/SalaryAcctEmployeeServiceImpl.java | 4 + .../impl/SalaryAcctExcelServiceImpl.java | 5 +- .../impl/SalaryAcctRecordServiceImpl.java | 113 ++++++++++++---- .../impl/SalaryAcctResultServiceImpl.java | 123 ++++++++++++++++-- .../SalaryComparisonResultServiceImpl.java | 7 +- .../service/impl/SalarySendServiceImpl.java | 82 ++++++++++-- .../impl/SalarySobItemServiceImpl.java | 36 +++-- .../salary/web/SalaryAcctController.java | 7 + .../salary/web/SalaryBillController.java | 30 +++++ .../wrapper/SalaryAcctRecordWrapper.java | 25 +++- .../salary/wrapper/SalarySendWrapper.java | 5 +- .../salary/wrapper/SalaryTemplateWrapper.java | 101 ++++++++++++-- .../proxy/SalaryAcctRecordWrapperProxy.java | 1 - 55 files changed, 1067 insertions(+), 123 deletions(-) create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalarySendCheckDTO.java create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateReplenishFormDTO.java create mode 100644 src/com/engine/salary/entity/salaryBill/param/ReplenishFormQueryParam.java create mode 100644 src/com/engine/salary/enums/salarybill/SalaryTemplateReplenishRuleEnum.java diff --git a/src/com/engine/salary/biz/SalarySendBiz.java b/src/com/engine/salary/biz/SalarySendBiz.java index 0b6219985..6af3ae366 100644 --- a/src/com/engine/salary/biz/SalarySendBiz.java +++ b/src/com/engine/salary/biz/SalarySendBiz.java @@ -96,4 +96,26 @@ public class SalarySendBiz { sqlSession.close(); } } + + public void batchHandleSendStatusHistory() { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + SalarySendMapper mapper = sqlSession.getMapper(SalarySendMapper.class); + mapper.batchHandleSendStatusHistory(); + sqlSession.commit(); + } finally { + sqlSession.close(); + } + } + + public void batchHandleSalaryAcctTypeHistory() { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + SalarySendMapper mapper = sqlSession.getMapper(SalarySendMapper.class); + mapper.batchHandleSalaryAcctTypeHistory(); + sqlSession.commit(); + } finally { + sqlSession.close(); + } + } } diff --git a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java index ecdb969a5..b7a61aaf7 100644 --- a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java +++ b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java @@ -13,6 +13,7 @@ public class SalaryAcctResultPOEncrypt { } list.forEach(item -> { item.setResultValue(AESEncryptUtil.encrypt(item.getResultValue())); + item.setOriginResultValue(AESEncryptUtil.encrypt(item.getOriginResultValue())); }); return list; } @@ -23,6 +24,7 @@ public class SalaryAcctResultPOEncrypt { } list.forEach(item -> { item.setResultValue(AESEncryptUtil.decrypt(item.getResultValue())); + item.setOriginResultValue(AESEncryptUtil.decrypt(item.getOriginResultValue())); }); return list; } diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index 68fa62b8b..99a288704 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -7,6 +7,7 @@ import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDT 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 org.apache.commons.collections.CollectionUtils; import java.util.Date; @@ -49,6 +50,9 @@ public class SalaryTemplateBO { .salaryItemNullStatus(saveParam.getSalaryItemNullStatus()?1:0) .salaryItemZeroStatus(saveParam.getSalaryItemZeroStatus()?1:0) .salaryItemSetting(saveParam.getSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getSalaryItemSetting()) : "") + .replenishName(saveParam.getReplenishName()) + .replenishRule(saveParam.getReplenishRule()) + .replenishSalaryItemSetting((saveParam.getSalaryItemSetting() != null ? JsonUtil.toJsonString(saveParam.getReplenishSalaryItemSetting()) : "")) .createTime(new Date()) .updateTime(new Date()) .creator(employeeId) diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendCheckDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendCheckDTO.java new file mode 100644 index 000000000..4c04cb768 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendCheckDTO.java @@ -0,0 +1,28 @@ +package com.engine.salary.entity.salaryBill.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @date 2022/11/24 14:11 + * @description 工资单发放检查信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalarySendCheckDTO { + + // 核算id + private Long salaryAcctId; + + // 是否存在已经发送 + private boolean isAlreadySend; + + // 是否已经发送完成 + private boolean isSendFinished; + +} diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java index 77ea9bde1..f328b6032 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseFormDTO.java @@ -20,4 +20,7 @@ public class SalaryTemplateBaseFormDTO { // 基础设置 private Map salaryTemplateBaseSet; + + // 补发规则设置下拉列表 + private Map replenishRuleSetOption; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java index b5bb86029..13a858835 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java @@ -19,28 +19,39 @@ public class SalaryTemplateBaseSetDTO { /* ===== 1.基础信息 ======================*/ -// @ApiModelProperty("薪资账套") + // @ApiModelProperty("薪资账套") private Long salarySob; private List> salarySobOptions; -// @ApiModelProperty("工资单模板名称") + // @ApiModelProperty("工资单模板名称") private String name; -// @ApiModelProperty("备注") + // @ApiModelProperty("备注") private String description; + + // @ApiModelProperty("补发工资单模板名称") + private String replenishName; + + // @ApiModelProperty("补发工资单名单生成规则") + private String replenishRule; + + // @ApiModelProperty("规则设置") + private String replenishRuleSet; + + /* ===== 2.发送设置 ======================*/ -// @ApiModelProperty("邮件") + // @ApiModelProperty("邮件") private Boolean emailStatus; -// @ApiModelProperty("发送地址") + // @ApiModelProperty("发送地址") private Long sendEmail; // 邮件列表 private List> sendEmailOptions; -// @ApiModelProperty("消息中心") + // @ApiModelProperty("消息中心") private Boolean msgStatus; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateReplenishFormDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateReplenishFormDTO.java new file mode 100644 index 000000000..117ead514 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateReplenishFormDTO.java @@ -0,0 +1,29 @@ +package com.engine.salary.entity.salaryBill.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Harryxzy + * @date 2022/12/02 17:18 + * @description 工资单补发表单 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +//@ApiModel("工资单补发表单") +public class SalaryTemplateReplenishFormDTO { + +// @ApiModelProperty("主键id") +// @JsonSerialize(using = ToStringSerializer.class) + private Long id; + +// @ApiModelProperty("薪资项目设置") + private List replenishSalaryTemplateSalaryItemSet; + +} diff --git a/src/com/engine/salary/entity/salaryBill/param/ReplenishFormQueryParam.java b/src/com/engine/salary/entity/salaryBill/param/ReplenishFormQueryParam.java new file mode 100644 index 000000000..840e8567e --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/param/ReplenishFormQueryParam.java @@ -0,0 +1,22 @@ +package com.engine.salary.entity.salaryBill.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @date 2022/12/02 17:21 + * @description + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ReplenishFormQueryParam { + + private Long id; + + private Long salarySobId; +} diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendQueryParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendQueryParam.java index 5c3a2df28..ac127290a 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendQueryParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendQueryParam.java @@ -33,4 +33,7 @@ public class SalarySendQueryParam extends BaseQueryParam { private List salaryMonthDate; private Collection salarySobIds; + + private Collection SalaryAccountingId; + } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java index a1cc4aa87..c470f3505 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java @@ -3,10 +3,12 @@ package com.engine.salary.entity.salaryBill.param; import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO; import com.engine.salary.enums.salarybill.SalaryTemplateTextContentPositionEnum; import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.util.SalaryI18nUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -63,6 +65,16 @@ public class SalaryTemplateSaveParam { // @ApiModelProperty("薪资项目设置") private List salaryItemSetting; + +// @ApiModelProperty("补发工资单模板名称") + private String replenishName; + +// @ApiModelProperty("补发工资单名单生成规则") + private String replenishRule; + +// @ApiModelProperty("补发薪资项目设置") + private List replenishSalaryItemSetting; + public static void checkParam(SalaryTemplateSaveParam saveParam) { if (saveParam.getSalarySobId() == null) { throw new SalaryRunTimeException("薪资账套表的主键id必传"); @@ -76,6 +88,19 @@ public class SalaryTemplateSaveParam { throw new SalaryRunTimeException("工资单主题必填"); } + if (StringUtils.isEmpty(saveParam.getReplenishName())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139737, "补发工资单模板名称必填")); + } + + if (saveParam.getName().equals(saveParam.getReplenishName())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140557, "工资单模板名称和补发工资单模板名称不可相同")); + } + + if (StringUtils.isEmpty(saveParam.getReplenishRule())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139738, "补发工资单名单生成规则必填")); + } + + if (saveParam.getEmailStatus() && saveParam.getSendEmail() == null) { throw new SalaryRunTimeException("开启邮箱后,发送地址必选"); } @@ -87,5 +112,9 @@ public class SalaryTemplateSaveParam { if (saveParam.getTextContentPosition() !=null && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.BEFORE.getValue()) && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.AFTER.getValue())) { throw new SalaryRunTimeException("文本内容位置参数不对"); } + + if (CollectionUtils.isEmpty(saveParam.getReplenishSalaryItemSetting())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140509, "补发工资单模板的薪资项目设置不能为空")); + } } } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java index 582cc097d..df9c2b4f7 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java @@ -5,7 +5,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDate; import java.util.Date; /** @@ -67,6 +66,12 @@ public class SalarySendInfoPO { // @ElogTransform(name = "发送时间") private Date sendTime; + /** + * 核算类型。0:正常,1:补发 + */ +// @ElogTransform(name = "核算类型。0:正常,1:补发") + private Integer salaryAcctType; + /** * 工资单模板设置内容 */ diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java index 8071598fd..e4e828b23 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java @@ -5,8 +5,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.Date; /** @@ -62,6 +60,20 @@ public class SalarySendPO { // @ElogTransform(name = "最后发送时间") private Date lastSendTime; + + /** + * 发放状态。0:未冻结、1:已冻结 + */ +// @ElogTransform(name = "发放状态。0:未冻结、1:已冻结") + private Integer sendStatus; + + /** + * 核算类型。0:正常,1:补发 + */ +// @ElogTransform(name = "核算类型。0:正常,1:补发") + private Integer salaryAcctType; + + /** * 创建人 */ diff --git a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java index b375d92fa..b54b870ed 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java @@ -110,6 +110,25 @@ public class SalaryTemplatePO { // @ElogTransform(name = "薪资项目设置") private String salaryItemSetting; + //=====================补发=================== + /** + * 补发工资单模板名称 + */ +// @ElogTransform(name = "补发工资单模板名称") + private String replenishName; + + /** + * 补发工资单名单生成规则 + */ +// @ElogTransform(name = "补发工资单名单生成规则") + private String replenishRule; + + /** + * 补发薪资项目设置 + */ +// @ElogTransform(name = "补发薪资项目设置") + private String replenishSalaryItemSetting; + /** * 创建时间 */ diff --git a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java index fc5dcc5cd..425c7715c 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/CalculateFormulaVarBO.java @@ -130,7 +130,6 @@ public class CalculateFormulaVarBO { handleWelfareData(salaryAcctCalculateBO, resultMap); // 处理考勤数据 handleAttendQuoteData(salaryAcctCalculateBO, resultMap); - //处理核算人员信息 handleSalaryAcctEmployee(salaryAcctCalculateBO, resultMap); handleSimpleEmployees(resultMap); @@ -180,9 +179,13 @@ public class CalculateFormulaVarBO { private void handleSalaryAcctResult(SalaryAcctCalculateBO salaryAcctCalculateBO, Map> resultMap) { // key:薪资项目的id、value:薪资项目的code Map salaryItemCodeMap = SalaryEntityUtil.convert2Map(salaryAcctCalculateBO.getSalaryItemPOS(), SalaryItemPO::getId, SalaryItemPO::getCode); + // key:薪资项目的code、value:薪资项目的id + Map salaryCodeItemMap = SalaryEntityUtil.convert2Map(salaryAcctCalculateBO.getSalaryItemPOS(), SalaryItemPO::getCode, SalaryItemPO::getId); // key:employeeId_taxAgentId、value:薪资核算结果集合 Map> salaryAcctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, salaryAcctResultPO -> salaryAcctResultPO.getEmployeeId() + "_" + salaryAcctResultPO.getTaxAgentId()); + // +// List expressFormulas = salaryAcctCalculateBO.getExpressFormulas(); // 填充到返回结果集中 salaryAcctResultMap.forEach((key, salaryAcctResultPOS) -> { List formulaVarValues = resultMap.computeIfAbsent(key, k -> Lists.newArrayList()); @@ -194,9 +197,21 @@ public class CalculateFormulaVarBO { return new FormulaVarValue().setFieldId(fieldId).setFieldValue(salaryAcctResultPO.getResultValue()); }) .collect(Collectors.toList())); + Map salaryAcctResultPOMap = SalaryEntityUtil.convert2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId); + formulaVarValues.addAll(salaryAcctCalculateBO.getIssuedFieldIds().stream() + .map(fieldId -> { + String originResultValue = salaryAcctResultPOMap.get(salaryCodeItemMap.get(fieldId)).getOriginResultValue(); + String fieldId2 = SalaryFormulaReferenceEnum.ISSUED.getValue() + + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR + + fieldId; + return new FormulaVarValue().setFieldId(fieldId2).setFieldValue(originResultValue); + }).collect(Collectors.toList())); }); } + + + /** * 处理薪资档案(会涉及调薪计薪规则)+处理核算日期 * diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java index 399e4d0fe..5244de8c0 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java @@ -16,6 +16,7 @@ import lombok.experimental.Accessors; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.BlockingDeque; import java.util.concurrent.CountDownLatch; @@ -98,6 +99,11 @@ public class SalaryAcctCalculateBO { */ private List salaryAcctEmployeePOS; + /** + * 本次运算的回算薪资项目所涉及的变量 + */ + private Set issuedFieldIds; + /** * 核算结果临时表中的key */ diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculatePriorityBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculatePriorityBO.java index 9aa4aa44b..197ad1245 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculatePriorityBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculatePriorityBO.java @@ -4,6 +4,7 @@ import com.engine.salary.constant.SalaryFormulaFieldConstant; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO; import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -53,7 +54,9 @@ public class SalaryAcctCalculatePriorityBO { */ public static List> calculatePriority(List salarySobItems, List salaryItems, - List expressFormulas) { + List expressFormulas, + List salarySobBackItems, + Set issuedFieldIds) { // 公式详情 Map> formulaIdKeyMap = ExpressFormulaBO.buildFormulaVar(expressFormulas); // key:薪资项目的id,value:薪资项目的po @@ -62,9 +65,14 @@ public class SalaryAcctCalculatePriorityBO { Map codeKeySalaryItemPOMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getCode); // key:薪资项目的id,value:薪资账套下的薪资项目副本的po Map salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItems, SalarySobItemPO::getSalaryItemId); - Map salaryItemIdWithPriorityMap = Maps.newHashMapWithExpectedSize(salarySobItems.size()); - for (SalarySobItemPO salarySobItem : salarySobItems) { - calculate(salarySobItem.getSalaryItemId(), salaryItemPOMap, codeKeySalaryItemPOMap, salaryItemIdKeySalarySobItemPOMap, formulaIdKeyMap, salaryItemIdWithPriorityMap, null); + // 薪资账套项目+薪资回算项目 + Set salarySobItemsAndBackItems = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId); + salarySobItemsAndBackItems.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId)); + Map salaryItemIdWithPriorityMap = Maps.newHashMapWithExpectedSize(salarySobItemsAndBackItems.size()); + // key:薪资回算项目id,value:薪资回算项目副本PO + Map salarySobBackItemPOMap = SalaryEntityUtil.convert2Map(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId); + for (Long salaryItemId : salarySobItemsAndBackItems) { + calculate(salaryItemId, salaryItemPOMap, codeKeySalaryItemPOMap, salaryItemIdKeySalarySobItemPOMap, formulaIdKeyMap, salaryItemIdWithPriorityMap, null, salarySobBackItemPOMap, issuedFieldIds); } return SalaryEntityUtil.group2Map(salaryItemIdWithPriorityMap.values(), SalaryItemIdWithPriority::getPriority).values().stream() .sorted(Comparator.comparingInt(list -> list.get(0).getPriority())) @@ -90,7 +98,9 @@ public class SalaryAcctCalculatePriorityBO { Map salaryItemIdKeySalarySobItemPOMap, Map> formulaIdKeyMap, Map salaryItemIdWithPriorityMap, - SalaryItemIdWithPriority pre) { + SalaryItemIdWithPriority pre, + Map salarySobBackItemPOMap, + Set issuedFieldIds) { List salaryItemIds = Lists.newArrayList(); // 获取公式详情 List formulaVars; @@ -98,8 +108,12 @@ public class SalaryAcctCalculatePriorityBO { // 如果薪资项目在薪资账套中有副本,则取薪资账套中设置的公式 SalarySobItemPO salarySobItemPO = salaryItemIdKeySalarySobItemPOMap.get(currentSalaryItemId); formulaVars = formulaIdKeyMap.getOrDefault(salarySobItemPO.getFormulaId(), Collections.emptyList()); + } else if(salarySobBackItemPOMap.containsKey(currentSalaryItemId)){ + // 如果薪资项目在薪资账套中没有副本,则取薪资回算中设置的公式 + SalarySobBackItemPO salarySobBackItemPO = salarySobBackItemPOMap.get(currentSalaryItemId); + formulaVars = formulaIdKeyMap.getOrDefault(salarySobBackItemPO.getFormulaId(), Collections.emptyList()); } else { - // 如果薪资项目在薪资账套中没有有副本,则取薪资项目中设置的公式 + // 如果薪资项目在薪资账套及回算薪资项目中没有有副本,则取薪资项目中设置的公式 SalaryItemPO salaryItemPO = salaryItemPOMap.get(currentSalaryItemId); formulaVars = formulaIdKeyMap.getOrDefault(salaryItemPO.getFormulaId(), Collections.emptyList()); } @@ -112,6 +126,8 @@ public class SalaryAcctCalculatePriorityBO { Matcher matcher = SALARY_PATTERN.matcher(fieldId); if (matcher.find()) { SalaryFormulaReferenceEnum referenceEnum = SalaryFormulaReferenceEnum.parseByValue(matcher.group(1)); + // 分析公式中的回算变量包含哪些 + loadSalaryCalcFormula(referenceEnum, issuedFieldIds, matcher.group(2)); if (referenceEnum == SalaryFormulaReferenceEnum.SALARY_ITEM) { SalaryItemPO salaryItemPO = codeKeySalaryItemPOMap.get(matcher.group(2)); if (salaryItemPO == null) { @@ -139,7 +155,13 @@ public class SalaryAcctCalculatePriorityBO { .build()); addPre(current, pre, salaryItemPOMap); updatePriority(current); - calculate(salaryItemId, salaryItemPOMap, codeKeySalaryItemPOMap, salaryItemIdKeySalarySobItemPOMap, formulaIdKeyMap, salaryItemIdWithPriorityMap, current); + calculate(salaryItemId, salaryItemPOMap, codeKeySalaryItemPOMap, salaryItemIdKeySalarySobItemPOMap, formulaIdKeyMap, salaryItemIdWithPriorityMap, current, Collections.emptyMap(), issuedFieldIds); + } + } + + private static void loadSalaryCalcFormula(SalaryFormulaReferenceEnum referenceEnum, Set issuedFieldIds, String fieldId) { + if (referenceEnum == SalaryFormulaReferenceEnum.ISSUED) { + issuedFieldIds.add(fieldId); } } diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java index 0139c38ef..db327ce8a 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java @@ -3,6 +3,7 @@ package com.engine.salary.entity.salaryacct.bo; import com.cloudstore.eccom.pc.table.WeaTableOperate; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.salaryBill.dto.SalarySendCheckDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctEmployeeCountDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctRecordListDTO; import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordSaveParam; @@ -43,24 +44,31 @@ public class SalaryAcctRecordBO { public static List convert2ListDTO(List salaryAcctRecordPOS, List salarySobs, List employeeComInfos, - List salaryAcctEmployeeCountDTOS) { + List salaryAcctEmployeeCountDTOS, + List salarySendCheckResult) { if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) { return Collections.emptyList(); } Map salarySobMap = SalaryEntityUtil.convert2Map(salarySobs, SalarySobPO::getId); Map usernameMap = SalaryEntityUtil.convert2Map(employeeComInfos, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); Map empSizeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployeeCountDTOS, SalaryAcctEmployeeCountDTO::getSalaryAcctRecordId, SalaryAcctEmployeeCountDTO::getCountBySalaryAcctRecordId); + Map salarySendMap = SalaryEntityUtil.convert2Map(salarySendCheckResult, SalarySendCheckDTO::getSalaryAcctId, SalarySendCheckDTO::isSendFinished); return salaryAcctRecordPOS.stream() .map(salaryAcctRecordPO -> { SalarySobPO salarySobPO = salarySobMap.get(salaryAcctRecordPO.getSalarySobId()); SalaryAcctRecordStatusEnum salaryAcctRecordStatusEnum = SalaryAcctRecordStatusEnum.parseByValue(salaryAcctRecordPO.getStatus()); // 只有未归档时可以"核算"、"删除"、"归档" + // 归档后、工资单全部发放以后可以"查看"、"重新核算"、"回算" // 归档后、申报后可以"查看"、"重新核算" List btnList = new ArrayList<>(); if (SalaryAcctRecordStatusEnum.NOT_ARCHIVED == salaryAcctRecordStatusEnum) { btnList.add(new WeaTableOperate("核算", null, "0")); btnList.add(new WeaTableOperate("删除", null, "0")); btnList.add(new WeaTableOperate("归档", null, "0")); + } else if (SalaryAcctRecordStatusEnum.ARCHIVED == salaryAcctRecordStatusEnum && ( salarySendMap.get(salaryAcctRecordPO.getId()) ==Boolean.TRUE ) ){ + btnList.add(new WeaTableOperate("查看", null, "0")); + btnList.add(new WeaTableOperate("重新核算", null, "0")); + btnList.add(new WeaTableOperate("回算", null, "0")); } else { btnList.add(new WeaTableOperate("查看", null, "0")); btnList.add(new WeaTableOperate("重新核算", null, "0")); @@ -75,6 +83,7 @@ public class SalaryAcctRecordBO { .orElse(StringUtils.EMPTY)) .acctTimes(salaryAcctRecordPO.getAcctTimes()) .acctTimesViable(salaryAcctRecordPO.getAcctTimes() >= 1) + .backCalcStatus(salaryAcctRecordPO.getBackCalcStatus() == null ? 0 : salaryAcctRecordPO.getBackCalcStatus()) .employeeSize(empSizeMap.getOrDefault(salaryAcctRecordPO.getId(), NumberUtils.LONG_ZERO)) .accountantName(usernameMap.getOrDefault(salaryAcctRecordPO.getCreator(), StringUtils.EMPTY)) .updateTime(SalaryDateUtil.getFormatLocalDateTime(salaryAcctRecordPO.getUpdateTime())) @@ -103,6 +112,7 @@ public class SalaryAcctRecordBO { .setSalarySobId(saveParam.getSalarySobId()) .setStatus(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()) .setAcctTimes(acctTimes + 1) + .setBackCalcStatus(0) .setDescription(saveParam.getDescription()) .setDeleteType(NumberUtils.INTEGER_ZERO) .setCreator(employeeId) diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java index 483d223a4..75c4a71ca 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java @@ -15,6 +15,7 @@ import com.engine.salary.entity.salarysob.dto.SalarySobEmpFieldDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemGroupDTO; +import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO; import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO; import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; @@ -156,6 +157,15 @@ public class SalaryAcctResultBO { columns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.UNLOCK.getValue())); } + } + // 回算的薪资项目 + for (SalarySobItemDTO salarySobItemDTO : salarySobItemAggregateDTO.getBackCalcItems()) { + if (lockSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) { + columns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.LOCK.getValue())); + } else { + columns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.UNLOCK.getValue())); + } + } return columns; } @@ -200,6 +210,8 @@ public class SalaryAcctResultBO { * @param salaryAccountingResults * @param taxAgents * @param consolidatedTaxSalaryAcctEmpIds + * @param customBackCalcParameters + * @param isBackCalc * @return */ public static List> buildTableData(List salaryItems, @@ -209,7 +221,9 @@ public class SalaryAcctResultBO { List salaryAccountingResults, List taxAgents, Set consolidatedTaxSalaryAcctEmpIds, - Map customParameters) { + Map customParameters, + Map customBackCalcParameters, + boolean isBackCalc) { if (CollectionUtils.isEmpty(salaryAcctEmployees)) { return Collections.emptyList(); } @@ -224,6 +238,7 @@ public class SalaryAcctResultBO { // 薪资项目的字段类型(前端依据这个判断是否需要展示千分位) Map dataTypeMap = SalaryEntityUtil.convert2Map(salaryItems, salaryItemPO -> salaryItemPO.getId() + DATA_TYPE_SUFFIX, SalaryItemPO::getDataType); map.putAll(dataTypeMap); + // TODO ?看一下如果不是回算这会不会有回算的东西? // 人员信息字段的值 Map fieldValueMap = SalaryAcctFormulaBO.convert2FormulaEmployee(employeeMap.get(e.getEmployeeId())); for (SalarySobEmpFieldPO salarySobEmpField : salarySobEmpFields) { @@ -241,6 +256,7 @@ public class SalaryAcctResultBO { // 个税扣缴义务人的字段类型 map.put("taxAgentName" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue()); // 公式详情 + customParameters.putAll(customBackCalcParameters); map.put("customParameters", customParameters); return map; }).collect(Collectors.toList()); @@ -355,7 +371,11 @@ public class SalaryAcctResultBO { List salarySobEmpFields, List salarySobItemPOS, List salaryItems, - List salaryAcctResults) { + List salaryAcctResults, + List salarySobBackItemPOS, + List salaryBackItemPOS, + Map salaryBackItemFormula) { + // 员工信息字段 Map employeeFieldValueMap = SalaryAcctFormulaBO.convert2FormulaEmployee(simpleEmployee); // 个税扣缴义务人 @@ -370,6 +390,7 @@ public class SalaryAcctResultBO { // 薪资项目的值 Map resultValueMap = SalaryEntityUtil.convert2Map(salaryAcctResults, SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue); Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); + Map salaryBackItemMap = SalaryEntityUtil.convert2Map(salaryBackItemPOS, SalaryItemPO::getId); // 公式项的值(不根据salaryItemPO的valueType判断是因为薪资项目的valueType属性改变后并不会同步更新薪资账套中的薪资项目的formulaId字段) List formulaItems = salarySobItemPOS.stream() .filter(salarySobItemPO -> salarySobItemPO.getFormulaId() > 0) @@ -380,12 +401,21 @@ public class SalaryAcctResultBO { .filter(salarySobItemPO -> salarySobItemPO.getFormulaId() <= 0) .map(salarySobItemPO -> convert2SalaryAcctResultDetailItemDTO(salarySobItemPO, salaryItemMap.get(salarySobItemPO.getSalaryItemId()), resultValueMap)) .collect(Collectors.toList()); + // TODO 临时处理,后续删除,将已发补发加入输入、导入 + formulaItems.addAll(salarySobBackItemPOS.stream() + .map(salarySobBackItemPO -> backItemConvert2SalaryAcctResultDetailItemDTO(salarySobBackItemPO, salaryBackItemMap.get(salarySobBackItemPO.getSalaryItemId()), resultValueMap, salaryBackItemFormula)) + .collect(Collectors.toList())); + // 已发/补发项目的值 + List issuedAndReissueItems = salarySobBackItemPOS.stream() + .map(salarySobBackItemPO -> backItemConvert2SalaryAcctResultDetailItemDTO(salarySobBackItemPO, salaryBackItemMap.get(salarySobBackItemPO.getSalaryItemId()), resultValueMap, salaryBackItemFormula)) + .collect(Collectors.toList()); return SalaryAcctResultDetailDTO.builder() .id(salaryAcctEmployee.getId()) .employeeId(salaryAcctEmployee.getEmployeeId()) .employeeInfos(employeeInfos) .formulaItems(formulaItems) .inputItems(inputItems) + .issuedAndReissueItems(issuedAndReissueItems) .build(); } @@ -410,6 +440,29 @@ public class SalaryAcctResultBO { .build(); } + /** + * 薪资回算项目转换成薪资核算结果详情dto + * + * @param salarySobBackItemPO + * @param salaryItemPO + * @param resultValueMap + * @return + */ + private static SalaryAcctResultDetailDTO.SalaryAcctResultDetailItemDTO backItemConvert2SalaryAcctResultDetailItemDTO(SalarySobBackItemPO salarySobBackItemPO, + SalaryItemPO salaryItemPO, + Map resultValueMap, + Map salaryBackItemFormula) { + // 薪资项目的数据类型 + return SalaryAcctResultDetailDTO.SalaryAcctResultDetailItemDTO.builder() + .salaryItemId(salarySobBackItemPO.getSalaryItemId()) + .salaryItemName(Optional.ofNullable(salaryItemPO).map(SalaryItemPO::getName).orElse(StringUtils.EMPTY)) + .resultValue(resultValueMap.getOrDefault(salarySobBackItemPO.getSalaryItemId(), StringUtils.EMPTY)) + .salaryBackItemFormula(salaryBackItemFormula.get(salarySobBackItemPO.getSalaryItemId())) + .dataType(Optional.ofNullable(salarySobBackItemPO).map(SalarySobBackItemPO::getDataType).orElse(SalaryDataTypeEnum.NUMBER.getValue())) + .canEdit(Objects.equals(Optional.ofNullable(salaryItemPO).map(SalaryItemPO::getUseInEmployeeSalary).orElse(0), 0)) + .build(); + } + /** * 薪资核算结果保存参数转换成薪资核算结果po * @@ -418,12 +471,18 @@ public class SalaryAcctResultBO { * @param employeeId 当前登陆人员id * @return */ - public static List convert2PO(SalaryAcctResultSaveParam saveParam, + public static List convert2PO(List salaryAcctResultPOSOld, + SalaryAcctResultSaveParam saveParam, SalaryAcctEmployeePO salaryAcctEmployee, Long employeeId) { if (CollectionUtils.isEmpty(saveParam.getItems())) { return Collections.emptyList(); } + // 获取薪资项目回算前的值 + Map salaryAcctResultOldPOMap = salaryAcctResultPOSOld.stream() + .collect(Collectors.groupingBy(p -> p.getSalaryAcctEmpId() + "-" + p.getSalaryItemId(), + Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(SalaryAcctResultPO::getId)), + s -> s.map(SalaryAcctResultPO::getOriginResultValue).orElse("")))); Date now = new Date(); return saveParam.getItems().stream() .map(e -> SalaryAcctResultPO.builder() @@ -434,6 +493,7 @@ public class SalaryAcctResultBO { .employeeId(salaryAcctEmployee.getEmployeeId()) .taxAgentId(salaryAcctEmployee.getTaxAgentId()) .resultValue(e.getResultValue()) + .originResultValue(salaryAcctResultOldPOMap.get(saveParam.getSalaryAcctEmpId() + "-" + e.getSalaryItemId())) .creator(employeeId) .createTime(now) .updateTime(now) diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctRecordListDTO.java b/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctRecordListDTO.java index 345e643f0..59b4440eb 100644 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctRecordListDTO.java +++ b/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctRecordListDTO.java @@ -42,6 +42,9 @@ public class SalaryAcctRecordListDTO { @TableTitle(title = "薪资所属月", dataIndex = "salaryMonth", key = "salaryMonth") private String salaryMonth; + @TableTitle(title = "是否回算过", dataIndex = "backCalcStatus", key = "backCalcStatus") + private Integer backCalcStatus; + @TableTitle(title = "核算次数", dataIndex = "acctTimes", key = "acctTimes") private Integer acctTimes; @@ -54,6 +57,7 @@ public class SalaryAcctRecordListDTO { @TableTitle(title = "状态", dataIndex = "status", key = "status") private String status; + @TableTitle(title = "核算人数", dataIndex = "employeeSize", key = "employeeSize") private Long employeeSize; diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctResultDetailDTO.java b/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctResultDetailDTO.java index c49454e5f..efd51c4a2 100644 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctResultDetailDTO.java +++ b/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctResultDetailDTO.java @@ -39,6 +39,9 @@ public class SalaryAcctResultDetailDTO { //输入项") private List inputItems; + //已发补发 + private List issuedAndReissueItems; + @Data @Builder @NoArgsConstructor @@ -54,6 +57,9 @@ public class SalaryAcctResultDetailDTO { //核算结果的值") private String resultValue; + // 公式/输入 + private String salaryBackItemFormula; + //数据类型:number、string") private String dataType; diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java index 7f1bbf645..ce941edf8 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java @@ -59,6 +59,25 @@ public class SalaryAcctRecordPO { */ private Integer acctTimes; + /** + * 是否是回算 0:不是回算、1:是回算 + */ + private Integer backCalcStatus; + + /** + * 回算(上次核算的薪资核算记录id) + */ + @Deprecated +// @ElogTransform(name = "备用字段1", ignore = true) + private Long superId; + + /** + * 回算(最原始的那次薪资核算记录id) + */ + @Deprecated +// @ElogTransform(name = "备用字段2", ignore = true) + private Long rootId; + /** * 备注 */ diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java index 101d2bda1..432fc138a 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java @@ -63,6 +63,11 @@ public class SalaryAcctResultPO { */ private String resultValue; + /** + * 回算前的值 + */ + private String originResultValue; + /** * 租户key */ @@ -94,4 +99,5 @@ public class SalaryAcctResultPO { private Collection salaryAcctEmpIds; private Collection employeeIds; private Collection taxAgentIds; + private Collection salaryItemIds; } diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultTempPO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultTempPO.java index d11498903..3e985265e 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultTempPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultTempPO.java @@ -69,6 +69,11 @@ public class SalaryAcctResultTempPO { */ private String resultValue; + /** + * 回算前的值 + */ + private String originResultValue; + /** * 租户key */ diff --git a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java index 5dbadc876..bced4a8a5 100644 --- a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java +++ b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java @@ -6,10 +6,7 @@ import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO; import com.engine.salary.entity.salaryitem.bo.SalaryItemBO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.dto.*; -import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO; -import com.engine.salary.entity.salarysob.po.SalarySobItemGroupPO; -import com.engine.salary.entity.salarysob.po.SalarySobItemPO; -import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.entity.salarysob.po.*; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; @@ -66,6 +63,11 @@ public class SalarySobItemAggregateBO { */ private List salaryItems; + /** + * 薪资回算项目 + */ + private List salarySobBackItems; + private final BaseBean baseBean = new BaseBean(); //强制开启账套的公式配置 @@ -140,6 +142,26 @@ public class SalarySobItemAggregateBO { .setItems(sortItem(itemsWithoutGroup)); incomeCategories.add(salarySobItemIncomeCategoryDTO); } + // 薪资回算项目 + List backCalcItems = salarySobBackItems.stream() + .map(salarySobBackItem -> { + SalaryItemPO salaryItem = salaryItemMap.get(salarySobBackItem.getSalaryItemId()); + return SalarySobItemDTO.builder() + .id(salarySobBackItem.getId()) + .salarySobId(salarySob.getId()) + .salaryItemId(salaryItem.getId()) + .salaryItemGroupId(0L) + .dateType(salaryItem.getDataType()) + .name(salaryItem.getName()) + .formulaId(salarySobBackItem.getFormulaId()) + .formulaContent(formulaMap.getOrDefault(salarySobBackItem.getFormulaId(), "输入")) + .taxDeclarationColumn(SalaryItemBO.buildTaxDeclarationColumn(salaryItem.getCode())) + .sortedIndex(0) + .canEdit(true) + .canDelete(false) + .build(); + }).collect(Collectors.toList()); + return SalarySobItemAggregateDTO.builder() .salarySobId(salarySob.getId()) @@ -147,6 +169,7 @@ public class SalarySobItemAggregateBO { .items(sortItem(itemsWithoutGroup)) .itemGroups(sortItemGroup(salarySobItemGroupDTOMap.values())) .incomeCategories(incomeCategories) + .backCalcItems(backCalcItems) .build(); } diff --git a/src/com/engine/salary/entity/salarysob/dto/SalarySobItemAggregateDTO.java b/src/com/engine/salary/entity/salarysob/dto/SalarySobItemAggregateDTO.java index a002508a9..9fff58c8c 100644 --- a/src/com/engine/salary/entity/salarysob/dto/SalarySobItemAggregateDTO.java +++ b/src/com/engine/salary/entity/salarysob/dto/SalarySobItemAggregateDTO.java @@ -39,4 +39,7 @@ public class SalarySobItemAggregateDTO { //薪资账套的薪资项目按薪资类型分类(账套目前只含一个类型,只给核算表头带出公式使用。未来若账套包含多类型时,可用于扩展) private List incomeCategories; + + // 已发薪资项目 + private List backCalcItems; } diff --git a/src/com/engine/salary/enums/salarybill/SalaryTemplateReplenishRuleEnum.java b/src/com/engine/salary/enums/salarybill/SalaryTemplateReplenishRuleEnum.java new file mode 100644 index 000000000..0ff3b9b3b --- /dev/null +++ b/src/com/engine/salary/enums/salarybill/SalaryTemplateReplenishRuleEnum.java @@ -0,0 +1,38 @@ +package com.engine.salary.enums.salarybill; + +/** + * @author Harryxzy + * @date 2022/12/02 15:44 + * @description 补发工资名单规则 + */ +public enum SalaryTemplateReplenishRuleEnum { + + ALL("ALL", "全部", 85155), + + BYRULE("BYRULE", "按规则", 138972); + + private String value; + + private String defaultLabel; + + private int labelId; + + SalaryTemplateReplenishRuleEnum(String value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + public String getValue() { + return value; + } + + public String getDefaultLabel() { + return defaultLabel; + } + + public int getLabelId() { + return labelId; + } + +} diff --git a/src/com/engine/salary/enums/salaryformula/ReferenceTypeEnum.java b/src/com/engine/salary/enums/salaryformula/ReferenceTypeEnum.java index ec4775aeb..081d19165 100644 --- a/src/com/engine/salary/enums/salaryformula/ReferenceTypeEnum.java +++ b/src/com/engine/salary/enums/salaryformula/ReferenceTypeEnum.java @@ -5,7 +5,8 @@ import java.util.Objects; public enum ReferenceTypeEnum { FORMULA("formula", "公式"), - SQL("sql", "SQL"); + SQL("sql", "SQL"), + BackCalc("backCalc", "回算"); private String value; diff --git a/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java b/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java index bb25103d9..80d48a5e5 100644 --- a/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java +++ b/src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java @@ -24,6 +24,7 @@ public enum SalaryFormulaReferenceEnum implements BaseEnum { ADD_UP_DEDUCTIONS("addUpDeductions", "累计专项附加扣除", 85380), WELFARE("welfare", "社保福利", 87522), OTHER_DEDUCTION("otherDeduction", "其他免税扣除", 93849), + ISSUED("ISSUED", "已发", 0),; ; private String value; diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml index 70b128008..2ba269b02 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml @@ -33,6 +33,7 @@ , t.update_time , t.delete_type , t.tenant_key + , t.back_calc_status ,t.lock_salary_item_ids @@ -369,6 +370,9 @@ tenant_key=#{tenantKey}, + + back_calc_status=#{backCalcStatus}, + WHERE id = #{id} AND delete_type = 0 diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.java b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.java index 6613c958f..d1bc53212 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.java +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.java @@ -1,6 +1,5 @@ package com.engine.salary.mapper.salaryacct; -import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import org.apache.ibatis.annotations.Param; @@ -117,4 +116,14 @@ public interface SalaryAcctResultMapper { * @param pos */ int batchUpdate(@Param("collection") List pos); + + /** + * @description 批量更新回算薪资项目 + * @return null + * @author Harryxzy + * @date 2022/11/24 21:12 + */ + void batchUpdateOriginResultValue(@Param("collection") List subSalaryAcctResultValues); + + } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.xml index 2903d4f71..99b1408ac 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultMapper.xml @@ -29,6 +29,7 @@ , t.tax_agent_id , t.salary_item_id , t.result_value + , t.origin_result_value , t.creator , t.create_time , t.update_time @@ -128,6 +129,12 @@ #{taxAgentId} + + AND salary_item_id IN + + #{salaryItemId} + + ORDER BY id DESC @@ -432,7 +439,7 @@ INSERT INTO hrsa_salary_acct_result( salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, creator, create_time, update_time, delete_type, tenant_key) + tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key) VALUES ( @@ -443,6 +450,7 @@ #{item.taxAgentId}, #{item.salaryItemId}, #{item.resultValue}, + #{item.originResultValue}, #{item.creator}, #{item.createTime}, #{item.updateTime}, @@ -453,7 +461,7 @@ INSERT INTO hrsa_salary_acct_result( salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, creator, create_time, update_time, delete_type, tenant_key) + tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key) select @@ -464,6 +472,7 @@ #{item.taxAgentId,jdbcType=DOUBLE}, #{item.salaryItemId,jdbcType=DOUBLE}, #{item.resultValue,jdbcType=VARCHAR}, + #{item.originResultValue,jdbcType=VARCHAR}, #{item.creator,jdbcType=DOUBLE}, #{item.createTime,jdbcType=DATE}, #{item.updateTime,jdbcType=DATE}, @@ -475,7 +484,7 @@ INSERT INTO hrsa_salary_acct_result(salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, creator, create_time, update_time, delete_type, tenant_key) + tax_agent_id, salary_item_id, result_value, origin_result_value, creator, create_time, update_time, delete_type, tenant_key) VALUES ( #{item.salarySobId}, @@ -485,6 +494,7 @@ #{item.taxAgentId}, #{item.salaryItemId}, #{item.resultValue}, + #{item.originResultValue}, #{item.creator}, #{item.createTime}, #{item.updateTime}, @@ -534,6 +544,7 @@ + update hrsa_salary_acct_result @@ -558,4 +569,23 @@ #{item.id} + + + update hrsa_salary_acct_result + + + + + when id=#{item.id} then #{item.originResultValue} + + + + + where + id in + + #{item.id} + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultTempMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultTempMapper.xml index 4eae72a3d..5397380ec 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultTempMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctResultTempMapper.xml @@ -4,7 +4,7 @@ INSERT INTO hrsa_acct_result_temp(salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, calculate_key, creator, create_time, update_time, delete_type, + tax_agent_id, salary_item_id, result_value, origin_result_value, calculate_key, creator, create_time, update_time, delete_type, tenant_key) VALUES @@ -16,6 +16,7 @@ #{item.taxAgentId}, #{item.salaryItemId}, #{item.resultValue}, + #{item.originResultValue}, #{item.calculateKey}, #{item.creator}, #{item.createTime}, @@ -27,7 +28,7 @@ INSERT INTO hrsa_acct_result_temp(salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, calculate_key, creator, create_time, update_time, delete_type, + tax_agent_id, salary_item_id, result_value, origin_result_value,calculate_key, creator, create_time, update_time, delete_type, tenant_key) @@ -39,6 +40,7 @@ #{item.taxAgentId,jdbcType=DOUBLE}, #{item.salaryItemId,jdbcType=DOUBLE}, #{item.resultValue,jdbcType=VARCHAR}, + #{item.originResultValue,jdbcType=VARCHAR}, #{item.calculateKey,jdbcType=VARCHAR}, #{item.creator,jdbcType=DOUBLE}, #{item.createTime,jdbcType=DATE}, @@ -51,7 +53,7 @@ INSERT INTO hrsa_acct_result_temp( salary_sob_id, salary_acct_emp_id, salary_acct_record_id, employee_id, - tax_agent_id, salary_item_id, result_value, calculate_key, creator, create_time, update_time, delete_type, + tax_agent_id, salary_item_id, result_value, origin_result_value, calculate_key, creator, create_time, update_time, delete_type, tenant_key) VALUES ( @@ -61,7 +63,8 @@ #{item.employeeId}, #{item.taxAgentId}, #{item.salaryItemId}, - #{item.resultValue}, + #{item.resultValue}, + #{item.originResultValue}, #{item.calculateKey}, #{item.creator}, #{item.createTime}, @@ -127,6 +130,7 @@ , t.tax_agent_id , t.salary_item_id , t.result_value + , t.origin_result_value , t.creator , t.create_time , t.update_time diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java index d34eee4b6..ddf345cde 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java @@ -3,7 +3,6 @@ package com.engine.salary.mapper.salarybill; import com.engine.salary.entity.salaryBill.dto.SalarySendListDTO; import com.engine.salary.entity.salaryBill.param.SalarySendQueryParam; import com.engine.salary.entity.salaryBill.po.SalarySendPO; -import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -57,4 +56,8 @@ public interface SalarySendMapper { List listSome(SalarySendPO params); void insertIgnoreNull(SalarySendPO salarySend); + + void batchHandleSendStatusHistory(); + + void batchHandleSalaryAcctTypeHistory(); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml index 820143b3e..ba9ea2438 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml @@ -24,6 +24,8 @@ send_num, send_total, last_send_time, + send_status, + salary_acct_type, creator, create_time, update_time, @@ -128,6 +130,19 @@ WHERE id = #{id} AND delete_type = 0 + + update hrsa_salary_send + set send_status = 0 + where send_status is NULL + + + + + update hrsa_salary_send + set salary_acct_type = 0 + where send_status is NULL + +