薪资回算-薪资核算部分(剩余核算归档)

This commit is contained in:
Harryxzy 2022-12-02 17:35:14 +08:00
parent 85fef5c5f8
commit 3ff3fd8e44
55 changed files with 1067 additions and 123 deletions

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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)

View File

@ -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;
}

View File

@ -20,4 +20,7 @@ public class SalaryTemplateBaseFormDTO {
// 基础设置
private Map<String, Object> salaryTemplateBaseSet;
// 补发规则设置下拉列表
private Map<String, String> replenishRuleSetOption;
}

View File

@ -19,28 +19,39 @@ public class SalaryTemplateBaseSetDTO {
/* ===== 1.基础信息 ======================*/
// @ApiModelProperty("薪资账套")
// @ApiModelProperty("薪资账套")
private Long salarySob;
private List<Map<String, Object>> 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<Map<String, Object>> sendEmailOptions;
// @ApiModelProperty("消息中心")
// @ApiModelProperty("消息中心")
private Boolean msgStatus;
}

View File

@ -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<SalaryTemplateSalaryItemSetListDTO> replenishSalaryTemplateSalaryItemSet;
}

View File

@ -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;
}

View File

@ -33,4 +33,7 @@ public class SalarySendQueryParam extends BaseQueryParam {
private List<Date> salaryMonthDate;
private Collection<Long> salarySobIds;
private Collection<Long> SalaryAccountingId;
}

View File

@ -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<SalaryTemplateSalaryItemSetListDTO> salaryItemSetting;
// @ApiModelProperty("补发工资单模板名称")
private String replenishName;
// @ApiModelProperty("补发工资单名单生成规则")
private String replenishRule;
// @ApiModelProperty("补发薪资项目设置")
private List<SalaryTemplateSalaryItemSetListDTO> 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, "补发工资单模板的薪资项目设置不能为空"));
}
}
}

View File

@ -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;
/**
* 工资单模板设置内容
*/

View File

@ -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;
/**
* 创建人
*/

View File

@ -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;
/**
* 创建时间
*/

View File

@ -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<String, List<FormulaVarValue>> resultMap) {
// key:薪资项目的idvalue:薪资项目的code
Map<Long, String> salaryItemCodeMap = SalaryEntityUtil.convert2Map(salaryAcctCalculateBO.getSalaryItemPOS(), SalaryItemPO::getId, SalaryItemPO::getCode);
// key:薪资项目的codevalue:薪资项目的id
Map<String, Long> salaryCodeItemMap = SalaryEntityUtil.convert2Map(salaryAcctCalculateBO.getSalaryItemPOS(), SalaryItemPO::getCode, SalaryItemPO::getId);
// key:employeeId_taxAgentIdvalue:薪资核算结果集合
Map<String, List<SalaryAcctResultPO>> salaryAcctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS,
salaryAcctResultPO -> salaryAcctResultPO.getEmployeeId() + "_" + salaryAcctResultPO.getTaxAgentId());
//
// List<ExpressFormula> expressFormulas = salaryAcctCalculateBO.getExpressFormulas();
// 填充到返回结果集中
salaryAcctResultMap.forEach((key, salaryAcctResultPOS) -> {
List<FormulaVarValue> 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<Long, SalaryAcctResultPO> 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()));
});
}
/**
* 处理薪资档案会涉及调薪计薪规则+处理核算日期
*

View File

@ -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<SalaryAcctEmployeePO> salaryAcctEmployeePOS;
/**
* 本次运算的回算薪资项目所涉及的变量
*/
private Set<String> issuedFieldIds;
/**
* 核算结果临时表中的key
*/

View File

@ -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<List<Long>> calculatePriority(List<SalarySobItemPO> salarySobItems,
List<SalaryItemPO> salaryItems,
List<ExpressFormula> expressFormulas) {
List<ExpressFormula> expressFormulas,
List<SalarySobBackItemPO> salarySobBackItems,
Set<String> issuedFieldIds) {
// 公式详情
Map<Long, List<FormulaVar>> formulaIdKeyMap = ExpressFormulaBO.buildFormulaVar(expressFormulas);
// key薪资项目的idvalue薪资项目的po
@ -62,9 +65,14 @@ public class SalaryAcctCalculatePriorityBO {
Map<String, SalaryItemPO> codeKeySalaryItemPOMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getCode);
// key薪资项目的idvalue薪资账套下的薪资项目副本的po
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItems, SalarySobItemPO::getSalaryItemId);
Map<Long, SalaryItemIdWithPriority> salaryItemIdWithPriorityMap = Maps.newHashMapWithExpectedSize(salarySobItems.size());
for (SalarySobItemPO salarySobItem : salarySobItems) {
calculate(salarySobItem.getSalaryItemId(), salaryItemPOMap, codeKeySalaryItemPOMap, salaryItemIdKeySalarySobItemPOMap, formulaIdKeyMap, salaryItemIdWithPriorityMap, null);
// 薪资账套项目+薪资回算项目
Set<Long> salarySobItemsAndBackItems = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
salarySobItemsAndBackItems.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId));
Map<Long, SalaryItemIdWithPriority> salaryItemIdWithPriorityMap = Maps.newHashMapWithExpectedSize(salarySobItemsAndBackItems.size());
// key薪资回算项目idvalue薪资回算项目副本PO
Map<Long, SalarySobBackItemPO> 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<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap,
Map<Long, List<FormulaVar>> formulaIdKeyMap,
Map<Long, SalaryItemIdWithPriority> salaryItemIdWithPriorityMap,
SalaryItemIdWithPriority pre) {
SalaryItemIdWithPriority pre,
Map<Long, SalarySobBackItemPO> salarySobBackItemPOMap,
Set<String> issuedFieldIds) {
List<Long> salaryItemIds = Lists.newArrayList();
// 获取公式详情
List<FormulaVar> 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<String> issuedFieldIds, String fieldId) {
if (referenceEnum == SalaryFormulaReferenceEnum.ISSUED) {
issuedFieldIds.add(fieldId);
}
}

View File

@ -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<SalaryAcctRecordListDTO> convert2ListDTO(List<SalaryAcctRecordPO> salaryAcctRecordPOS,
List<SalarySobPO> salarySobs,
List<DataCollectionEmployee> employeeComInfos,
List<SalaryAcctEmployeeCountDTO> salaryAcctEmployeeCountDTOS) {
List<SalaryAcctEmployeeCountDTO> salaryAcctEmployeeCountDTOS,
List<SalarySendCheckDTO> salarySendCheckResult) {
if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) {
return Collections.emptyList();
}
Map<Long, SalarySobPO> salarySobMap = SalaryEntityUtil.convert2Map(salarySobs, SalarySobPO::getId);
Map<Long, String> usernameMap = SalaryEntityUtil.convert2Map(employeeComInfos, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername);
Map<Long, Long> empSizeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployeeCountDTOS, SalaryAcctEmployeeCountDTO::getSalaryAcctRecordId, SalaryAcctEmployeeCountDTO::getCountBySalaryAcctRecordId);
Map<Long, Boolean> 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<WeaTableOperate> 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)

View File

