weaver-hrm-salary/src/com/engine/salary/service/impl/SalarySobInitServiceImpl.java

396 lines
22 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.annotation.SalaryFormulaVar;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.datacollection.AddUpSituation;
import com.engine.salary.entity.salaryitem.bo.SysSalaryItemBO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO;
import com.engine.salary.entity.salarysob.bo.SalarySobInitEnv;
import com.engine.salary.entity.salarysob.param.SalarySobBasicSaveParam;
import com.engine.salary.entity.salarysob.po.*;
import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.enums.sicategory.DeleteTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salarysob.SalarySobMapper;
import com.engine.salary.service.*;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import dm.jdbc.util.IdGenerator;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import weaver.hrm.User;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
/**
* 薪资账套初始化
* <p>Copyright: Copyright (c) 2023</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
public class SalarySobInitServiceImpl extends AbstractSalarySobInitService {
private SalarySobMapper getSalarySobMapper() {
return MapperProxyFactory.getProxy(SalarySobMapper.class);
}
private SalarySobDefaultEmpFieldService getSalarySobDefaultEmpFieldService(User user) {
return ServiceUtil.getService(SalarySobDefaultEmpFieldServiceImpl.class, user);
}
private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) {
return ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user);
}
private SalarySobDefaultItemGroupService getSalarySobDefaultItemGroupService(User user) {
return ServiceUtil.getService(SalarySobDefaultItemGroupServiceImpl.class, user);
}
private SalarySobDefaultItemService getSalarySobDefaultItemService(User user) {
return ServiceUtil.getService(SalarySobDefaultItemServiceImpl.class, user);
}
private SysSalaryItemService getSysSalaryItemService(User user) {
return ServiceUtil.getService(SysSalaryItemServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SalarySobItemGroupService getSalarySobItemGroupService(User user) {
return ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user);
}
private SalarySobItemService getSalarySobItemService(User user) {
return ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
private SalarySobAddUpRuleService getSalarySobAddUpRuleService(User user) {
return ServiceUtil.getService(SalarySobAddUpRuleServiceImpl.class, user);
}
private TaxReportColumnService getTaxReportColumnService(User user) {
return ServiceUtil.getService(TaxReportColumnServiceImpl.class, user);
}
private SalarySobTaxReportRuleService getSalarySobTaxReportRuleService(User user) {
return ServiceUtil.getService(SalarySobTaxReportRuleServiceImpl.class, user);
}
@Override
protected void initBasic(SalarySobInitEnv env) {
if (env == null || env.getSaveParam() == null || env.getCurrentUser() == null) {
throw new SalaryRunTimeException("Invalid arguments");
}
// 因为薪资账套的「名称」支持了"小地球"所以在打开新建表单时后端就会将id传给前端所以新建保存的时候前端是会将id传给后端的
// 当前端未将id传给后端时后端自动生成一个id
SalarySobBasicSaveParam saveParam = env.getSaveParam();
if (saveParam.getId() == null) {
saveParam.setId(IdGenerator.generate());
}
Date now = new Date();
SalarySobPO salarySob = new SalarySobPO()
// .setId(saveParam.getId())
.setTaxAgentId(saveParam.getTaxAgentId())
.setName(saveParam.getName())
.setIncomeCategory(saveParam.getTaxableItems())
.setSalaryCycleType(saveParam.getSalaryCycleType())
.setSalaryCycleFromDay(saveParam.getSalaryCycleFromDay())
.setTaxCycleType(saveParam.getTaxCycleType())
.setAttendCycleType(saveParam.getAttendCycleType())
.setAttendCycleFromDay(saveParam.getAttendCycleFromDay())
.setSocialSecurityCycleType(saveParam.getSocialSecurityCycleType())
.setDisable(0)
.setDescription(saveParam.getDescription())
// .setOriginSalarySobId(saveParam.getId())
.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.setCreator((long) env.getCurrentUser().getUID())
.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.setCreateTime(now)
.setUpdateTime(now);
getSalarySobMapper().insertIgnoreNull(salarySob);
env.setSalarySob(salarySob);
}
@Override
protected void initEmpField(SalarySobInitEnv env) {
if (env == null || env.getSaveParam() == null || env.getCurrentUser() == null) {
throw new SalaryRunTimeException("Invalid arguments");
}
// 查询薪资账套默认的员工信息字段
List<SalarySobDefaultEmpFieldPO> salarySobDefaultEmpFields = getSalarySobDefaultEmpFieldService(user).list();
Date now = new Date();
List<SalarySobEmpFieldPO> salarySobEmpFields = salarySobDefaultEmpFields.stream()
.map(field -> new SalarySobEmpFieldPO()
// .setId(IdGenerator.generate())
.setSalarySobId(env.getSalarySob().getId())
.setFieldCode(field.getFieldCode())
.setSortedIndex(field.getSortedIndex())
.setCanDelete(field.getCanDelete())
.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.setCreator((long) env.getCurrentUser().getUID())
.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.setCreateTime(now)
.setUpdateTime(now))
.collect(Collectors.toList());
getSalarySobEmpFieldService(user).batchSave(salarySobEmpFields);
}
@Override
protected void initItem(SalarySobInitEnv env) {
if (env == null || env.getSaveParam() == null || env.getCurrentUser() == null) {
throw new SalaryRunTimeException("Invalid arguments");
}
Date now = new Date();
// 根据所得项目查询默认的账套薪资项目分组
List<SalarySobDefaultItemGroupPO> salarySobDefaultItemGroups = getSalarySobDefaultItemGroupService(user)
.listByIncomeCategoryIn(Collections.singletonList(IncomeCategoryEnum.parseByValue(env.getSaveParam().getTaxableItems())));
// 根据所得项目查询默认的账套薪资项目
List<SalarySobDefaultItemPO> salarySobDefaultItems = getSalarySobDefaultItemService(user)
.listByIncomeCategory(IncomeCategoryEnum.parseByValue(env.getSaveParam().getTaxableItems()));
// 根据默认的账套薪资项目查询关联的系统薪资项目id
Set<Long> sysSalaryItemIds = SalaryEntityUtil.properties(salarySobDefaultItems,
SalarySobDefaultItemPO::getSysSalaryItemId);
List<SysSalaryItemPO> sysSalaryItems = getSysSalaryItemService(user).listByIds(sysSalaryItemIds);
Map<Long, SysSalaryItemPO> sysSalaryItemMap = SalaryEntityUtil.convert2Map(sysSalaryItems, SysSalaryItemPO::getId);
// 根据系统薪资项目id查询当前租户的自定义薪资项目
// 如果默认的账套薪资项目查询关联的系统薪资项目id没有生成自定义薪资项目需要自动生成对应的自定义薪资项目
List<SalaryItemPO> needInsertSalaryItems = new ArrayList<>();
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listBySysSalaryItemIds(sysSalaryItemIds);
// key:系统薪资项目id;value:薪资项目po
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems,
SalaryItemPO::getSysSalaryItemId);
for (SysSalaryItemPO sysSalaryItem : sysSalaryItems) {
salaryItemMap.computeIfAbsent(sysSalaryItem.getId(), key -> {
SalaryItemPO salaryItem = SysSalaryItemBO.convert2SalaryItemPO(sysSalaryItem, now, (long) env.getCurrentUser().getUID());
needInsertSalaryItems.add(salaryItem);
return salaryItem;
});
}
// key:默认的账套薪资项目分组id;value:账套薪资项目分组po
Map<Long, SalarySobItemGroupPO> salarySobItemGroupMap = Maps.newHashMapWithExpectedSize(salarySobDefaultItemGroups.size());
// 遍历默认的账套薪资项目分组生成账套薪资项目分组po
for (SalarySobDefaultItemGroupPO salarySobDefaultItemGroup : salarySobDefaultItemGroups) {
SalarySobItemGroupPO salarySobItemGroup = SalarySobItemGroupPO.builder()
.id(IdGenerator.generate())
.name(salarySobDefaultItemGroup.getName())
.salarySobId(env.getSalarySob().getId())
.sortedIndex(salarySobDefaultItemGroup.getSortedIndex())
.description(salarySobDefaultItemGroup.getDescription())
// .incomeCategory(salarySobDefaultItemGroup.getIncomeCategory().toString())
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.creator((long) env.getCurrentUser().getUID())
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.createTime(now)
.updateTime(now)
.build();
salarySobItemGroupMap.put(salarySobDefaultItemGroup.getId(), salarySobItemGroup);
}
List<SalarySobItemPO> salarySobItems = new ArrayList<>(salarySobDefaultItems.size());
// 遍历默认的账套薪资项目生成账套薪资项目po
for (SalarySobDefaultItemPO salarySobDefaultItem : salarySobDefaultItems) {
// 账套薪资项目分组
SalarySobItemGroupPO salarySobItemGroup = salarySobItemGroupMap.get(salarySobDefaultItem.getSobDefaultItemGroupId());
// 关联的薪资项目、系统薪资项目
SalaryItemPO salaryItem = salaryItemMap.get(salarySobDefaultItem.getSysSalaryItemId());
SysSalaryItemPO sysSalaryItem = sysSalaryItemMap.get(salarySobDefaultItem.getSysSalaryItemId());
if (salaryItem == null || sysSalaryItem == null) {
throw new SalaryRunTimeException("Invalid arguments,salaryItem can not be null");
}
SalarySobItemPO salarySobItem = SalarySobItemPO.builder()
// .id(IdGenerator.generate())
.salarySobId(env.getSalarySob().getId())
.incomeCategory(salarySobDefaultItem.getIncomeCategory().toString())
.salaryItemId(salaryItem.getId())
.salaryItemCode(salaryItem.getCode())
.salarySobItemGroupId(Optional.ofNullable(salarySobItemGroup).map(SalarySobItemGroupPO::getId).orElse(0L))
// .useInEmployeeSalary(0)
// .dataType(salaryItem.getDataType())
// .roundingMode(sysSalaryItem.getRoundingMode())
// .pattern(sysSalaryItem.getPattern())
// .valueType(sysSalaryItem.getValueType())
.formulaId(sysSalaryItem.getFormulaId())
// .hideSwitch(0)
// .sumSwitch(0)
// .readonlySwitch(0)
.sortedIndex(salarySobDefaultItem.getSortedIndex())
.description(salaryItem.getDescription())
// .canEdit(1)
.canDelete(1)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.creator((long) env.getCurrentUser().getUID())
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.createTime(now)
.updateTime(now)
.build();
salarySobItems.add(salarySobItem);
}
if (CollectionUtils.isNotEmpty(needInsertSalaryItems)) {
getSalaryItemService(user).batchSave(needInsertSalaryItems);
}
if (MapUtils.isNotEmpty(salarySobItemGroupMap)) {
getSalarySobItemGroupService(user).batchSave(salarySobItemGroupMap.values());
}
if (CollectionUtils.isNotEmpty(salarySobItems)) {
getSalarySobItemService(user).batchSave(salarySobItems);
}
env.setSalarySobItems(salarySobItems);
}
@Override
protected void initBackItem(SalarySobInitEnv env) {
// 只有「正常工资薪金」才默认生成回算薪资项目
boolean contains = Objects.equals(env.getSaveParam().getTaxableItems(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue());
if (!contains) {
return;
}
// 746777981115629575L--已发薪资合计
// 746777981115629576L--补发薪资合计
List<Long> sysSalaryItemIds = Lists.newArrayList(746777981115629575L, 746777981115629576L);
List<SysSalaryItemPO> sysSalaryItems = getSysSalaryItemService(user).listByIds(sysSalaryItemIds);
// 根据系统薪资项目id查询当前租户的自定义薪资项目
// 如果默认的账套薪资项目查询关联的系统薪资项目id没有生成自定义薪资项目需要自动生成对应的自定义薪资项目
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listBySysSalaryItemIds(sysSalaryItemIds);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getSysSalaryItemId);
Date now = new Date();
List<SalaryItemPO> needInsertSalaryItems = new ArrayList<>();
List<SalarySobBackItemPO> salarySobBackItems = new ArrayList<>();
for (SysSalaryItemPO sysSalaryItem : sysSalaryItems) {
SalaryItemPO salaryItem = salaryItemMap.computeIfAbsent(sysSalaryItem.getId(), key -> {
SalaryItemPO temp = SysSalaryItemBO.convert2SalaryItemPO(sysSalaryItem, now, (long) env.getCurrentUser().getUID());
needInsertSalaryItems.add(temp);
return temp;
});
SalarySobBackItemPO salarySobBackItem = SalarySobBackItemPO.builder()
.id(IdGenerator.generate())
.salarySobId(env.getSalarySob().getId())
// .incomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue().toString())
.salaryItemId(salaryItem.getId())
.salaryItemCode(salaryItem.getCode())
.dataType(salaryItem.getDataType())
.roundingMode(sysSalaryItem.getRoundingMode())
.pattern(sysSalaryItem.getPattern())
.valueType(sysSalaryItem.getValueType())
.formulaId(sysSalaryItem.getFormulaId())
// .hideSwitch(0)
// .sumSwitch(0)
// .readonlySwitch(0)
// .sortedIndex(0)
.backCalcType(Objects.equals(sysSalaryItem.getId(), 746777981115629575L) ? 0 : 1)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
// .breator((long) env.getCurrentUser().getUID())
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.createTime(now)
.updateTime(now)
.build();
salarySobBackItems.add(salarySobBackItem);
}
if (CollectionUtils.isNotEmpty(needInsertSalaryItems)) {
getSalaryItemService(user).batchSave(needInsertSalaryItems);
}
if (CollectionUtils.isNotEmpty(salarySobBackItems)) {
getSalarySobBackItemService(user).batchInsert(salarySobBackItems);
}
}
@Override
protected void initAddUpRule(SalarySobInitEnv env) {
// 只有「正常工资薪金」才默认生成累计字段对应规则
boolean contains = Objects.equals(env.getSaveParam().getTaxableItems(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue());
if (!contains) {
return;
}
Date now = new Date();
List<SalarySobAddUpRulePO> salarySobAddUpRules = new ArrayList<>();
// 账套薪资项目
List<SalarySobItemPO> salarySobItems = env.getSalarySobItems().stream()
.filter(e -> Objects.equals(e.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue().toString()))
.collect(Collectors.toList());
// AddUpSituationPO.class带有SalaryFormulaVar.class注解字段的name和账套薪资项目的code都是对应的除了「addUpAdvanceTax」
// 遍历AddUpSituationPO.class的SalaryFormulaVar.class注解生成累计字段对应规则po
Map<String, SalarySobItemPO> salarySobItemMap = SalaryEntityUtil.convert2Map(salarySobItems,
SalarySobItemPO::getSalaryItemCode);
for (Field declaredField : AddUpSituation.class.getDeclaredFields()) {
SalarySobItemPO salarySobItem = salarySobItemMap.get(declaredField.getName());
if (Objects.equals(declaredField.getName(), "addUpAdvanceTax")) {
salarySobItem = salarySobItemMap.get("addUpTaxPayable");
}
if (Objects.equals(declaredField.getName(), "addUpTaxExemptIncome")) {
salarySobItem = salarySobItemMap.get("addUpTaxFreeIncome");
}
if (Objects.equals(declaredField.getName(), "addUpTaxSavings")) {
salarySobItem = salarySobItemMap.get("addUpTaxDeduction");
}
if (!declaredField.isAnnotationPresent(SalaryFormulaVar.class) || Objects.isNull(salarySobItem)) {
continue;
}
SalarySobAddUpRulePO salarySobAddUpRule = new SalarySobAddUpRulePO();
salarySobAddUpRule.setId(IdGenerator.generate());
salarySobAddUpRule.setSalarySobId(env.getSalarySob().getId());
salarySobAddUpRule.setIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue().toString());
salarySobAddUpRule.setSalaryItemId(salarySobItem.getSalaryItemId());
salarySobAddUpRule.setAddUpColumnDataIndex(declaredField.getName());
salarySobAddUpRule.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY);
salarySobAddUpRule.setCreator((long) env.getCurrentUser().getUID());
salarySobAddUpRule.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue());
salarySobAddUpRule.setCreateTime(now);
salarySobAddUpRule.setUpdateTime(now);
salarySobAddUpRules.add(salarySobAddUpRule);
}
if (CollectionUtils.isNotEmpty(salarySobAddUpRules)) {
getSalarySobAddUpRuleService(user).saveBatch(salarySobAddUpRules);
}
}
@Override
protected void initTaxReportRule(SalarySobInitEnv env) {
// 查询个税申报表的表头
List<TaxReportColumnPO> taxReportColumns = new ArrayList<>(getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(env.getSaveParam().getTaxableItems())));
Date now = new Date();
// 个税申报表表头的reportColumnDataIndex和账套薪资项目的code都是对应的
// 遍历个税申报表的表头生成个税申报表字段对应规则po
List<SalarySobTaxReportRulePO> salarySobTaxReportRules = Lists.newArrayList();
Map<String, SalarySobItemPO> salarySobItemMap = SalaryEntityUtil.convert2Map(env.getSalarySobItems(),
e -> e.getIncomeCategory() + "-" + e.getSalaryItemCode());
for (TaxReportColumnPO taxReportColumn : taxReportColumns) {
SalarySobItemPO salarySobItem = salarySobItemMap.get(taxReportColumn.getIncomeCategory() + "-" + taxReportColumn.getReportColumnDataIndex());
if (Objects.nonNull(salarySobItem)) {
SalarySobTaxReportRulePO salarySobTaxReportRule = new SalarySobTaxReportRulePO();
salarySobTaxReportRule.setId(IdGenerator.generate());
salarySobTaxReportRule.setSalarySobId(env.getSalarySob().getId());
salarySobTaxReportRule.setIncomeCategory(salarySobItem.getIncomeCategory());
salarySobTaxReportRule.setReportColumnDataIndex(taxReportColumn.getReportColumnDataIndex());
salarySobTaxReportRule.setSalaryItemId(salarySobItem.getSalaryItemId());
salarySobTaxReportRule.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY);
salarySobTaxReportRule.setCreator((long) env.getCurrentUser().getUID());
salarySobTaxReportRule.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue());
salarySobTaxReportRule.setCreateTime(now);
salarySobTaxReportRule.setUpdateTime(now);
salarySobTaxReportRules.add(salarySobTaxReportRule);
}
}
if (CollectionUtils.isNotEmpty(salarySobTaxReportRules)) {
getSalarySobTaxReportRuleService(user).saveBatch(salarySobTaxReportRules);
}
}
}