package com.engine.salary.entity.salarysob.bo;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.*;
import com.engine.salary.enums.sicategory.DeleteTypeEnum;
import com.engine.salary.util.SalaryEntityUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.engine.salary.util.db.IdGenerator;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.math.NumberUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 薪资账套薪资项目
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
public class SalarySobItemBO {
/**
* 默认包含的员工信息字段转换成薪资账套员工信息字段po
*
* @param salarySobId 薪资账套id
* @param defaultEmpFieldList 默认包含的员工信息字段
* @param employeeId 当前登陆人员id
* @return
*/
public static List convert2EmpFieldPO(Long salarySobId, List defaultEmpFieldList, Long employeeId) {
Date now = new Date();
return defaultEmpFieldList.stream()
.map(field -> new SalarySobEmpFieldPO()
.setSalarySobId(salarySobId)
.setFieldCode(field.getFieldCode())
.setSortedIndex(field.getSortedIndex())
.setCanDelete(field.getCanDelete())
.setCreator(employeeId)
.setCreateTime(now)
.setUpdateTime(now)
.setDeleteType(0)
.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY))
.collect(Collectors.toList());
}
/**
* 转换成薪资账套的薪资项目副本po
*
* @param salarySobId
* @param salarySobDefaultItemGroupPOS
* @param salarySobDefaultItemPOS
* @param defaultSalaryItemPOS
* @param employeeId
* @param tenantKey
* @return
*/
public static Result initSalarySobItem(Long salarySobId,
List salarySobDefaultItemGroupPOS,
List salarySobDefaultItemPOS,
List defaultSalaryItemPOS,
Long employeeId, String tenantKey) {
Date now = new Date();
// 处理薪资账套默认的薪资项目分类
Map salarySobItemGroupIdMap = Maps.newHashMapWithExpectedSize(salarySobDefaultItemGroupPOS.size());
List salarySobItemGroups = Lists.newArrayListWithExpectedSize(salarySobDefaultItemGroupPOS.size());
for (SalarySobDefaultItemGroupPO salarySobDefaultItemGroupPO : salarySobDefaultItemGroupPOS) {
long salarySobItemGroupId = IdGenerator.generate();
salarySobItemGroups.add(SalarySobItemGroupPO.builder()
.id(salarySobItemGroupId)
.name(salarySobDefaultItemGroupPO.getName())
.salarySobId(salarySobId)
.sortedIndex(salarySobDefaultItemGroupPO.getSortedIndex())
.description(salarySobDefaultItemGroupPO.getDescription())
.creator(employeeId)
.createTime(now)
.updateTime(now)
.tenantKey(tenantKey)
.deleteType(NumberUtils.INTEGER_ZERO)
.build());
salarySobItemGroupIdMap.put(salarySobDefaultItemGroupPO.getId(), salarySobItemGroupId);
}
List salarySobItems = Lists.newArrayListWithExpectedSize(defaultSalaryItemPOS.size());
// 处理薪资账套默认的系统薪资项目
Set sysSalaryItemIds = SalaryEntityUtil.properties(salarySobDefaultItemPOS, SalarySobDefaultItemPO::getSysSalaryItemId);
Map salaryItemPOMap = defaultSalaryItemPOS.stream()
.filter(salaryItemPO -> sysSalaryItemIds.contains(salaryItemPO.getSysSalaryItemId()))
.collect(Collectors.toMap(SalaryItemPO::getSysSalaryItemId, Function.identity(), (a, b) -> a));
for (SalarySobDefaultItemPO salarySobDefaultItemPO : salarySobDefaultItemPOS) {
SalaryItemPO salaryItemPO = salaryItemPOMap.get(salarySobDefaultItemPO.getSysSalaryItemId());
if (salaryItemPO==null)continue;
salarySobItems.add(SalarySobItemPO.builder()
.salarySobId(salarySobId)
.salarySobItemGroupId(salarySobItemGroupIdMap.getOrDefault(salarySobDefaultItemPO.getSobDefaultItemGroupId(), NumberUtils.LONG_ZERO))
.salaryItemId(salaryItemPO.getId())
.salaryItemCode(salaryItemPO.getCode())
.formulaId(salaryItemPO.getFormulaId())
.sortedIndex(salarySobDefaultItemPO.getSortedIndex())
.description(salaryItemPO.getDescription())
.canDelete(salarySobDefaultItemPO.getCanDelete())
.creator(employeeId)
.createTime(now)
.updateTime(now)
.tenantKey(tenantKey)
.deleteType(NumberUtils.INTEGER_ZERO)
.build());
}
// 处理薪资账套默认的自定义薪资项目(开启了"默认使用")
for (int i = 0; i < defaultSalaryItemPOS.size(); i++) {
SalaryItemPO salaryItemPO = defaultSalaryItemPOS.get(i);
if (sysSalaryItemIds.contains(salaryItemPO.getSysSalaryItemId())) {
continue;
}
// 获取系统默认回算薪资项目的系统id
List backItemSysItemIds = SalarySobBackItemBO.getDefault().stream().map(SalarySobDefaultBackItemPO::getSysSalaryItemId).collect(Collectors.toList());
if (backItemSysItemIds.contains(salaryItemPO.getSysSalaryItemId())) {
continue;
}
salarySobItems.add(SalarySobItemPO.builder()
.salarySobId(salarySobId)
.salarySobItemGroupId(NumberUtils.LONG_ZERO)
.salaryItemId(salaryItemPO.getId())
.salaryItemCode(salaryItemPO.getCode())
.formulaId(salaryItemPO.getFormulaId())
.sortedIndex(i)
.description(salaryItemPO.getDescription())
.canDelete(NumberUtils.INTEGER_ONE)
.creator(employeeId)
.createTime(now)
.updateTime(now)
.tenantKey(tenantKey)
.deleteType(NumberUtils.INTEGER_ZERO)
.build());
}
// 薪资账套默认的回算薪资项目
List salarySobBackItems = Lists.newArrayListWithExpectedSize(2);
for (SalarySobDefaultBackItemPO salarySobDefaultBackItemPO : SalarySobBackItemBO.getDefault()) {
Map sysSalaryItemMap = SalaryEntityUtil.convert2Map(defaultSalaryItemPOS, SalaryItemPO::getSysSalaryItemId);
SalaryItemPO salaryItemPO = sysSalaryItemMap.get(salarySobDefaultBackItemPO.getSysSalaryItemId());
SalarySobBackItemPO salarySobBackItemPO = SalarySobBackItemPO.builder()
.id(IdGenerator.generate())
.salarySobId(salarySobId)
.salaryItemId(salaryItemPO.getId())
.salaryItemCode(salaryItemPO.getCode())
.dataType(salaryItemPO.getDataType())
.roundingMode(salaryItemPO.getRoundingMode())
.pattern(salaryItemPO.getPattern())
.valueType(salaryItemPO.getValueType())
.formulaId(salarySobDefaultBackItemPO.getFormulaId())
.backCalcType(salarySobDefaultBackItemPO.getBackCalcType())
.creator(employeeId)
.createTime(now)
.updateTime(now)
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.tenantKey(tenantKey).build();
salarySobBackItems.add(salarySobBackItemPO);
}
return new Result().setNeedInsertSalarySobItems(salarySobItems).setNeedInsertSalarySobItemGroups(salarySobItemGroups)
.setNeedInsertSalarySobBackItems(salarySobBackItems);
}
@Data
@Accessors(chain = true)
public static class Result {
/**
* 需要保存的薪资项目
*/
List needInsertSalarySobItems;
/**
* 需要保存的薪资项目分类
*/
List needInsertSalarySobItemGroups;
/**
* 需要保存的回算薪资项目
*/
List needInsertSalarySobBackItems;
}
}