package com.engine.salary.report.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper;
import com.engine.salary.report.common.constant.SalaryConstant;
import com.engine.salary.report.entity.bo.SalaryStatisticsEmployeeBO;
import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeDetailResultDTO;
import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO;
import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam;
import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam;
import com.engine.salary.report.service.SalaryStatisticsEmployeeService;
import com.engine.salary.service.*;
import com.engine.salary.service.impl.*;
import com.engine.salary.util.SalaryAssert;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.hrm.User;
import java.util.*;
import java.util.stream.Collectors;
/**
* 薪酬统计员工明细
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class SalaryStatisticsEmployeeServiceImpl extends Service implements SalaryStatisticsEmployeeService {
private SalaryAcctEmployeeMapper getSalaryAcctEmployeeMapper() {
return MapperProxyFactory.getProxy(SalaryAcctEmployeeMapper.class);
}
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
}
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SalarySobService getSalarySobService(User user) {
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
}
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
}
// private ExtEmployeeMapper extEmployeeMapper;
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryEmployeeService getSalaryEmployeeService(User user) {
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
}
@Override
public PageInfo listPage(SalaryStatisticsEmployeeQueryParam queryParam) {
List list = Collections.emptyList();
PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, SalaryStatisticsEmployeeListDTO.class);
// 1.分权处理, 首先获取个税扣缴义务人参数
Collection taxAgentViews = getTaxAgentService(user).listAllTaxAgents((long) user.getUID());
List taxAgentIds = Objects.isNull(taxAgentViews) ? Lists.newArrayList() : taxAgentViews.stream().map(TaxAgentPO::getId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(taxAgentIds)) {
return page;
}
// 2.年月参数处理,注意:薪资所属月居然是用字符串存储的,无法通过sql between处理
Set salaryMonths = SalaryStatisticsEmployeeBO.getSalaryMonths(queryParam.getYear(), queryParam.getSalaryMonth())
.stream()
.map(SalaryDateUtil::dateStrToLocalYearMonth)
.collect(Collectors.toSet());
// 查询薪资核算人员
List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listByTaxAgentAndSalaryMonth(taxAgentIds, salaryMonths);
if (CollectionUtils.isEmpty(salaryAcctEmployeeList)) {
return page;
}
// if (queryParam.getEmployeeType() != null) {
// salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(s -> queryParam.getEmployeeType().getValue().equals(s.getEmployeeType())).collect(Collectors.toList());
// }
// // 外部人员id
// Set extEmployeeIds = Sets.newHashSet();
// 内部人员id
Set innerEmployeeIds = Sets.newHashSet();
for (SalaryAcctEmployeePO sae : salaryAcctEmployeeList) {
// if (EmployeeTypeEnum.EXT_EMPLOYEE.getValue().equals(sae.getEmployeeType())) {
// extEmployeeIds.add(sae.getEmployeeId());
// } else if (EmployeeTypeEnum.ORGANIZATION.getValue().equals(sae.getEmployeeType())) {
// innerEmployeeIds.add(sae.getEmployeeId());
// }
innerEmployeeIds.add(sae.getEmployeeId());
}
// 3.关键字搜索参数
if (StringUtils.isNotEmpty(queryParam.getKeyword())) {
// if (CollectionUtils.isNotEmpty(extEmployeeIds)) {
// // 查询外部人员
// List extEmployeeList = new LambdaQueryChainWrapper<>(extEmployeeMapper)
// .eq(ExtEmployeePO::getTenantKey, tenantKey)
// .eq(ExtEmployeePO::getDeleteType, 0)
// .list();
// Set finalExtEmployeeIds = extEmployeeIds;
// extEmployeeIds = extEmployeeList.stream()
// .filter(e -> finalExtEmployeeIds.contains(e.getId()) && (e.getUsername().contains(queryParam.getKeyword()) || (StringUtils.isNotEmpty(e.getCardNum()) && e.getCardNum().contains(queryParam.getKeyword()))))
// .map(ExtEmployeePO::getId)
// .collect(Collectors.toSet());
// }
if (CollectionUtils.isNotEmpty(innerEmployeeIds)) {
List salaryEmployees = getSalaryEmployeeService(user).listAll();
Set finalInnerEmployeeIds = innerEmployeeIds;
innerEmployeeIds = salaryEmployees.stream()
.filter(e -> finalInnerEmployeeIds.contains(e.getEmployeeId()) && (e.getUsername().contains(queryParam.getKeyword()) || (StringUtils.isNotEmpty(e.getWorkcode()) && e.getWorkcode().contains(queryParam.getKeyword()))))
.map(DataCollectionEmployee::getEmployeeId)
.collect(Collectors.toSet());
// Map idNoMap = idNoMapByEmployeeIds(finalInnerEmployeeIds);
// for (Long k : idNoMap.keySet()) {
// if (idNoMap.get(k) != null && idNoMap.get(k).contains(queryParam.getKeyword())) {
// innerEmployeeIds.addAll(idNoMap.keySet());
// }
// }
}
}
List innerEmployeeIdList = innerEmployeeIds.stream().sorted(Comparator.comparing(e -> e)).collect(Collectors.toList());
// List extEmployeeIdList = extEmployeeIds.stream().sorted(Comparator.comparing(e -> e)).collect(Collectors.toList());
// 排序,内部员工优先
list = innerEmployeeIdList.stream().map(e -> SalaryStatisticsEmployeeListDTO.builder()
.id(e)
// .employeeType(EmployeeTypeEnum.ORGANIZATION.getValue())
.build()).collect(Collectors.toList());
// list.addAll(extEmployeeIdList.stream().map(e -> SalaryStatisticsEmployeeListDTO.builder()
// .id(e)
// .employeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue())
// .build()).collect(Collectors.toList()));
// 第一页数据显示处理
page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, SalaryStatisticsEmployeeListDTO.class);
List salaryStatisticsEmployeeListDTOs = page.getList();
List employeeIds = salaryStatisticsEmployeeListDTOs.stream().map(SalaryStatisticsEmployeeListDTO::getId).collect(Collectors.toList());
// 查询外部人员
// List extEmployeeList = CollectionUtils.isEmpty(extEmployeeIdList) ? Lists.newArrayList() : new LambdaQueryChainWrapper<>(extEmployeeMapper)
// .eq(ExtEmployeePO::getTenantKey, tenantKey)
// .eq(ExtEmployeePO::getDeleteType, 0)
// .in(ExtEmployeePO::getId, extEmployeeIdList)
// .list();
// Map extEmployeeMap = extEmployeeList.stream().collect(Collectors.toMap(ExtEmployeePO::getId, v -> v));
List simpleEmployeeList = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
Map innerEmployeeMap = simpleEmployeeList.stream().collect(Collectors.toMap(DataCollectionEmployee::getEmployeeId, v -> v));
salaryStatisticsEmployeeListDTOs.forEach(e -> {
DataCollectionEmployee simpleEmployee = innerEmployeeMap.get(e.getId());
e.setName(Objects.isNull(simpleEmployee) ? "" : simpleEmployee.getUsername());
e.setSubCompany(simpleEmployee.getSubcompanyName());
e.setDepartment(simpleEmployee.getDepartmentName());
e.setPosition(simpleEmployee.getJobtitleName());
e.setStatus(UserStatusEnum.getDefaultLabelByValue(Integer.parseInt(simpleEmployee.getStatus())));
e.setJobNum(simpleEmployee.getWorkcode());
e.setIdNo(simpleEmployee.getIdNo());
});
page.setList(salaryStatisticsEmployeeListDTOs);
return page;
}
@Override
public SalaryStatisticsEmployeeDetailResultDTO getDetailSalaryAcctResult(SalaryStatisticsEmployeeDetailQueryParam queryParam) {
SalaryAssert.notNull(queryParam.getEmployeeId(), SalaryI18nUtil.getI18nLabel(163974, "人员id不能为空"));
// 薪资所属月参数,如果已经有年的就取交集
Set salaryMonths = SalaryStatisticsEmployeeBO.getSalaryMonths(queryParam.getYear(), queryParam.getSalaryMonth()).stream().map(SalaryDateUtil::dateStrToLocalYearMonth).collect(Collectors.toSet());
// 1.获取该员工所有核算人员数据
SalaryAcctEmployeePO build = SalaryAcctEmployeePO.builder().employeeId(queryParam.getEmployeeId()).build();
if (CollectionUtils.isNotEmpty(queryParam.getIds())) {
build.setIds(queryParam.getIds());
}
if (CollectionUtils.isNotEmpty(salaryMonths)) {
build.setSalaryMonths(salaryMonths);
}
if (Objects.nonNull(queryParam.getTaxAgentId())) {
build.setTaxAgentId(queryParam.getTaxAgentId());
}
List salaryAcctEmployees = getSalaryAcctEmployeeMapper().listSome(build);
salaryAcctEmployees = salaryAcctEmployees.stream().sorted(Comparator.comparing(SalaryAcctEmployeePO::getSalaryMonth)).collect(Collectors.toList());
Collections.reverse(salaryAcctEmployees);
// 2.获取核算结果数据
List salaryAcctEmployeeIds = salaryAcctEmployees.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// 3.获取薪资项目
Map resultMap = Maps.newHashMap();
salaryAcctResultValues.forEach(sv -> {
resultMap.put(sv.getSalaryItemId() + "", sv.getResultValue());
});
List salaryItemIds = resultMap.keySet().stream().map(Long::valueOf).collect(Collectors.toList());
List salaryItemList = CollectionUtils.isEmpty(salaryItemIds) ? Lists.newArrayList() : getSalaryItemService(user).listByIds(salaryItemIds);
return SalaryStatisticsEmployeeDetailResultDTO.builder()
.salaryAcctEmployeeList(salaryAcctEmployees)
.salaryAcctResultValueList(salaryAcctResultValues)
.salaryItemList(salaryItemList)
.build();
}
@Override
public List