weaver-hrm-salary/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java

215 lines
9.6 KiB
Java
Raw Normal View History

2022-03-23 18:41:38 +08:00
package com.engine.salary.entity.salarysob.bo;
2022-04-13 14:18:00 +08:00
import com.engine.salary.annotation.SalaryFormulaVar;
2022-04-14 20:46:17 +08:00
import com.engine.salary.entity.salaryformula.ExpressFormula;
2022-04-13 14:18:00 +08:00
import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
2022-03-24 16:59:52 +08:00
import com.engine.salary.entity.salaryitem.bo.SalaryItemBO;
2022-03-23 18:41:38 +08:00
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.*;
2022-03-23 18:41:38 +08:00
import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemGroupPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
2022-03-23 18:41:38 +08:00
import com.engine.salary.util.SalaryEntityUtil;
2022-04-13 14:18:00 +08:00
import com.engine.salary.util.SalaryI18nUtil;
2022-03-23 18:41:38 +08:00
import com.google.common.collect.Lists;
2022-04-13 14:18:00 +08:00
import com.google.common.collect.Maps;
2022-03-23 18:41:38 +08:00
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
2022-03-24 16:59:52 +08:00
import org.apache.commons.lang3.math.NumberUtils;
2022-06-23 17:15:39 +08:00
import weaver.general.BaseBean;
2022-03-23 18:41:38 +08:00
2022-04-13 14:18:00 +08:00
import java.lang.reflect.Field;
2022-03-23 18:41:38 +08:00
import java.util.*;
import java.util.stream.Collectors;
/**
* 将薪资账套的员工信息薪资项目副本薪资项目分类聚合在一起
* <p>Copyright: Copyright (c) 2022</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@AllArgsConstructor
public class SalarySobItemAggregateBO {
/**
* 薪资账套
*/
private SalarySobPO salarySob;
/**
* 薪资账套的员工信息
*/
private List<SalarySobEmpFieldPO> salarySobEmpFields;
/**
* 薪资账套的薪资项目分类
*/
private List<SalarySobItemGroupPO> salarySobItemGroups;
/**
* 薪资账套的薪资项目副本
*/
private List<SalarySobItemPO> salarySobItems;
/**
* 薪资账套的薪资项目副本所用公式详情
*/
private List<ExpressFormula> expressFormulas;
/**
* 薪资账套的薪资项目副本所关联的薪资项目
*/
private List<SalaryItemPO> salaryItems;
2022-06-23 17:15:39 +08:00
private final BaseBean baseBean = new BaseBean();
//强制开启账套的公式配置
private final Boolean openFormulaForcedEditing = "true".equals(baseBean.getPropValue("hrmSalary", "openFormulaForcedEditing"));
2022-03-23 18:41:38 +08:00
/**
* 转换成聚合dto
*
* @return
*/
public SalarySobItemAggregateDTO convert2AggregateDTO() {
List<SalarySobItemDTO> itemsWithoutGroup = Lists.newArrayList();
// 薪资账套的薪资项目分类po转换成dto
List<SalarySobItemGroupDTO> salarySobItemGroupDTOS = salarySobItemGroups.stream()
.map(e -> SalarySobItemGroupDTO.builder()
.id(e.getId())
.salarySobId(e.getSalarySobId())
.name(e.getName())
.sortedIndex(e.getSortedIndex())
2022-08-24 10:31:42 +08:00
.itemHide(e.getItemHide())
2022-03-23 18:41:38 +08:00
.build())
.collect(Collectors.toList());
Map<Long, SalarySobItemGroupDTO> salarySobItemGroupDTOMap = SalaryEntityUtil.convert2Map(salarySobItemGroupDTOS, SalarySobItemGroupDTO::getId);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map<Long, List<SalarySobItemPO>> salarySobItemMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId);
Map<Long, String> formulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
2022-08-24 10:31:42 +08:00
2022-03-23 18:41:38 +08:00
// 薪资账套的薪资项目副本po转换成dto
salarySobItemMap.forEach((k, v) -> {
List<SalarySobItemDTO> items = Lists.newArrayList();
for (int i = 0; i < v.size(); i++) {
SalarySobItemPO salarySobItemPO = v.get(i);
SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId());
items.add(SalarySobItemDTO.builder()
.id(salarySobItemPO.getId())
.salarySobId(salarySob.getId())
.salaryItemGroupId(k)
.salaryItemId(salaryItemPO.getId())
2022-05-07 15:20:39 +08:00
.dateType(salaryItemPO.getDataType())
2022-03-23 18:41:38 +08:00
.name(salaryItemPO.getName())
2022-08-24 10:31:42 +08:00
.itemHide(salarySobItemPO.getItemHide())
2022-03-23 18:41:38 +08:00
.formulaId(salarySobItemPO.getFormulaId())
.formulaContent(formulaMap.getOrDefault(salarySobItemPO.getFormulaId(), ""))
2022-03-24 16:59:52 +08:00
.taxDeclarationColumn(SalaryItemBO.buildTaxDeclarationColumn(salaryItemPO.getCode()))
2022-06-14 11:13:31 +08:00
.sortedIndex(salarySobItemPO.getSortedIndex())
2022-06-23 17:15:39 +08:00
.canEdit(openFormulaForcedEditing || Objects.equals(salaryItemPO.getCanEdit(), 1))
2022-05-18 14:34:06 +08:00
.canDelete(salarySobItemPO.getCanDelete() == null || Objects.equals(salarySobItemPO.getCanDelete(), 1))
2022-03-23 18:41:38 +08:00
.build());
}
if (!salarySobItemGroupDTOMap.containsKey(k)) {
itemsWithoutGroup.addAll(items);
} else {
SalarySobItemGroupDTO salarySobItemGroupDTO = salarySobItemGroupDTOMap.get(k);
salarySobItemGroupDTO.setItems(sortItem(items));
}
});
// 薪资账套的员工信息字段po转换成dto
List<SalarySobEmpFieldDTO> salarySobEmpFieldDTOS = buildEmpField(salarySobEmpFields);
List<SalarySobItemIncomeCategoryDTO> incomeCategories = Lists.newArrayList();
// List<Integer> incomeCategoryValues = JsonUtil.parseList(salarySob.getIncomeCategory(), Integer.class);
Integer incomeCategory = salarySob.getIncomeCategory();
List<Integer> incomeCategoryValues = Lists.newArrayList(incomeCategory);
for (Integer incomeCategoryValue : incomeCategoryValues) {
IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(incomeCategoryValue);
SalarySobItemIncomeCategoryDTO salarySobItemIncomeCategoryDTO = new SalarySobItemIncomeCategoryDTO()
.setId(incomeCategoryValue.longValue())
.setName(Optional.ofNullable(incomeCategoryEnum)
.map(e -> SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel()))
.orElse(StringUtils.EMPTY))
.setItemGroups(sortItemGroup(salarySobItemGroupDTOS))
.setItems(sortItem(itemsWithoutGroup));
incomeCategories.add(salarySobItemIncomeCategoryDTO);
}
2022-03-23 18:41:38 +08:00
return SalarySobItemAggregateDTO.builder()
.salarySobId(salarySob.getId())
.empFields(salarySobEmpFieldDTOS)
.items(sortItem(itemsWithoutGroup))
.itemGroups(sortItemGroup(salarySobItemGroupDTOMap.values()))
.incomeCategories(incomeCategories)
2022-03-23 18:41:38 +08:00
.build();
}
/**
* 薪资账套的员工信息字段po转换成dto
*
* @param salarySobEmpFields 薪资账套的员工信息字段
* @return
*/
private List<SalarySobEmpFieldDTO> buildEmpField(Collection<SalarySobEmpFieldPO> salarySobEmpFields) {
2022-03-24 16:59:52 +08:00
if (CollectionUtils.isEmpty(salarySobEmpFields)) {
return Collections.emptyList();
}
2022-04-13 14:18:00 +08:00
Field[] declaredFields = SalaryFormulaEmployeeDTO.class.getDeclaredFields();
Map<String, String> empFieldMap = Maps.newHashMapWithExpectedSize(declaredFields.length);
for (Field declaredField : declaredFields) {
if (!declaredField.isAnnotationPresent(SalaryFormulaVar.class)) {
continue;
}
SalaryFormulaVar annotation = declaredField.getAnnotation(SalaryFormulaVar.class);
empFieldMap.put(declaredField.getName(), SalaryI18nUtil.getI18nLabel(annotation.labelId(), annotation.defaultLabel()));
}
2022-03-24 16:59:52 +08:00
return salarySobEmpFields.stream()
.map(e -> SalarySobEmpFieldDTO.builder()
.id(e.getId())
.salarySobId(e.getSalarySobId())
.fieldId(e.getFieldCode())
2022-04-13 14:18:00 +08:00
.fieldName(empFieldMap.getOrDefault(e.getFieldCode(), ""))
2022-03-24 16:59:52 +08:00
.sortedIndex(e.getSortedIndex())
.canDelete(Objects.equals(e.getCanDelete(), NumberUtils.INTEGER_ONE))
.build())
.collect(Collectors.toList());
2022-03-23 18:41:38 +08:00
}
/**
* 薪资账套的薪资项目按照sortedIndex排序
*
* @param items 待排序的薪资账套的薪资项目
* @return
*/
private List<SalarySobItemDTO> sortItem(Collection<SalarySobItemDTO> items) {
if (CollectionUtils.isEmpty(items)) {
return Collections.emptyList();
}
return items.stream().sorted(Comparator.comparingInt(SalarySobItemDTO::getSortedIndex)).collect(Collectors.toList());
}
/**
* 薪资账套的薪资项目分类按照sortedIndex排序
*
* @param itemGroups 待排序的薪资账套的薪资项目分类
* @return
*/
private List<SalarySobItemGroupDTO> sortItemGroup(Collection<SalarySobItemGroupDTO> itemGroups) {
if (CollectionUtils.isEmpty(itemGroups)) {
return Collections.emptyList();
}
2022-06-17 17:22:48 +08:00
return itemGroups.stream().map(group -> {
if (group != null && CollectionUtils.isEmpty(group.getItems())) {
group.setItems(new ArrayList<>());
}
return group;
}).sorted(Comparator.comparingInt(SalarySobItemGroupDTO::getSortedIndex)).collect(Collectors.toList());
2022-03-23 18:41:38 +08:00
}
}