package com.engine.organization.service.impl; import com.engine.organization.entity.staff.param.StaffOutParam; import com.engine.organization.entity.staff.po.StaffPO; import com.engine.organization.enums.ModuleTypeEnum; import com.engine.organization.enums.StaffChangeEnum; import com.engine.organization.mapper.staff.StaffMapper; import com.engine.organization.util.OrganizationAssert; import com.engine.organization.util.db.MapperProxyFactory; import lombok.SneakyThrows; import org.apache.commons.collections.CollectionUtils; import weaver.hrm.User; import weaver.hrm.company.DepartmentComInfo; import weaver.hrm.company.SubCompanyComInfo; import weaver.systeminfo.SystemEnv; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @Author liang.cheng * @Date 2023/9/4 10:44 AM * @Description: 函数式接口 function interface 实现 * @Version 1.0 */ public class FunctionOutStaffServiceImpl { private static final Integer HARDCONTROLLER = 2; private static Map> affairFunctionS = new HashMap<>(); private StaffMapper staffMapper() { return MapperProxyFactory.getProxy(StaffMapper.class); } private User user; FunctionOutStaffServiceImpl(User user){ affairFunctionS.put(StaffChangeEnum.ADD, this::addStaffNums); affairFunctionS.put(StaffChangeEnum.REDUCE, this::reduceStaffNums); affairFunctionS.put(StaffChangeEnum.FROZEN, this::frozenStaffNums); affairFunctionS.put(StaffChangeEnum.ENTRY, this::entryAdd); affairFunctionS.put(StaffChangeEnum.DIMISSION, this::dimissionReduce); affairFunctionS.put(StaffChangeEnum.TRANSFER, this::transfer); this.user = user; } private Integer addStaffNums(StaffOutParam param) { StaffPO staffPO = select(param); List numbers = Arrays.asList(staffPO.getStaffNum(),param.getNum()); int sum = numbers.stream() .mapToInt(Integer::intValue) .sum(); staffPO.setStaffNum(sum); buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer reduceStaffNums(StaffOutParam param) { StaffPO staffPO = select(param); List numbers = Arrays.asList(staffPO.getStaffNum(),param.getNum()); Integer difference = numbers.stream() .reduce((a, b) -> a - b) .orElse(0); Integer sums = staffPO.getPermanentNum() + staffPO.getFreezeNum(); if (staffPO.getControlPolicy().equals(HARDCONTROLLER)) { OrganizationAssert.isFalse(difference.compareTo(sums) < 0, SystemEnv.getHtmlLabelName(547453,user.getLanguage())); } staffPO.setStaffNum(difference < 0 ? 0 :difference); buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer frozenStaffNums(StaffOutParam param) { StaffPO staffPO = select(param); List numberF = Arrays.asList(staffPO.getFreezeNum(),param.getNum(),staffPO.getPermanentNum()); //1.增加冻结数 (num为负数时为减少冻结数) Integer sum = numberF.stream() .mapToInt(Integer::intValue) .sum(); if (staffPO.getControlPolicy().equals(HARDCONTROLLER)) { OrganizationAssert.isFalse(sum.compareTo(staffPO.getStaffNum()) > 0, SystemEnv.getHtmlLabelName(547469,user.getLanguage())); } staffPO.setFreezeNum(sum); buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer entryAdd(StaffOutParam param) { StaffPO staffPO = select(param); List numbers = Arrays.asList(staffPO.getPermanentNum(),param.getNum()); //1.增加在编数 int sum = numbers.stream() .mapToInt(Integer::intValue) .sum(); staffPO.setPermanentNum(sum); Integer sums = staffPO.getPermanentNum() + staffPO.getFreezeNum(); //强控策略下不容许超编 if (staffPO.getControlPolicy().equals(HARDCONTROLLER)) { //冻结数释放 OrganizationAssert.isFalse((sums > staffPO.getStaffNum() && staffPO.getFreezeNum() > 0),SystemEnv.getHtmlLabelName(547470,user.getLanguage())); OrganizationAssert.isFalse( sums > staffPO.getStaffNum(),SystemEnv.getHtmlLabelName(547471,user.getLanguage())); } //向上部门 分部在编数调整 upwardReviewSums(param); //2.调整方式为流程时释放冻结数 if (param.getChangeMode() == 1) { List numbersF = Arrays.asList(staffPO.getFreezeNum(),param.getNum()); int difference = numbersF.stream() .reduce((a, b) -> a - b) .orElse(0); staffPO.setFreezeNum(difference); } buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer dimissionReduce(StaffOutParam param) { StaffPO staffPO = select(param); OrganizationAssert.isFalse(param.getNum().compareTo(staffPO.getPermanentNum()) > 0,SystemEnv.getHtmlLabelName(547472,user.getLanguage())); List numbers = Arrays.asList(staffPO.getPermanentNum(),param.getNum()); Integer difference = numbers.stream() .reduce((a, b) -> a - b) .orElse(0); staffPO.setPermanentNum(difference); //向上部门 分部在编数调整 upwardReviewSums(param); //2.调整方式为流程时释放冻结数 if (param.getChangeMode() == 1) { List numbersF = Arrays.asList(staffPO.getFreezeNum(),param.getNum()); int differenceF = numbersF.stream() .reduce((a, b) -> a - b) .orElse(0); staffPO.setFreezeNum(differenceF); } buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer transfer(StaffOutParam param) { return null; } /** * @Description: 向上刷新所有在编数 * @Author: liang.cheng * @Date: 2023/9/6 3:38 PM * @param: [param] * @return: void */ @SneakyThrows private void upwardReviewSums(StaffOutParam param){ DepartmentComInfo departmentComInfo = new DepartmentComInfo(); SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo(); //1.分部 if (param.getCompany() != null) { String allSupCompany = subCompanyComInfo.getAllSupCompany(String.valueOf(param.getCompany())); Collection subCompanys = new ArrayList<>(); if (param.getDimension().equals(ModuleTypeEnum.departmentfielddefined.getValue()) || param.getDimension().equals(ModuleTypeEnum.jobfielddefined.getValue())){ subCompanys.add(param.getCompany()); } if (!"".equals(allSupCompany)) { Collection sub = Arrays.stream(allSupCompany.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); subCompanys.addAll(sub); } List staffPOS = new ArrayList<>(); if (CollectionUtils.isNotEmpty(subCompanys)) { staffPOS = staffMapper().selectByEcCompany(subCompanys); } if (!CollectionUtils.isEmpty(staffPOS)) { staffPOS.forEach(item -> { if (param.getType().getValue() == 3){ item.setPermanentNum(item.getPermanentNum() + param.getNum()); }else { item.setPermanentNum(item.getPermanentNum() - param.getNum()); } buildStaffPO(item); staffMapper().updateStaff(item); }); } } //2.部门 if (param.getDepartment() != null) { String allSupDepartment = departmentComInfo.getAllSupDepartment(String.valueOf(param.getDepartment())); Collection subDepartments = new ArrayList<>(); if (param.getDimension().equals(ModuleTypeEnum.jobfielddefined.getValue())) { subDepartments.add(param.getDepartment()); } if (!"".equals(allSupDepartment)) { Collection sub = Arrays.stream(allSupDepartment.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); subDepartments.addAll(sub); } List staffPOS = new ArrayList<>(); if (CollectionUtils.isNotEmpty(subDepartments)) { staffPOS = staffMapper().selectByEcDepartment(subDepartments); } if (!CollectionUtils.isEmpty(staffPOS)) { staffPOS.forEach(item -> { if (param.getType().getValue() == 3){ item.setPermanentNum(item.getPermanentNum() + param.getNum()); }else { item.setPermanentNum(item.getPermanentNum() - param.getNum()); } buildStaffPO(item); staffMapper().updateStaff(item); }); } } } private StaffPO select(StaffOutParam param) { List staffPO = staffMapper().customSelect(param.getPlanId(), param.getCompany(), param.getDepartment(), param.getJob()); OrganizationAssert.notEmpty(staffPO,SystemEnv.getHtmlLabelName(547474,user.getLanguage())); return staffPO.get(0); } private static void buildStaffPO(StaffPO staffPO) { List number = Arrays.asList(staffPO.getPermanentNum(),staffPO.getFreezeNum()); Integer sums = number.stream() .mapToInt(Integer::intValue) .sum(); Integer a = staffPO.getStaffNum(); staffPO.setLackStatus((a.compareTo(sums) < 0) ? 3 : ((a.compareTo(sums) == 0) ? 2 : 1)); } public Integer actuator(StaffChangeEnum functionEnum,StaffOutParam staffOutParam) { Function function = affairFunctionS.get(functionEnum); return function.apply(staffOutParam); } }