You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-hrm-organization/src/com/engine/organization/service/impl/FunctionOutStaffServiceImpl...

256 lines
11 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.engine.organization.service.impl;
import com.alibaba.fastjson.JSON;
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.general.BaseBean;
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<StaffChangeEnum, Function<StaffOutParam, Integer>> 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<Integer> 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<Integer> 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);
if (param.getNum() < 0) {
OrganizationAssert.isFalse(staffPO.getFreezeNum() == 0, SystemEnv.getHtmlLabelName(547949,user.getLanguage()));
}
List<Integer> numberF = Arrays.asList(staffPO.getFreezeNum(),param.getNum());
//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<Integer> 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<Integer> 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<Integer> 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<Integer> 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<Integer> subCompanys = new ArrayList<>();
if (param.getDimension().equals(ModuleTypeEnum.departmentfielddefined.getValue()) || param.getDimension().equals(ModuleTypeEnum.jobfielddefined.getValue())){
subCompanys.add(param.getCompany());
}
if (!"".equals(allSupCompany)) {
Collection<Integer> sub = Arrays.stream(allSupCompany.split(","))
.map(Integer::parseInt)
.collect(Collectors.toList());
subCompanys.addAll(sub);
}
List<StaffPO> 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<Integer> subDepartments = new ArrayList<>();
if (param.getDimension().equals(ModuleTypeEnum.jobfielddefined.getValue())) {
subDepartments.add(param.getDepartment());
}
if (!"".equals(allSupDepartment)) {
Collection<Integer> sub = Arrays.stream(allSupDepartment.split(","))
.map(Integer::parseInt)
.collect(Collectors.toList());
subDepartments.addAll(sub);
}
List<StaffPO> 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> staffPO = staffMapper().customSelect(param.getPlanId(), param.getCompany(), param.getDepartment(), param.getJob());
BaseBean bb = new BaseBean();
bb.writeLog("编制参数"+ JSON.toJSONString(param));
bb.writeLog("查询结果"+ JSON.toJSONString(staffPO));
bb.writeLog("user对象"+JSON.toJSONString(user));
OrganizationAssert.notEmpty(staffPO,SystemEnv.getHtmlLabelName(547474,user.getLanguage()));
return staffPO.get(0);
}
private static void buildStaffPO(StaffPO staffPO) {
List<Integer> 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<StaffOutParam, Integer> function = affairFunctionS.get(functionEnum);
return function.apply(staffOutParam);
}
}