2022-03-21 20:09:10 +08:00
|
|
|
|
package com.engine.salary.service.impl;
|
|
|
|
|
|
|
2022-03-23 20:54:08 +08:00
|
|
|
|
import com.engine.common.util.ServiceUtil;
|
2022-03-21 20:09:10 +08:00
|
|
|
|
import com.engine.core.impl.Service;
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import com.engine.salary.biz.SalarySobBiz;
|
2022-03-21 20:09:10 +08:00
|
|
|
|
import com.engine.salary.biz.SalarySobItemBiz;
|
2022-03-25 10:31:31 +08:00
|
|
|
|
import com.engine.salary.biz.SalarySobItemGroupBiz;
|
2023-02-09 15:33:35 +08:00
|
|
|
|
import com.engine.salary.biz.SalarySobItemHideBiz;
|
2024-01-30 09:58:13 +08:00
|
|
|
|
import com.engine.salary.config.SalaryElogConfig;
|
2022-03-25 10:31:31 +08:00
|
|
|
|
import com.engine.salary.constant.SalaryDefaultTenantConstant;
|
2024-03-12 14:34:44 +08:00
|
|
|
|
import com.engine.hrmelog.entity.dto.LoggerContext;
|
2024-05-06 16:03:29 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctConfig;
|
2022-04-14 20:46:17 +08:00
|
|
|
|
import com.engine.salary.entity.salaryformula.ExpressFormula;
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
|
2023-07-24 17:11:19 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.dto.SalarySobItemFormDTO;
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam;
|
2022-08-24 10:31:42 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.*;
|
2022-11-11 13:59:37 +08:00
|
|
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
2024-01-30 09:58:13 +08:00
|
|
|
|
import com.engine.salary.enums.OperateTypeEnum;
|
2023-07-24 17:11:19 +08:00
|
|
|
|
import com.engine.salary.enums.SalaryValueTypeEnum;
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import com.engine.salary.exception.SalaryRunTimeException;
|
2023-02-27 17:51:26 +08:00
|
|
|
|
import com.engine.salary.mapper.salarysob.SalarySobDefaultItemMapper;
|
2023-02-09 15:33:35 +08:00
|
|
|
|
import com.engine.salary.mapper.salarysob.SalarySobEmpFieldMapper;
|
|
|
|
|
|
import com.engine.salary.mapper.salarysob.SalarySobItemMapper;
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import com.engine.salary.service.*;
|
|
|
|
|
|
import com.engine.salary.util.SalaryEntityUtil;
|
|
|
|
|
|
import com.engine.salary.util.SalaryI18nUtil;
|
2024-01-30 09:58:13 +08:00
|
|
|
|
import com.engine.salary.util.db.IdGenerator;
|
2023-02-09 15:33:35 +08:00
|
|
|
|
import com.engine.salary.util.db.MapperProxyFactory;
|
2022-04-18 14:45:12 +08:00
|
|
|
|
import com.engine.salary.util.valid.ValidUtil;
|
2023-10-09 15:35:20 +08:00
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2022-03-21 20:09:10 +08:00
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
2022-03-25 10:31:31 +08:00
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
import org.apache.commons.lang3.math.NumberUtils;
|
2023-07-24 17:11:19 +08:00
|
|
|
|
import weaver.general.BaseBean;
|
2022-03-23 20:54:08 +08:00
|
|
|
|
import weaver.hrm.User;
|
2022-03-21 20:09:10 +08:00
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
import java.util.*;
|
2023-01-12 14:09:04 +08:00
|
|
|
|
import java.util.function.Function;
|
2022-08-24 10:31:42 +08:00
|
|
|
|
import java.util.stream.Collectors;
|
2022-03-21 20:09:10 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 薪资账套的薪资项目副本
|
|
|
|
|
|
* <p>Copyright: Copyright (c) 2022</p>
|
|
|
|
|
|
* <p>Company: 泛微软件</p>
|
|
|
|
|
|
*
|
|
|
|
|
|
* @author qiantao
|
|
|
|
|
|
* @version 1.0
|
|
|
|
|
|
**/
|
2023-10-09 15:35:20 +08:00
|
|
|
|
@Slf4j
|
2022-03-21 20:09:10 +08:00
|
|
|
|
public class SalarySobItemServiceImpl extends Service implements SalarySobItemService {
|
|
|
|
|
|
|
|
|
|
|
|
private SalarySobItemBiz salarySobItemMapper = new SalarySobItemBiz();
|
2022-03-23 18:41:38 +08:00
|
|
|
|
private SalarySobBiz salarySobBiz = new SalarySobBiz();
|
2022-03-23 20:54:08 +08:00
|
|
|
|
|
2022-03-25 10:31:31 +08:00
|
|
|
|
private SalarySobItemGroupBiz salarySobItemGroupBiz = new SalarySobItemGroupBiz();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
private SalarySobItemHideBiz salarySobItemHideBiz = new SalarySobItemHideBiz();
|
|
|
|
|
|
|
|
|
|
|
|
private SalarySobEmpFieldMapper getSalarySobEmpFieldMapper() {
|
|
|
|
|
|
return MapperProxyFactory.getProxy(SalarySobEmpFieldMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SalarySobItemMapper getSalarySobItemMapper() {
|
|
|
|
|
|
return MapperProxyFactory.getProxy(SalarySobItemMapper.class);
|
|
|
|
|
|
}
|
2022-03-25 10:31:31 +08:00
|
|
|
|
|
2022-03-23 20:54:08 +08:00
|
|
|
|
private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) {
|
|
|
|
|
|
return (SalarySobEmpFieldService) ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-11 13:59:37 +08:00
|
|
|
|
private TaxAgentService getTaxAgentService(User user) {
|
|
|
|
|
|
return (TaxAgentService) ServiceUtil.getService(TaxAgentServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 20:54:08 +08:00
|
|
|
|
private SalarySobItemGroupService getSalarySobItemGroupService(User user) {
|
|
|
|
|
|
return (SalarySobItemGroupService) ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
private SalarySobItemHideService getSalarySobItemHideService(User user) {
|
|
|
|
|
|
return (SalarySobItemHideService) ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 14:45:12 +08:00
|
|
|
|
private SalaryFormulaService getSalaryFormulaService(User user) {
|
|
|
|
|
|
return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-03-28 11:38:33 +08:00
|
|
|
|
|
|
|
|
|
|
private SalaryItemService getSalaryItemService(User user) {
|
|
|
|
|
|
return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-12-02 17:35:14 +08:00
|
|
|
|
|
|
|
|
|
|
private SalarySobBackItemService getSalarySobBackItemService(User user) {
|
|
|
|
|
|
return (SalarySobBackItemService) ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
2023-02-27 17:51:26 +08:00
|
|
|
|
|
|
|
|
|
|
private SalarySobDefaultItemMapper getSalarySobDefaultItemMapper() {
|
|
|
|
|
|
return MapperProxyFactory.getProxy(SalarySobDefaultItemMapper.class);
|
|
|
|
|
|
}
|
2022-03-21 20:09:10 +08:00
|
|
|
|
|
2024-05-06 16:03:29 +08:00
|
|
|
|
private SalaryAcctSobConfigService getSalaryAcctSobConfigService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryAcctSobConfigServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 20:09:10 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySobItemPO> list() {
|
|
|
|
|
|
return salarySobItemMapper.listAll();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySobItemPO> listBySalarySobId(Long salarySobId) {
|
|
|
|
|
|
return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).build());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
@Override
|
2023-02-09 15:33:35 +08:00
|
|
|
|
public List<SalarySobItemPO> listBySalarySobIdAndGroupId(Long salarySobId, Collection<Long> salarySobItemGroupIds) {
|
|
|
|
|
|
return salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, salarySobItemGroupIds);
|
2022-08-24 10:31:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySobItemPO> listBySalarySobIds(Collection<Long> salarySobIds) {
|
|
|
|
|
|
return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobIds(salarySobIds).build());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySobItemPO> listBySalarySobIdAndSalaryItemIdNotIn(Long salarySobId, Collection<Long> salaryItemIds) {
|
2022-03-30 11:29:48 +08:00
|
|
|
|
return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).notInSalaryItemIds(salaryItemIds).build());
|
2022-03-23 18:41:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 20:09:10 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySobItemPO> listBySalaryItemIds(Collection<Long> salaryItemIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryItemIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-03-23 18:41:38 +08:00
|
|
|
|
return salarySobItemMapper.listSome(SalarySobItemPO.builder().salaryItemIds(salaryItemIds).build());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listBySalarySobId4SalaryItem(Long salarySobId) {
|
|
|
|
|
|
// 查询薪资项目副本
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = listBySalarySobId(salarySobId);
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资项目
|
|
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-03-28 11:38:33 +08:00
|
|
|
|
return getSalaryItemService(user).listByIds(salaryItemIds);
|
2022-03-21 20:09:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public SalarySobItemAggregateDTO getAggregateBySalarySobId(Long salarySobId) {
|
|
|
|
|
|
// 查询薪资账套
|
|
|
|
|
|
SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId);
|
|
|
|
|
|
if (Objects.isNull(salarySobPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资账套的员工信息字段
|
2022-03-23 20:54:08 +08:00
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobId);
|
2022-03-23 18:41:38 +08:00
|
|
|
|
// 查询薪资账套的薪资项目分类
|
2024-05-06 16:03:29 +08:00
|
|
|
|
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salarySobId);
|
2022-03-23 18:41:38 +08:00
|
|
|
|
// 查询薪资账套的薪资项目副本
|
2024-05-06 16:03:29 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = listBySalarySobId(salarySobId);
|
2023-04-07 15:14:07 +08:00
|
|
|
|
// 薪资项目副本去重
|
|
|
|
|
|
salarySobItemPOS = salarySobItemPOS.stream().filter(SalaryEntityUtil.distinctByKey(PO -> PO.getSalarySobId() + "-" + PO.getSalaryItemId())).collect(Collectors.toList());
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// 回算薪资项目
|
|
|
|
|
|
List<SalarySobBackItemPO> salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId);
|
2022-03-23 18:41:38 +08:00
|
|
|
|
// 薪资账套的薪资项目副本所用的公式id
|
|
|
|
|
|
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// 添加薪资回算项目的公式id
|
2023-02-09 15:33:35 +08:00
|
|
|
|
formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId));
|
2022-04-18 14:45:12 +08:00
|
|
|
|
// 查询公式详情
|
|
|
|
|
|
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// 查询薪资账套的薪资项目副本+回算的薪资项目所关联的薪资项目
|
2022-03-23 18:41:38 +08:00
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
Set<Long> backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId);
|
|
|
|
|
|
salaryItemIds.addAll(backCalcItemIds);
|
2022-11-11 13:59:37 +08:00
|
|
|
|
|
|
|
|
|
|
Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID());
|
|
|
|
|
|
final Set<Long> ids = new HashSet<Long>();
|
|
|
|
|
|
if (needAuth) {
|
|
|
|
|
|
Set<Long> collect = getTaxAgentService(user).listAllTaxAgents((long) user.getUID())
|
|
|
|
|
|
.stream().map(TaxAgentPO::getId).collect(Collectors.toSet());
|
|
|
|
|
|
ids.addAll(collect);
|
|
|
|
|
|
}
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds).stream()
|
|
|
|
|
|
.filter(po -> Boolean.FALSE.equals(needAuth) || getSalaryItemService(user).filterInRange(ids, po))
|
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
2023-02-27 17:51:26 +08:00
|
|
|
|
//获取系统值
|
|
|
|
|
|
List<SalarySobDefaultItemPO> salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll();
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
// 转换成聚合dto
|
|
|
|
|
|
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS,
|
2023-02-27 17:51:26 +08:00
|
|
|
|
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, salarySobDefaultItemPOS);
|
2022-08-24 10:31:42 +08:00
|
|
|
|
return salarySobItemAggregateBO.convert2AggregateDTO();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-07 15:25:43 +08:00
|
|
|
|
@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<SalarySobEmpFieldPO> salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields();
|
|
|
|
|
|
// 查询薪资账套的薪资项目分类
|
|
|
|
|
|
List<SalarySobItemGroupPO> salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups();
|
|
|
|
|
|
if (hideItem) {
|
|
|
|
|
|
salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList());
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目)
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = salaryAcctConfig.getSalarySobItems();
|
|
|
|
|
|
if (hideItem) {
|
|
|
|
|
|
salarySobItemPOS = salarySobItemPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList());
|
|
|
|
|
|
}
|
|
|
|
|
|
// 回算薪资项目
|
|
|
|
|
|
List<SalarySobBackItemPO> salarySobBackItems = salaryAcctConfig.getSalarySobBackItems();
|
|
|
|
|
|
// 薪资账套的薪资项目副本所用的公式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);
|
|
|
|
|
|
|
|
|
|
|
|
Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID());
|
|
|
|
|
|
final Set<Long> ids = new HashSet<Long>();
|
|
|
|
|
|
if (needAuth) {
|
|
|
|
|
|
Set<Long> collect = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()).stream().map(TaxAgentPO::getId).collect(Collectors.toSet());
|
|
|
|
|
|
ids.addAll(collect);
|
|
|
|
|
|
}
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds).stream().filter(po -> Boolean.FALSE.equals(needAuth) || getSalaryItemService(user).filterInRange(ids, po)).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
//获取系统值
|
|
|
|
|
|
List<SalarySobDefaultItemPO> salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll();
|
|
|
|
|
|
|
|
|
|
|
|
// 转换成聚合dto
|
|
|
|
|
|
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, salarySobDefaultItemPOS);
|
|
|
|
|
|
return salarySobItemAggregateBO.convert2AggregateDTO();
|
|
|
|
|
|
}
|
2022-11-11 13:59:37 +08:00
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
@Override
|
2024-05-06 16:03:29 +08:00
|
|
|
|
public SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salaryAcctRecordId, Long salarySobId, boolean isBackCalc) {
|
|
|
|
|
|
|
|
|
|
|
|
SalaryAcctConfig salaryAcctConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordId);
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
// 查询薪资账套
|
2024-05-06 16:03:29 +08:00
|
|
|
|
SalarySobPO salarySobPO = salaryAcctConfig.getSalarySob();
|
2022-08-24 10:31:42 +08:00
|
|
|
|
if (Objects.isNull(salarySobPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资账套的员工信息字段
|
2024-05-06 16:03:29 +08:00
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields();
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
2024-05-06 16:03:29 +08:00
|
|
|
|
// 查询薪资账套的薪资项目分类
|
|
|
|
|
|
List<SalarySobItemGroupPO> salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups();
|
|
|
|
|
|
salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList());
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
|
|
|
|
|
// 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目)
|
2024-05-06 16:03:29 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = salaryAcctConfig.getSalarySobItems();
|
|
|
|
|
|
salarySobItemPOS = salarySobItemPOS.stream().filter(po -> po.getItemHide() == null || po.getItemHide().equals(0L)).collect(Collectors.toList());
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// 回算薪资项目
|
|
|
|
|
|
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
if (isBackCalc) {
|
2024-05-06 16:03:29 +08:00
|
|
|
|
salarySobBackItems = salaryAcctConfig.getSalarySobBackItems();
|
2022-12-02 17:35:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
// 薪资账套的薪资项目副本所用的公式id
|
|
|
|
|
|
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
formulaIds.addAll(salarySobBackItems.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList()));
|
2022-08-24 10:31:42 +08:00
|
|
|
|
// 查询公式详情
|
|
|
|
|
|
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
|
|
|
|
|
// 查询薪资账套的薪资项目副本所关联的薪资项目
|
|
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
Set<Long> backCalcItemIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId);
|
|
|
|
|
|
salaryItemIds.addAll(backCalcItemIds);
|
2022-08-24 10:31:42 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
// 转换成聚合dto
|
|
|
|
|
|
SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS,
|
2023-02-27 17:51:26 +08:00
|
|
|
|
salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems, Collections.emptyList());
|
2022-03-23 18:41:38 +08:00
|
|
|
|
return salarySobItemAggregateBO.convert2AggregateDTO();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void save(SalarySobItemSaveParam saveParam) {
|
2022-03-25 10:31:31 +08:00
|
|
|
|
|
|
|
|
|
|
Long salarySobId = saveParam.getSalarySobId();
|
|
|
|
|
|
|
2022-03-25 18:05:07 +08:00
|
|
|
|
// 校验
|
2022-04-18 14:45:12 +08:00
|
|
|
|
validSaveParam(saveParam);
|
2022-03-25 18:05:07 +08:00
|
|
|
|
|
|
|
|
|
|
//保存
|
|
|
|
|
|
saveSobItem(saveParam);
|
|
|
|
|
|
|
2024-01-30 09:58:13 +08:00
|
|
|
|
SalarySobPO salarySob = salarySobBiz.getById(salarySobId);
|
|
|
|
|
|
|
|
|
|
|
|
// 记录日志
|
|
|
|
|
|
LoggerContext<SalarySobPO> loggerContext = new LoggerContext<>();
|
|
|
|
|
|
loggerContext.setUser(user);
|
|
|
|
|
|
loggerContext.setTargetId("" + salarySob.getId());
|
|
|
|
|
|
loggerContext.setTargetName(salarySob.getName());
|
2024-02-22 09:43:47 +08:00
|
|
|
|
loggerContext.setOperateType(OperateTypeEnum.ADD.getValue());
|
2024-02-04 15:10:35 +08:00
|
|
|
|
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "编辑薪资账套薪资项目"));
|
|
|
|
|
|
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "编辑薪资账套薪资项目"));
|
2024-01-30 09:58:13 +08:00
|
|
|
|
SalaryElogConfig.salarySobLoggerTemplate.write(loggerContext);
|
2022-03-25 18:05:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 校验
|
|
|
|
|
|
*/
|
2022-04-18 14:45:12 +08:00
|
|
|
|
private void validSaveParam(SalarySobItemSaveParam saveParam) {
|
|
|
|
|
|
|
|
|
|
|
|
ValidUtil.doValidator(saveParam);
|
|
|
|
|
|
|
2022-06-21 11:38:55 +08:00
|
|
|
|
//账套存在
|
2022-04-18 14:45:12 +08:00
|
|
|
|
Long salarySobId = saveParam.getSalarySobId();
|
2022-03-25 10:31:31 +08:00
|
|
|
|
SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId);
|
2022-03-23 18:41:38 +08:00
|
|
|
|
if (Objects.isNull(salarySobPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
|
|
|
|
|
|
}
|
2022-03-25 18:05:07 +08:00
|
|
|
|
|
2022-06-21 11:38:55 +08:00
|
|
|
|
//员工信息字段不可重复
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobEmpFieldParam> empFields = saveParam.getEmpFields();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
if (CollectionUtils.isNotEmpty(empFields)) {
|
|
|
|
|
|
int count = (int) SalaryEntityUtil.properties(empFields, SalarySobItemSaveParam.SalarySobEmpFieldParam::getFieldId).stream().distinct().count();
|
|
|
|
|
|
if (count < empFields.size()) {
|
2022-06-21 11:38:55 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "分类名称重复!"));
|
|
|
|
|
|
}
|
2023-02-09 15:33:35 +08:00
|
|
|
|
} else {
|
2022-06-21 11:38:55 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "员工信息不能为空!"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//分类名称唯一
|
2022-06-17 17:22:48 +08:00
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemGroupParam> itemGroups = saveParam.getItemGroups();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
if (CollectionUtils.isNotEmpty(itemGroups)) {
|
|
|
|
|
|
int count = (int) SalaryEntityUtil.properties(itemGroups, SalarySobItemSaveParam.SalarySobItemGroupParam::getName).stream().distinct().count();
|
|
|
|
|
|
if (count < itemGroups.size()) {
|
2022-06-17 17:22:48 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "分类名称重复!"));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-03-25 18:05:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
2022-03-25 18:05:07 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 保存项目信息
|
2022-04-27 18:48:41 +08:00
|
|
|
|
*
|
2022-03-25 18:05:07 +08:00
|
|
|
|
* @param saveParam
|
|
|
|
|
|
*/
|
|
|
|
|
|
private void saveSobItem(SalarySobItemSaveParam saveParam) {
|
2023-02-09 15:33:35 +08:00
|
|
|
|
//分组和薪资项
|
|
|
|
|
|
handleGroupAndItem(saveParam);
|
2024-03-07 10:21:06 +08:00
|
|
|
|
|
|
|
|
|
|
//处理人员信息字段
|
|
|
|
|
|
handleEmpField(saveParam);
|
2023-02-09 15:33:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void handleGroupAndItem(SalarySobItemSaveParam saveParam) {
|
2022-03-25 18:05:07 +08:00
|
|
|
|
long employeeId = (long) user.getUID();
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
Long salarySobId = saveParam.getSalarySobId();
|
2022-03-23 18:41:38 +08:00
|
|
|
|
|
2023-02-09 15:33:35 +08:00
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemGroupParam> itemGroups = saveParam.getItemGroups();
|
|
|
|
|
|
List<Long> newGroupIds = SalaryEntityUtil.properties(itemGroups, SalarySobItemSaveParam.SalarySobItemGroupParam::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salarySobId);
|
|
|
|
|
|
List<Long> oldGroupIds = SalaryEntityUtil.properties(salarySobItemGroupPOS, SalarySobItemGroupPO::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemGroupParam> needAddGroup = itemGroups.stream().filter(f -> f.getId() == null).collect(Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemGroupParam> needUpdateGroup = itemGroups.stream().filter(f -> f.getId() != null && oldGroupIds.contains(f.getId())).collect(Collectors.toList());
|
|
|
|
|
|
List<Long> needDeleteGroupIds = oldGroupIds.stream().filter(f -> !newGroupIds.contains(f)).collect(Collectors.toList());
|
2022-03-25 10:31:31 +08:00
|
|
|
|
|
2023-07-24 17:11:19 +08:00
|
|
|
|
// 获取所有薪资项目
|
|
|
|
|
|
List<SalaryItemPO> allSalaryItemList = getSalaryItemService(user).listAll();
|
|
|
|
|
|
Map<Long, SalaryItemPO> salaryItemsMap = SalaryEntityUtil.convert2Map(allSalaryItemList, SalaryItemPO::getId);
|
|
|
|
|
|
|
2022-03-25 18:05:07 +08:00
|
|
|
|
//先保存项目分类获,取分类id
|
|
|
|
|
|
Collection<SalarySobItemPO> salarySobItems = new ArrayList<>();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemGroupParam itemGroupParam : needAddGroup) {
|
2022-05-10 17:26:58 +08:00
|
|
|
|
Long salarySobItemGroupId = IdGenerator.generate();
|
2024-05-07 15:25:43 +08:00
|
|
|
|
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();
|
2022-03-25 18:05:07 +08:00
|
|
|
|
//保存分类
|
2022-03-25 10:31:31 +08:00
|
|
|
|
salarySobItemGroupBiz.insert(salarySobItemGroupPO);
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
|
|
|
|
|
|
2022-03-25 10:31:31 +08:00
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemParam itemParam : itemGroupParam.getItems()) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap);
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().salarySobId(salarySobId).salaryItemId(itemParam.getSalaryItemId()).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()).build();
|
2024-05-06 16:03:29 +08:00
|
|
|
|
salarySobItems.add(salarySobItemPO);
|
2022-03-25 10:31:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
2023-02-09 15:33:35 +08:00
|
|
|
|
//更新分组
|
|
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemGroupParam itemGroupParam : needUpdateGroup) {
|
|
|
|
|
|
Long groupId = itemGroupParam.getId();
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemGroupPO salarySobItemGroupPO = SalarySobItemGroupPO.builder().id(groupId).name(itemGroupParam.getName()).sortedIndex(itemGroupParam.getSortedIndex()).itemHide(itemGroupParam.getItemHide()).build();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
//更新分类
|
|
|
|
|
|
salarySobItemGroupBiz.update(salarySobItemGroupPO);
|
|
|
|
|
|
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> items = itemGroupParam.getItems();
|
|
|
|
|
|
List<Long> itemIds = SalaryEntityUtil.properties(items, SalarySobItemSaveParam.SalarySobItemParam::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemPO> oldItems = salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, Collections.singleton(groupId));
|
|
|
|
|
|
List<Long> oldItemIds = SalaryEntityUtil.properties(oldItems, SalarySobItemPO::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> needAddItems = items.stream().filter(f -> f.getId() == null).collect(Collectors.toList());
|
|
|
|
|
|
List<Long> needDeleteItemIds = oldItems.stream().filter(f -> !itemIds.contains(f.getId())).map(SalarySobItemPO::getId).collect(Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> needUpdateItems = items.stream().filter(f -> f.getId() != null && oldItemIds.contains(f.getId())).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
//新增
|
|
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needAddItems) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap);
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().salarySobId(salarySobId).salaryItemId(itemParam.getSalaryItemId()).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()).build();
|
2024-05-06 16:03:29 +08:00
|
|
|
|
salarySobItems.add(salarySobItemPO);
|
2023-02-09 15:33:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
//更新
|
|
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needUpdateItems) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap);
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().id(itemParam.getId()).salaryItemId(itemParam.getSalaryItemId()).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()).build();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO);
|
2024-05-06 16:03:29 +08:00
|
|
|
|
|
2023-02-09 15:33:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//删除
|
|
|
|
|
|
salarySobItemMapper.deleteByIds(needDeleteItemIds);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//删除分组
|
|
|
|
|
|
salarySobItemGroupBiz.deleteByIds(needDeleteGroupIds);
|
|
|
|
|
|
salarySobItemMapper.deleteByGroupIds(needDeleteGroupIds);
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-01 09:58:55 +08:00
|
|
|
|
//未分类
|
2023-02-09 15:33:35 +08:00
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> items = saveParam.getItems();
|
|
|
|
|
|
List<Long> itemIds = SalaryEntityUtil.properties(items, SalarySobItemSaveParam.SalarySobItemParam::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemPO> oldItems = salarySobItemMapper.listBySalarySobIdAndGroupId(salarySobId, Collections.singleton(0L));
|
|
|
|
|
|
List<Long> oldItemIds = SalaryEntityUtil.properties(oldItems, SalarySobItemPO::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> needAddItems = items.stream().filter(f -> f.getId() == null).collect(Collectors.toList());
|
|
|
|
|
|
List<Long> needDeleteItemIds = oldItems.stream().filter(f -> !itemIds.contains(f.getId())).map(SalarySobItemPO::getId).collect(Collectors.toList());
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobItemParam> needUpdateItems = items.stream().filter(f -> f.getId() != null && oldItemIds.contains(f.getId())).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needAddItems) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap);
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().salarySobId(salarySobId).salaryItemId(itemParam.getSalaryItemId()).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()).build();
|
2024-05-06 16:03:29 +08:00
|
|
|
|
salarySobItems.add(salarySobItemPO);
|
2022-03-25 10:31:31 +08:00
|
|
|
|
}
|
2022-03-24 19:42:03 +08:00
|
|
|
|
|
2023-02-09 15:33:35 +08:00
|
|
|
|
for (SalarySobItemSaveParam.SalarySobItemParam itemParam : needUpdateItems) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = checkItemExists(itemParam.getSalaryItemId(), salaryItemsMap);
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobItemPO salarySobItemPO = SalarySobItemPO.builder().id(itemParam.getId()).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()).build();
|
2024-05-06 16:03:29 +08:00
|
|
|
|
getSalarySobItemMapper().updateIgnoreNull(salarySobItemPO);
|
2023-02-09 15:33:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(needDeleteItemIds)) {
|
|
|
|
|
|
getSalarySobItemMapper().deleteByIds(needDeleteItemIds);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
// 保存薪资账套的薪资项目副本
|
2022-03-25 18:05:07 +08:00
|
|
|
|
batchSave(salarySobItems);
|
2023-04-07 15:14:07 +08:00
|
|
|
|
|
2024-03-07 10:21:06 +08:00
|
|
|
|
// 删除原薪资项目是否显示
|
|
|
|
|
|
deleteItemShowBySalarySobIds(Collections.singleton(salarySobId));
|
2022-03-23 18:41:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 17:11:19 +08:00
|
|
|
|
private SalaryItemPO checkItemExists(Long salaryItemId, Map<Long, SalaryItemPO> salaryItemsMap) {
|
|
|
|
|
|
SalaryItemPO salaryItemPO = salaryItemsMap.get(salaryItemId);
|
2023-10-09 15:35:20 +08:00
|
|
|
|
if (salaryItemPO == null) {
|
|
|
|
|
|
log.error("薪资项目:{}不存在", salaryItemId);
|
2023-07-24 17:11:19 +08:00
|
|
|
|
throw new SalaryRunTimeException("保存失败!存在薪资项目不存在或已被删除");
|
|
|
|
|
|
}
|
|
|
|
|
|
return salaryItemPO;
|
|
|
|
|
|
}
|
2023-04-07 15:14:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
2023-02-09 15:33:35 +08:00
|
|
|
|
private void handleEmpField(SalarySobItemSaveParam saveParam) {
|
|
|
|
|
|
long employeeId = (long) user.getUID();
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
Long salarySobId = saveParam.getSalarySobId();
|
|
|
|
|
|
|
|
|
|
|
|
List<SalarySobItemSaveParam.SalarySobEmpFieldParam> empFields = saveParam.getEmpFields();
|
|
|
|
|
|
List<Long> newEmpIds = SalaryEntityUtil.properties(empFields, SalarySobItemSaveParam.SalarySobEmpFieldParam::getId, Collectors.toList());
|
|
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobId);
|
|
|
|
|
|
List<Long> needDeleteEmpIds = salarySobEmpFieldPOS.stream().filter(f -> !newEmpIds.contains(f.getId())).map(SalarySobEmpFieldPO::getId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
// 保存薪资账套的员工信息字段
|
|
|
|
|
|
Collection<SalarySobEmpFieldPO> needInsertSalarySobEmpFields = new ArrayList<>();
|
|
|
|
|
|
for (SalarySobItemSaveParam.SalarySobEmpFieldParam salarySobEmpFieldParam : empFields) {
|
|
|
|
|
|
if (salarySobEmpFieldParam.getId() == null) {
|
2024-05-07 15:25:43 +08:00
|
|
|
|
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();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
needInsertSalarySobEmpFields.add(salarySobEmpFieldPO);
|
|
|
|
|
|
} else {
|
2024-05-07 15:25:43 +08:00
|
|
|
|
SalarySobEmpFieldPO salarySobEmpFieldPO = SalarySobEmpFieldPO.builder().id(salarySobEmpFieldParam.getId()).sortedIndex(salarySobEmpFieldParam.getSortedIndex()).updateTime(now).build();
|
2023-02-09 15:33:35 +08:00
|
|
|
|
getSalarySobEmpFieldMapper().updateIgnoreNull(salarySobEmpFieldPO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
getSalarySobEmpFieldService(user).batchSave(needInsertSalarySobEmpFields);
|
|
|
|
|
|
//删除字段
|
|
|
|
|
|
getSalarySobEmpFieldService(user).deleteByIds(needDeleteEmpIds);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-23 18:41:38 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void batchSave(Collection<SalarySobItemPO> salarySobItemPOS) {
|
2022-04-27 18:48:41 +08:00
|
|
|
|
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
2022-04-14 20:46:17 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-01-12 14:09:04 +08:00
|
|
|
|
//前端可能传重复数据,去重
|
2024-05-07 15:25:43 +08:00
|
|
|
|
List<SalarySobItemPO> list = new ArrayList<>(salarySobItemPOS.stream().collect(Collectors.toMap(SalarySobItemPO::getSalaryItemId, Function.identity(), (oldValue, newValue) -> oldValue)).values());
|
2023-01-12 14:09:04 +08:00
|
|
|
|
salarySobItemMapper.batchInsert(list);
|
2022-03-23 18:41:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteBySalarySobIds(Collection<Long> salarySobIds) {
|
|
|
|
|
|
salarySobItemMapper.deleteBySalarySobIds(salarySobIds);
|
|
|
|
|
|
}
|
2022-08-24 10:31:42 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteItemShowBySalarySobIds(Collection<Long> salarySobIds) {
|
|
|
|
|
|
salarySobItemMapper.deleteItemShowBySalarySobId(salarySobIds);
|
|
|
|
|
|
}
|
2023-07-24 17:11:19 +08:00
|
|
|
|
|
2023-08-31 09:24:41 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void update(SalarySobItemPO po) {
|
|
|
|
|
|
salarySobItemMapper.update(po);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 17:11:19 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public SalarySobItemFormDTO getSalaryItemForm(SalarySobItemPO param) {
|
|
|
|
|
|
SalarySobItemFormDTO salarySobItemFormDTO = new SalarySobItemFormDTO();
|
|
|
|
|
|
salarySobItemFormDTO.setCanEdit(1);
|
|
|
|
|
|
// 默认可以编辑
|
2023-10-09 10:43:43 +08:00
|
|
|
|
if (param.getSalarySobId() != null && param.getSalaryItemId() != null) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
// 查询薪资账套
|
|
|
|
|
|
SalarySobPO salarySobPO = salarySobBiz.getById(param.getSalarySobId());
|
|
|
|
|
|
if (Objects.isNull(salarySobPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资项目
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemMapper().listSome(SalarySobItemPO.builder().salarySobId(param.getSalarySobId()).salaryItemId(param.getSalaryItemId()).build());
|
2023-10-09 10:43:43 +08:00
|
|
|
|
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
throw new SalaryRunTimeException("账套中薪资项目不存在");
|
|
|
|
|
|
}
|
|
|
|
|
|
SalarySobItemPO salarySobItemPO = salarySobItemPOS.get(0);
|
|
|
|
|
|
SalaryItemPO salaryItemPO = getSalaryItemService(user).getById(salarySobItemPO.getSalaryItemId());
|
2023-10-09 10:43:43 +08:00
|
|
|
|
if (salaryItemPO == null) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
throw new SalaryRunTimeException("薪资项目不存在或已被删除");
|
|
|
|
|
|
}
|
|
|
|
|
|
//获取系统值
|
|
|
|
|
|
List<SalarySobDefaultItemPO> salarySobDefaultItemPOS = getSalarySobDefaultItemMapper().listAll();
|
|
|
|
|
|
salarySobDefaultItemPOS = salarySobDefaultItemPOS.stream().filter(po -> po.getSysSalaryItemId() != 0).collect(Collectors.toList());
|
|
|
|
|
|
Map<Long, Integer> longIntegerMap = SalaryEntityUtil.convert2Map(salarySobDefaultItemPOS, SalarySobDefaultItemPO::getSysSalaryItemId, SalarySobDefaultItemPO::getCanDelete);
|
2023-10-09 10:43:43 +08:00
|
|
|
|
if (salaryItemPO.getSysSalaryItemId() != null) {
|
2023-07-24 17:11:19 +08:00
|
|
|
|
salarySobItemPO.setCanDelete(longIntegerMap.getOrDefault(salaryItemPO.getSysSalaryItemId(), 1));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取薪资项目公式
|
|
|
|
|
|
List<ExpressFormula> 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();
|
2023-10-09 10:43:43 +08:00
|
|
|
|
Integer valueType = salarySobItemPO.getValueType() == null ? salaryItemPO.getValueType() : salarySobItemPO.getValueType();
|
2024-05-07 15:25:43 +08:00
|
|
|
|
salarySobItemFormDTO.setId(salarySobItemPO.getId()).setName(salaryItemPO.getName()).setItemHide(Integer.valueOf(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);
|
2023-07-24 17:11:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
return salarySobItemFormDTO;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 20:09:10 +08:00
|
|
|
|
}
|