@ -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<Map<String, Object>> buildTableData(List<SalaryItemPO> salaryItems,
@ -209,7 +221,9 @@ public class SalaryAcctResultBO {
List<SalaryAcctResultPO> salaryAccountingResults,
List<TaxAgentPO> taxAgents,
Set<Long> consolidatedTaxSalaryAcctEmpIds,
Map<Long, String> customParameters) {
Map<Long, String> customParameters,
Map<Long, String> customBackCalcParameters,
boolean isBackCalc) {
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
return Collections.emptyList();
}
@ -224,6 +238,7 @@ public class SalaryAcctResultBO {
// 薪资项目的字段类型前端依据这个判断是否需要展示千分位
Map<String, String> dataTypeMap = SalaryEntityUtil.convert2Map(salaryItems, salaryItemPO -> salaryItemPO.getId() + DATA_TYPE_SUFFIX, SalaryItemPO::getDataType);
map.putAll(dataTypeMap);
// TODO ?看一下如果不是回算这会不会有回算的东西?
// 人员信息字段的值
Map<String, String> 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<SalarySobEmpFieldPO> salarySobEmpFields,
List<SalarySobItemPO> salarySobItemPOS,
List<SalaryItemPO> salaryItems,
List<SalaryAcctResultPO> salaryAcctResults) {
List<SalaryAcctResultPO> salaryAcctResults,
List<SalarySobBackItemPO> salarySobBackItemPOS,
List<SalaryItemPO> salaryBackItemPOS,
Map<Long, String> salaryBackItemFormula) {
// 员工信息字段
Map<String, String> employeeFieldValueMap = SalaryAcctFormulaBO.convert2FormulaEmployee(simpleEmployee);
// 个税扣缴义务人
@ -370,6 +390,7 @@ public class SalaryAcctResultBO {
// 薪资项目的值
Map<Long, String> resultValueMap = SalaryEntityUtil.convert2Map(salaryAcctResults, SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map<Long, SalaryItemPO> salaryBackItemMap = SalaryEntityUtil.convert2Map(salaryBackItemPOS, SalaryItemPO::getId);
// 公式项的值不根据salaryItemPO的valueType判断是因为薪资项目的valueType属性改变后并不会同步更新薪资账套中的薪资项目的formulaId字段
List<SalaryAcctResultDetailDTO.SalaryAcctResultDetailItemDTO> 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<SalaryAcctResultDetailDTO.SalaryAcctResultDetailItemDTO> 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<Long, String> resultValueMap,
Map<Long, String> 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<SalaryAcctResultPO> convert2PO(SalaryAcctResultSaveParam saveParam,
public static List<SalaryAcctResultPO> convert2PO(List<SalaryAcctResultPO> salaryAcctResultPOSOld,
SalaryAcctResultSaveParam saveParam,
SalaryAcctEmployeePO salaryAcctEmployee,
Long employeeId) {
if (CollectionUtils.isEmpty(saveParam.getItems())) {
return Collections.emptyList();
}
// 获取薪资项目回算前的值
Map<String, String> 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)

View File

@ -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;

View File

@ -39,6 +39,9 @@ public class SalaryAcctResultDetailDTO {
//输入项")
private List<SalaryAcctResultDetailItemDTO> inputItems;
//已发补发
private List<SalaryAcctResultDetailItemDTO> issuedAndReissueItems;
@Data
@Builder
@NoArgsConstructor
@ -54,6 +57,9 @@ public class SalaryAcctResultDetailDTO {
//核算结果的值")
private String resultValue;
// 公式/输入
private String salaryBackItemFormula;
//数据类型numberstring")
private String dataType;

View File

@ -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;
/**
* 备注
*/

View File

@ -63,6 +63,11 @@ public class SalaryAcctResultPO {
*/
private String resultValue;
/**
* 回算前的值
*/
private String originResultValue;
/**
* 租户key
*/
@ -94,4 +99,5 @@ public class SalaryAcctResultPO {
private Collection<Long> salaryAcctEmpIds;
private Collection<Long> employeeIds;
private Collection<Long> taxAgentIds;
private Collection<Long> salaryItemIds;
}

View File

@ -69,6 +69,11 @@ public class SalaryAcctResultTempPO {
*/
private String resultValue;
/**
* 回算前的值
*/
private String originResultValue;
/**
* 租户key
*/

View File

@ -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<SalaryItemPO> salaryItems;
/**
* 薪资回算项目
*/
private List<SalarySobBackItemPO> salarySobBackItems;
private final BaseBean baseBean = new BaseBean();
//强制开启账套的公式配置
@ -140,6 +142,26 @@ public class SalarySobItemAggregateBO {
.setItems(sortItem(itemsWithoutGroup));
incomeCategories.add(salarySobItemIncomeCategoryDTO);
}
// 薪资回算项目
List<SalarySobItemDTO> 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();
}

View File

@ -39,4 +39,7 @@ public class SalarySobItemAggregateDTO {
//薪资账套的薪资项目按薪资类型分类账套目前只含一个类型只给核算表头带出公式使用未来若账套包含多类型时可用于扩展
private List<SalarySobItemIncomeCategoryDTO> incomeCategories;
// 已发薪资项目
private List<SalarySobItemDTO> backCalcItems;
}

View File

@ -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;
}
}

View File

@ -5,7 +5,8 @@ import java.util.Objects;
public enum ReferenceTypeEnum {
FORMULA("formula", "公式"),
SQL("sql", "SQL");
SQL("sql", "SQL"),
BackCalc("backCalc", "回算");
private String value;

View File

@ -24,6 +24,7 @@ public enum SalaryFormulaReferenceEnum implements BaseEnum<String> {
ADD_UP_DEDUCTIONS("addUpDeductions", "累计专项附加扣除", 85380),
WELFARE("welfare", "社保福利", 87522),
OTHER_DEDUCTION("otherDeduction", "其他免税扣除", 93849),
ISSUED("ISSUED", "已发", 0),;
;
private String value;

View File

@ -33,6 +33,7 @@
, t.update_time
, t.delete_type
, t.tenant_key
, t.back_calc_status
,t.lock_salary_item_ids
</sql>
@ -369,6 +370,9 @@
<if test="tenantKey != null">
tenant_key=#{tenantKey},
</if>
<if test="backCalcStatus != null">
back_calc_status=#{backCalcStatus},
</if>
</set>
WHERE id = #{id} AND delete_type = 0
</update>

View File

@ -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<SalaryAcctResultPO> pos);
/**
* @description 批量更新回算薪资项目
* @return null
* @author Harryxzy
* @date 2022/11/24 21:12
*/
void batchUpdateOriginResultValue(@Param("collection") List<SalaryAcctResultPO> subSalaryAcctResultValues);
}

View File

@ -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}
</foreach>
</if>
<if test="salaryItemIds != null and salaryItemIds.size()>0">
AND salary_item_id IN
<foreach collection="salaryItemIds" open="(" item="salaryItemId" separator="," close=")">
#{salaryItemId}
</foreach>
</if>
ORDER BY id DESC
</select>
@ -432,7 +439,7 @@
<insert id="batchInsert">
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
<foreach collection="collection" item="item" separator=",">
(
@ -443,6 +450,7 @@
#{item.taxAgentId},
#{item.salaryItemId},
#{item.resultValue},
#{item.originResultValue},
#{item.creator},
#{item.createTime},
#{item.updateTime},
@ -453,7 +461,7 @@
</insert>
<insert id="batchInsert" databaseId="oracle">
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)
<foreach collection="collection" item="item" separator="union all">
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 id="batchInsert" databaseId="sqlserver">
<foreach collection="collection" item="item" separator=";">
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 @@
</foreach>
</delete>
<update id="batchUpdate" parameterType="java.util.List">
update hrsa_salary_acct_result
<trim prefix="set" suffixOverrides=",">
@ -558,4 +569,23 @@
#{item.id}
</foreach>
</update>
<update id="batchUpdateOriginResultValue">
update hrsa_salary_acct_result
<trim prefix="set" suffixOverrides=",">
<trim prefix="origin_result_value = case" suffix="end,">
<foreach collection="collection" item="item" index="index">
<if test="item.originResultValue!=null">
when id=#{item.id} then #{item.originResultValue}
</if>
</foreach>
</trim>
</trim>
where
id in
<foreach collection="collection" item="item" index="index" separator="," open="(" close=")">
#{item.id}
</foreach>
</update>
</mapper>

View File

@ -4,7 +4,7 @@
<insert id="batchInsert">
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
<foreach collection="collection" item="item" separator=",">
@ -16,6 +16,7 @@
#{item.taxAgentId},
#{item.salaryItemId},
#{item.resultValue},
#{item.originResultValue},
#{item.calculateKey},
#{item.creator},
#{item.createTime},
@ -27,7 +28,7 @@
</insert>
<insert id="batchInsert" databaseId="oracle">
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)
<foreach collection="collection" item="item" separator="union all">
@ -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 id="batchInsert" databaseId="sqlserver">
<foreach collection="collection" item="item" separator=";">
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

View File

@ -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<SalarySendPO> listSome(SalarySendPO params);
void insertIgnoreNull(SalarySendPO salarySend);
void batchHandleSendStatusHistory();
void batchHandleSalaryAcctTypeHistory();
}

View File

@ -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>
<update id="batchHandleSendStatusHistory">
update hrsa_salary_send
set send_status = 0
where send_status is NULL
</update>
<update id="batchHandleSalaryAcctTypeHistory">
update hrsa_salary_send
set salary_acct_type = 0
where send_status is NULL
</update>
<select id="listSomeWithCondition" resultMap="BaseResultMap">
SELECT
@ -140,12 +155,8 @@
AND t1.send_num = #{param.sendNum}
</if>
<if test="param.sendNum != null and param.sendNum != ''">
AND t1.send_num = #{param.sendNum}
</if>
<if test="param.salaryAccountingIds != null and param.salaryAccountingIds != ''">
AND t1.salary_sob_id IN
<if test="param.salaryAccountingIds != null and param.salaryAccountingIds.size() != 0">
AND t1.salary_accounting_id IN
<foreach collection="param.salaryAccountingIds" open="(" item="id" separator="," close=")">
#{id}
</foreach>
@ -185,6 +196,12 @@
<if test="lastSendTime != null and lastSendTime != ''">
AND last_send_time = #{lastSendTime}
</if>
<if test="sendStatus != null and sendStatus != ''">
AND send_status = #{sendStatus}
</if>
<if test="salaryAcctType != null and salaryAcctType != ''">
AND salary_acct_type = #{salaryAcctTypec}
</if>
<if test="creator != null and creator != ''">
AND creator = #{creator}
</if>

View File

@ -418,6 +418,15 @@
<if test="salaryItemSetting != null">
salary_item_setting,
</if>
<if test="replenishName != null">
replenish_name,
</if>
<if test="replenishRule != null">
replenish_rule,
</if>
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting,
</if>
<if test="createTime != null">
create_time,
</if>

View File

@ -2,6 +2,9 @@ package com.engine.salary.service;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculateBO;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import java.util.List;
/**
* 薪资核算-核算
@ -18,5 +21,5 @@ public interface SalaryAcctCalculateService {
*
* @param salaryAcctCalculateBO
*/
void calculate(SalaryAcctCalculateBO salaryAcctCalculateBO, DataCollectionEmployee simpleEmploye);
void calculate(SalaryAcctCalculateBO salaryAcctCalculateBO, DataCollectionEmployee simpleEmploye, List<SalarySobBackItemPO> salarySobBackItems);
}

View File

@ -182,4 +182,12 @@ public interface SalaryAcctRecordService {
List<SalaryAcctRecordPO> listByStatusAndEmployeeId(SalaryAcctRecordStatusEnum status, Long employeeId);
void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord);
/**
* @description 回算
* @return void
* @author Harryxzy
* @date 2022/11/24 16:09
*/
void backCalculate(Long salaryAcctRecordId);
}

View File

@ -127,6 +127,7 @@ public interface SalaryAcctResultService {
*/
void deleteBySalaryAcctEmployeeIds(Collection<Long> salaryAcctEmployeeIds);
/**
* 根据薪资核算人员id薪资项目id删除薪资核算结果
*
@ -165,4 +166,19 @@ public interface SalaryAcctResultService {
* @param updateParam
*/
void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam);
/**
* 批量更新
*
* @param salaryAcctResultValues
*/
void batchUpdateOriginResultValue(List<SalaryAcctResultPO> salaryAcctResultValues);
/**
* @description 薪资回算
* @return void
* @author Harryxzy
* @date 2022/11/24 20:26
*/
void reCalc(Long id);
}

