package com.engine.salary.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.engine.core.impl.Service; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeListDTO; import com.engine.salary.entity.taxagent.param.TaxAgentManageRangeQueryParam; import com.engine.salary.entity.taxagent.param.TaxAgentRangeQueryParam; import com.engine.salary.entity.taxagent.param.TaxAgentRangeSaveParam; import com.engine.salary.entity.taxagent.po.TaxAgentManageRangePO; import com.engine.salary.enums.SalaryJobFlagEnum; import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum; import com.engine.salary.enums.salarysob.TargetTypeEnum; import com.engine.salary.enums.taxagent.TaxAgentRangeTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.taxagent.TaxAgentManageRangeMapper; import com.engine.salary.service.TaxAgentEmpService; import com.engine.salary.service.TaxAgentManageRangeService; import com.engine.salary.service.TaxAgentService; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.page.PageInfo; import com.google.common.collect.Lists; import com.weaver.common.async.bean.AsyncBean; import com.weaver.common.async.consumer.anno.method.AsyncListener; import com.weaver.common.cache.tablecache.impl.ComInfoCache; import com.weaver.common.component.table.page.Page; import com.weaver.common.hrm.cache.HrmDepartmentComInfo; import com.weaver.common.hrm.cache.HrmEmployeeComInfo; import com.weaver.common.hrm.cache.HrmPositionComInfo; import com.weaver.common.hrm.domain.employee.HrmStatus; import com.weaver.common.hrm.domain.queue.HrmCommonQueue; import com.weaver.common.hrm.service.employee.HrmCommonHrmStatusService; import com.weaver.datasecurity.interceptor.DSTenantKeyThreadVar; import com.weaver.hrm.salary.common.SalaryEmployee; import com.weaver.hrm.salary.entity.taxagent.bo.TaxAgentBO; import com.weaver.hrm.salary.entity.taxagent.param.*; import com.weaver.hrm.salary.entity.taxagent.po.TaxAgentPO; import com.weaver.hrm.salary.entity.taxagent.po.TaxAgentSubAdminPO; import com.weaver.hrm.salary.exception.SalaryRunTimeException; import com.weaver.hrm.salary.service.*; import com.weaver.hrm.salary.util.SalaryI18nUtil; import com.weaver.hrm.salary.util.SalaryPageUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; /** * 个税扣缴义务人的管理范围 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ @Slf4j public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentManageRangeService { private TaxAgentManageRangeMapper taxAgentManageRangeMapper; private TaxAgentService taxAgentService; private TaxAgentSubAdminService taxAgentSubAdminService; private TaxAgentEmpService taxAgentEmployeeService; private TaxAgentSubAdminEmpService taxAgentSubAdminEmployeeService; private ComInfoCache comInfoCache; private EmployMapper employeeMapper; private ExecutorService taskExecutor; private HrmCommonHrmStatusService hrmCommonHrmStatusService; private List listByTaxAgentIds(List taxAgentIds) { if (CollectionUtils.isEmpty(taxAgentIds)) { return Lists.newArrayList(); } return taxAgentManageRangeMapper.listSome(TaxAgentManageRangePO.builder().rangeType(TaxAgentRangeTypeEnum.TAXAGENT.getValue()).taxAgentIds(taxAgentIds).build()); } @Override public List listSalaryEmployeeByTaxAgentIds(List taxAgentIds) { return listSalaryEmployeeByTaxAgentIds(null, taxAgentIds); } @Override public List listSalaryEmployeeByTaxAgentIds(SalaryEmployeeStatusEnum employeeStatus, List taxAgentIds) { List allTaxAgentManageRanges = this.listByTaxAgentIds(taxAgentIds); return convertTaxAgentEmployee(employeeStatus, taxAgentIds, allTaxAgentManageRanges); } // @Override // public List listBySubAdminIds(Collection taxAgentSubAdminIds) { // if (CollectionUtils.isEmpty(taxAgentSubAdminIds)) { // return Lists.newArrayList(); // } // return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) // .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) // .eq(TaxAgentManageRangePO::getDeleteType, 0) // .eq(TaxAgentManageRangePO::getRangeType, TaxAgentRangeTypeEnum.SUBADMIN.getValue()) // .in(TaxAgentManageRangePO::getTaxAgentSubAdminId, taxAgentSubAdminIds) // .orderByDesc(TaxAgentManageRangePO::getId) // .list(); // } // @Override // public List listSalaryEmployeeBySubAdminIds(List taxAgentIds) { // return listSalaryEmployeeBySubAdminIds(null, taxAgentIds); // } // @Override // public List listSalaryEmployeeBySubAdminIds(SalaryEmployeeStatusEnum employeeStatus, List taxAgentSubAdminIds) { // List allTaxAgentManageRanges = this.listBySubAdminIds(taxAgentSubAdminIds); // List taxAgentIds = allTaxAgentManageRanges.stream().map(TaxAgentManageRangePO::getTaxAgentId).distinct().collect(Collectors.toList()); // // return convertTaxAgentEmployee(employeeStatus, taxAgentIds, allTaxAgentManageRanges); // } private List convertTaxAgentEmployee(SalaryEmployeeStatusEnum employeeStatus, List taxAgentIds, List allTaxAgentManageRanges) { return taxAgentIds.stream().distinct().map(e -> { // 获取范围下的人员 List salaryEmployees = getManageRangeSalaryEmployees(employeeStatus, e, allTaxAgentManageRanges); if (CollectionUtils.isEmpty(salaryEmployees)) { return null; } List taxAgentEmployees = salaryEmployees.stream().map(m -> { TaxAgentManageRangeEmployeeDTO.TaxAgentEmployee taxAgentEmployee = new TaxAgentManageRangeEmployeeDTO.TaxAgentEmployee(); taxAgentEmployee.setEmployeeId(m.getEmployeeId()); taxAgentEmployee.setUsername(m.getUsername()); return taxAgentEmployee; }).collect(Collectors.toList()); return TaxAgentManageRangeEmployeeDTO.builder() .taxAgentId(e) .taxAgentName("") .employeeList(taxAgentEmployees) .build(); }).filter(Objects::nonNull).collect(Collectors.toList()); } /** * 获取范围下的人员 * * @param employeeStatus * @param taxAgentId * @param allTaxAgentManageRanges * @return */ private List getManageRangeSalaryEmployees(SalaryEmployeeStatusEnum employeeStatus, Long taxAgentId, List allTaxAgentManageRanges) { List includeAllTaxAgentManageRanges = allTaxAgentManageRanges.stream().filter(f -> f.getIncludeType().equals(NumberUtils.INTEGER_ONE)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(includeAllTaxAgentManageRanges)) { return Collections.emptyList(); } List excludeAllTaxAgentManageRanges = allTaxAgentManageRanges.stream().filter(f -> f.getIncludeType().equals(NumberUtils.INTEGER_ZERO)).collect(Collectors.toList()); List includeSalaryEmployees = Lists.newArrayList(); List includeTaxAgentManageRanges = includeAllTaxAgentManageRanges.stream().filter(f -> f.getTaxAgentId().equals(taxAgentId)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(includeTaxAgentManageRanges)) { return includeSalaryEmployees; } // 如果需要状态过滤 List personnelStatuss = Lists.newArrayList(); if (employeeStatus != null) { // 查询人员状态 List hrmStatusList = hrmCommonHrmStatusService.list(); if (employeeStatus.equals(SalaryEmployeeStatusEnum.NORMAL)) { personnelStatuss = hrmStatusList.stream().filter(f -> f.getJobflag().equals(SalaryJobFlagEnum.normal.getValue())).map(m -> m.getCodeId() + "").collect(Collectors.toList()); } else if (employeeStatus.equals(SalaryEmployeeStatusEnum.UNAVAILABLE)) { personnelStatuss = hrmStatusList.stream().filter(f -> f.getJobflag().equals(SalaryJobFlagEnum.unavailable.getValue())).map(m -> m.getCodeId() + "").collect(Collectors.toList()); } } // 根据上一步的查询参数查询人员 includeSalaryEmployees = listSalaryEmployeeByManageRange(includeTaxAgentManageRanges, personnelStatuss); if (CollectionUtils.isEmpty(includeSalaryEmployees)) { return includeSalaryEmployees; } // 查询管理范围(从范围中排除) List excludeTaxAgentManageRanges = excludeAllTaxAgentManageRanges.stream().filter(f -> f.getTaxAgentId().equals(taxAgentId)).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(excludeTaxAgentManageRanges)) { // 根据上一步的查询参数查询人员 List excludeSalaryEmployees = listSalaryEmployeeByManageRange(excludeTaxAgentManageRanges, personnelStatuss); // 需要排除的人员范围 Set excludeEmployeeIds = SalaryEntityUtil.properties(excludeSalaryEmployees, DataCollectionEmployee::getEmployeeId); // 过滤人员 includeSalaryEmployees = includeSalaryEmployees.stream() .filter(salaryEmployee -> !excludeEmployeeIds.contains(salaryEmployee.getEmployeeId())) .collect(Collectors.toList()); } return includeSalaryEmployees; } /** * 根据范围加载人员 * * @param taxAgentManageRanges * @return */ private List listSalaryEmployeeByManageRange(List taxAgentManageRanges, List personnelStatuss) { if (CollectionUtils.isEmpty(taxAgentManageRanges)) { return Collections.emptyList(); } List salaryEmployees = employeeMapper.listAll(); List salaryEmployeeList = Lists.newArrayList(); for (TaxAgentManageRangePO manageRange : taxAgentManageRanges) { salaryEmployeeList.addAll(salaryEmployees.stream() .filter(salaryEmployee -> { // 判断人员状态 List hrmStatusList = JsonUtil.parseList(manageRange.getEmployeeStatus(), String.class); // 有状态过滤则取交集 if (CollectionUtils.isNotEmpty(personnelStatuss)) { hrmStatusList = hrmStatusList.stream().filter(personnelStatuss::contains).collect(Collectors.toList()); } if (CollectionUtils.isNotEmpty(hrmStatusList) && !hrmStatusList.contains(salaryEmployee.getPersonnelStatus())) { return false; } if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.ALL.getValue())) { return true; } if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getEmployeeId())) { return true; } if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.DEPT.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getDepartmentId())) { return true; } if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getDepartmentId())) { return true; } if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.POSITION.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getJobtitleId())) { return true; } return false; }).collect(Collectors.toList())); } // 去重 salaryEmployeeList = salaryEmployeeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DataCollectionEmployee::getEmployeeId))), ArrayList::new)); return salaryEmployeeList; } // /** // * 根据分管理员id获取管理范围列表 // * // * @param subAdminId // * @param includeType // * @return // */ // private List listBySubAdminIdAndIncludeType(Long subAdminId, Integer includeType) { // // return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) // .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) // .eq(TaxAgentManageRangePO::getDeleteType, 0) // .eq(TaxAgentManageRangePO::getTaxAgentSubAdminId, subAdminId) // .eq(TaxAgentManageRangePO::getRangeType, TaxAgentRangeTypeEnum.SUBADMIN.getValue()) // .eq(TaxAgentManageRangePO::getIncludeType, includeType) // .orderByDesc(TaxAgentManageRangePO::getId) // .list(); // } /** * 获取个税口角义务人的管理范围 * * @param taxAgentId * @param includeType * @return */ private List listByTaxAgentIdAndIncludeType(Long taxAgentId, Integer includeType) { return taxAgentManageRangeMapper.listSome(TaxAgentManageRangePO.builder().taxAgentId(taxAgentId).rangeType(TaxAgentRangeTypeEnum.TAXAGENT.getValue()).includeType(includeType).build()); } // @Override // public Page listPageByParamAndIncludeType(TaxAgentSubAdminRangeQueryParam queryParam, Integer includeType) { // // 查询已有的管理范围 // List taxAgentManageRanges = listBySubAdminIdAndIncludeType(queryParam.getSubAdminId(), includeType); // return listPageByParamAndIncludeType(taxAgentManageRanges, queryParam, includeType); // } @Override public PageInfo listPageByParamAndIncludeType(TaxAgentRangeQueryParam queryParam, Integer includeType) { // 查询已有的管理范围 List taxAgentManageRanges = listByTaxAgentIdAndIncludeType(queryParam.getTaxAgentId(), includeType); return listPageByParamAndIncludeType(taxAgentManageRanges, queryParam, includeType); } private PageInfo listPageByParamAndIncludeType(List taxAgentManageRanges, TaxAgentManageRangeQueryParam queryParam, Integer includeType) { // 查询人员信息 List employeeIds = taxAgentManageRanges.stream() .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue())) .map(TaxAgentManageRangePO::getTargetId) .collect(Collectors.toList()); List employeeComInfos = comInfoCache.getCacheList(HrmEmployeeComInfo.class, employeeIds); // 查询部门信息 List departmentIds = taxAgentManageRanges.stream() .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.DEPT.getValue())) .map(TaxAgentManageRangePO::getTargetId) .collect(Collectors.toList()); List departmentComInfos = comInfoCache.getCacheList(HrmDepartmentComInfo.class, departmentIds); // 查询分部信息 List subDepartmentIds = taxAgentManageRanges.stream() .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue())) .map(TaxAgentManageRangePO::getTargetId) .collect(Collectors.toList()); List subDepartmentComInfos = comInfoCache.getCacheList(HrmDepartmentComInfo.class, subDepartmentIds); // 查询岗位信息 List positionIds = taxAgentManageRanges.stream() .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.POSITION.getValue())) .map(TaxAgentManageRangePO::getTargetId) .collect(Collectors.toList()); List positionComInfos = comInfoCache.getCacheList(HrmPositionComInfo.class, positionIds); // 分页参数 Page dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize()); // 查询人员状态 List hrmStatusList = hrmCommonHrmStatusService.list(tenantKey); // 薪资账套的人员范围po转换成列表dto List taxAgentManageRangeList = TaxAgentBO.convert2ListDTO(taxAgentManageRanges, employeeComInfos, departmentComInfos, subDepartmentComInfos, positionComInfos, hrmStatusList); // 根据对象名称过滤 if (StringUtils.isNotEmpty(queryParam.getTargetName())) { taxAgentManageRangeList = taxAgentManageRangeList.stream() .filter(f -> f.getTargetName().contains(queryParam.getTargetName())) .collect(Collectors.toList()); } // 填充总数和当页数据 dtoPage.setTotal(taxAgentManageRangeList.size()); dtoPage.setRecords(SalaryPageUtil.subList((int) dtoPage.getCurrent(), (int) dtoPage.getSize(), taxAgentManageRangeList)); return dtoPage; } /** * 根据个税口角义务人id保存管理范围 * * @param saveParam 保存参数 * @param employeeId 人员id * @param tenantKey 租户key */ @Override @Transactional(rollbackFor = Exception.class) public void save(TaxAgentRangeSaveParam saveParam, Long employeeId, String tenantKey) { // 查询薪资账套 TaxAgentPO taxAgent = taxAgentService.getById(saveParam.getTaxAgentId(), tenantKey); if (Objects.isNull(taxAgent)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 108605, "参数错误,个税扣缴义务人不存在或者已被删除")); } // 查询已有的管理范围 List taxAgentManageAllRanges = listByTaxAgentId(saveParam.getTaxAgentId(), tenantKey); List taxAgentManageRanges = taxAgentManageAllRanges.stream().filter(f -> f.getIncludeType().equals(saveParam.getIncludeType())).collect(Collectors.toList()); // 处理一下本次的保存参数(如果原来添加过对应的人员(/部门/岗位),那么本次不需要新增,只需要更新) TaxAgentBO.Result result = TaxAgentBO.handleTaxAgentRange(taxAgentManageRanges, saveParam, taxAgent.getId(), employeeId, tenantKey); /** 检查当前个税扣缴义务人的所有人员范围与所有分管理员的管理范围===========================start */ List allRanges = Lists.newArrayList(taxAgentManageAllRanges); allRanges.addAll(result.getNeedInsertTaxAgentManageRanges()); allRanges.addAll(result.getNeedUpdateTaxAgentManageRanges()); // 去重 allRanges = allRanges.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing(f -> f.getTaxAgentId() + "." + f.getRangeType() + "." + f.getTargetType() + "." + f.getTargetId() + "." + f.getEmployeeStatus() + "." + f.getIncludeType())) ), ArrayList::new)); List allSalaryEmployees = this.getManageRangeSalaryEmployees(null, saveParam.getTaxAgentId(), allRanges, tenantKey); // 如果是排除是否会对分管理范围产生影响 List allSubAdminRanges = listSunAdminRangeByTaxAgentId(saveParam.getTaxAgentId(), tenantKey); if (saveParam.getIncludeType().equals(NumberUtils.INTEGER_ZERO)) { List allSubAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, saveParam.getTaxAgentId(), allSubAdminRanges, tenantKey); List allSalaryEmployeeIds = allSalaryEmployees.stream().map(SalaryEmployee::getEmployeeId).collect(Collectors.toList()); allSubAdminSalaryEmployees.removeIf(a -> allSalaryEmployeeIds.contains(a.getEmployeeId())); if (CollectionUtils.isNotEmpty(allSubAdminSalaryEmployees)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 110122, "分管理员包含该范围,不能删除")); } } /** 检查当前个税扣缴义务人的所有人员范围与所有分管理员的管理范围===========================end */ // 保存 if (CollectionUtils.isNotEmpty(result.getNeedInsertTaxAgentManageRanges())) { this.saveBatch(result.getNeedInsertTaxAgentManageRanges()); } if (CollectionUtils.isNotEmpty(result.getNeedUpdateTaxAgentManageRanges())) { this.updateBatchById(result.getNeedUpdateTaxAgentManageRanges()); } /** 同步本地人员范围的关联人员=========================== */ taskExecutor.execute(() -> { try { DSTenantKeyThreadVar.tenantKey.set(tenantKey); syncLocalEmp(saveParam.getTaxAgentId(), allSalaryEmployees, allSubAdminRanges, employeeId, tenantKey); } finally { DSTenantKeyThreadVar.tenantKey.remove(); } }); // 记录日志 todo } /** * 获取个税口角义务人的管理范围 * * @param taxAgentId * @param tenantKey * @return */ private List listByTaxAgentId(Long taxAgentId, String tenantKey) { return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTaxAgentId, taxAgentId) .eq(TaxAgentManageRangePO::getRangeType, TaxAgentRangeTypeEnum.TAXAGENT.getValue()) .orderByDesc(TaxAgentManageRangePO::getId) .list(); } private List listSunAdminRangeByTaxAgentId(Long taxAgentId, String tenantKey) { return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTaxAgentId, taxAgentId) .eq(TaxAgentManageRangePO::getRangeType, TaxAgentRangeTypeEnum.SUBADMIN.getValue()) .orderByDesc(TaxAgentManageRangePO::getId) .list(); } @Override @Transactional(rollbackFor = Exception.class) public void save4SubAdmin(TaxAgentSubAdminRangeSaveParam saveParam, Long employeeId, String tenantKey) { // 查询薪资账套 TaxAgentSubAdminPO taxAgentSubAdmin = taxAgentSubAdminService.getById(saveParam.getSubAdminId(), tenantKey); if (Objects.isNull(taxAgentSubAdmin)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 106687, "参数错误,分管理员不存在或者已被删除")); } // 查询已有的管理范围 List taxAgentManageAllRanges = listBySubAdminId(saveParam.getSubAdminId(), tenantKey); List taxAgentManageRanges = taxAgentManageAllRanges.stream().filter(f -> f.getIncludeType().equals(saveParam.getIncludeType())).collect(Collectors.toList()); // 处理一下本次的保存参数(如果原来添加过对应的人员(/部门/岗位),那么本次不需要新增,只需要更新) TaxAgentBO.Result result = TaxAgentBO.handleSubAdminRange(taxAgentManageRanges, saveParam, taxAgentSubAdmin.getTaxAgentId(), taxAgentSubAdmin.getId(), employeeId, tenantKey); // 当前库中所有分管理员的管理范围 List allSubAdminRangesExist = listSunAdminRangeByTaxAgentId(taxAgentSubAdmin.getTaxAgentId(), tenantKey); /** 检查当前分管理员的范围与其他分管理员人员范围===========================start */ // 当前分管理员的范围 List allSubAdminRangesCuttent = Lists.newArrayList(taxAgentManageAllRanges); // 其他分管理员的范围 List otherSubAdminRangesExist = allSubAdminRangesExist.stream().filter(f -> !f.getTaxAgentSubAdminId().equals(saveParam.getSubAdminId())).collect(Collectors.toList()); allSubAdminRangesCuttent.addAll(result.getNeedInsertTaxAgentManageRanges()); allSubAdminRangesCuttent.addAll(result.getNeedUpdateTaxAgentManageRanges()); // 当前分管理员的所有人员 List currentSubAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentSubAdmin.getTaxAgentId(), allSubAdminRangesCuttent, tenantKey); // 其他分管理员的所有人员 List otherSubAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentSubAdmin.getTaxAgentId(), otherSubAdminRangesExist, tenantKey); for (SalaryEmployee se : currentSubAdminSalaryEmployees) { Optional optionalSe = otherSubAdminSalaryEmployees.stream().filter(f -> f.getEmployeeId().equals(se.getEmployeeId())).findFirst(); if (optionalSe.isPresent()) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 110149, "不可包含其他分管理员的人员")); } } /** 检查当前分管理员的范围与其他分管理员人员范围===========================end */ /** 检查当前分管理员的范围与所属个税扣缴义务人的人员范围===========================start */ // 所属个税扣缴义务人的所有分管理员的管理范围 List allSubAdminRanges = Lists.newArrayList(allSubAdminRangesExist); allSubAdminRanges.addAll(result.getNeedInsertTaxAgentManageRanges()); allSubAdminRanges.addAll(result.getNeedUpdateTaxAgentManageRanges()); // 去重 allSubAdminRanges = allSubAdminRanges.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing(f -> f.getTaxAgentSubAdminId() + "." + f.getRangeType() + "." + f.getTargetType() + "." + f.getTargetId() + "." + f.getEmployeeStatus() + "." + f.getIncludeType())) ), ArrayList::new)); // 所属个税扣缴义务人的所有人员 List allRanges = listByTaxAgentId(taxAgentSubAdmin.getTaxAgentId(), tenantKey); List allSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentSubAdmin.getTaxAgentId(), allRanges, tenantKey); // 所有分管理员的所有人员 List allSubAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentSubAdmin.getTaxAgentId(), allSubAdminRanges, tenantKey); List allSalaryEmployeeIds = allSalaryEmployees.stream().map(SalaryEmployee::getEmployeeId).collect(Collectors.toList()); allSubAdminSalaryEmployees.removeIf(a -> allSalaryEmployeeIds.contains(a.getEmployeeId())); if (CollectionUtils.isNotEmpty(allSubAdminSalaryEmployees)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 110125, "超出了整体人员范围")); } /** 检查当前分管理员的范围与所属个税扣缴义务人的人员范围===========================end */ // 保存 if (CollectionUtils.isNotEmpty(result.getNeedInsertTaxAgentManageRanges())) { this.saveBatch(result.getNeedInsertTaxAgentManageRanges()); } if (CollectionUtils.isNotEmpty(result.getNeedUpdateTaxAgentManageRanges())) { this.updateBatchById(result.getNeedUpdateTaxAgentManageRanges()); } /** 同步本地人员范围的关联人员=========================== */ List finalAllSubAdminRanges = allSubAdminRanges; taskExecutor.execute(() -> { try { DSTenantKeyThreadVar.tenantKey.set(tenantKey); syncLocalEmp(taxAgentSubAdmin.getTaxAgentId(), allSalaryEmployees, finalAllSubAdminRanges, employeeId, tenantKey); } finally { DSTenantKeyThreadVar.tenantKey.remove(); } }); // 记录日志 todo } /** * 根据分管理员id获取管理范围列表 * * @param subAdminId * @param tenantKey * @return */ private List listBySubAdminId(Long subAdminId, String tenantKey) { return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTaxAgentSubAdminId, subAdminId) .eq(TaxAgentManageRangePO::getRangeType, TaxAgentRangeTypeEnum.SUBADMIN.getValue()) .orderByDesc(TaxAgentManageRangePO::getId) .list(); } private List listByIds(Collection ids, String tenantKey) { if (CollectionUtils.isEmpty(ids)) { return Collections.emptyList(); } return new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .eq(TaxAgentManageRangePO::getDeleteType, 0) .in(TaxAgentManageRangePO::getId, ids) .orderByDesc(TaxAgentManageRangePO::getId) .list(); } @Override @Transactional(rollbackFor = Exception.class) public void deleteByIds(Collection ids, Long employeeId, String tenantKey) { // 查询管理范围 List taxAgentManageRanges = listByIds(ids, tenantKey); if (CollectionUtils.isEmpty(taxAgentManageRanges)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98604, "数据不存在或已被删除")); } List taxAgentIds = taxAgentManageRanges.stream().map(TaxAgentManageRangePO::getTaxAgentId).distinct().collect(Collectors.toList()); if (taxAgentIds.size() > 1) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(110159, "一次只能删一个个税个税扣缴义务人的范围")); } Collection finalIds = ids; taxAgentManageRanges = this.listByTaxAgentIds(taxAgentIds, tenantKey); List allManageRanges = taxAgentManageRanges.stream().filter(f -> !finalIds.contains(f.getId())).collect(Collectors.toList()); List allRanges = allManageRanges.stream().filter(f -> f.getRangeType().equals(TaxAgentRangeTypeEnum.TAXAGENT.getValue())).collect(Collectors.toList()); List allSubAdminRanges = allManageRanges.stream().filter(f -> f.getRangeType().equals(TaxAgentRangeTypeEnum.SUBADMIN.getValue())).collect(Collectors.toList()); Long taxAgentId = taxAgentIds.get(0); List allSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentId, allRanges, tenantKey); List allSubAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentId, allSubAdminRanges, tenantKey); allSalaryEmployees.forEach(f -> { allSubAdminSalaryEmployees.removeIf(a -> a.getEmployeeId().equals(f.getEmployeeId())); }); if (CollectionUtils.isNotEmpty(allSubAdminSalaryEmployees)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 110160, "分管理员存在超出整体人员范围以外的人员,不可删除")); } // 删除管理范围 new LambdaUpdateChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .in(TaxAgentManageRangePO::getId, ids) .set(TaxAgentManageRangePO::getDeleteType, 1) .update(); /** 同步本地人员范围的关联人员=========================== */ taskExecutor.execute(() -> { try { DSTenantKeyThreadVar.tenantKey.set(tenantKey); syncLocalEmp(taxAgentId, allSalaryEmployees, allSubAdminRanges, employeeId, tenantKey); } finally { DSTenantKeyThreadVar.tenantKey.remove(); } }); // 记录日志 todo } @Override public void deleteByTaxAgentIds(Collection taxAgentIds, String tenantKey) { new LambdaUpdateChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .in(TaxAgentManageRangePO::getTaxAgentId, taxAgentIds) .set(TaxAgentManageRangePO::getDeleteType, 1) .update(); // 删除管理范围下的所有人员 taxAgentEmployeeService.deleteByTaxAgentIds(taxAgentIds, tenantKey); } @Override public void deleteBySubAdmins(Collection subAdminIds, String tenantKey) { if (CollectionUtils.isEmpty(subAdminIds)) { return; } new LambdaUpdateChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getDeleteType, 0) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .in(TaxAgentManageRangePO::getTaxAgentSubAdminId, subAdminIds) .set(TaxAgentManageRangePO::getDeleteType, 1) .update(); // 删除管理范围下的所有人员 taxAgentSubAdminEmployeeService.deleteBySubAdminIds(subAdminIds, tenantKey); } @AsyncListener(topic = "hrm_resource_queue") public void receiveHrmResourceQueue(AsyncBean asyncBean) { log.info("接受到人员变动的结果:{}", JSONObject.toJSONString(asyncBean)); // todo 过滤必要性事件类型进行处理,后续加上时间间隔,避免人事批量操作时,监听事件过多 if (asyncBean == null || asyncBean.getMessage() == null) { log.error("接受到人员变动的结果失败"); } String tenantKey = asyncBean.getMessage().getTenantKey(); // 开始同步 taskExecutor.execute(() -> { try { DSTenantKeyThreadVar.tenantKey.set(tenantKey); handleSyncTaxAgentEmpData(tenantKey); } finally { DSTenantKeyThreadVar.tenantKey.remove(); } }); } /** * 同步处理所有人员泛微 * * @param tenantKey */ private void handleSyncTaxAgentEmpData(String tenantKey) { List allManageRanges = new LambdaQueryChainWrapper<>(taxAgentManageRangeMapper) .eq(TaxAgentManageRangePO::getTenantKey, tenantKey) .eq(TaxAgentManageRangePO::getDeleteType, 0) .orderByDesc(TaxAgentManageRangePO::getId) .list(); if (CollectionUtils.isEmpty(allManageRanges)) { return; } List taxAgentIds = allManageRanges.stream().map(m -> m.getTaxAgentId()).distinct().collect(Collectors.toList()); List taxAgentEmpSaveParamList = Lists.newArrayList(); List subAdminEmpSaveParamList = Lists.newArrayList(); taxAgentIds.forEach(taxAgentId -> { // 当前个税扣缴义务人的所有范围 List allRanges = allManageRanges.stream().filter(f -> f.getTaxAgentId().equals(taxAgentId) && f.getRangeType().equals(TaxAgentRangeTypeEnum.TAXAGENT.getValue())).collect(Collectors.toList()); List allSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentId, allRanges, tenantKey); taxAgentEmpSaveParamList.add(getTaxAgentEmpSyncParam(taxAgentId, allSalaryEmployees)); List allSubAdminRanges = allManageRanges.stream().filter(f -> f.getTaxAgentId().equals(taxAgentId) && f.getRangeType().equals(TaxAgentRangeTypeEnum.SUBADMIN.getValue())).collect(Collectors.toList()); subAdminEmpSaveParamList.addAll(getTaxAgentSubAdminEmpSyncParam(taxAgentId, allSubAdminRanges, tenantKey)); }); Long employeeId = 0L; // 同步管理员的人员 taxAgentEmployeeService.syncTaxAgentEmployee(taxAgentEmpSaveParamList, employeeId, tenantKey); // 同步分管理员的人员 taxAgentSubAdminEmployeeService.syncTaxAgentSubAdminEmployee(subAdminEmpSaveParamList, employeeId, tenantKey); } /** * 获取个税扣缴义务人的同步参数 * * @param taxAgentId * @param allSalaryEmployees * @return */ private TaxAgentEmpSaveParam getTaxAgentEmpSyncParam(Long taxAgentId, List allSalaryEmployees) { return TaxAgentEmpSaveParam.builder() .taxAgentId(taxAgentId) .salaryEmployeeList(allSalaryEmployees) .build(); } /** * 获取分管理员的同步参数 * * @param taxAgentId * @param allSubAdminRanges * @param tenantKey * @return */ private List getTaxAgentSubAdminEmpSyncParam(Long taxAgentId, List allSubAdminRanges, String tenantKey) { List allSubAdminIds = allSubAdminRanges.stream().map(TaxAgentManageRangePO::getTaxAgentSubAdminId).distinct().collect(Collectors.toList()); List subAdminEmpSaveParamList = Lists.newArrayList(); allSubAdminIds.forEach(e -> { List singSubAdminRanges = allSubAdminRanges.stream().filter(r -> e.equals(r.getTaxAgentSubAdminId())).collect(Collectors.toList()); List subAdminSalaryEmployees = this.getManageRangeSalaryEmployees(null, taxAgentId, singSubAdminRanges, tenantKey); subAdminEmpSaveParamList.add(TaxAgentSubAdminEmpSaveParam.builder() .taxAgentId(taxAgentId) .subAdminId(e) .salaryEmployeeList(subAdminSalaryEmployees) .build()); }); return subAdminEmpSaveParamList; } /** * 同步本地范围关联人员 * * @param taxAgentId * @param allSalaryEmployees 个税扣缴义务人下的所有人员 * @param allSubAdminRanges * @param employeeId * @param tenantKey */ private void syncLocalEmp(Long taxAgentId, List allSalaryEmployees, List allSubAdminRanges, Long employeeId, String tenantKey) { List taxAgentEmpSaveParamList = Collections.singletonList(getTaxAgentEmpSyncParam(taxAgentId, allSalaryEmployees)); // 同步个税扣缴义务人的人员 taxAgentEmployeeService.syncTaxAgentEmployee(taxAgentEmpSaveParamList, employeeId, tenantKey); List subAdminEmpSaveParamList = getTaxAgentSubAdminEmpSyncParam(taxAgentId, allSubAdminRanges, tenantKey); // 同步分管理员的人员 taxAgentSubAdminEmployeeService.syncTaxAgentSubAdminEmployee(subAdminEmpSaveParamList, employeeId, tenantKey); } }