package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.salaryitem.bo.SysSalaryItemBO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO;
import com.engine.salary.entity.salarysob.bo.SalarySobBO;
import com.engine.salary.entity.salarysob.bo.SalarySobBackItemBO;
import com.engine.salary.entity.salarysob.dto.SalarySobBasicFormDTO;
import com.engine.salary.entity.salarysob.dto.SalarySobListDTO;
import com.engine.salary.entity.salarysob.param.SalarySobBasicSaveParam;
import com.engine.salary.entity.salarysob.param.SalarySobDisableParam;
import com.engine.salary.entity.salarysob.param.SalarySobDuplicateParam;
import com.engine.salary.entity.salarysob.param.SalarySobListQueryParam;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobDefaultBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.enums.sicategory.DeleteTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.*;
import com.engine.salary.service.impl.*;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.SalarySobUtil;
import com.engine.salary.util.page.PageInfo;
import dm.jdbc.util.IdGenerator;
import org.apache.commons.collections4.CollectionUtils;
import weaver.hrm.User;
import java.util.*;
import java.util.stream.Collectors;
/**
* 薪资账套
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
public class SalarySobWrapper extends Service {
private SalarySobService getSalarySobService(User user) {
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SysSalaryItemService getSysSalaryItemService(User user) {
return ServiceUtil.getService(SysSalaryItemServiceImpl.class, user);
}
/**
* 薪资账套列表
*
* @param queryParam 列表查询参数
* @return
*/
public PageInfo listPage(SalarySobListQueryParam queryParam) {
// 处理历史数据,将薪资账套中将关联人员状态转换为List
SalarySobUtil.handleEmployeeStatusHistory();
// 查询薪资账套
PageInfo page = getSalarySobService(user).listPageByParam(queryParam);
// 薪资账套po转换成薪资账套列表dto
List taxAgentPOS = getTaxAgentService(user).listAll();
Map taxAgentIdTONameMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgentPO::getId, TaxAgentPO::getName);
List salarySobListDTOS = SalarySobBO.convert2ListDTO(page.getList(),taxAgentIdTONameMap);
PageInfo dtoPage = new PageInfo<>(salarySobListDTOS, SalarySobListDTO.class);
dtoPage.setTotal(page.getTotal());
dtoPage.setPageNum(page.getPageNum());
dtoPage.setPageSize(page.getPageSize());
// 处理历史数据,为薪资账套默认添加回算薪资项目
handleSalarySobBackItemHistory(queryParam);
// 转换成前端所需的数据格式
return dtoPage;
}
private void handleSalarySobBackItemHistory(SalarySobListQueryParam queryParam) {
queryParam.setPageSize(100000);
List list = getSalarySobService(user).listPageByParam(queryParam).getList();
if(list != null && list.size()>0){
List salarySobIds = list.stream().map(SalarySobPO::getId).collect(Collectors.toList());
Long count = getSalarySobBackItemService(user).getCountBySalarySobIdIn(salarySobIds);
if(count.equals(0L)){
// 薪资账套的默认的回算薪资项目
Set SalarySobBackItemIds = SalaryEntityUtil.properties(SalarySobBackItemBO.getDefault(), SalarySobDefaultBackItemPO::getSysSalaryItemId);
// 获取薪资项目中是否已经添加回算薪资项目
List salaryItemPOS = getSalaryItemService(user).listBySysSalaryItemIds(SalarySobBackItemIds);
Set salaryBackItemSysIds = SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getSysSalaryItemId);
// 需要添加进薪资项目中的回算薪资项目
List needAddSalaryBackItemIds = SalarySobBackItemIds.stream().filter(salarySobBackItemId -> !salaryBackItemSysIds.contains(salarySobBackItemId)).collect(Collectors.toList());
List needAddSysSalaryBackItemPOS = getSysSalaryItemService(user).listByIds(needAddSalaryBackItemIds);
// 需要保存的回算薪资项目
List needInsertSalaryItemPOS = SysSalaryItemBO.convert2SalaryItemPO(needAddSysSalaryBackItemPOS, (long) user.getUID());
if (CollectionUtils.isNotEmpty(needInsertSalaryItemPOS)) {
getSalaryItemService(user).batchSave(needInsertSalaryItemPOS);
}
// 没有回算薪资项目数据,给所有薪资账套添加默认回算薪资项目
List salarySobBackItems = new ArrayList<>();
// 获取默认添加后的回算薪资项目
List salaryBackItemPOS = getSalaryItemService(user).listBySysSalaryItemIds(SalarySobBackItemIds);
for(Long id : salarySobIds){
for (SalarySobDefaultBackItemPO salarySobDefaultBackItemPO : SalarySobBackItemBO.getDefault()) {
Date now = new Date();
Map sysSalaryItemMap = SalaryEntityUtil.convert2Map(salaryBackItemPOS, SalaryItemPO::getSysSalaryItemId);
SalaryItemPO salaryItemPO = sysSalaryItemMap.get(salarySobDefaultBackItemPO.getSysSalaryItemId());
SalarySobBackItemPO salarySobBackItemPO = SalarySobBackItemPO.builder()
.id(IdGenerator.generate())
.salarySobId(id)
.salaryItemId(salaryItemPO.getId())
.salaryItemCode(salaryItemPO.getCode())
.dataType(salaryItemPO.getDataType())
.roundingMode(salaryItemPO.getRoundingMode())
.pattern(salaryItemPO.getPattern())
.valueType(salaryItemPO.getValueType())
.formulaId(salarySobDefaultBackItemPO.getFormulaId())
.backCalcType(salarySobDefaultBackItemPO.getBackCalcType())
.creator((long)user.getUID())
.createTime(now)
.updateTime(now)
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).build();
salarySobBackItems.add(salarySobBackItemPO);
}
}
// 入库
getSalarySobBackItemService(user).batchInsert(salarySobBackItems);
}
}
}
/**
* 薪资账套详情
*
* @param id 薪资账套id
* @return
*/
public Map getForm(Long id) {
long employeeId = user.getUID();
Map data = new HashMap<>(16);
// 是否可以编辑(分权后,总管理员不可以编辑管理员新建的账套)
boolean canEdit = Objects.isNull(id) || canEdit(id, employeeId);
// 薪资账套基础设置详情(目前核算人员范围的值固定为"1")
SalarySobBasicFormDTO basicForm = new SalarySobBasicFormDTO()
.setEmployeeRange("1")
.setTaxableItems(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())
.setCanEdit(canEdit);
if (!Objects.isNull(id)) {
// 查询薪资账套
SalarySobPO salarySobPO = getSalarySobService(user).getById(id);
if (Objects.isNull(salarySobPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
}
// 薪资装套po转换成薪资账套详情dto
basicForm = SalarySobBO.convert2FormDTO(basicForm,salarySobPO);
}
// 转换成前端所需的数据格式
data.put("basicForm", basicForm);
return data;
}
/**
* 保存
*
* @param saveParam 保存参数
* @return
*/
public Long save(SalarySobBasicSaveParam saveParam) {
return getSalarySobService(user).save(saveParam);
}
/**
* 更新薪资账套的基础设置
*
* @param saveParam 更新参数
* @return
*/
public Long update(SalarySobBasicSaveParam saveParam) {
return getSalarySobService(user).update(saveParam);
}
/**
* 启用/禁用薪资账套
*
* @param disableParam 更新参数
*/
public void updateDisable(SalarySobDisableParam disableParam) {
getSalarySobService(user).updateDisable(disableParam);
}
/**
* 删除薪资账套
*
* @param ids 薪资账套的id
*/
public void delete(Collection ids) {
getSalarySobService(user).deleteByIds(ids);
}
/**
* 复制
*
* @param duplicateParam 复制参数
*/
public void duplicate(SalarySobDuplicateParam duplicateParam) {
getSalarySobService(user).duplicate(duplicateParam);
}
/**
* 判断是否可以编辑薪资账套
*
* @param id
* @param employeeId
* @return
*/
public boolean canEdit(Long id, Long employeeId) {
// 查询薪资账套
SalarySobPO salarySobPO = getSalarySobService(user).getById(id);
if (Objects.isNull(salarySobPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
}
// 判断是否开启了分权
Boolean openDevolution = getTaxAgentService(user).isOpenDevolution();
if (!openDevolution) {
return true;
}
Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgentsAsAdmin(employeeId);
Set taxAgentIds = SalaryEntityUtil.properties(taxAgentPOS, TaxAgentPO::getId);
return taxAgentIds.contains(salarySobPO.getTaxAgentId())||Objects.isNull(salarySobPO.getTaxAgentId());
}
}