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.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.company.DepartmentComInfo; import weaver.hrm.company.SubCompanyComInfo; 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); } FunctionOutStaffServiceImpl(){ 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); } 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,"存在编制超编风险,请先修改控制策略"); } staffPO.setStaffNum(difference); buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer frozenStaffNums(StaffOutParam param) { StaffPO staffPO = select(param); List numberF = Arrays.asList(staffPO.getFreezeNum(),param.getNum()); //1.增加冻结数 Integer sum = numberF.stream() .mapToInt(Integer::intValue) .sum(); if (staffPO.getControlPolicy().equals(HARDCONTROLLER)) { OrganizationAssert.isFalse(sum.compareTo(staffPO.getStaffNum()) > 0, "冻结数不能大于剩余编制数!"); } staffPO.setFreezeNum(sum); buildStaffPO(staffPO); return staffMapper().updateStaff(staffPO); } private Integer entryAdd(StaffOutParam param) { StaffPO staffPO = select(param); Integer sums = staffPO.getPermanentNum() + staffPO.getFreezeNum(); //强控策略下不容许超编 if (staffPO.getControlPolicy().equals(HARDCONTROLLER)) { OrganizationAssert.isFalse(sums.compareTo(staffPO.getStaffNum()) > 0,"强控策略下不容许超编"); } List numbers = Arrays.asList(staffPO.getPermanentNum(),param.getNum()); //1.增加在编数 int sum = numbers.stream() .mapToInt(Integer::intValue) .sum(); staffPO.setPermanentNum(sum); //向上部门 分部在编数调整 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,"调整数量不可大于在编数"); 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())); if (!"".equals(allSupCompany)) { Collection subCompanys = Arrays.stream(allSupCompany.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); List 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()); } staffMapper().updateStaff(item); }); } } } //2.部门 if (param.getDepartment() != null) { String allSupDepartment = departmentComInfo.getAllSupDepartment(String.valueOf(param.getDepartment())); if ("".equals(allSupDepartment)) { Collection subDepartments = Arrays.stream(allSupDepartment.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); List 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()); } staffMapper().updateStaff(item); }); } } } } private StaffPO select(StaffOutParam param) { List staffPO = staffMapper().customSelect(param.getPlanId(), param.getCompany(), param.getDepartment(), param.getJob()); OrganizationAssert.notNull(staffPO,"未查询到对应编制方案下的组织编制信息!"); 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); } }