package com.engine.salary.entity.salarysob.bo;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.SalarySobEmpFieldDTO;
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.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.*;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.google.common.collect.Lists;
import com.weaver.excel.formula.api.entity.ExpressFormula;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* 将薪资账套的员工信息、薪资项目副本、薪资项目分类聚合在一起
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
@AllArgsConstructor
public class SalarySobItemAggregateBO {
/**
* 薪资账套
*/
private SalarySobPO salarySob;
/**
* 薪资账套的员工信息
*/
private List salarySobEmpFields;
/**
* 薪资账套的薪资项目分类
*/
private List salarySobItemGroups;
/**
* 薪资账套的薪资项目副本
*/
private List salarySobItems;
/**
* 薪资账套的薪资项目副本所用公式详情
*/
private List expressFormulas;
/**
* 薪资账套的薪资项目副本所关联的薪资项目
*/
private List salaryItems;
/**
* 转换成聚合dto
*
* @return
*/
public SalarySobItemAggregateDTO convert2AggregateDTO() {
List itemsWithoutGroup = Lists.newArrayList();
// 薪资账套的薪资项目分类po转换成dto
List salarySobItemGroupDTOS = salarySobItemGroups.stream()
.map(e -> SalarySobItemGroupDTO.builder()
.id(e.getId())
.salarySobId(e.getSalarySobId())
.name(e.getName())
.sortedIndex(e.getSortedIndex())
.build())
.collect(Collectors.toList());
Map salarySobItemGroupDTOMap = SalaryEntityUtil.convert2Map(salarySobItemGroupDTOS, SalarySobItemGroupDTO::getId);
Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map> salarySobItemMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId);
Map formulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
// 薪资账套的薪资项目副本po转换成dto
salarySobItemMap.forEach((k, v) -> {
List items = Lists.newArrayList();
for (int i = 0; i < v.size(); i++) {
SalarySobItemPO salarySobItemPO = v.get(i);
SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId());
SalaryItemTypeEnum salaryItemTypeEnum = SalaryItemTypeEnum.parseByValue(salaryItemPO.getItemType());
SalaryValueTypeEnum salaryValueTypeEnum = SalaryValueTypeEnum.parseByValue(salaryItemPO.getValueType());
SalaryDataSourceEnum salaryDataSourceEnum = SalaryDataSourceEnum.parseByValue(salaryItemPO.getDatasource());
items.add(SalarySobItemDTO.builder()
.id(salarySobItemPO.getId())
.salarySobId(salarySob.getId())
.salaryItemGroupId(k)
.salaryItemId(salaryItemPO.getId())
.name(salaryItemPO.getName())
.systemType(SalarySystemTypeEnum.parseByValue(salaryItemPO.getSystemType()))
.useDefault(salaryItemPO.getUseDefault())
.category(SalaryItemCategoryEnum.parseByValue(salaryItemPO.getCategory()))
.itemTypeId(salaryItemTypeEnum)
.itemType(Optional.ofNullable(salaryItemTypeEnum)
.map(e -> SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel()))
.orElse(StringUtils.EMPTY))
.valueType(salaryValueTypeEnum)
.dataSourceId(salaryDataSourceEnum)
.dataSource(Optional.ofNullable(salaryDataSourceEnum)
.map(e -> SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel()))
.orElse(StringUtils.EMPTY))
.formulaId(salarySobItemPO.getFormulaId())
.formulaContent(formulaMap.getOrDefault(salarySobItemPO.getFormulaId(), ""))
.sortedIndex(i)
.canEdit(salaryItemPO.getCanEdit() == 1)
.canDelete(salaryItemPO.getCanDelete() == 1)
.build());
}
if (!salarySobItemGroupDTOMap.containsKey(k)) {
itemsWithoutGroup.addAll(items);
} else {
SalarySobItemGroupDTO salarySobItemGroupDTO = salarySobItemGroupDTOMap.get(k);
salarySobItemGroupDTO.setItems(sortItem(items));
}
});
// 薪资账套的员工信息字段po转换成dto
List salarySobEmpFieldDTOS = buildEmpField(salarySobEmpFields);
return SalarySobItemAggregateDTO.builder()
.salarySobId(salarySob.getId())
.empFields(salarySobEmpFieldDTOS)
.items(sortItem(itemsWithoutGroup))
.itemGroups(sortItemGroup(salarySobItemGroupDTOMap.values()))
.build();
}
/**
* 薪资账套的员工信息字段po转换成dto
*
* @param salarySobEmpFields 薪资账套的员工信息字段
* @return
*/
private List buildEmpField(Collection salarySobEmpFields) {
// if (CollectionUtils.isEmpty(salarySobEmpFields)) {
// return Collections.emptyList();
// }
// Field[] declaredFields = SalaryFormulaEmployeeDTO.class.getDeclaredFields();
// Map 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()));
// }
// return salarySobEmpFields.stream()
// .map(e -> SalarySobEmpFieldDTO.builder()
// .id(e.getId())
// .salarySobId(e.getSalarySobId())
// .fieldId(e.getFieldCode())
// .fieldName(empFieldMap.getOrDefault(e.getFieldCode(), ""))
// .sortedIndex(e.getSortedIndex())
// .canDelete(Objects.equals(e.getCanDelete(), NumberUtils.INTEGER_ONE))
// .build())
// .collect(Collectors.toList());
return null;
}
/**
* 薪资账套的薪资项目按照sortedIndex排序
*
* @param items 待排序的薪资账套的薪资项目
* @return
*/
private List sortItem(Collection 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 sortItemGroup(Collection itemGroups) {
if (CollectionUtils.isEmpty(itemGroups)) {
return Collections.emptyList();
}
return itemGroups.stream().sorted(Comparator.comparingInt(SalarySobItemGroupDTO::getSortedIndex)).collect(Collectors.toList());
}
}