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

442 lines
23 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

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

package com.engine.salary.service.impl;
import 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<String, Object> 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<SalaryTemplatePO> salaryTemplates = mapper.listSome(po);
if (CollectionUtils.isNotEmpty(salaryTemplates)) {
throw new SalaryRunTimeException("工资单模板名称不允许重复");
}
SalarySobPO salarySobPO = new SalarySobPO();
po.setDeleteType(0);
po.setId(saveParam.getSalarySobId());
List<SalarySobPO> 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<SalaryTemplatePO> 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<SalarySobPO> 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<SalaryBillItemNamePO> billItemNameList = getSalaryBillItemNameService(user).ListByTemplateAndType(SalaryBillItemNamePO.builder().salaryTemplateId(saveParam.getId()).build());
Map<Integer, List<SalaryBillItemNamePO>> billItemNameMap = SalaryEntityUtil.group2Map(billItemNameList, SalaryBillItemNamePO::getSalaryBillType);
List<SalaryTemplateSalaryItemListDTO> saveItemList = saveParam.getSalaryItemSetting().stream().map(SalaryTemplateSalaryItemSetListDTO::getItems).flatMap(Collection::stream).collect(Collectors.toList());
Set<String> saveItemIdList = SalaryEntityUtil.properties(saveItemList, SalaryTemplateSalaryItemListDTO::getSalaryItemId);
// 正常工资单模板中删除的薪资项目
List<Long> needDeleteIds = billItemNameMap.getOrDefault(NumberUtils.INTEGER_ZERO, Collections.emptyList()).stream().filter(salaryBillItemNamepo -> !saveItemIdList.contains(salaryBillItemNamepo.getSalaryItemId().toString()))
.map(SalaryBillItemNamePO::getId).collect(Collectors.toList());
// 补发工资单模板中删除的薪资项目
List<SalaryTemplateSalaryItemListDTO> replenishItemList = saveParam.getReplenishSalaryItemSetting().stream().map(SalaryTemplateSalaryItemSetListDTO::getItems).flatMap(Collection::stream).collect(Collectors.toList());
Set<String> 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<SalaryTemplateListDTO> 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<SalaryBillItemNamePO> billItemNamePOList = getSalaryBillItemNameService(user).ListByTemplateAndType(SalaryBillItemNamePO.builder().salaryTemplateId(copyParam.getId()).build());
if (CollectionUtils.isNotEmpty(billItemNamePOList)) {
Date now = new Date();
List<SalaryBillItemNamePO> 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<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
throw new SalaryRunTimeException("参数错误");
}
List<SalaryTemplateListDTO> 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<Map<String, Object>> selectSalarySobList() {
List<SalarySobPO> salarySobs = getSalarySobService(user).listByDisable(NumberUtils.INTEGER_ZERO);
return salarySobs.stream().map(m -> {
Map<String, Object> map = new HashMap<>(2);
map.put("id", String.valueOf(m.getId()));
map.put("content", m.getName());
return map;
}).collect(Collectors.toList());
}
@Override
public List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId, boolean isReplenish) {
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
// 处理薪资账套中隐藏的分类和项目
// 获取关闭显示的分类
List<Long> hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build());
// 过滤关闭显示的薪资项目分类
List<SalarySobItemGroupDTO> itemGroupDTOS = salarySobItemAggregate.getItemGroups().stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList());
// 获取关闭显示的薪资项目
List<Long> hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build());
for (SalarySobItemGroupDTO DTO : itemGroupDTOS) {
List<SalarySobItemDTO> 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<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSetContainHide(Long salarySobId, Long salaryTemplateId, boolean isReplenish) {
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
// 获取工资单薪资项目展示名信息
List<SalaryBillItemNamePO> billItemNameList = Collections.emptyList();
if (salaryTemplateId != null) {
billItemNameList = getSalaryBillItemNameService(user).ListByTemplateAndType(
SalaryBillItemNamePO.builder().salaryTemplateId(salaryTemplateId)
.salaryBillType(isReplenish ? 1 : 0)
.build());
}
Map<Long, String> itemShowNameMap = SalaryEntityUtil.convert2Map(billItemNameList, SalaryBillItemNamePO::getSalaryItemId, SalaryBillItemNamePO::getSalaryItemShowName);
List<SalaryTemplateSalaryItemSetListDTO> 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<SalaryTemplatePO> getDefaultTemplates(List<Long> salarySobIds) {
return mapper.listDefaultTemplates(salarySobIds);
}
@Override
public List<SalaryTemplatePO> getBySalarySobIds(Collection<Long> ids) {
return mapper.listSome(SalaryTemplatePO.builder().salarySobIds(ids).build());
}
@Override
public PageInfo<SalaryTemplateListDTO> listPage(SalaryTemplateQueryParam queryParam) {
List<SalaryTemplateListDTO> salaryTemplateDTOList = Collections.emptyList();
// 分权
long currentEmployeeId = user.getUID();
Boolean needAuth = getTaxAgentService(user).isNeedAuth(currentEmployeeId);
if (needAuth) {
List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByDisable(NumberUtils.INTEGER_ZERO);
Set<Long> 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<SalaryTemplateListDTO> page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class);
return page;
}
@Override
public List<SalaryTemplatePO> getAutoSendTemplate() {
return mapper.listSome(SalaryTemplatePO.builder().autoSendStatus(NumberUtils.INTEGER_ONE).useType(NumberUtils.INTEGER_ONE).deleteType(NumberUtils.INTEGER_ZERO).build());
}
@Override
public List<SalaryTemplatePO> listNeedAckDefaultTemplate() {
return mapper.listSome(SalaryTemplatePO.builder().useType(NumberUtils.INTEGER_ONE).ackFeedbackStatus(NumberUtils.INTEGER_ONE).build());
}
}