View File

@ -4,11 +4,13 @@ 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.util.page.PageInfo;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @Description: 工资单发放
@ -34,10 +36,10 @@ public interface SalarySendService {
/**
* 薪资核算-归档撤销工资单
* @param salaryAccountingId
* @param salaryAcctRecord
* @return
*/
void revokeSalaryBill(Long salaryAccountingId);
void revokeSalaryBill(SalaryAcctRecordPO salaryAcctRecord);
/**
* 工资单发放列表分页
@ -130,4 +132,20 @@ public interface SalarySendService {
* @param queryParam
*/
XSSFWorkbook exportDetailList(SalarySendPO salarySend, SalarySendDetailQueryParam queryParam);
/**
* 获取核算工资单发放结果
*
* @param salaryAcctRecordIds
* @return
*/
List<SalarySendCheckDTO> getSalarySendCheckResult(Set<Long> salaryAcctRecordIds);
/**
* @description 处理历史数据
* @return null
* @author Harryxzy
* @date 2022/11/25 10:45
*/
void handleHistory();
}

View File

@ -92,7 +92,7 @@ public interface SalarySobItemService {
* @param salarySobId
* @return
*/
SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salarySobId);
SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salarySobId, boolean isBackCalc);
/**
* 保存

View File

@ -128,6 +128,7 @@ public class RemoteExcelServiceImpl extends Service implements RemoteExcelServic
if (referenceEnum != null) {
switch (referenceEnum) {
case SALARY_ITEM:
case ISSUED:
vars = salaryItem2FormulaVar(referenceEnum, extendParam);
break;
case SALARY_ARCHIVES:
@ -176,6 +177,15 @@ public class RemoteExcelServiceImpl extends Service implements RemoteExcelServic
return map;
}).collect(Collectors.toList());
}
// 回算已发
if (ReferenceTypeEnum.BackCalc.getValue().equals(extendParam.get("referenceType"))){
Map<String, Object> map = new HashMap<>();
map.put("key", SalaryFormulaReferenceEnum.ISSUED.getValue());
map.put("value", SalaryI18nUtil.getI18nLabel(SalaryFormulaReferenceEnum.ISSUED.getLabelId(), SalaryFormulaReferenceEnum.ISSUED.getDefaultLabel()));
List<Map<String,Object>> result = new ArrayList<>();
result.add(map);
return result;
}
return Arrays.stream(SalaryFormulaReferenceEnum.values()).map(e -> {
Map<String, Object> map = new HashMap<>();
@ -298,6 +308,7 @@ public class RemoteExcelServiceImpl extends Service implements RemoteExcelServic
}
private List<FormulaVar> salaryArchives2FormulaVar(SalaryFormulaReferenceEnum referenceEnum, Map<String, Object> extendParam) {
Set<Long> salaryItemIds = Collections.emptySet();
Object salarySobId = extendParam == null ? null : extendParam.get("salarySobId");

View File

@ -20,6 +20,7 @@ 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.dto.SalarySobCycleDTO;
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.service.*;
@ -103,7 +104,7 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
}
@Override
public void calculate(SalaryAcctCalculateBO salaryAcctCalculateBO, DataCollectionEmployee simpleEmployee) {
public void calculate(SalaryAcctCalculateBO salaryAcctCalculateBO, DataCollectionEmployee simpleEmployee, List<SalarySobBackItemPO> salarySobBackItems) {
Date now = new Date();
try {
// 数据库字段加密用
@ -133,6 +134,13 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
// 8查询薪资核算人员的薪资核算结果
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId);
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// 薪资回算时回算前的核算结果 (没有回算项)
Map<String, List<SalaryAcctResultPO>> collect = salaryAcctResultPOS.stream().collect(Collectors.groupingBy(k -> k.getEmployeeId() + "-" + k.getTaxAgentId() + "-" + k.getSalaryItemId()));
Map<String, String> salaryAcctResultPOMap = new HashMap<>();
for(Map.Entry<String,List<SalaryAcctResultPO>> et : collect.entrySet()){
salaryAcctResultPOMap.put(et.getKey(),et.getValue().get(0).getOriginResultValue());
}
//核算锁定的值
Map<String, SalaryAcctResultPO> salaryAcctLockResultPOS = MapUtils.emptyIfNull(salaryAcctCalculateBO.getSalaryAcctLockResultPOS());
List<Long> lockSalaryItemIds = ListUtils.emptyIfNull(salaryAcctCalculateBO.getLockSalaryItemIds());
@ -161,7 +169,7 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
Long salaryAcctEmployeePOId = salaryAcctEmployeePO.getId();
//1 获取当前薪资核算人员的公式中的变量的值
List<CalculateFormulaVarBO.FormulaVarValue> formulaVarValues = formulaVarMap.get(salaryAcctEmployeePO.getEmployeeId() + "_" + salaryAcctEmployeePO.getTaxAgentId());
//2人员信息
//2 人员信息
formulaVarValues.addAll(formulaVarMap.get(salaryAcctEmployeePO.getEmployeeId() + ""));
Map<String, String> formulaVarValueMap = SalaryEntityUtil.convert2Map(formulaVarValues, CalculateFormulaVarBO.FormulaVarValue::getFieldId, CalculateFormulaVarBO.FormulaVarValue::getFieldValue);
// 按照计算好的优先级计算薪资项目的值
@ -203,10 +211,15 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
// 将已经计算过的薪资项目的值转换成公式变量的值添加到集合中
String key = SalaryFormulaReferenceEnum.SALARY_ITEM.getValue() + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR + salaryItemPO.getCode();
if(salaryItemPO.getCode().equals("ressueTotal") ||salaryItemPO.getCode().equals("issuedTotal") ){
System.out.println("--");
}
formulaVarValueMap.put(key, resultValue);
// 获取薪资回算的薪资项目ID
Set<Long> salarySobBackItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId);
// 值保存薪资账套下的薪资项目的核算结果
if (salaryItemIdKeySalarySobItemPOMap.containsKey(salaryItemId)) {
if (salaryItemIdKeySalarySobItemPOMap.containsKey(salaryItemId) || salarySobBackItemIds.contains(salaryItemId)) {
// 转换成薪资核算结果po
SalaryAcctResultTempPO salaryAcctResultTempPO = new SalaryAcctResultTempPO()
.setSalaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId())
@ -216,6 +229,8 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
.setSalarySobId(salaryAcctEmployeePO.getSalarySobId())
.setSalaryItemId(salaryItemPO.getId())
.setResultValue(resultValue)
.setOriginResultValue(salaryAcctResultPOMap.get(salaryAcctEmployeePO.getEmployeeId()+"-"+salaryAcctEmployeePO.getTaxAgentId()+"-"+salaryItemId) == null
? StringUtils.EMPTY : salaryAcctResultPOMap.get(salaryAcctEmployeePO.getEmployeeId()+"-"+salaryAcctEmployeePO.getTaxAgentId()+"-"+salaryItemId))
.setCalculateKey(salaryAcctCalculateBO.getCalculateKey())
.setCreator((long) user.getUID())
.setCreateTime(now)

View File

@ -425,6 +425,10 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 回算不允许删除薪资核算人员
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus() , 1)){
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0,"正常薪资已经发放,薪资回算时,不允许再删除薪资核算人员"));
}
// 只有未归档时才能删除薪资核算人员
if (!Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98830, "薪资核算已归档或已申报,不允许再删除薪资核算人员"));

View File

@ -317,8 +317,11 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
* @return
*/
public List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO) {
// 是否是回算
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctRecordPO.getId());
boolean isBackCalc = Objects.equals(byId.getBackCalcStatus(), 1);
// 查询薪资账套下的薪资项目+员工信息字段
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateWithItemHideBySalarySobId(salaryAcctRecordPO.getSalarySobId());
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateWithItemHideBySalarySobId(salaryAcctRecordPO.getSalarySobId(),isBackCalc);
// 构建薪资核算结果列表表头
return SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds()));
}

