package com.engine.salary.service.impl; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SalarySobBiz; import com.engine.salary.biz.SalaryTemplateBiz; import com.engine.salary.entity.salaryBill.bo.SalaryTemplateBO; import com.engine.salary.entity.salaryBill.dto.SalaryTemplateListDTO; import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemListDTO; import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO; import com.engine.salary.entity.salaryBill.param.SalaryTemplateCopyParam; import com.engine.salary.entity.salaryBill.param.SalaryTemplateDefaultUseParam; import com.engine.salary.entity.salaryBill.param.SalaryTemplateQueryParam; import com.engine.salary.entity.salaryBill.param.SalaryTemplateSaveParam; import com.engine.salary.entity.salaryBill.po.SalaryBillItemNamePO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemGroupDTO; import com.engine.salary.entity.salarysob.po.SalarySobItemHidePO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.*; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.mzlion.core.utils.BeanUtils; import com.engine.salary.util.db.IdGenerator; import org.apache.commons.collections.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; /** * @Description: 工资单模板 * @Author: wangxiangzhong * @Date: 2021-12-08 14:44 */ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplateService { private SalaryTemplateBiz mapper = new SalaryTemplateBiz(); private SalarySobBiz salarySobMapper = new SalarySobBiz(); private SalarySobItemService getSalarySobItemService(User user) { return ServiceUtil.getService(SalarySobItemServiceImpl.class, user); } private SalarySobService getSalarySobService(User user) { return ServiceUtil.getService(SalarySobServiceImpl.class, user); } private TaxAgentService getTaxAgentService(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } private SalarySobItemHideService getSalarySobItemHideService(User user) { return ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user); } private SalaryBillItemNameService getSalaryBillItemNameService(User user) { return ServiceUtil.getService(SalaryBillItemNameServiceImpl.class, user); } @Override public SalaryTemplatePO getById(Long id) { return mapper.getById(id); } // @Override // public Map listPage(SalaryTemplateQueryParam queryParam) { // mapper.list(queryParam); // return page; // } @Override public String defaultUse(SalaryTemplateDefaultUseParam defaultUseParamy) { // 校验参数 SalaryTemplateDefaultUseParam.checkParam(defaultUseParamy); SalaryTemplatePO salaryTemplate = getById(defaultUseParamy.getId()); if (salaryTemplate == null) { throw new SalaryRunTimeException("工资单模板不存在"); } // 选中默认使用 SalaryTemplatePO po = new SalaryTemplatePO(); po.setDeleteType(0); po.setSalarySobId(salaryTemplate.getSalarySobId()); po.setUseType(SalaryTemplateWhetherEnum.FALSE.getValue()); mapper.updateBySalarySobId(po); SalaryTemplatePO salaryTemplateNew = new SalaryTemplatePO(); BeanUtils.copyProperties(salaryTemplate, salaryTemplateNew); salaryTemplateNew.setUseType(SalaryTemplateWhetherEnum.TRUE.getValue()); mapper.updateById(salaryTemplateNew); // 记录日志 // SalaryLoggerUtil.recordUpdateSingleLog(salaryTemplateLoggerTemplate, // salaryTemplate.getId(), // salaryTemplateNew.getName(), // SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100534, "设为默认使用"), // SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100534, "设为默认使用"), // salaryTemplate, // salaryTemplateNew); return ""; } @Override public String save(SalaryTemplateSaveParam saveParam) { // 校验参数 SalaryTemplateSaveParam.checkParam(saveParam); SalaryTemplatePO po = new SalaryTemplatePO(); po.setDeleteType(0); po.setName(saveParam.getName()); List salaryTemplates = mapper.listSome(po); if (CollectionUtils.isNotEmpty(salaryTemplates)) { throw new SalaryRunTimeException("工资单模板名称不允许重复"); } SalarySobPO salarySobPO = new SalarySobPO(); po.setDeleteType(0); po.setId(saveParam.getSalarySobId()); List salarySobs = salarySobMapper.listSome(salarySobPO); if (CollectionUtils.isEmpty(salarySobs)) { throw new SalaryRunTimeException("薪资账套不存在"); } // todo 薪资项目设置检查校验 // 保存 SalaryTemplatePO salaryTemplate = SalaryTemplateBO.convertToPO(saveParam, (long) user.getUID()); // salaryTemplate.setSendEmailId(saveParam.getSendEmail()); salaryTemplate.setEmailStatus(saveParam.getEmailStatus() ? 1 : 0); salaryTemplate.setMsgStatus(saveParam.getMsgStatus() ? 1 : 0); salaryTemplate.setSmsStatus(saveParam.getSmsStatus() != null && saveParam.getSmsStatus() ? 1 : 0); salaryTemplate.setSmsSetting(saveParam.getSmsSetting() == null ? "" : JSON.toJSONString(saveParam.getSmsSetting())); salaryTemplate.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplate.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus() ? 1 : 0); salaryTemplate.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus() ? 1 : 0); salaryTemplate.setAutoSendCycleType(saveParam.getAutoSendCycleType()); mapper.insert(salaryTemplate); // 存储工资单项目自定义名称信息 saveParam.getSalaryBillItemNameSetting().stream().forEach(set -> set.setSalaryTemplateId(salaryTemplate.getId())); getSalaryBillItemNameService(user).saveItemShowName(saveParam.getSalaryBillItemNameSetting()); // 记录日志 // SalaryLoggerUtil.recordAddSingleLog(salaryTemplateLoggerTemplate, // salaryTemplate.getId(), // salaryTemplate.getName(), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100538, "新增工资单模板"), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100538, "新增工资单模板"), // salaryTemplate); return ""; } @Override public String update(SalaryTemplateSaveParam saveParam) { // 校验参数 SalaryTemplateSaveParam.checkParam(saveParam); // 校验是否可以编辑 if (saveParam.getId() == null) { throw new SalaryRunTimeException("参数错误"); } SalaryTemplatePO salaryTemplate = getById(saveParam.getId()); if (salaryTemplate == null) { throw new SalaryRunTimeException("工资单模板不存在"); } // 工资单模板编辑时不允许调整账套 if (!salaryTemplate.getSalarySobId().equals(saveParam.getSalarySobId())) { throw new SalaryRunTimeException("工资单模板编辑时不允许调整账套"); } SalaryTemplatePO po = new SalaryTemplatePO(); po.setDeleteType(0); po.setName(saveParam.getName()); List salaryTemplates = mapper.listSome(po); boolean nameExist = salaryTemplates.stream().anyMatch(e -> !Objects.equals(e.getId(), saveParam.getId())); if (nameExist) { throw new SalaryRunTimeException("工资单模板名称不允许重复"); } SalarySobPO salarySobPO = new SalarySobPO(); po.setDeleteType(0); po.setId(saveParam.getSalarySobId()); List salarySobs = salarySobMapper.listSome(salarySobPO); if (CollectionUtils.isEmpty(salarySobs)) { throw new SalaryRunTimeException("薪资账套不存在"); } // 更新工资单 SalaryTemplatePO salaryTemplateNew = new SalaryTemplatePO(); BeanUtils.copyProperties(salaryTemplate, salaryTemplateNew); BeanUtils.copyProperties(saveParam, salaryTemplateNew); salaryTemplateNew.setUpdateTime(new Date()); salaryTemplateNew.setSendEmailId(0L); salaryTemplateNew.setEmailStatus(saveParam.getEmailStatus() ? 1 : 0); salaryTemplateNew.setMsgStatus(saveParam.getMsgStatus() ? 1 : 0); salaryTemplateNew.setSmsStatus(saveParam.getSmsStatus() != null && saveParam.getSmsStatus() ? 1 : 0); salaryTemplateNew.setSmsSetting(saveParam.getSmsSetting() == null ? "" : JSON.toJSONString(saveParam.getSmsSetting())); salaryTemplateNew.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplateNew.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus() ? 1 : 0); salaryTemplateNew.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus() ? 1 : 0); salaryTemplateNew.setAutoSendStatus(saveParam.getAutoSendStatus() ? 1 : 0); salaryTemplateNew.setAutoSendCycleType(saveParam.getAutoSendCycleType()); salaryTemplateNew.setAckFeedbackStatus(saveParam.getAckFeedbackStatus() ? 1 : 0); salaryTemplateNew.setAutoAckDays(saveParam.getAutoAckDays()); salaryTemplateNew.setFeedbackUrl(saveParam.getFeedbackUrl()); // todo 薪资项目设置检查校验 salaryTemplateNew.setSalaryItemSetting(saveParam.getSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getSalaryItemSetting()) : ""); salaryTemplateNew.setReplenishSalaryItemSetting(saveParam.getReplenishSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getReplenishSalaryItemSetting()) : ""); mapper.updateById(salaryTemplateNew); // 保存自定义工资单项目名称信息 getSalaryBillItemNameService(user).saveItemShowName(saveParam.getSalaryBillItemNameSetting()); // 模板中没有的薪资项目需要同步删除显示名称表 List billItemNameList = getSalaryBillItemNameService(user).ListByTemplateAndType(SalaryBillItemNamePO.builder().salaryTemplateId(saveParam.getId()).build()); Map> billItemNameMap = SalaryEntityUtil.group2Map(billItemNameList, SalaryBillItemNamePO::getSalaryBillType); List saveItemList = saveParam.getSalaryItemSetting().stream().map(SalaryTemplateSalaryItemSetListDTO::getItems).flatMap(Collection::stream).collect(Collectors.toList()); Set saveItemIdList = SalaryEntityUtil.properties(saveItemList, SalaryTemplateSalaryItemListDTO::getSalaryItemId); // 正常工资单模板中删除的薪资项目 List needDeleteIds = billItemNameMap.getOrDefault(NumberUtils.INTEGER_ZERO, Collections.emptyList()).stream().filter(salaryBillItemNamepo -> !saveItemIdList.contains(salaryBillItemNamepo.getSalaryItemId().toString())) .map(SalaryBillItemNamePO::getId).collect(Collectors.toList()); // 补发工资单模板中删除的薪资项目 List replenishItemList = saveParam.getReplenishSalaryItemSetting().stream().map(SalaryTemplateSalaryItemSetListDTO::getItems).flatMap(Collection::stream).collect(Collectors.toList()); Set saveReplenishItemIdList = SalaryEntityUtil.properties(replenishItemList, SalaryTemplateSalaryItemListDTO::getSalaryItemId); needDeleteIds.addAll(billItemNameMap.getOrDefault(NumberUtils.INTEGER_ONE, Collections.emptyList()).stream().filter(salaryBillItemNamepo -> !saveReplenishItemIdList.contains(salaryBillItemNamepo.getSalaryItemId().toString())) .map(SalaryBillItemNamePO::getId).collect(Collectors.toList())); getSalaryBillItemNameService(user).deleteByIds(needDeleteIds); // 记录日志 // SalaryLoggerUtil.recordUpdateSingleLog(salaryTemplateLoggerTemplate, // salaryTemplate.getId(), // salaryTemplateNew.getName(), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100539, "编辑工资单模板"), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100539, "编辑工资单模板"), // salaryTemplate, // salaryTemplateNew); return ""; } @Override public String copy(SalaryTemplateCopyParam copyParam) { // 校验参数 SalaryTemplateCopyParam.checkParam(copyParam); SalaryTemplatePO salaryTemplate = getById(copyParam.getId()); if (salaryTemplate == null) { throw new SalaryRunTimeException("被复制的工资单不存在"); } List salaryTemplates = mapper.list(SalaryTemplateQueryParam.builder().name(copyParam.getName()).build()); if (CollectionUtils.isNotEmpty(salaryTemplates)) { throw new SalaryRunTimeException("工资单模板名称不允许重复"); } SalaryTemplatePO salaryTemplateNew = new SalaryTemplatePO(); BeanUtils.copyProperties(salaryTemplate, salaryTemplateNew); salaryTemplateNew.setId(null); salaryTemplateNew.setName(copyParam.getName()); salaryTemplateNew.setUseType(SalaryTemplateWhetherEnum.FALSE.getValue()); mapper.insert(salaryTemplateNew); // 复制工资单自定义名称信息 List billItemNamePOList = getSalaryBillItemNameService(user).ListByTemplateAndType(SalaryBillItemNamePO.builder().salaryTemplateId(copyParam.getId()).build()); if (CollectionUtils.isNotEmpty(billItemNamePOList)) { Date now = new Date(); List needInsertList = billItemNamePOList.stream().map(po -> { SalaryBillItemNamePO newSalaryBillItemNamePO = new SalaryBillItemNamePO(); BeanUtils.copyProperties(po, newSalaryBillItemNamePO); newSalaryBillItemNamePO.setId(IdGenerator.generate()); newSalaryBillItemNamePO.setUpdateTime(now); newSalaryBillItemNamePO.setSalaryTemplateId(salaryTemplateNew.getId()); return newSalaryBillItemNamePO; }).collect(Collectors.toList()); getSalaryBillItemNameService(user).batchInsert(needInsertList); } // 记录日志 // SalaryLoggerUtil.recordAddSingleLog(salaryTemplateLoggerTemplate, // salaryTemplateNew.getId(), // salaryTemplateNew.getName(), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100541, "复制工资单模板"), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100541, "复制工资单模板"), // salaryTemplateNew); return ""; } @Override public String delete(Collection ids) { if (CollectionUtils.isEmpty(ids)) { throw new SalaryRunTimeException("参数错误"); } List salaryTemplates = mapper.list(SalaryTemplateQueryParam.builder().ids(ids).build()); if (CollectionUtils.isEmpty(salaryTemplates)) { throw new SalaryRunTimeException("要删除的工资单在不存在或已删除"); } // TODO 正在使用的记录不允许删除 mapper.deleteByIds(ids); // 删除工资单重命名表 getSalaryBillItemNameService(user).deleteByTemplateIds(ids); // 记录日志 // salaryTemplates.forEach(e -> SalaryLoggerUtil.recordDeleteSingleLog(salaryTemplateLoggerTemplate, // e.getId(), // e.getName(), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100542, "删除工资单模板"), // SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 100542, "删除工资单模板")+":" + e.getName(), // e)); return ""; } @Override public List> selectSalarySobList() { List salarySobs = getSalarySobService(user).listByDisable(NumberUtils.INTEGER_ZERO); return salarySobs.stream().map(m -> { Map map = new HashMap<>(2); map.put("id", String.valueOf(m.getId())); map.put("content", m.getName()); return map; }).collect(Collectors.toList()); } @Override public List getSalaryItemSet(Long salarySobId, boolean isReplenish) { SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId); // 处理薪资账套中隐藏的分类和项目 // 获取关闭显示的分类 List hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build()); // 过滤关闭显示的薪资项目分类 List itemGroupDTOS = salarySobItemAggregate.getItemGroups().stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList()); // 获取关闭显示的薪资项目 List hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build()); for (SalarySobItemGroupDTO DTO : itemGroupDTOS) { List items = DTO.getItems(); DTO.setItems(items.stream().filter(item -> !(hideItemIDs.contains(item.getSalaryItemId()))).collect(Collectors.toList())); } itemGroupDTOS = itemGroupDTOS.stream().filter(DTO -> CollectionUtils.isNotEmpty(DTO.getItems())).collect(Collectors.toList()); salarySobItemAggregate.setItemGroups(itemGroupDTOS); if (hideGroupIDs.contains(0L)) { // 隐藏了未分类 salarySobItemAggregate.setItems(Collections.emptyList()); } else { salarySobItemAggregate.setItems(salarySobItemAggregate.getItems().stream().filter(item -> !(hideItemIDs.contains(item.getSalaryItemId()))).collect(Collectors.toList())); } return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish); } @Override public List getSalaryItemSetContainHide(Long salarySobId, Long salaryTemplateId, boolean isReplenish) { SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId); // 获取工资单薪资项目展示名信息 List billItemNameList = Collections.emptyList(); if (salaryTemplateId != null) { billItemNameList = getSalaryBillItemNameService(user).ListByTemplateAndType( SalaryBillItemNamePO.builder().salaryTemplateId(salaryTemplateId) .salaryBillType(isReplenish ? 1 : 0) .build()); } Map itemShowNameMap = SalaryEntityUtil.convert2Map(billItemNameList, SalaryBillItemNamePO::getSalaryItemId, SalaryBillItemNamePO::getSalaryItemShowName); List salaryTemplateSalaryItemSetListDTOS = SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish); salaryTemplateSalaryItemSetListDTOS.stream() .filter(data -> !StringUtils.equals(data.getGroupId(), "111111111111111111")) .forEach(data -> { data.getItems().forEach(item -> { Long salaryItemId = Long.valueOf(item.getSalaryItemId()); if (itemShowNameMap.containsKey(salaryItemId)) { item.setSalaryItemShowName(itemShowNameMap.get(salaryItemId)); item.setName(itemShowNameMap.get(salaryItemId) + "(" + item.getOriginName() + ")"); } else { item.setSalaryItemShowName(item.getOriginName()); item.setName(item.getOriginName()); } }); }); return salaryTemplateSalaryItemSetListDTOS; } @Override public List getDefaultTemplates(List salarySobIds) { return mapper.listDefaultTemplates(salarySobIds); } @Override public List getBySalarySobIds(Collection ids) { return mapper.listSome(SalaryTemplatePO.builder().salarySobIds(ids).build()); } @Override public PageInfo listPage(SalaryTemplateQueryParam queryParam) { List salaryTemplateDTOList = Collections.emptyList(); // 分权 long currentEmployeeId = user.getUID(); Boolean needAuth = getTaxAgentService(user).isNeedAuth(currentEmployeeId); if (needAuth) { List salarySobPOS = getSalarySobService(user).listByDisable(NumberUtils.INTEGER_ZERO); Set salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(salarySobIds)) { // 查询 salaryTemplateDTOList = mapper.listDTO(SalaryTemplatePO.builder() .salarySobId(queryParam.getSalarySobId()) .name(queryParam.getName()) .salarySobIds(salarySobIds).build()); } else { return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class); } } else { // 查询 salaryTemplateDTOList = mapper.listDTO(SalaryTemplatePO.builder().salarySobId(queryParam.getSalarySobId()).name(queryParam.getName()).build()); } // 分页参数 PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class); return page; } @Override public List getAutoSendTemplate() { return mapper.listSome(SalaryTemplatePO.builder().autoSendStatus(NumberUtils.INTEGER_ONE).useType(NumberUtils.INTEGER_ONE).deleteType(NumberUtils.INTEGER_ZERO).build()); } @Override public List listNeedAckDefaultTemplate() { return mapper.listSome(SalaryTemplatePO.builder().useType(NumberUtils.INTEGER_ONE).ackFeedbackStatus(NumberUtils.INTEGER_ONE).build()); } }