package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SalarySobBiz; import com.engine.salary.biz.SalarySobItemBiz; import com.engine.salary.biz.SalarySobItemGroupBiz; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.param.SalarySobItemSaveParam; import com.engine.salary.entity.salarysob.po.*; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.*; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.valid.ValidUtil; import dm.jdbc.util.IdGenerator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; import java.util.*; import java.util.stream.Collectors; /** * 薪资账套的薪资项目副本 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ public class SalarySobItemServiceImpl extends Service implements SalarySobItemService { private SalarySobItemBiz salarySobItemMapper = new SalarySobItemBiz(); private SalarySobBiz salarySobBiz = new SalarySobBiz(); private SalarySobItemGroupBiz salarySobItemGroupBiz = new SalarySobItemGroupBiz(); private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) { return (SalarySobEmpFieldService) ServiceUtil.getService(SalarySobEmpFieldServiceImpl.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 LoggerTemplate salarySobLoggerTemplate; @Override public List list() { return salarySobItemMapper.listAll(); } @Override public List listBySalarySobId(Long salarySobId) { return salarySobItemMapper.listSome(SalarySobItemPO.builder().salarySobId(salarySobId).build()); } @Override public List listBySalarySobIdWithHideItem(Long salarySobId) { return salarySobItemMapper.listBySalarySobIdWithHideItem(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).listBySalarySobIdWithItemHide(salarySobId); // 查询薪资账套的薪资项目副本 List salarySobItemPOS =listBySalarySobIdWithHideItem(salarySobId); // 回算薪资项目 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); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 转换成聚合dto SalarySobItemAggregateBO salarySobItemAggregateBO = new SalarySobItemAggregateBO(salarySobPO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, expressFormulas, salaryItemPOS, salarySobBackItems); return salarySobItemAggregateBO.convert2AggregateDTO(); } @Override public SalarySobItemAggregateDTO getAggregateWithItemHideBySalarySobId(Long salarySobId, boolean isBackCalc) { // 查询薪资账套 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).listBySalarySobIdWithItemHide(salarySobId); if(isBackCalc){ // 回算分类 } // 获取关闭显示的分类 List hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build()); // 过滤关闭显示的薪资项目分类 salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList()); // 获取薪资项目分类ID List salarySobItemGroupIds = salarySobItemGroupPOS.stream().map(SalarySobItemGroupPO::getId).collect(Collectors.toList()); // 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目) List salarySobItemPOS = listBySalarySobIdAndGroupId(salarySobId,salarySobItemGroupIds); // 获取关闭显示的薪资项目 List hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build()); salarySobItemPOS = salarySobItemPOS.stream().filter(group -> !(hideItemIDs.contains(group.getSalaryItemId()))).collect(Collectors.toList()); // 回算薪资项目 List salarySobBackItems = Collections.emptyList(); if(isBackCalc){ salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId); } // 薪资账套的薪资项目副本所用的公式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); return salarySobItemAggregateBO.convert2AggregateDTO(); } @Override public void save(SalarySobItemSaveParam saveParam) { Long salarySobId = saveParam.getSalarySobId(); // 校验 validSaveParam(saveParam); //清除原数据 cleanOldData(salarySobId); //保存 saveSobItem(saveParam); //todo 记录日志 // LoggerContext loggerContext = new LoggerContext<>(); // loggerContext.setTargetId("" + salarySobPO.getId()); // loggerContext.setTargetName(salarySobPO.getName()); // loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue()); // loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(98613, "编辑薪资账套薪资项目")); // loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(98613, "编辑薪资账套薪资项目")); // 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 salarySobId */ private void cleanOldData(Long salarySobId) { // 删除薪资账套的员工信息字段 getSalarySobEmpFieldService(user).deleteBySalarySobIds(Collections.singleton(salarySobId)); // 删除薪资账套的薪资项目副本 deleteBySalarySobIds(Collections.singleton(salarySobId)); // 删除薪资账套的薪资项目分类 getSalarySobItemGroupService(user).deleteBySalarySobIds(Collections.singleton(salarySobId)); // 删除薪资项目是否显示 deleteItemShowBySalarySobIds(Collections.singleton(salarySobId)); } /** * 保存项目信息 * * @param saveParam */ private void saveSobItem(SalarySobItemSaveParam saveParam) { long employeeId = (long) user.getUID(); Date now = new Date(); Long salarySobId = saveParam.getSalarySobId(); // 保存薪资账套的员工信息字段 Collection needInsertSalarySobEmpFields = new ArrayList<>(); for (SalarySobItemSaveParam.SalarySobEmpFieldParam salarySobEmpFieldParam : saveParam.getEmpFields()) { 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); } getSalarySobEmpFieldService(user).batchSave(needInsertSalarySobEmpFields); //先保存项目分类获,取分类id Collection salarySobItems = new ArrayList<>(); int sortedIndex = 0; for (SalarySobItemSaveParam.SalarySobItemGroupParam itemGroupParam : saveParam.getItemGroups()) { Long salarySobItemGroupId = IdGenerator.generate(); SalarySobItemGroupPO salarySobItemGroupPO = SalarySobItemGroupPO.builder() .id(salarySobItemGroupId) .salarySobId(salarySobId) .name(itemGroupParam.getName()) .sortedIndex(sortedIndex++) .description(StringUtils.EMPTY) .creator(employeeId) .createTime(now) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); //保存分类 salarySobItemGroupBiz.insert(salarySobItemGroupPO); // 保存薪资项目分类 字段显隐 Long salarySobGroupItemShowId = IdGenerator.generate(); SalarySobItemHidePO salarySobGroupItemHidePO = SalarySobItemHidePO.builder() .id(salarySobGroupItemShowId) .salarySobId(salarySobId) .salaryItemId(salarySobItemGroupId) .isGroup(1) .itemHide(itemGroupParam.getItemHide()) .creator(employeeId) .createTime(now) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); if(itemGroupParam.getItemHide()==null){ salarySobGroupItemHidePO.setItemHide(Long.valueOf(0)); } salarySobItemMapper.InsertItemShow(salarySobGroupItemHidePO); // //获取分类id // List salarySobItemGroupPOS = salarySobItemGroupBiz.listSome(SalarySobItemGroupPO.builder().salarySobId(salarySobId).name(itemGroupParam.getName()).build()); // Long salarySobItemGroupId = salarySobItemGroupPOS.get(0).getId(); for (SalarySobItemSaveParam.SalarySobItemParam itemParam : itemGroupParam.getItems()) { 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)) .build(); salarySobItems.add(salarySobItemPO); // 保存薪资项目是否展示 Long salarySobItemShowId = IdGenerator.generate(); SalarySobItemHidePO salarySobItemHidePO = SalarySobItemHidePO.builder() .id(salarySobItemShowId) .salarySobId(salarySobId) .salaryItemId(itemParam.getSalaryItemId()) .isGroup(0) .itemHide(itemParam.getItemHide()) .creator(employeeId) .createTime(now) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); salarySobItemMapper.InsertItemShow(salarySobItemHidePO); } } for (SalarySobItemSaveParam.SalarySobItemParam itemParam : saveParam.getItems()) { 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)) .build(); salarySobItems.add(salarySobItemPO); // 保存未分类薪资项目是否展示 Long salarySobItemShowId = IdGenerator.generate(); SalarySobItemHidePO salarySobItemHidePO = SalarySobItemHidePO.builder() .id(salarySobItemShowId) .salarySobId(salarySobId) .salaryItemId(itemParam.getSalaryItemId()) .isGroup(0) .itemHide(itemParam.getItemHide()) .creator(employeeId) .createTime(now) .updateTime(now) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); salarySobItemMapper.InsertItemShow(salarySobItemHidePO); } // 保存薪资账套的薪资项目副本 batchSave(salarySobItems); } @Override public void batchSave(Collection salarySobItemPOS) { if (CollectionUtils.isEmpty(salarySobItemPOS)) { return; } salarySobItemMapper.batchInsert(salarySobItemPOS); } @Override public void deleteBySalarySobIds(Collection salarySobIds) { salarySobItemMapper.deleteBySalarySobIds(salarySobIds); } @Override public void deleteItemShowBySalarySobIds(Collection salarySobIds) { salarySobItemMapper.deleteItemShowBySalarySobId(salarySobIds); } }