View File

@ -88,6 +88,7 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryAcctReportService getSalaryAcctReportService(User user) {
return ServiceUtil.getService(SalaryAcctReportServiceImpl.class, user);
}
@ -550,6 +551,51 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 重新核算
reCalcOrBackCalc(salaryAcctRecordPO, true);
// // 查询税款所在年的该个税扣缴义务人所有薪资核算记录
// // 获取账套所属个税扣缴义务人的核算记录
// SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
// Long taxAgentId = salarySobPO.getTaxAgentId();
// //查询扣缴义务人下的所有账套
// List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByTaxAgentId(taxAgentId);
// Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId);
// List<SalaryAcctRecordPO> salaryAcctRecordPOS = listByTaxCycle(yearRange,salarySobIds);
// List<SalaryAcctRecordPO> selfSalaryAcctRecordPOS = filterByAuthority(salaryAcctRecordPOS);
// // 如果已经存在之后月份的薪资核算记录了就不允许重新核算本月了
// SalaryAcctRecordPO afterSalaryAcctRecordPO = selfSalaryAcctRecordPOS.stream()
// .filter(po -> po.getSalaryMonth().compareTo(salaryAcctRecordPO.getSalaryMonth()) > 0)
// .findAny()
// .orElse(null);
// if (Objects.nonNull(afterSalaryAcctRecordPO)) {
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(105826, "已经存在{0}的薪资核算记录了,不能重新核算{1}的薪资了")
// .replace("{0}", SalaryDateUtil.localDate2YearMonth(afterSalaryAcctRecordPO.getSalaryMonth()).toString())
// .replace("{1}", SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()).toString()));
// }
// //撤回工资单
// getSalarySendService(user).revokeSalaryBill(salaryAcctRecordId);
// getTaxDeclarationService(user).delete(salaryAcctRecordPO);
// // 更新薪资核算记录的状态
// salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue());
// salaryAcctRecordPO.setUpdateTime(new Date());
// getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO);
// 记录日志
// String targetName = getLogTargetNameById(salaryAcctRecordPO.getId(), tenantKey);
// LoggerContext<SalaryAcctRecordPO> loggerContext = new LoggerContext<>();
// loggerContext.setTargetId("" + salaryAcctRecordPO.getId());
// loggerContext.setTargetName(targetName);
// loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
// loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(98820, "重新核算"));
// loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(98820, "重新核算") + ": " + targetName);
// loggerContext.setNewValues(salaryAcctRecordPO);
// salaryAcctRecordLoggerTemplate.write(loggerContext);
}
private void reCalcOrBackCalc(SalaryAcctRecordPO salaryAcctRecordPO, boolean isReCalc) {
// 如果薪资核算记录还未归档不允许重新核算
if (Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98819, "薪资核算结果还未归档,可直接核算"));
@ -568,6 +614,7 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId);
List<SalaryAcctRecordPO> salaryAcctRecordPOS = listByTaxCycle(yearRange,salarySobIds);
List<SalaryAcctRecordPO> selfSalaryAcctRecordPOS = filterByAuthority(salaryAcctRecordPOS);
// 如果已经存在之后月份的薪资核算记录了就不允许重新核算本月了
SalaryAcctRecordPO afterSalaryAcctRecordPO = selfSalaryAcctRecordPOS.stream()
.filter(po -> po.getSalaryMonth().compareTo(salaryAcctRecordPO.getSalaryMonth()) > 0)
@ -578,40 +625,37 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
.replace("{0}", SalaryDateUtil.localDate2YearMonth(afterSalaryAcctRecordPO.getSalaryMonth()).toString())
.replace("{1}", SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()).toString()));
}
//撤回工资单
getSalarySendService(user).revokeSalaryBill(salaryAcctRecordId);
TaxDeclarationFunctionEnum taxDeclaration = getSalarySysConfService(user).getTaxDeclaration();
if (!isReCalc) {
salaryAcctRecordPO.setBackCalcStatus(1);
// salaryAcctRecordPO.setSuperId(salaryAcctRecordPO.getId());
// salaryAcctRecordPO.setRootId(Objects.equals(salaryAcctRecordPO.getRootId(), 0L) ? salaryAcctRecordPO.getId() : salaryAcctRecordPO.getRootId());
}
// if(taxDeclaration.getValue().equals(TaxDeclarationFunctionEnum.OPEN.getValue())){
// 开启了个税申报功能
// 删除个税申报表(个税申报表个税申报表详情往期累计情况)
getTaxDeclarationService(user).delete(salaryAcctRecordPO);
// }else if(taxDeclaration.getValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue())){
// // 重启个税申报功能
// Date taxDeclarationRebootDateTemp = getSalarySysConfService(user).getTaxDeclarationRebootDate();
// Date taxDeclarationRebootDate = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(taxDeclarationRebootDateTemp);
// if(!taxDeclarationRebootDate.after(salaryAcctRecordPO.getTaxCycle())){
// // 删除个税申报表(个税申报表个税申报表详情往期累计情况)
// getTaxDeclarationService(user).delete(salaryAcctRecordPO);
// }
// }
// 保存回算前的薪资核算结果
if (!isReCalc) {
getSalaryAcctResultService(user).reCalc(salaryAcctRecordPO.getId());
}
// 撤回工资单
getSalarySendService(user).revokeSalaryBill(salaryAcctRecordPO);
// 重新核算或者回算时若本次薪资核算记录已经申报了则本次薪资核算记录下的所有个税扣缴义务人在相同税款所属期内的所有薪资核算记录的状态都应该从已申报变更为已归档
// 过滤获取所在税款所属期内该个税扣缴义务人所有的薪资核算记录ID
List<Long> needUpdateSalaryAcctRecordIds = selfSalaryAcctRecordPOS.stream().filter(po -> po.getTaxCycle().equals(salaryAcctRecordPO.getTaxCycle()))
.map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
if (Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.DECLARED.getValue())) {
// 更新薪资核算记录的状态
updateStatusByIds(needUpdateSalaryAcctRecordIds, SalaryAcctRecordStatusEnum.ARCHIVED);
}
// 删除个税申报表及往期累计情况
getTaxDeclarationService(user).delete(salaryAcctRecordPO);
// 更新薪资核算记录的状态
salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue());
salaryAcctRecordPO.setUpdateTime(new Date());
getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO);
// 记录日志
// String targetName = getLogTargetNameById(salaryAcctRecordPO.getId(), tenantKey);
// LoggerContext<SalaryAcctRecordPO> loggerContext = new LoggerContext<>();
// loggerContext.setTargetId("" + salaryAcctRecordPO.getId());
// loggerContext.setTargetName(targetName);
// loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
// loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(98820, "重新核算"));
// loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(98820, "重新核算") + ": " + targetName);
// loggerContext.setNewValues(salaryAcctRecordPO);
// salaryAcctRecordLoggerTemplate.write(loggerContext);
}
@Override
public Integer hasConsolidatedTax(Long id) {
// 查询合并计税的其他薪资核算记录
@ -663,6 +707,23 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
getSalaryAcctRecordMapper().updateLockSalaryItemIds(salaryAcctRecord);
}
@Override
public void backCalculate(Long salaryAcctRecordId) {
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getById(salaryAcctRecordId);
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 获取该账套该月核算的所有记录
List<SalaryAcctRecordPO> salaryAcctRecordPOS = getSalaryAcctRecordMapper().listSome(SalaryAcctRecordPO.builder().salaryMonth(salaryAcctRecordPO.getSalaryMonth()).salarySobId(salaryAcctRecordPO.getSalarySobId()).deleteType(0).build());
if(!salaryAcctRecordPO.getAcctTimes().equals(salaryAcctRecordPOS.size())){
// 只有该账套在此月的最后一次核算才能进行回算
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0,"只有核算次数为最后一次时,才能进行回算"));
}
// 回算
reCalcOrBackCalc(salaryAcctRecordPO, false);
}
/**
* 开启分权后需要判断是否能查看对应的薪资核算记录

View File

@ -151,6 +151,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
return (SalarySobItemGroupService) ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
private SalaryCheckResultService salaryCheckResultService;
@ -200,6 +204,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
if (Objects.isNull(salaryAcctEmployeePO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
}
// 查询是否是回算
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
boolean isBackCal = Objects.equals(byId.getBackCalcStatus(), 1);
//----------------------------------------------
// 查询薪资账套的薪资项目分类
@ -222,6 +229,23 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
// 过滤薪资项目
salarySobItemPOS = salarySobItemPOS.stream().filter(item -> !(hideItemIDs.contains(item.getSalaryItemId()))).collect(Collectors.toList());
// 查询已发补发薪资项目
List<SalarySobBackItemPO> salarySobBackItemPOList = Collections.emptyList();
List<SalaryItemPO> salaryBackItemPOS = Collections.emptyList();
// key:账套中回算薪资项目的薪资项目id value:账套中回算薪资项目所对应的公式内容
Map<Long, String> salaryBackItemFormula = new HashMap<>();
if(isBackCal){
salarySobBackItemPOList = getSalarySobBackItemService(user).listBySalarySobId(byId.getSalarySobId());
Set<Long> salarySobBackItemIds = SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId);
salaryBackItemPOS = getSalaryItemService(user).listByIds(salarySobBackItemIds);
// 查询薪资账套中已发补发的公式内容
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getFormulaId));
Map<Long, String> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
for(SalarySobBackItemPO salarySobBackItemPO:salarySobBackItemPOList){
String exp = Objects.equals(expressFormulaMap.get(salarySobBackItemPO.getFormulaId()), 0) ? "输入" : expressFormulaMap.get(salarySobBackItemPO.getFormulaId());
salaryBackItemFormula.put(salarySobBackItemPO.getSalaryItemId(),exp);
}
}
// 查询薪资项目
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
@ -236,7 +260,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
TaxAgentPO taxAgent = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
// 转换成薪资核算结果详情dto
return SalaryAcctResultBO.convert2DetailDTO(simpleEmployee, taxAgent, salaryAcctEmployeePO, salarySobEmpFieldPOS, salarySobItemPOS, salaryItemPOS, salaryAcctResultPOS);
return SalaryAcctResultBO.convert2DetailDTO(simpleEmployee, taxAgent, salaryAcctEmployeePO, salarySobEmpFieldPOS, salarySobItemPOS, salaryItemPOS, salaryAcctResultPOS, salarySobBackItemPOList, salaryBackItemPOS, salaryBackItemFormula);
}
@Override
@ -314,19 +338,26 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
boolean isBackCalc = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1);
// 查询薪资核算所用的薪资账套的员工信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 查询薪资核算所用薪资账套的薪资项目
// 查询薪资核算所用薪资账套的薪资项目 TODO 是否包含回算薪资项目 --不包含
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
// 是否是回算
List<SalarySobBackItemPO> salarySobBackItemPOList = Collections.emptyList();
if (isBackCalc) {
// 根据薪资账套获取回算信息项
salarySobBackItemPOList = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
salaryItemIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
}
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
// 查询薪资核算结果
// 查询薪资核算结果 TODO: ?是否包含薪资回算项目结果? --包含
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// 查询人员信息
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).listByIds(employeeIds);
// 查询个税扣缴义务人
Set<Long> taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getTaxAgentId);
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds);
@ -343,6 +374,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
// 查询公式详情
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
// 获取回算公式 TODO: ?是回算项目?
if (isBackCalc) {
formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO :: getFormulaId ).collect(Collectors.toList()));
}
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
Map<Long, String> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
Map<Long, String> customParameters = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, salarySobItemPO -> {
@ -351,8 +386,17 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
return expressFormulaMap.getOrDefault(salarySobItemPO.getFormulaId(), StringUtils.EMPTY);
});
// 回算公式内容转换
Map<Long, String> customBackCalcParameters = SalaryEntityUtil.convert2Map(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId, salarySobBackItemPO -> {
if (salarySobBackItemPO.getFormulaId() <= 0) {
return SalaryI18nUtil.getI18nLabel(92004, "输入/导入");
}
return expressFormulaMap.getOrDefault(salarySobBackItemPO.getFormulaId(), StringUtils.EMPTY);
});
// 转换成薪资核算结果列表
return SalaryAcctResultBO.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOS, salaryAcctResultPOS, taxAgentPOS, salaryAcctEmployeeIds4ConsolidatedTax, customParameters);
return SalaryAcctResultBO.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOS, salaryAcctResultPOS, taxAgentPOS,
salaryAcctEmployeeIds4ConsolidatedTax, customParameters, customBackCalcParameters, isBackCalc);
}
@ -412,6 +456,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
Map<String, SalaryAcctResultListColumnDTO> resultMap = Maps.newHashMap();
// 查询薪资核算使用的薪资账套下的薪资项目
List<SalarySobItemDTO> salarySobItems = Lists.newArrayList();
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId());
for (SalarySobItemIncomeCategoryDTO incomeCategoryDTO : salarySobItemAggregateDTO.getIncomeCategories()) {
for (SalarySobItemGroupDTO salarySobItemGroupDTO : incomeCategoryDTO.getItemGroups()) {
@ -435,6 +480,18 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
resultMap.put("" + salarySobItemDTO.getSalaryItemId(), salaryAcctResultListColumnDTO);
}
}
// 查询回算薪资项目
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) {
List<SalarySobItemDTO> backCalcItems = salarySobItemAggregateDTO.getBackCalcItems();
for (SalarySobItemDTO backCalcItem : backCalcItems) {
SalaryAcctResultListColumnDTO salaryAcctResultListColumnDTO = new SalaryAcctResultListColumnDTO()
.setColumnName(backCalcItem.getName())
.setFormulaId(backCalcItem.getFormulaId())
.setFormulaContent(backCalcItem.getFormulaContent())
.setShowLock(true);
resultMap.put("" + backCalcItem.getSalaryItemId(), salaryAcctResultListColumnDTO);
}
}
return resultMap;
}
@ -449,8 +506,23 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
if (Objects.isNull(salaryAcctEmployeePO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
}
// 查询原来的薪资核算结果
List<SalaryAcctResultPO> salaryAcctResultPOSOld = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(saveParam.getSalaryAcctEmpId()).build());
// 解密
SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOSOld);
// 保存参数转换成薪资核算结果po
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2PO(saveParam, salaryAcctEmployeePO, (long) user.getUID());
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2PO(salaryAcctResultPOSOld, saveParam, salaryAcctEmployeePO, (long) user.getUID());
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
// 若保存编辑时一同传已发补发则删除以下代码
// if(byId.getBackCalcStatus() != null && Objects.equals(byId.getBackCalcStatus(),1)){
// // 是回算
// List<Long> salarySobBackItemIds = getSalarySobBackItemService(user).listBySalarySobId(byId.getSalarySobId()).stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList());
// // 获取已发待发的薪资核算结果
// List<SalaryAcctResultPO> salarySobBackItemResultPO = salaryAcctResultPOSOld.stream().filter(po -> salarySobBackItemIds.contains(po.getSalaryItemId())).collect(Collectors.toList());
// salaryAcctResultPOS.addAll(salarySobBackItemResultPO);
// }
// 删除原来的薪资核算结果
deleteBySalaryAcctEmployeeIds(Collections.singleton(saveParam.getSalaryAcctEmpId()));
// 保存薪资核算结果
@ -460,8 +532,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
}
//报表
//报表 todo
getSalaryAcctReportService(user).deleteBySalaryAcctEmpIds(Collections.singleton(saveParam.getSalaryAcctEmpId()));
List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = SalaryAcctResultReportBO.convert2PO(saveParam, salaryAcctEmployeePO, (long) user.getUID(), emps);
if (CollectionUtils.isNotEmpty(salaryAcctResultReportPOS)) {
@ -486,6 +557,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
// salaryAcctRecordLoggerTemplate.write(loggerContext);
}
@Override
public void batchSave(Collection<SalaryAcctResultPO> salaryAcctResultPOS) {
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
@ -503,6 +575,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(salaryAcctEmployeeIds);
}
@Override
public void deleteByAcctEmployeeIdsAndSalaryItemIds(Collection<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds) {
getSalaryAcctResultMapper().deleteByAcctEmpIdsAndSalaryItemIds(salaryAcctEmployeeIds, salaryItemIds);
@ -537,6 +610,11 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
}
// 回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
if(Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)){
salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
}
// 4查询当前租户的所有薪资项目
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
// 5查询薪资核算记录所用薪资账套的调薪计薪规则
@ -562,8 +640,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 本次运算的回算薪资项目所涉及的变量
Set<String> issuedFieldIds = new HashSet<>();
// 9计算薪资项目的运算优先级
List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas);
List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas, salarySobBackItems, issuedFieldIds);
// 10根据id查询其他合并计税的薪资核算记录
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId());
// 11查询本次核算人员
@ -604,13 +684,15 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
.setWelfareColumns(MapUtils.emptyIfNull(welfareColumns))
.setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS)
.setSalaryAcctEmployeePOS(acctEmployeePOS)
.setIssuedFieldIds(issuedFieldIds)
.setChildMonitor(childMonitor)
.setResults(calculateResults)
.setCalculateKey(calculateKey);
List<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee);
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculateV2", localRunnable);
@ -759,6 +841,27 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
@Override
public void reCalc(Long id) {
// 无需解密
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctRecordId(id).deleteType(0).build();
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(build);
// 回算前的薪资核算结果
salaryAcctResultPOS.forEach(salaryAcctResult ->
salaryAcctResult.setOriginResultValue(salaryAcctResult.getResultValue()));
// 批量更新
batchUpdateOriginResultValue(salaryAcctResultPOS);
}
@Override
public void batchUpdateOriginResultValue(List<SalaryAcctResultPO> salaryAcctResultValues) {
int batchSize = 1000;
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultValues, batchSize);
for (List<SalaryAcctResultPO> subSalaryAcctResultValues : partition) {
getSalaryAcctResultMapper().batchUpdateOriginResultValue(subSalaryAcctResultValues);
}
}
private Set<Long> canLockSalaryItemIds(Long salarySobId) {
// 值可以锁定的薪资项目
Set<Long> salaryItemIds = Sets.newHashSet();

View File

@ -17,10 +17,7 @@ import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO;
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
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.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salaryacct.ExcelAcctResultMapper;
@ -162,7 +159,7 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
// 转换成聚合dto
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS,
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS);
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS,Collections.emptyList());
SalarySobItemAggregateDTO salarySobItemAggregateDTO = salarySobItemAggregateBO.convert2AggregateDTO();
// 薪资核算人员

View File

@ -51,6 +51,7 @@ import dm.jdbc.util.IdGenerator;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -242,35 +243,62 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
}
@Override
public void revokeSalaryBill(Long salaryAccountingId) {
public void revokeSalaryBill(SalaryAcctRecordPO salaryAcctRecord) {
// 校验salaryAccountingId
if (salaryAccountingId == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100497, "核算id必传"));
}
SalaryAcctRecordPO po = SalaryAcctRecordPO.builder().id(salaryAccountingId).build();
List<SalaryAcctRecordPO> acctRecords = getSalaryAcctRecordMapper().listSome(po);
// if (salaryAcctRecord == null) {
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100497, "核算id必传"));
// }
//
// SalaryAcctRecordPO po = SalaryAcctRecordPO.builder().id(salaryAccountingId).build();
// List<SalaryAcctRecordPO> acctRecords = getSalaryAcctRecordMapper().listSome(po);
// 检查核算的归档记录
if (CollectionUtils.isEmpty(acctRecords)) {
if (salaryAcctRecord == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100498, "核算记录不存在"));
}
SalarySendPO build = SalarySendPO.builder().salaryAccountingId(salaryAccountingId).deleteType(0).build();
SalarySendPO build = SalarySendPO.builder().salaryAccountingId(salaryAcctRecord.getId()).deleteType(0).build();
List<SalarySendPO> salarySends = getSalarySendMapper().listSome(build);
if (CollectionUtils.isEmpty(salarySends)) {
return;
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100505, "工资单不存在"));
}
SalarySendPO salarySend = salarySends.get(0);
SalarySendPO salarySend;
if (salaryAcctRecord.getBackCalcStatus() != null && salaryAcctRecord.getBackCalcStatus().equals(NumberUtils.INTEGER_ONE)) {
// todo 一般只有一个未冻结,同一个原始核算id后面如果有多级回算就会换成不同核算id
salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null);
if (salarySend != null && salarySend.getSendNum() < salarySend.getSendTotal()) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(139702, "正常原始核算或上一个回算尚未全部发送完成,不能进行撤回"));
}
if (salarySend != null) {
// 将上一版本未冻结的给冻结掉
salarySend.setSendStatus(NumberUtils.INTEGER_ONE);
getSalarySendMapper().updateIgnoreNull(salarySend);
}
// 已经回算的删除 todo 以后多级回算注意要修改
salarySend = salarySends.stream().filter(s -> s.getSalaryAcctType() != null && s.getSalaryAcctType().equals(NumberUtils.INTEGER_ONE)).findFirst().orElse(null);
handleDelSalaryBill(salarySend);
// 2.正常核算处理
} else {
salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null);
handleDelSalaryBill(salarySend);
}
}
private void handleDelSalaryBill(SalarySendPO salarySend) {
if (salarySend == null) {
return;
}
// 已发送工资单
SalarySendInfoPO sendInfo = SalarySendInfoPO.builder()
.deleteType(0)
.salarySendId(salarySend.getId())
.sendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()).build();
.sendStatus(SalarySendStatusEnum.ALREADYSEND.getValue())
.salaryAcctType(NumberUtils.INTEGER_ZERO).build();
List<SalarySendInfoPO> salarySendInfos = getSalarySendInfoMapper().listSome(sendInfo);
if (salarySend.getSendNum() > 0 || CollectionUtils.isNotEmpty(salarySendInfos)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100507, "工资单已经发放,不可撤销"));
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100507, "工资单已经发放,不可撤销,可以进行回算"));
}
// 删除工资单
SalarySendPO salarySendPO = SalarySendPO.builder()
@ -285,6 +313,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
.deleteType(1)
.build();
getSalarySendInfoMapper().updateGrantWithdraw(infoPO, salarySend.getId(), null, null);
}
@Override
@ -1117,6 +1146,35 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
}
return ExcelUtil.genWorkbookV2(rows, sheetName);
}
@Override
public List<SalarySendCheckDTO> getSalarySendCheckResult(Set<Long> salaryAcctRecordIds) {
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
return Collections.emptyList();
}
Map<String, Object> condition = new HashMap<>();
condition.put("salaryAccountingIds",salaryAcctRecordIds);
List<SalarySendPO> salarySendPOS = getSalarySendMapper().listSomeWithCondition(condition);
Map<Long, SalarySendPO> map = SalaryEntityUtil.convert2Map(salarySendPOS, SalarySendPO::getSalaryAccountingId);
return salaryAcctRecordIds.stream().map(m -> {
SalarySendPO salarySend = map.get(m);
SalarySendCheckDTO salarySendCheck = new SalarySendCheckDTO();
salarySendCheck.setSalaryAcctId(m);
// 是否存在已经发送
salarySendCheck.setAlreadySend(salarySend != null && salarySend.getSendNum() > 0);
// 是否已经发送完成
salarySendCheck.setSendFinished(salarySend != null && salarySend.getSendNum() == salarySend.getSendTotal());
return salarySendCheck;
}).collect(Collectors.toList());
}
@Override
public void handleHistory() {
mapper.batchHandleSendStatusHistory();
mapper.batchHandleSalaryAcctTypeHistory();
}
//
// @BatchExportHandler("exportSalarySendDetail")
// public void salarySendDetailExportHandler() {

View File

@ -60,6 +60,10 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
private SalaryItemService getSalaryItemService(User user) {
return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return (SalarySobBackItemService) ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
// private LoggerTemplate salarySobLoggerTemplate;
@Override
@ -123,26 +127,29 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobId);
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobIdWithItemHide(salarySobId);
// 查询薪资账套的薪资项目副本
List<SalarySobItemPO> salarySobItemPOS =listBySalarySobIdWithHideItem (salarySobId);
List<SalarySobItemPO> salarySobItemPOS =listBySalarySobIdWithHideItem(salarySobId);
// 回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId);
// 薪资账套的薪资项目副本所用的公式id
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
// 添加薪资回算项目的公式id
formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems,SalarySobBackItemPO::getFormulaId));
// 查询公式详情
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 查询薪资账套的薪资项目副本所关联的薪资项目
// 查询薪资账套的薪资项目副本+回算的薪资项目所关联的薪资项目
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
Set<Long> backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId);
salaryItemIds.addAll(backCalcItemIds);
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
// 转换成聚合dto
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS,
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS);
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems);
return salarySobItemAggregateBO.convert2AggregateDTO();
}
@Override
public SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salarySobId) {
public SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salarySobId, boolean isBackCalc) {
// 查询薪资账套
SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId);
if (Objects.isNull(salarySobPO)) {
@ -153,6 +160,10 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobIdWithItemHide(salarySobId);
if(isBackCalc){
// 回算分类
}
// 获取关闭显示的分类
List<Long> hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build());
// 过滤关闭显示的薪资项目分类
@ -167,18 +178,27 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
List<Long> hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build());
salarySobItemPOS = salarySobItemPOS.stream().filter(group -> !(hideItemIDs.contains(group.getSalaryItemId()))).collect(Collectors.toList());
// 回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
if(isBackCalc){
salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId);
}
// 薪资账套的薪资项目副本所用的公式id
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
formulaIds.addAll(salarySobBackItems.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList()));
// 查询公式详情
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 查询薪资账套的薪资项目副本所关联的薪资项目
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
Set<Long> backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId);
salaryItemIds.addAll(backCalcItemIds);
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
// 转换成聚合dto
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS,
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS);
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS,salarySobBackItems);
return salarySobItemAggregateBO.convert2AggregateDTO();
}

View File

@ -150,6 +150,13 @@ public class SalaryAcctController {
return new ResponseResult<Long, Integer>(user).run(getSalaryAcctRecordWrapper(user)::hasConsolidatedTax, id);
}
// 回算
@POST
@Path("/backCalculate")
public String backCalculate(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctRecordReAccountParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long, String>(user).run(getSalaryAcctRecordWrapper(user)::backCalculate, param.getSalaryAcctRecordId());
}
/* ********************************薪资核算记录相关 end*********************************/

