package com.engine.salary.entity.taxagent.bo; import com.engine.salary.biz.EmployBiz; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.agency.po.PaymentAgencyPO; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.hrm.*; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentListDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeListDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentSubAdminListDTO; import com.engine.salary.entity.taxagent.param.TaxAgentManageRangeSaveParam; import com.engine.salary.entity.taxagent.param.TaxAgentSaveParam; import com.engine.salary.entity.taxagent.param.TaxAgentSubAdminRangeSaveParam; import com.engine.salary.entity.taxagent.po.TaxAgentAdminPO; import com.engine.salary.entity.taxagent.po.TaxAgentManageRangePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.entity.taxagent.po.TaxAgentSubAdminPO; import com.engine.salary.enums.salarysob.TargetTypeEnum; import com.engine.salary.enums.taxagent.TaxAgentRangeTypeEnum; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; 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 **/ public class TaxAgentBO { @Override public String toString() { return "TaxAgentBO{}"; } /** * 根据个税扣缴义务人id和用户id判断是否匹配 * * @param taxAgentEmployees * @param taxAgentId * @param employeeId * @return */ public static boolean checkTaxAgentAndEmployee(List taxAgentEmployees, Long taxAgentId, Long employeeId) { if (CollectionUtils.isEmpty(taxAgentEmployees) && taxAgentId == null) { return false; } return taxAgentEmployees.stream().anyMatch(t -> t.getTaxAgentId().equals(taxAgentId) && employeeId.equals(t.getEmployeeId())); } /** * 构建表格 * * @param isOpenDevolution */ public static void buildTaxAgentTable(PageInfo> listPage, boolean isOpenDevolution) { // 表格表头 List columns = new ArrayList<>(); String name = SalaryI18nUtil.getI18nLabel(91558, "个税扣缴义务人名称"); String employeeRange = SalaryI18nUtil.getI18nLabel(86125, "人员范围"); String roles = SalaryI18nUtil.getI18nLabel(87626, "角色"); String admins = SalaryI18nUtil.getI18nLabel(106259, "管理员"); String subAdmins = SalaryI18nUtil.getI18nLabel(106283, "分管理员"); // String paymentAgency = SalaryI18nUtil.getI18nLabel(112448, "社保福利代缴机构"); String description = SalaryI18nUtil.getI18nLabel(84961, "备注"); String sortedIndex = SalaryI18nUtil.getI18nLabel(84962, "显示顺序"); columns.add(new Column(name, "name", "name")); columns.add(new Column(employeeRange, "employeeRange", "employeeRange")); if (isOpenDevolution) { columns.add(new Column(roles, "roles", "roles")); columns.add(new Column(admins, "admins", "admins")); } columns.add(new Column(description, "description", "description")); columns.add(new Column(sortedIndex, "sortedIndex", "sortedIndex")); listPage.setColumns(columns); } /** * 表数据转列表数据 * * @param taxAgents * @return */ public static List convertToListDTO(Collection taxAgents) { if (CollectionUtils.isEmpty(taxAgents)) { return Collections.emptyList(); } return taxAgents.stream() .map(e -> TaxAgentListDTO.builder() .id(e.getId()) .name(e.getName()) .description(e.getDescription()) .build()) .collect(Collectors.toList()); } /** * 表数据转列表数据 * * @param taxAgents * @return */ public static List> convertToTableListDTO(List taxAgents, List paymentAgencyPOS) { return convertToTableListDTO(Boolean.FALSE, taxAgents, paymentAgencyPOS, null, null); } /** * 表数据转列表数据 * * @param taxAgents * @return */ public static List> convertToTableListDTO(List taxAgents, List paymentAgencyPOS, List taxAgentAdmins, List adminList) { return convertToTableListDTO(Boolean.TRUE, taxAgents, paymentAgencyPOS, taxAgentAdmins, adminList); } /** * 表数据转列表数据 * * @param taxAgents * @param adminList * @return */ public static List> convertToTableListDTO(Boolean isDevolution, List taxAgents, List paymentAgencyPOS, List taxAgentAdmins, List adminList) { if (CollectionUtils.isEmpty(taxAgents)) { return Collections.emptyList(); } return taxAgents.stream() .map(e -> { Map map = new LinkedHashMap<>(); map.put("id", e.getId()); map.put("name", e.getName()); map.put("employeeRange", "设置"); if (isDevolution) { List empIds = taxAgentAdmins.stream().filter(t -> t.getTaxAgentId().equals(e.getId())).map(TaxAgentAdminPO::getEmployeeId).collect(Collectors.toList()); List admins = adminList.stream().filter(a -> empIds.contains(a.getEmployeeId())).map(DataCollectionEmployee::getUsername).collect(Collectors.toList()); map.put("admins", CollectionUtils.isEmpty(admins) ? "" : Joiner.on(",").join((Iterable) admins)); map.put("subAdmins", "设置"); String roleId = e.getRoleId(); if(StringUtils.isNotBlank(roleId)){ List roleIdList = Arrays.stream(roleId.split(",")).filter(StringUtils::isNotBlank).map(Long::parseLong).collect(Collectors.toList()); List roleInfos = new EmployBiz().listRoleInfo(roleIdList); map.put("roles", roleInfos.stream().map(RoleInfo::getName).collect(Collectors.joining(","))); } } map.put("paymentAgency", buildPaymentAgency(e.getPaymentAgency(), paymentAgencyPOS)); map.put("description", e.getDescription()); map.put("sortedIndex", e.getSortedIndex()); return map; }).collect(Collectors.toList()); } public static List> buildPaymentAgency(String originStr, List paymentAgencyPOS) { List> paymentAgencyList = new ArrayList<>(); if (CollectionUtils.isEmpty(paymentAgencyPOS)) { return paymentAgencyList; } originStr = StringUtils.isBlank(originStr) ? "" : originStr; String finalOriginStr = originStr; return paymentAgencyPOS.stream().map(e -> { HashMap temp = new HashMap<>(); temp.put("id", e.getId()); temp.put("agencyName", e.getAgencyName()); if (finalOriginStr.contains(String.valueOf(e.getId()))) { temp.put("status", true); } else { temp.put("status", false); } return temp; }).collect(Collectors.toList()); } /** * 保存参数转表数据 * * @param saveParam * @param employeeId * @return */ public static TaxAgentPO convertToPO(TaxAgentSaveParam saveParam, Long employeeId) { if (saveParam == null) { return null; } Date now = new Date(); return TaxAgentPO.builder() // .id(saveParam.getId()) .name(saveParam.getName()) .description(saveParam.getDescription()) .createTime(now) .updateTime(now) .creator(employeeId) .deleteType(0) .roleId(saveParam.getRoleId()) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .sortedIndex(saveParam.getSortedIndex()) .build(); } /** * 表数据转列表数据(分管理员) * * @param list * @param range * @param subAdminList * @return */ public static List convertToSubAdminListDTO(List list, String range, List subAdminList) { if (CollectionUtils.isEmpty(list)) { return Collections.emptyList(); } return list.stream() .map(e -> { Optional optionalUsername = subAdminList.stream().filter(a -> e.getEmployeeId().equals(a.getEmployeeId())).map(DataCollectionEmployee::getUsername).findFirst(); return TaxAgentSubAdminListDTO.builder() .id(e.getId()) .subAdmin(optionalUsername.isPresent() ? optionalUsername.get() : "") .range(range) .description(e.getRemark()) .build(); }) .collect(Collectors.toList()); } /** * 管理范围列表转换 * * @param taxAgentManageRanges * @param employeeComInfos * @param departmentComInfos * @param subDepartmentComInfos * @param positionComInfos * @param hrmStatusList * @return */ public static List convert2ListDTO(List taxAgentManageRanges, List employeeComInfos, List departmentComInfos, List subDepartmentComInfos, List positionComInfos, List hrmStatusList, List roleComInfos) { if (CollectionUtils.isEmpty(taxAgentManageRanges)) { return Collections.emptyList(); } Map employeeComInfoMap = SalaryEntityUtil.convert2Map(employeeComInfos, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); Map departmentComInfoMap = SalaryEntityUtil.convert2Map(departmentComInfos, DeptInfo::getId, DeptInfo::getName); Map subDepartmentComInfoMap = SalaryEntityUtil.convert2Map(subDepartmentComInfos, SubCompanyInfo::getId, SubCompanyInfo::getName); Map positionComInfoMap = SalaryEntityUtil.convert2Map(positionComInfos, PositionInfo::getId, PositionInfo::getName); Map roleComInfoMap = SalaryEntityUtil.convert2Map(roleComInfos, RoleInfo::getId, RoleInfo::getName); Map hrmStatusNameMap = SalaryEntityUtil.convert2Map(hrmStatusList, hrmStatus -> String.valueOf(hrmStatus.getId()), HrmStatus::getName); return taxAgentManageRanges.stream() .map(taxAgentManageRange -> { TargetTypeEnum targetTypeEnum = TargetTypeEnum.parseByValue(taxAgentManageRange.getTargetType()); return TaxAgentManageRangeListDTO.builder() .id(taxAgentManageRange.getId()) .targetType(targetTypeEnum) .targetTypeName(Optional.ofNullable(targetTypeEnum) .map(e -> SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel())) .orElse(StringUtils.EMPTY)) .targetId(taxAgentManageRange.getTargetId()) .target(taxAgentManageRange.getTarget()) .targetName(buildTargetName(taxAgentManageRange, employeeComInfoMap, departmentComInfoMap, subDepartmentComInfoMap, positionComInfoMap,roleComInfoMap)) .employeeStatus(buildEmployeeStatus(hrmStatusNameMap, taxAgentManageRange.getEmployeeStatus())) .status(buildStatus(taxAgentManageRange.getEmployeeStatus())) .build(); }) .collect(Collectors.toList()); } private static String buildEmployeeStatus(Map hrmStatusNameMap, String employeeStatus) { List employeeStatusList = JsonUtil.parseList(employeeStatus, String.class); if (CollectionUtils.isEmpty(employeeStatusList)) { return StringUtils.EMPTY; } return employeeStatusList.stream() .map(hrmStatusNameMap::get) .collect(Collectors.joining(",")); } private static String buildStatus( String employeeStatus) { List employeeStatusList = JsonUtil.parseList(employeeStatus, String.class); if (CollectionUtils.isEmpty(employeeStatusList)) { return StringUtils.EMPTY; } return String.join(",", employeeStatusList); } /** * 构建对象名 * * @param taxAgentManageRange * @param employeeComInfoMap * @param departmentComInfoMap * @param subDepartmentComInfoMap * @param positionComInfoMap * @return */ private static String buildTargetName(TaxAgentManageRangePO taxAgentManageRange, Map employeeComInfoMap, Map departmentComInfoMap, Map subDepartmentComInfoMap, Map positionComInfoMap,Map roleComInfoMap) { TargetTypeEnum targetTypeEnum = TargetTypeEnum.parseByValue(taxAgentManageRange.getTargetType()); if (Objects.isNull(targetTypeEnum)) { return StringUtils.EMPTY; } switch (targetTypeEnum) { case EMPLOYEE: return employeeComInfoMap.getOrDefault(taxAgentManageRange.getTargetId(), StringUtils.EMPTY); case DEPT: return departmentComInfoMap.getOrDefault(taxAgentManageRange.getTargetId(), StringUtils.EMPTY); case SUBCOMPANY: return subDepartmentComInfoMap.getOrDefault(taxAgentManageRange.getTargetId(), StringUtils.EMPTY); case POSITION: return positionComInfoMap.getOrDefault(taxAgentManageRange.getTargetId(), StringUtils.EMPTY); case ROLE: return roleComInfoMap.getOrDefault(taxAgentManageRange.getTargetId(), StringUtils.EMPTY); case SQL: return taxAgentManageRange.getTarget(); default: return StringUtils.EMPTY; } } public static Result handleTaxAgentRange(List taxAgentManageRanges, TaxAgentManageRangeSaveParam saveParam, Long taxAgentId, Long employeeId, boolean isImport) { return handleManageRange(taxAgentManageRanges, saveParam, TaxAgentRangeTypeEnum.TAXAGENT, taxAgentId, 0L, employeeId, isImport); } /** * 处理前端传回的保存参数,转换成对应的po(如果保存参数中的人员、部门、岗位等之前就已经添加过了,就不需要再次保存了) * * @param taxAgentManageRanges * @param saveParam * @param taxAgentId * @param subAdminId * @param employeeId * @return */ private static Result handleManageRange(List taxAgentManageRanges, TaxAgentManageRangeSaveParam saveParam, TaxAgentRangeTypeEnum rangeTypeEnum, Long taxAgentId, Long subAdminId, Long employeeId, boolean isImport) { Date now = new Date(); Result handleResult = Result.builder() .needInsertTaxAgentManageRanges(Lists.newArrayList()) .needUpdateTaxAgentManageRanges(Lists.newArrayList()) .build(); if (CollectionUtils.isEmpty(saveParam.getTargetParams())) { return handleResult; } Map taxAgentManageRangeMap = SalaryEntityUtil.convert2Map(taxAgentManageRanges, e -> e.getIncludeType() + "-" + e.getTargetType() + "-" + e.getTargetId() + "-" + e.getRangeType()); for (TaxAgentSubAdminRangeSaveParam.TaxAgentSubAdminRangeTargetParam targetParam : saveParam.getTargetParams()) { if (targetParam.getTargetType() == TargetTypeEnum.SQL) { TaxAgentManageRangePO taxAgentManageRange = TaxAgentManageRangePO.builder() .id(IdGenerator.generate()) .taxAgentId(taxAgentId) .taxAgentSubAdminId(subAdminId) .rangeType(rangeTypeEnum.getValue()) .targetType(targetParam.getTargetType().getValue()) .targetId(0L) .target(targetParam.getTarget()) .includeType(saveParam.getIncludeType()) .creator(employeeId) .createTime(now) .updateTime(now) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .deleteType(0) .build(); if (isImport) { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(targetParam.getEmployeeStatus())); } else { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(saveParam.getEmployeeStatus())); } handleResult.getNeedInsertTaxAgentManageRanges().add(taxAgentManageRange); } else { String key = saveParam.getIncludeType() + "-" + targetParam.getTargetType().getValue() + "-" + targetParam.getTargetId() + "-" + rangeTypeEnum.getValue(); if (taxAgentManageRangeMap.containsKey(key)) { TaxAgentManageRangePO taxAgentManageRange = taxAgentManageRangeMap.get(key); if (isImport) { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(targetParam.getEmployeeStatus())); } else { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(saveParam.getEmployeeStatus())); } taxAgentManageRange.setUpdateTime(now); handleResult.getNeedUpdateTaxAgentManageRanges().add(taxAgentManageRange); continue; } TaxAgentManageRangePO taxAgentManageRange = TaxAgentManageRangePO.builder() .id(IdGenerator.generate()) .taxAgentId(taxAgentId) .taxAgentSubAdminId(subAdminId) .rangeType(rangeTypeEnum.getValue()) .targetType(targetParam.getTargetType().getValue()) .targetId(targetParam.getTargetId()) .includeType(saveParam.getIncludeType()) .creator(employeeId) .createTime(now) .updateTime(now) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .deleteType(0) .build(); if (isImport) { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(targetParam.getEmployeeStatus())); } else { taxAgentManageRange.setEmployeeStatus(JsonUtil.toJsonString(saveParam.getEmployeeStatus())); } handleResult.getNeedInsertTaxAgentManageRanges().add(taxAgentManageRange); } } return handleResult; } @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class Result { /** * 需要更新的人员范围 */ private Collection needUpdateTaxAgentManageRanges; /** * 需要新增的人员范围 */ private Collection needInsertTaxAgentManageRanges; } }