package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; import com.engine.salary.biz.SalarySobBiz; import com.engine.salary.biz.SalarySobItemBiz; import com.engine.salary.biz.SalarySobItemGroupBiz; import com.engine.salary.biz.SalarySobItemHideBiz; import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AttendQuoteDataDTO; import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; import com.engine.salary.entity.datacollection.po.VariableItemPO; import com.engine.salary.entity.salaryacct.bo.CalculateFormulaVarBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculateBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculatePriorityBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctConfig; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveDataDTO; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.config.FormluaConfig; import com.engine.salary.entity.salaryformula.po.FormulaPO; import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO; import com.engine.salary.entity.salarysob.dto.SalaryItemTopologyDTO; import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO; import com.engine.salary.entity.salarysob.param.SalaryItemTopologyQueryParam; import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam; import com.engine.salary.entity.salarysob.po.*; import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.OperateTypeEnum; import com.engine.salary.enums.SalaryValueTypeEnum; import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum; import com.engine.salary.enums.salaryformula.SalarySQLReferenceEnum; import com.engine.salary.enums.auth.AuthFilterTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salarysob.SalarySobDefaultItemMapper; import com.engine.salary.mapper.salarysob.SalarySobEmpFieldMapper; import com.engine.salary.mapper.salarysob.SalarySobItemMapper; import com.engine.salary.service.*; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.valid.ValidUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.general.BaseBean; import weaver.hrm.User; import java.time.Month; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 薪资账套的薪资项目副本 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ @Slf4j public class SalarySobItemServiceImpl extends Service implements SalarySobItemService { private SalarySobItemBiz salarySobItemMapper = new SalarySobItemBiz(); private SalarySobBiz salarySobBiz = new SalarySobBiz(); private SalarySobItemGroupBiz salarySobItemGroupBiz = new SalarySobItemGroupBiz(); private SalarySobItemHideBiz salarySobItemHideBiz = new SalarySobItemHideBiz(); private SalarySobEmpFieldMapper getSalarySobEmpFieldMapper() { return MapperProxyFactory.getProxy(SalarySobEmpFieldMapper.class); } private SalarySobItemMapper getSalarySobItemMapper() { return MapperProxyFactory.getProxy(SalarySobItemMapper.class); } private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) { return (SalarySobEmpFieldService) ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user); } private TaxAgentService getTaxAgentService(User user) { return (TaxAgentService) ServiceUtil.getService(TaxAgentServiceImpl.class, user); } private SalarySobItemGroupService getSalarySobItemGroupService(User user) { return (SalarySobItemGroupService) ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user); } private SalarySobItemHideService getSalarySobItemHideService(User user) { return (SalarySobItemHideService) ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user); } private SalaryFormulaService getSalaryFormulaService(User user) { return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user); } 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 SalarySobDefaultItemMapper getSalarySobDefaultItemMapper() { return MapperProxyFactory.getProxy(SalarySobDefaultItemMapper.class); } private SalaryAcctSobConfigService getSalaryAcctSobConfigService(User user) { return ServiceUtil.getService(SalaryAcctSobConfigServiceImpl.class, user); } private SalaryAcctResultService getSalaryAcctResultService(User user) { return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); } // private LoggerTemplate salarySobLoggerTemplate; private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); } private SalaryAcctRecordService getSalaryAcctRecordService(User user) { return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); } private SalarySobService getSalarySobService(User user) { return ServiceUtil.getService(SalarySobServiceImpl.class, user); } private SIAccountService getSIAccountService(User user) { return ServiceUtil.getService(SIAccountServiceImpl.class, user); } private AttendQuoteFieldService getAttendQuoteFieldService(User user) { return ServiceUtil.getService(AttendQuoteFieldServiceImpl.class, user); } private VariableItemService getVariableItemService(User user) { return ServiceUtil.getService(VariableItemServiceImpl.class, user); } private SalaryEmployeeService getSalaryEmployeeService(User user) { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } private SalaryArchiveService getSalaryArchiveService(User user) { return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user); } private AddUpSituationService getAddUpSituationService(User user) { return ServiceUtil.getService(AddUpSituationServiceImpl.class, user); } private AddUpDeductionService getAddUpDeductionService(User user) { return ServiceUtil.getService(AddUpDeductionServiceImpl.class, user); } private OtherDeductionService getOtherDeductionService(User user) { return ServiceUtil.getService(OtherDeductionServiceImpl.class, user); } private AttendQuoteDataService getAttendQuoteDataService(User user) { return ServiceUtil.getService(AttendQuoteDataServiceImpl.class, user); } private VariableArchiveService getVariableArchiveService(User user) { return ServiceUtil.getService(VariableArchiveServiceImpl.class, user); } @Override public List list() { return salarySobItemMapper.listAll(); } @Override public List listBySalarySobId(Long salarySobId) { return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).build()); } @Override public List listBySalarySobIdAndGroupId(Long salarySobId, Collection salarySobItemGroupIds) { return salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, salarySobItemGroupIds); } @Override public List listBySalarySobIds(Collection salarySobIds) { return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobIds(salarySobIds).build()); } @Override public List listBySalarySobIdAndSalaryItemIdNotIn(Long salarySobId, Collection salaryItemIds) { return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).notInSalaryItemIds(salaryItemIds).build()); } @Override public List listBySalaryItemIds(Collection salaryItemIds) { if (CollectionUtils.isEmpty(salaryItemIds)) { return Collections.emptyList(); } return salarySobItemMapper.listSome(SalarySobItemPO.builder().salaryItemIds(salaryItemIds).build()); } @Override public List listBySalarySobId4SalaryItem(Long salarySobId) { // 查询薪资项目副本 List salarySobItemPOS = listBySalarySobId(salarySobId); if (CollectionUtils.isEmpty(salarySobItemPOS)) { return Collections.emptyList(); } // 查询薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); return getSalaryItemService(user).listByIds(salaryItemIds); } @Override public SalarySobItemAggregateDTO getAggregateBySalarySobId(Long salarySobId) { // 查询薪资账套 SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } // 查询薪资账套的员工信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobId); // 查询薪资账套的薪资项目分类 List salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salarySobId); // 查询薪资账套的薪资项目副本 List salarySobItemPOS = listBySalarySobId(salarySobId); // 薪资项目副本去重 salarySobItemPOS = salarySobItemPOS.stream().filter(SalaryEntityUtil.distinctByKey(PO -> PO.getSalarySobId() + "-" + PO.getSalaryItemId())).collect(Collectors.toList()); // 回算薪资项目 List salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId); // 薪资账套的薪资项目副本所用的公式id Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); // 添加薪资回算项目的公式id formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId)); // 查询公式详情 List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 查询薪资账套的薪资项目副本+回算的薪资项目所关联的薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); Set backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId); salaryItemIds.addAll(backCalcItemIds); //账套项目分权 TaxAgentQueryParam param = TaxAgentQueryParam.builder().build(); param.setFilterType(AuthFilterTypeEnum.QUERY_DATA); Set ids = getTaxAgentService(user).listAuth(param).stream().map(TaxAgentPO::getId).collect(Collectors.toSet()); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds).stream() .filter(po -> getSalaryItemService(user).filterInRange(ids, po)) .collect(Collectors.toList()); //获取系统值 List salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll(); // 转换成聚合dto SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, salarySobDefaultItemPOS); return salarySobItemAggregateBO.convert2AggregateDTO(); } @Override public SalarySobItemAggregateDTO getAggregateByRecordId(Long salaryAcctRecordId, boolean hideItem) { SalaryAcctConfig salaryAcctConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordId); // 查询薪资账套 SalarySobPO salarySobPO = salaryAcctConfig.getSalarySob(); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } // 查询薪资账套的员工信息字段 List salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields(); // 查询薪资账套的薪资项目分类 List salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups(); if (hideItem) { salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList()); } // 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目) List salarySobItemPOS = salaryAcctConfig.getSalarySobItems(); if (hideItem) { salarySobItemPOS = salarySobItemPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList()); } // 回算薪资项目 List salarySobBackItems = salaryAcctConfig.getSalarySobBackItems(); // 薪资账套的薪资项目副本所用的公式id Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); // 添加薪资回算项目的公式id formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId)); // 查询公式详情 List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 查询薪资账套的薪资项目副本+回算的薪资项目所关联的薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); Set backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId); salaryItemIds.addAll(backCalcItemIds); TaxAgentQueryParam param = TaxAgentQueryParam.builder().build(); param.setFilterType(AuthFilterTypeEnum.QUERY_DATA); Set ids = getTaxAgentService(user).listAuth(param).stream().map(TaxAgentPO::getId).collect(Collectors.toSet()); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds).stream().filter(po -> getSalaryItemService(user).filterInRange(ids, po)).collect(Collectors.toList()); //获取系统值 List salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll(); // 转换成聚合dto SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, salarySobDefaultItemPOS); return salarySobItemAggregateBO.convert2AggregateDTO(); } @Override public SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salaryAcctRecordId, Long salarySobId, boolean isBackCalc) { SalaryAcctConfig salaryAcctConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordId); // 查询薪资账套 SalarySobPO salarySobPO = salaryAcctConfig.getSalarySob(); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } // 查询薪资账套的员工信息字段 List salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields(); // 查询薪资账套的薪资项目分类 List salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups(); salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList()); // 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目) List salarySobItemPOS = salaryAcctConfig.getSalarySobItems(); salarySobItemPOS = salarySobItemPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList()); // 回算薪资项目 List salarySobBackItems = Collections.emptyList(); if (isBackCalc) { salarySobBackItems = salaryAcctConfig.getSalarySobBackItems(); } // 薪资账套的薪资项目副本所用的公式id Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); formulaIds.addAll(salarySobBackItems.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList())); // 查询公式详情 List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 查询薪资账套的薪资项目副本所关联的薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); Set backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId); salaryItemIds.addAll(backCalcItemIds); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 转换成聚合dto SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, Collections.emptyList()); return salarySobItemAggregateBO.convert2AggregateDTO(); } @Override public void save(SalarySobItemSaveParam saveParam) { Long salarySobId = saveParam.getSalarySobId(); // 校验 validSaveParam(saveParam); //保存 saveSobItem(saveParam); SalarySobPO salarySob = salarySobBiz.getById(salarySobId); // 记录日志 LoggerContext loggerContext = new LoggerContext<>(); loggerContext.setUser(user); loggerContext.setTargetId("" + salarySob.getId()); loggerContext.setTargetName(salarySob.getName()); loggerContext.setOperateType(OperateTypeEnum.ADD.getValue()); loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "编辑薪资账套薪资项目")); loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "编辑薪资账套薪资项目")); SalaryElogConfig.salarySobLoggerTemplate.write(loggerContext); } /** * 校验 */ private void validSaveParam(SalarySobItemSaveParam saveParam) { ValidUtil.doValidator(saveParam); //账套存在 Long salarySobId = saveParam.getSalarySobId(); SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } //员工信息字段不可重复 List empFields = saveParam.getEmpFields(); if (CollectionUtils.isNotEmpty(empFields)) { int count = (int) SalaryEntityUtil.properties(empFields, SalarySobItemSaveParam.SalarySobEmpFieldParam::getFieldId).stream().distinct().count(); if (count < empFields.size()) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "分类名称重复!")); } } else { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "员工信息不能为空!")); } //分类名称唯一 List itemGroups = saveParam.getItemGroups(); if (CollectionUtils.isNotEmpty(itemGroups)) { int count = (int) SalaryEntityUtil.properties(itemGroups, SalarySobItemSaveParam.SalarySobItemGroupParam::getName).stream().distinct().count(); if (count < itemGroups.size()) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "分类名称重复!")); } } } /** * 保存项目信息 * * @param saveParam */ private void saveSobItem(SalarySobItemSaveParam saveParam) { //分组和薪资项 handleGroupAndItem(saveParam); //处理人员信息字段 handleEmpField(saveParam); } private void handleGroupAndItem(SalarySobItemSaveParam saveParam) { long employeeId = (long) user.getUID(); Date now = new Date(); Long salarySobId = saveParam.getSalarySobId(); SalarySobPO sob = salarySobBiz.getById(salarySobId); String incomeCategory = sob.getIncomeCategory() == null ? "1" : sob.getIncomeCategory().toString(); List itemGroups = saveParam.getItemGroups(); List newGroupIds = SalaryEntityUtil.properties(itemGroups, SalarySobItemSaveParam.SalarySobItemGroupParam::getId, Collectors.toList()); List salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salarySobId); List oldGroupIds = SalaryEntityUtil.properties(salarySobItemGroupPOS, SalarySobItemGroupPO::getId, Collectors.toList()); List needAddGroup = itemGroups.stream().filter(f -> f.getId() == null).collect(Collectors.toList()); List needUpdateGroup = itemGroups.stream().filter(f -> f.getId() != null && oldGroupIds.contains(f.getId())).collect(Collectors.toList()); List needDeleteGroupIds = oldGroupIds.stream().filter(f -> !newGroupIds.contains(f)).collect(Collectors.toList()); // 获取所有薪资项目 List allSalaryItemList = getSalaryItemService(user).listAll(); Map salaryItemsMap = SalaryEntityUtil.convert2Map(allSalaryItemList, SalaryItemPO::getId); //先保存项目分类获,取分类id Collection salarySobItems = new ArrayList<>(); for (SalarySobItemSaveParam.SalarySobItemGroupParam itemGroupParam : needAddGroup) { Long salarySobItemGroupId = IdGenerator.generate(); SalarySobItemGroupPO salarySobItemGroupPO = SalarySobItemGroupPO.builder().id(salarySobItemGroupId).salarySobId(salarySobId).name(itemGroupParam.getName()).sortedIndex(itemGroupParam.getSortedIndex()).itemHide(itemGroupParam.getItemHide()).description(StringUtils.EMPTY).creator(employeeId).createTime(now).updateTime(now).deleteType(NumberUtils.INTEGER_ZERO).tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).build(); //保存分类 salarySobItemGroupBiz.insert(salarySobItemGroupPO); for (SalarySobItemSaveParam.SalarySobItemParam itemParam : itemGroupParam.getItems()) { SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap); SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder() .salarySobId(salarySobId) .incomeCategory(incomeCategory) .salaryItemId(itemParam.getSalaryItemId()) .salaryItemCode(salaryItemPO.getCode()) .salarySobItemGroupId(salarySobItemGroupId) .formulaId(Optional.ofNullable(itemParam.getFormulaId()).orElse(NumberUtils.LONG_ZERO)) .sortedIndex(itemParam.getSortedIndex()) .description(StringUtils.EMPTY) .creator(employeeId) .createTime(now) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .canDelete(itemParam.getCanDelete() == null ? NumberUtils.INTEGER_ONE : (itemParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)) .roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode()) .pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern()) .valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType()) .itemHide(itemParam.getItemHide()) .defaultValue(itemParam.getDefaultValue()) .build(); salarySobItems.add(salarySobItemPO); } } //更新分组 for (SalarySobItemSaveParam.SalarySobItemGroupParam itemGroupParam : needUpdateGroup) { Long groupId = itemGroupParam.getId(); SalarySobItemGroupPO salarySobItemGroupPO = SalarySobItemGroupPO.builder().id(groupId).name(itemGroupParam.getName()).sortedIndex(itemGroupParam.getSortedIndex()).itemHide(itemGroupParam.getItemHide()).build(); //更新分类 salarySobItemGroupBiz.update(salarySobItemGroupPO); List items = itemGroupParam.getItems(); List itemIds = SalaryEntityUtil.properties(items, SalarySobItemSaveParam.SalarySobItemParam::getId, Collectors.toList()); List oldItems = salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, Collections.singleton(groupId)); List oldItemIds = SalaryEntityUtil.properties(oldItems, SalarySobItemPO::getId, Collectors.toList()); List needAddItems = items.stream().filter(f -> f.getId() == null).collect(Collectors.toList()); List needDeleteItemIds = oldItems.stream().filter(f -> !itemIds.contains(f.getId())).map(SalarySobItemPO::getId).collect(Collectors.toList()); List needUpdateItems = items.stream().filter(f -> f.getId() != null && oldItemIds.contains(f.getId())).collect(Collectors.toList()); //新增 for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needAddItems) { SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap); SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder() .salarySobId(salarySobId) .incomeCategory(incomeCategory) .salaryItemId(itemParam.getSalaryItemId()) .salaryItemCode(salaryItemPO.getCode()) .salarySobItemGroupId(groupId) .formulaId(Optional.ofNullable(itemParam.getFormulaId()).orElse(NumberUtils.LONG_ZERO)) .canDelete(itemParam.getCanDelete() == null ? NumberUtils.INTEGER_ONE : (itemParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)) .sortedIndex(itemParam.getSortedIndex()) .description(StringUtils.EMPTY) .creator(employeeId) .createTime(now) .updateTime(now) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .deleteType(NumberUtils.INTEGER_ZERO) .roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode()) .pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern()) .valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType()) .itemHide(itemParam.getItemHide()) .defaultValue(itemParam.getDefaultValue()) .build(); salarySobItems.add(salarySobItemPO); } //更新 for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needUpdateItems) { SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap); SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder() .id(itemParam.getId()) .incomeCategory(incomeCategory) .salaryItemId(itemParam.getSalaryItemId()) .salaryItemCode(salaryItemPO.getCode()) .salarySobItemGroupId(groupId) .formulaId(Optional.ofNullable(itemParam.getFormulaId()).orElse(NumberUtils.LONG_ZERO)) .sortedIndex(itemParam.getSortedIndex()) .canDelete(itemParam.getCanDelete() == null ? NumberUtils.INTEGER_ONE : (itemParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode()) .pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern()) .valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType()) .itemHide(itemParam.getItemHide()) .defaultValue(itemParam.getDefaultValue()) .build(); getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO); } //删除 salarySobItemMapper.deleteByIds(needDeleteItemIds); } //删除分组 salarySobItemGroupBiz.deleteByIds(needDeleteGroupIds); salarySobItemMapper.deleteByGroupIds(needDeleteGroupIds); //未分类 List items = saveParam.getItems(); List itemIds = SalaryEntityUtil.properties(items, SalarySobItemSaveParam.SalarySobItemParam::getId, Collectors.toList()); List oldItems = salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, Collections.singleton(0L)); List oldItemIds = SalaryEntityUtil.properties(oldItems, SalarySobItemPO::getId, Collectors.toList()); List needAddItems = items.stream().filter(f -> f.getId() == null).collect(Collectors.toList()); List needDeleteItemIds = oldItems.stream().filter(f -> !itemIds.contains(f.getId())).map(SalarySobItemPO::getId).collect(Collectors.toList()); List needUpdateItems = items.stream().filter(f -> f.getId() != null && oldItemIds.contains(f.getId())).collect(Collectors.toList()); for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needAddItems) { SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap); SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().salarySobId(salarySobId).incomeCategory(incomeCategory).salaryItemId(itemParam.getSalaryItemId()).salaryItemCode(salaryItemPO.getCode()).salarySobItemGroupId(NumberUtils.LONG_ZERO).formulaId(Optional.ofNullable(itemParam.getFormulaId()).orElse(NumberUtils.LONG_ZERO)).sortedIndex(itemParam.getSortedIndex()).description(StringUtils.EMPTY).creator(employeeId).createTime(now).updateTime(now).deleteType(NumberUtils.INTEGER_ZERO).tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).canDelete(itemParam.getCanDelete() == null ? NumberUtils.INTEGER_ONE : (itemParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)).roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode()).pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern()).valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType()).itemHide(itemParam.getItemHide()).defaultValue(itemParam.getDefaultValue()).build(); salarySobItems.add(salarySobItemPO); } for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needUpdateItems) { SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap); SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().id(itemParam.getId()).incomeCategory(incomeCategory).formulaId(Optional.ofNullable(itemParam.getFormulaId()).orElse(NumberUtils.LONG_ZERO)).sortedIndex(itemParam.getSortedIndex()).updateTime(now).canDelete(itemParam.getCanDelete() == null ? NumberUtils.INTEGER_ONE : (itemParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)).roundingMode(itemParam.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : itemParam.getRoundingMode()).pattern(itemParam.getPattern() == null ? salaryItemPO.getPattern() : itemParam.getPattern()).valueType(itemParam.getValueType() == null ? salaryItemPO.getValueType() : itemParam.getValueType()).itemHide(itemParam.getItemHide()).defaultValue(itemParam.getDefaultValue()).build(); getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO); } if (CollectionUtils.isNotEmpty(needDeleteItemIds)) { getSalarySobItemMapper().deleteByIds(needDeleteItemIds); } // 保存薪资账套的薪资项目副本 batchSave(salarySobItems); // 删除原薪资项目是否显示 deleteItemShowBySalarySobIds(Collections.singleton(salarySobId)); } private SalaryItemPO checkItemExists(Long salaryItemId, Map salaryItemsMap) { SalaryItemPO salaryItemPO = salaryItemsMap.get(salaryItemId); if (salaryItemPO == null) { log.error("薪资项目:{}不存在", salaryItemId); throw new SalaryRunTimeException("保存失败!存在薪资项目不存在或已被删除"); } return salaryItemPO; } private void handleEmpField(SalarySobItemSaveParam saveParam) { long employeeId = (long) user.getUID(); Date now = new Date(); Long salarySobId = saveParam.getSalarySobId(); List empFields = saveParam.getEmpFields(); List newEmpIds = SalaryEntityUtil.properties(empFields, SalarySobItemSaveParam.SalarySobEmpFieldParam::getId, Collectors.toList()); List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobId); List needDeleteEmpIds = salarySobEmpFieldPOS.stream().filter(f -> !newEmpIds.contains(f.getId())).map(SalarySobEmpFieldPO::getId).collect(Collectors.toList()); // 保存薪资账套的员工信息字段 Collection needInsertSalarySobEmpFields = new ArrayList<>(); for (SalarySobItemSaveParam.SalarySobEmpFieldParam salarySobEmpFieldParam : empFields) { if (salarySobEmpFieldParam.getId() == null) { SalarySobEmpFieldPO salarySobEmpFieldPO = SalarySobEmpFieldPO.builder().salarySobId(saveParam.getSalarySobId()).fieldCode(salarySobEmpFieldParam.getFieldId()).sortedIndex(salarySobEmpFieldParam.getSortedIndex()).canDelete(salarySobEmpFieldParam.getCanDelete() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO).creator(employeeId).createTime(now).updateTime(now).deleteType(NumberUtils.INTEGER_ZERO).tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).build(); needInsertSalarySobEmpFields.add(salarySobEmpFieldPO); } else { SalarySobEmpFieldPO salarySobEmpFieldPO = SalarySobEmpFieldPO.builder().id(salarySobEmpFieldParam.getId()).sortedIndex(salarySobEmpFieldParam.getSortedIndex()).updateTime(now).build(); getSalarySobEmpFieldMapper().updateIgnoreNull(salarySobEmpFieldPO); } } getSalarySobEmpFieldService(user).batchSave(needInsertSalarySobEmpFields); //删除字段 getSalarySobEmpFieldService(user).deleteByIds(needDeleteEmpIds); } @Override public void batchSave(Collection salarySobItemPOS) { if (CollectionUtils.isEmpty(salarySobItemPOS)) { return; } //前端可能传重复数据,去重 List list = new ArrayList<>(salarySobItemPOS.stream().collect(Collectors.toMap(SalarySobItemPO::getSalaryItemId, Function.identity(), (oldValue, newValue) -> oldValue)).values()); salarySobItemMapper.batchInsert(list); } @Override public void deleteBySalarySobIds(Collection salarySobIds) { salarySobItemMapper.deleteBySalarySobIds(salarySobIds); } @Override public void deleteItemShowBySalarySobIds(Collection salarySobIds) { salarySobItemMapper.deleteItemShowBySalarySobId(salarySobIds); } @Override public void update(SalarySobItemPO po) { salarySobItemMapper.update(po); } @Override public List getConfig(Long salarySobId) { List salarySobItemPOS = salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).salarySobItemGroupId(0L).build()); if (CollectionUtils.isNotEmpty(salarySobItemPOS)) { FormluaConfig config = getSalaryFormulaService(user).getConfig(); List formulaPOS = config.getFormulas(); Map formulaMap = SalaryEntityUtil.convert2Map(formulaPOS, FormulaPO::getId); List formulaVars = config.getFormulaVars(); Map> varListMap = SalaryEntityUtil.group2Map(formulaVars, FormulaVar::getFormulaId); List salaryItems = getSalaryItemService(user).listAll(); Map itemIdMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); salarySobItemPOS.forEach(salarySobItemPO -> { if (SalaryEntityUtil.isNotNullOrEmpty(salarySobItemPO.getFormulaId())) { FormulaPO formulaPO = formulaMap.get(salarySobItemPO.getFormulaId()); if (SalaryEntityUtil.isNotNullOrEmpty(formulaPO)) { List formulaVarList = varListMap.getOrDefault(formulaPO.getId(), new ArrayList<>()); formulaPO.setFormulaVars(formulaVarList); } salarySobItemPO.setFormula(formulaPO); } if (SalaryEntityUtil.isNotNullOrEmpty(salarySobItemPO.getSalaryItemId())) { SalaryItemPO salaryItemPO = itemIdMap.get(salarySobItemPO.getSalaryItemId()); salarySobItemPO.setSalaryItem(salaryItemPO); } }); } return salarySobItemPOS; } @Override public SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param) { SalarySobItemFormDTO salarySobItemFormDTO = new SalarySobItemFormDTO(); salarySobItemFormDTO.setCanEdit(1); // 默认可以编辑 if (param.getSalarySobId() != null && param.getSalaryItemId() != null) { // 查询薪资账套 SalarySobPO salarySobPO = salarySobBiz.getById(param.getSalarySobId()); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } // 查询薪资项目 List salarySobItemPOS = getSalarySobItemMapper().listSome(SalarySobItemPO.builder().salarySobId(param.getSalarySobId()).salaryItemId(param.getSalaryItemId()).build()); if (CollectionUtils.isEmpty(salarySobItemPOS)) { throw new SalaryRunTimeException("账套中薪资项目不存在"); } SalarySobItemPO salarySobItemPO = salarySobItemPOS.get(0); SalaryItemPO salaryItemPO = getSalaryItemService(user).getById(salarySobItemPO.getSalaryItemId()); if (salaryItemPO == null) { throw new SalaryRunTimeException("薪资项目不存在或已被删除"); } //获取系统值 List salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll(); salarySobDefaultItemPOS = salarySobDefaultItemPOS.stream().filter(po -> po.getSysSalaryItemId() != 0).collect(Collectors.toList()); Map longIntegerMap = SalaryEntityUtil.convert2Map(salarySobDefaultItemPOS, SalarySobDefaultItemPO::getSysSalaryItemId, SalarySobDefaultItemPO::getCanDelete); if (salaryItemPO.getSysSalaryItemId() != null) { salarySobItemPO.setCanDelete(longIntegerMap.getOrDefault(salaryItemPO.getSysSalaryItemId(), 1)); } // 获取薪资项目公式 List expressFormulas = getSalaryFormulaService(user).listExpressFormula(Collections.singleton(salarySobItemPO.getFormulaId())); // 强制开启账套的公式配置 BaseBean baseBean = new BaseBean(); final Boolean openFormulaForcedEditing = "true".equals(baseBean.getPropValue("hrmSalary", "openFormulaForcedEditing")); String formulaContent = CollectionUtils.isEmpty(expressFormulas) ? "" : expressFormulas.get(0).getFormula(); Integer valueType = salarySobItemPO.getValueType() == null ? salaryItemPO.getValueType() : salarySobItemPO.getValueType(); salarySobItemFormDTO .setId(salarySobItemPO.getId()) .setName(salaryItemPO.getName()) .setItemHide(salarySobItemPO.getItemHide() == null ? 0 : Integer.parseInt(salarySobItemPO.getItemHide().toString())) .setDataType(salaryItemPO.getDataType()) .setRoundingMode(salarySobItemPO.getRoundingMode() == null ? salaryItemPO.getRoundingMode() : salarySobItemPO.getRoundingMode()) .setPattern(salarySobItemPO.getPattern() == null ? salaryItemPO.getPattern() : salarySobItemPO.getPattern()) .setValueType(valueType).setFormulaId(salarySobItemPO.getFormulaId()) .setFormulaContent(CollectionUtils.isNotEmpty(expressFormulas) ? formulaContent : "") .setOriginFormulaContent(valueType.equals(SalaryValueTypeEnum.FORMULA.getValue()) ? formulaContent : "") .setOriginSqlContent(valueType.equals(SalaryValueTypeEnum.SQL.getValue()) ? formulaContent : "") .setUseInEmployeeSalary(salaryItemPO.getUseInEmployeeSalary()) .setDescription(salarySobItemPO.getDescription()) .setCanEdit((openFormulaForcedEditing || salaryItemPO.getCanEdit().equals(1)) ? 1 : 0) .setDefaultValue(salarySobItemPO.getDefaultValue()); } return salarySobItemFormDTO; } /** * 拓扑图 * * @param param * @return */ @Override public SalaryItemTopologyDTO topology(SalaryItemTopologyQueryParam param) { // 查询薪资账套 SalarySobPO salarySobPO = salarySobBiz.getById(param.getSalarySobId()); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除")); } // 查询薪资项目 List salarySobItemPOS = getSalarySobItemMapper().listSome(SalarySobItemPO.builder().salarySobId(param.getSalarySobId()).salaryItemId(param.getSalaryItemId()).build()); if (CollectionUtils.isEmpty(salarySobItemPOS)) { throw new SalaryRunTimeException("账套中薪资项目不存在"); } SalarySobItemPO salarySobItemPO = salarySobItemPOS.get(0); //所有薪资项目 TopologyData topologyData = init(param); SalaryItemPO salaryItemPO = topologyData.getSalaryItemPO(); // 获取薪资项目公式 ExpressFormula expressFormula = getSalaryFormulaService(user).getExpressFormula(salarySobItemPO.getFormulaId()); SalaryItemTopologyDTO salaryItemTopologyDTO = new SalaryItemTopologyDTO(); salaryItemTopologyDTO.setSalaryItemId(salaryItemPO.getId()); salaryItemTopologyDTO.setSalaryItemName(salaryItemPO.getName()); salaryItemTopologyDTO.setFormula(expressFormula); salaryItemTopologyDTO.setResult(topologyData.getResultItemMap().getOrDefault(SalaryFormulaReferenceEnum.SALARY_ITEM.getValue() + "_" + salaryItemPO.getCode(), "")); topology(salaryItemTopologyDTO, topologyData); return salaryItemTopologyDTO; } @Override public void checkLoop(Long salarySobId) { // 查询薪资项目副本 List salarySobItemPOS = listBySalarySobId(salarySobId); // 查询薪资项目 List salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, Collectors.toList()); List salaryItems = getSalaryItemService(user).listByIds(salaryItemIds); // 查询公式详情 List formulaIds = SalaryEntityUtil.properties(salaryItems, SalaryItemPO::getFormulaId, Collectors.toList()); List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItems, expressFormulas, new ArrayList<>(), new HashSet<>()); } /** * 递归拓扑 * * @param salaryItemTopologyDTO * @param topologyData */ private void topology(SalaryItemTopologyDTO salaryItemTopologyDTO, TopologyData topologyData) { Long salaryItemId = topologyData.getSalaryItemId(); Map salaryItemIdMap = topologyData.getSalaryItemIdMap(); Map salaryItemCodeMap = topologyData.getSalaryItemCodeMap(); Map salarySobItemCodeMap = topologyData.getSalarySobItemCodeMap(); Map expressFormulaIdMap = topologyData.getExpressFormulaIdMap(); ExpressFormula formula = salaryItemTopologyDTO.getFormula(); if (formula != null) { List parameters = formula.getParameters(); if (CollectionUtils.isNotEmpty(parameters)) { List salaryItemTopologyDTOChildren = new ArrayList<>(); for (int i = 0; i < parameters.size(); i++) { FormulaVar formulaVar = parameters.get(i); String source = formulaVar.getSource(); String fieldId = formulaVar.getFieldId(); String code = fieldId.replace(source + "_", ""); String name = formulaVar.getName(); String fieldName = formulaVar.getFieldName(); //是否是薪资项目 boolean isSalaryItemVar; SalaryFormulaReferenceEnum salaryFormulaReferenceEnum = SalaryFormulaReferenceEnum.parseByValue(source); if (salaryFormulaReferenceEnum == null) { SalarySQLReferenceEnum referenceEnum = SalarySQLReferenceEnum.parseByValue(source); if (referenceEnum == null) { isSalaryItemVar = false; } else { isSalaryItemVar = referenceEnum == SalarySQLReferenceEnum.SALARY_ITEM; } } else { isSalaryItemVar = salaryFormulaReferenceEnum == SalaryFormulaReferenceEnum.SALARY_ITEM; } ExpressFormula expressFormula; if (salarySobItemCodeMap.containsKey(code)) { // 如果薪资账套下重新定义了薪资项目的公式,则使用薪资账套下的公式,否则使用薪资项目本身的公式 expressFormula = expressFormulaIdMap.get(salarySobItemCodeMap.get(code).getFormulaId()); } else if (salaryItemCodeMap.containsKey(code)) { expressFormula = expressFormulaIdMap.get(salaryItemCodeMap.get(code).getFormulaId()); } else { expressFormula = null; } SalaryItemPO salaryItemChild = isSalaryItemVar ? salaryItemCodeMap.get(code) : new SalaryItemPO(); SalaryItemTopologyDTO salaryItemTopologyChild = new SalaryItemTopologyDTO(); salaryItemTopologyChild.setSalaryItemId(isSalaryItemVar ? salaryItemChild.getId() : null); salaryItemTopologyChild.setSalaryItemName(isSalaryItemVar ? salaryItemChild.getName() : fieldName); salaryItemTopologyChild.setFormula(expressFormula); salaryItemTopologyChild.setResult(topologyData.getResultItemMap().getOrDefault(fieldId, "")); salaryItemTopologyDTOChildren.add(salaryItemTopologyChild); if (isSalaryItemVar) { SalaryItemPO salaryItemChildChild = salaryItemCodeMap.get(code); SalaryValueTypeEnum salaryValueTypeEnum = SalaryValueTypeEnum.parseByValue(salaryItemChildChild.getValueType()); if (salaryValueTypeEnum != SalaryValueTypeEnum.INPUT) { topologyData.setSalaryItemId(salaryItemChildChild.getId()); topology(salaryItemTopologyChild, topologyData); } } } salaryItemTopologyDTO.setChildren(salaryItemTopologyDTOChildren); } } } private TopologyData init(SalaryItemTopologyQueryParam param) { TopologyData topologyData = new TopologyData(); //薪资项目 topologyData.setSalaryItemId(param.getSalaryItemId()); List salaryItems = getSalaryItemService(user).listAll(); Map salaryItemIdMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); topologyData.setSalaryItemIdMap(salaryItemIdMap); Map salaryItemCodeMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getCode); topologyData.setSalaryItemCodeMap(salaryItemCodeMap); SalaryItemPO salaryItemPO = salaryItemIdMap.get(topologyData.salaryItemId); topologyData.setSalaryItemPO(salaryItemPO); //账套项目 List salarySobItems = listBySalarySobId(param.getSalarySobId()); Map salarySobItemCodeMap = SalaryEntityUtil.convert2Map(salarySobItems, SalarySobItemPO::getSalaryItemCode); topologyData.setSalarySobItemCodeMap(salarySobItemCodeMap); //公式 List expressFormulas = getSalaryFormulaService(user).listAllExpressFormula(); Map expressFormulaIdMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId); topologyData.setExpressFormulaIdMap(expressFormulaIdMap); //薪资结果 Long acctEmpId = param.getAcctEmpId(); if (acctEmpId != null) { SalaryAcctEmployeePO acctEmployeePO = getSalaryAcctEmployeeService(user).getById(acctEmpId); List acctEmployeePOS = new ArrayList<>(); acctEmployeePOS.add(acctEmployeePO); Long salaryAcctRecordId = acctEmployeePO.getSalaryAcctRecordId(); // 1、查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } //查询对应账套 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); if (Objects.isNull(salarySobPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资账套不存在或已被删除")); } // 不是查询薪资账套下实时的薪资项目,而是查询发起薪资核算时存储的薪资项目快照 SalaryAcctConfig salaryAcctSobConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordId); // 2、查询薪资核算记录的薪资周期、考勤周期等 SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctRecordId); // 3、查询薪资核算记录所用薪资账套的薪资项目副本 List salarySobItemPOS = salaryAcctSobConfig.getSalarySobItems(); // 回算薪资项目 List salarySobBackItems = Collections.emptyList(); if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) { salarySobBackItems = salaryAcctSobConfig.getSalarySobBackItems(); } // 4、查询当前租户的所有薪资项目 List salaryItemPOS = getSalaryItemService(user).listAll(); // 6、查询社保福利的所有字段 Map welfareColumns = getSIAccountService(user).welfareColumns(); // 7、查询考勤引用的所有字段 List attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll(); List variableItemPOS = getVariableItemService(user).listAll(); // 8、查询公式详情 Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId)); formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId)); List formulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 本次运算的回算薪资项目所涉及的变量 // Set issuedFieldIds = getIssuedFieldIds(salarySobBackItems); // 10、根据id查询其他合并计税的薪资核算记录 List otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId()); // 12.3、生成本次运算的key String calculateKey = UUID.randomUUID().toString(); // 12.5、多线程运算,运算结果存放在临时表中 SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO() .setSalaryAcctRecordPO(salaryAcctRecordPO) .setSalarySobPO(salarySobPO) .setSalarySobCycleDTO(salarySobCycleDTO) .setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS) .setSalarySobItemPOS(salarySobItemPOS) .setSalaryItemIdWithPriorityList(new ArrayList<>()) .setExpressFormulas(formulas) .setSalaryItemPOS(salaryItemPOS) .setSalarySobAdjustRulePOS(new ArrayList<>()) .setWelfareColumns(MapUtils.emptyIfNull(welfareColumns)) .setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS) .setSalaryAcctEmployeePOS(acctEmployeePOS) .setIssuedFieldIds(new HashSet<>()) .setResults(null) .setCalculateKey(calculateKey) .setVariableItems(variableItemPOS) .setTaxDeclarationFunction(null) .setTaxIds(null); List employeeIds = Collections.singletonList(acctEmployeePO.getEmployeeId()); List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds); Long taxAgentId = salaryAcctCalculateBO.getSalarySobPO().getTaxAgentId(); List salaryArchiveData = getSalaryArchiveService(user).getSalaryArchiveData(salarySobCycleDTO.getSalaryCycle(), employeeIds, taxAgentId); List addUpSituationPOS; if (salarySobCycleDTO.getTaxCycle().getMonth() == Month.JANUARY) { // 3.1、如果当前税款所属期是本年度第一个税款所属期,就不需要查询往期累计情况 addUpSituationPOS = Collections.emptyList(); } else { addUpSituationPOS = getAddUpSituationService(user).getAddUpSituationList(salarySobCycleDTO.getTaxCycle().plusMonths(-1), employeeIds); } List addUpDeductionPOS = getAddUpDeductionService(user).getAddUpDeductionList(salarySobCycleDTO.getTaxCycle(), employeeIds, taxAgentId); List otherDeductionPOS = getOtherDeductionService(user).getOtherDeductionList(salarySobCycleDTO.getTaxCycle(), employeeIds, taxAgentId); List> welfareData = new ArrayList<>(); welfareData.addAll(getSIAccountService(user).welfareData(salarySobCycleDTO.getSocialSecurityCycle().toString(), employeeIds, taxAgentId)); List attendQuoteDataDTOS = getAttendQuoteDataService(user).getAttendQuoteData(salarySobCycleDTO.getSalaryMonth(), salarySobCycleDTO.getSalarySobId(), employeeIds); List salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId, Collectors.toList()); List salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); Map empItemValueMap = SalaryEntityUtil.convert2Map(salaryAcctResultPOS, p -> p.getSalaryAcctEmpId() + "_" + p.getSalaryItemId(), SalaryAcctResultPO::getResultValue); List> variableArchiveList = getVariableArchiveService(user).listBySalaryMonthAndEmployeeIds(salarySobCycleDTO.getSalaryMonth(), employeeIds, taxAgentId); Map> collect = salaryAcctResultPOS.stream().collect(Collectors.groupingBy(k -> k.getEmployeeId() + "-" + k.getTaxAgentId() + "-" + k.getSalaryItemId())); Map salaryAcctResultPOMap = new HashMap<>(); for (Map.Entry> et : collect.entrySet()) { salaryAcctResultPOMap.put(et.getKey(), et.getValue().get(0).getOriginResultValue()); } Set otherSalaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getOtherSalaryAcctRecordPOS(), SalaryAcctRecordPO::getId); List otherSalaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndEmployeeIds(otherSalaryAcctRecordIds, employeeIds); Map> otherSalaryAcctResultPOMap = SalaryEntityUtil.group2Map(otherSalaryAcctResultPOS, e -> e.getEmployeeId() + "_" + e.getTaxAgentId()); List otherSalaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(otherSalaryAcctRecordIds, employeeIds); Map> otherSalaryAcctEmployeePOMap = SalaryEntityUtil.group2Map(otherSalaryAcctEmployeePOS, salaryAcctEmployeePO -> salaryAcctEmployeePO.getEmployeeId() + "_" + salaryAcctEmployeePO.getTaxAgentId()); // List lastMonthResultPOS = getSalaryAcctResultService(user).listBySobSalaryMonth(SalaryDateUtil.toDate(salarySobCycleDTO.getSalaryMonth().minusMonths(1), 1), salaryAcctCalculateBO.getSalarySobPO().getId(), employeeIds); CalculateFormulaVarBO calculateFormulaVarBO = new CalculateFormulaVarBO(simpleEmployees, salaryArchiveData, addUpSituationPOS, addUpDeductionPOS, otherDeductionPOS, welfareData, attendQuoteDataDTOS, salaryAcctResultPOS, variableArchiveList); Map> formulaVarMap = calculateFormulaVarBO.convert2FormulaVar(salaryAcctCalculateBO); Map resultMap = new HashMap<>(); formulaVarMap.entrySet().forEach(e -> { e.getValue().forEach(f -> { resultMap.put(f.getFieldId(), f.getFieldValue()); }); }); topologyData.setResultItemMap(resultMap); } else { topologyData.setResultItemMap(new HashMap<>()); } return topologyData; } @Data class TopologyData { /** * 薪资项目id */ Long salaryItemId; /** * 薪资项目 */ Map salaryItemIdMap; Map salaryItemCodeMap; /** * 账套项目 */ SalaryItemPO salaryItemPO; Map salarySobItemCodeMap; /** * 公式 */ Map expressFormulaIdMap; /** * 核算结果 */ Map resultItemMap; } }