View File

@ -14,6 +14,7 @@ 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;
@ -100,6 +101,20 @@ public class SalaryBillController {
return new ResponseResult<Long, List<SalaryTemplateSalaryItemSetListDTO>>(user).run(getSalaryTemplateWrapper(user)::getSalaryItemSet, salarySobId);
}
/**
* 获取工资单模板补发设置表单
*
* @return
*/
@POST
@Path("/template/getReplenishForm")
@Produces(MediaType.APPLICATION_JSON)
public String getReplenishForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody ReplenishFormQueryParam replenishFormQueryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<ReplenishFormQueryParam ,SalaryTemplateReplenishFormDTO>(user).run(getSalaryTemplateWrapper(user)::getReplenishForm, replenishFormQueryParam);
}
/**
* 工资单模板默认使用
*
@ -186,6 +201,21 @@ public class SalaryBillController {
return new ResponseResult<>(user).run(getSalaryTemplateWrapper(user)::selectSalarySobList);
}
/**
* 获取补发规则设置下拉列表
*
* @return
*/
@GET
@Path("/template/getReplenishRuleSetOptions")
@Produces(MediaType.APPLICATION_JSON)
public String getReplenishRuleSetOptions(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestParam Long salarySobId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long,String>(user).run(getSalaryTemplateWrapper(user)::getReplenishRuleSetOptions, salarySobId);
}
/**
* 获取租户名
*

View File

@ -4,6 +4,7 @@ import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.biz.EmployBiz;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryBill.dto.SalarySendCheckDTO;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctRecordBO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctEmployeeCountDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctRecordFormDTO;
@ -16,9 +17,11 @@ import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.SalaryAcctEmployeeService;
import com.engine.salary.service.SalaryAcctRecordService;
import com.engine.salary.service.SalarySendService;
import com.engine.salary.service.SalarySobService;
import com.engine.salary.service.impl.SalaryAcctEmployeeServiceImpl;
import com.engine.salary.service.impl.SalaryAcctRecordServiceImpl;
import com.engine.salary.service.impl.SalarySendServiceImpl;
import com.engine.salary.service.impl.SalarySobServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
@ -54,6 +57,11 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
}
private SalarySendService getSalarySendService(User user) {
return ServiceUtil.getService(SalarySendServiceImpl.class, user);
}
// private ComInfoCache comInfoCache;
public PageInfo<SalaryAcctRecordListDTO> listPage(SalaryAcctRecordQueryParam queryParam) {
@ -79,8 +87,11 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord
// 查询薪资核算人数的数量
Set<Long> salaryAcctRecordIds = SalaryEntityUtil.properties(list, SalaryAcctRecordPO::getId);
List<SalaryAcctEmployeeCountDTO> salaryAcctEmployeeCountDTOS = getSalaryAcctEmployeeService(user).countBySalaryAcctRecordId(salaryAcctRecordIds);
// 查询工资单的查询情况
List<SalarySendCheckDTO> salarySendCheckResult = getSalarySendService(user).getSalarySendCheckResult(salaryAcctRecordIds);
// 转换成列表dto
List<SalaryAcctRecordListDTO> salaryAcctRecordListDTOS = SalaryAcctRecordBO.convert2ListDTO(list, salarySobPOS, employeeComInfos, salaryAcctEmployeeCountDTOS);
List<SalaryAcctRecordListDTO> salaryAcctRecordListDTOS = SalaryAcctRecordBO.convert2ListDTO(list, salarySobPOS, employeeComInfos, salaryAcctEmployeeCountDTOS, salarySendCheckResult);
dtoPage.setList(salaryAcctRecordListDTOS);
}
// WeaTable<SalaryAcctRecordListDTO> weaTable = SalaryFormatUtil.<SalaryAcctRecordListDTO>getInstance().buildTable(SalaryAcctRecordListDTO.class, dtoPage);
@ -196,6 +207,8 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord
getSalaryAcctRecordService(user).reCalculate(id);
}
/**
* 判断是否存在合并计税
*
@ -205,4 +218,14 @@ public class SalaryAcctRecordWrapper extends Service implements SalaryAcctRecord
public Integer hasConsolidatedTax(Long id) {
return getSalaryAcctRecordService(user).hasConsolidatedTax(id);
}
/**
* @description 回算
* @return void
* @author Harryxzy
* @date 2022/11/24 15:52
*/
public void backCalculate(Long salaryAcctRecordId){
getSalaryAcctRecordService(user).backCalculate(salaryAcctRecordId);
}
}

View File

@ -36,7 +36,6 @@ import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.engine.salary.util.valid.ValidUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
@ -79,6 +78,10 @@ public class SalarySendWrapper extends Service {
* @return
*/
public Map<String, Object> list(SalarySendQueryParam queryParam) {
// 处理工资单发放历史数据
getSalarySendService(user).handleHistory();
long currentEmployeeId = user.getUID();
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();

View File

@ -5,22 +5,19 @@ import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.component.SalaryWeaTable;
import com.engine.salary.entity.salaryBill.dto.*;
import com.engine.salary.entity.salaryBill.param.SalaryTemplateCopyParam;
import com.engine.salary.entity.salaryBill.param.SalaryTemplateDefaultUseParam;
import com.engine.salary.entity.salaryBill.param.SalaryTemplateQueryParam;
import com.engine.salary.entity.salaryBill.param.SalaryTemplateSaveParam;
import com.engine.salary.entity.salaryBill.param.*;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.enums.salarybill.SalaryTemplateReplenishRuleEnum;
import com.engine.salary.enums.salarybill.SalaryTemplateVarEnum;
import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.SalarySobService;
import com.engine.salary.service.SalaryTemplateService;
import com.engine.salary.service.TaxAgentService;
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.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.DBType;
import com.mzlion.core.json.fastjson.JsonUtil;
import com.mzlion.core.utils.BeanUtils;
@ -50,6 +47,14 @@ public class SalaryTemplateWrapper extends Service {
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
@ -132,6 +137,7 @@ public class SalaryTemplateWrapper extends Service {
SalaryTemplateBaseSetDTO salaryTemplateBaseSetDTO = new SalaryTemplateBaseSetDTO();
Map<String, String> replenishRuleSetOptionList = Collections.emptyMap();
if (id != null) {
SalaryTemplatePO po = getSalaryTemplateService(user).getById(id);
if (po == null) {
@ -143,6 +149,12 @@ public class SalaryTemplateWrapper extends Service {
salaryTemplateBaseSetDTO.setMsgStatus(po.getMsgStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()));
salaryTemplateBaseSetDTO.setSalarySob(po.getSalarySobId());
salaryTemplateBaseSetDTO.setSendEmail(po.getSendEmailId());
// 规则赋值
salaryTemplateBaseSetDTO.setReplenishRule(SalaryTemplateReplenishRuleEnum.ALL.getValue().equals(po.getReplenishRule()) ? po.getReplenishRule() : SalaryTemplateReplenishRuleEnum.BYRULE.getValue());
// 规则设置赋值
salaryTemplateBaseSetDTO.setReplenishRuleSet(po.getReplenishRule());
// 修改时获取补规则设置下拉列表
replenishRuleSetOptionList = getReplenishRuleSetOptions(po.getSalarySobId());
}
@ -174,6 +186,7 @@ public class SalaryTemplateWrapper extends Service {
return SalaryTemplateBaseFormDTO.builder()
.id(id)
.salaryTemplateBaseSet(salaryTemplateBase)
.replenishRuleSetOption(replenishRuleSetOptionList)
.build();
}
@ -298,4 +311,72 @@ public class SalaryTemplateWrapper extends Service {
}
/**
* 获取补发规则设置下拉列表
*
* @param salarySobId
* @return
*/
public Map<String, String> getReplenishRuleSetOptions(Long salarySobId) {
if (salarySobId == null) {
return Collections.emptyMap();
}
SalarySobPO salarySob = getSalarySobService(user).getById(salarySobId);
if (salarySob == null) {
return Collections.emptyMap();
}
// 查询薪资账套的回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId);
if (CollectionUtils.isEmpty(salarySobBackItems)) {
salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySob.getId());
}
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salarySobBackItems.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
String ruleTip = "(" + SalaryI18nUtil.getI18nLabel( 140142, "不等于0")+")";
List<Map<String, String>> result = salaryItemPOS.stream().map(m -> {
Map<String, String> map = new HashMap<>(2);
map.put("id", String.valueOf(m.getId()));
map.put("content", m.getName() + ruleTip);
return map;
}).collect(Collectors.toList());
if(result!= null && result.size()>0){
return result.get(0);
}
return Collections.emptyMap();
}
/**
* 获取工资单模板补发设置表单
*
* @param replenishFormQueryParam
* @return
*/
public SalaryTemplateReplenishFormDTO getReplenishForm(ReplenishFormQueryParam replenishFormQueryParam) {
// Long id = replenishFormQueryParam.getId();
// // 补发薪资项目设置
// List<SalaryTemplateSalaryItemSetListDTO> 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;
}
}

View File

@ -50,5 +50,4 @@ public interface SalaryAcctRecordWrapperProxy {
*/
void reCalculate(Long id);
}