新部门编号 按部门 子部门 子部门流水 (部门最多三级)

新美光HR项目
Chengliang 2 months ago
parent 7a25169fab
commit 6733d55725

@ -1,7 +1,7 @@
package com.engine.hrm.util; package com.engine.hrm.util;
import com.engine.hrm.entity.RuleCodeType; import com.engine.hrm.entity.RuleCodeType;
import com.engine.xmgsecond.util.DepartmentCodeUtil; import com.engine.xmgsecond.util.DepartmentNewCodeUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet; import weaver.conn.RecordSet;
@ -66,7 +66,7 @@ public class CodeRuleManager extends BaseBean {
//QC3600738 新美光HR项目 部门自定义编码 新建(卡片 导入等) //QC3600738 新美光HR项目 部门自定义编码 新建(卡片 导入等)
if("DEPARTMENT".equals(serialtype.getValue())) { if("DEPARTMENT".equals(serialtype.getValue())) {
DepartmentCodeUtil departmentCodeUtil = new DepartmentCodeUtil(); DepartmentNewCodeUtil departmentCodeUtil = new DepartmentNewCodeUtil();
return departmentCodeUtil.generateRuleCode(subcompanyid,"",supDeptid); return departmentCodeUtil.generateRuleCode(subcompanyid,"",supDeptid);
} }
@ -98,7 +98,7 @@ public class CodeRuleManager extends BaseBean {
//QC3600738 新美光HR项目 部门自定义编码 重新生成编号 //QC3600738 新美光HR项目 部门自定义编码 重新生成编号
if("DEPARTMENT".equals(serialtype.getValue())) { if("DEPARTMENT".equals(serialtype.getValue())) {
DepartmentCodeUtil departmentCodeUtil = new DepartmentCodeUtil(); DepartmentNewCodeUtil departmentCodeUtil = new DepartmentNewCodeUtil();
return departmentCodeUtil.generateRuleCode(subcompanyid,deptid,""); return departmentCodeUtil.generateRuleCode(subcompanyid,deptid,"");
} }

@ -17,7 +17,7 @@ import java.util.stream.IntStream;
/** /**
* @Author liang.cheng * @Author liang.cheng
* @Date 2025/3/25 14:48 * @Date 2025/3/25 14:48
* @Description: * @Description:
* @Version 1.0 * @Version 1.0
*/ */
public class DepartmentCodeUtil { public class DepartmentCodeUtil {

@ -0,0 +1,171 @@
package com.engine.xmgsecond.util;
import com.engine.xmgsecond.entity.DeptCodeRule;
import org.apache.commons.lang.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.StringUtil;
import weaver.general.Util;
import weaver.hrm.company.DepartmentComInfo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @Author liang.cheng
* @Date 2025/3/25 14:48
* @Description:
* @Version 1.0
*/
public class DepartmentNewCodeUtil {
private static final Map<String, int[]> DEPT_LABEL_MAP = new HashMap<>();
static {
DEPT_LABEL_MAP.put("1", new int[]{1, 3});
DEPT_LABEL_MAP.put("2", new int[]{3, 5});
DEPT_LABEL_MAP.put("3", new int[]{5, 7});
}
public String generateRuleCode(String subcompanyId,String deptId, String lastSupdepid) {
RecordSet rs = new RecordSet();
//1.根据分部获取新部门编码规则表信息
DeptCodeRule deptCodeRule = null;
rs.executeQuery("select id,fb,bs from uf_departmentcode_rules where fb = ?",subcompanyId);
if (rs.next()) {
deptCodeRule = DeptCodeRule.builder()
.id(Util.getIntValue(rs.getString("id")))
.subcompany(Util.getIntValue(rs.getString("fb")))
.code(Util.null2String(rs.getString("bs")))
.build();
}
if (deptCodeRule == null) {
//新部门编码规则表未设置规则情况下 不进行编码直接返回
return "";
}
//2.获取该部门所有上级部门 (需求确认 部门层级最多只有3级),并获取对应的流水号,若不存在为 00
//导入时缓存无法获取部门信息 String lastSupCode = deptInfo.getDepartmentCode(lastSupdepid);
DepartmentComInfo deptInfo = new DepartmentComInfo();
//上级部门id
if (StringUtil.isEmpty(lastSupdepid)) {
lastSupdepid = deptInfo.getDepartmentsupdepid(deptId);
}
Map<String, String> lastData = getDepartmentCode(lastSupdepid);
String lastSupCode = lastData.get("departmentcode");
lastSupdepid = lastSupdepid == null || lastSupdepid.isEmpty() ? "0" : lastSupdepid;
//上上级部门id
Map<String, String> lastTopData = getDepartmentCode(lastSupdepid);
String lastTopSupdepid = lastTopData.get("supdepid");
lastTopSupdepid = lastTopSupdepid == null || lastTopSupdepid.isEmpty() ? "0" : lastTopSupdepid;
String lastTopSupCode = lastTopData.get("departmentcode");
// 例如一级部门 lastSupdepid="0",lastTopSupdepid="0"
// 例如二级部门 lastSupdepid="2726",lastTopSupdepid="0"
// 例如三级部门 lastSupdepid="2730",lastTopSupdepid="2726"
String deptLevel = "";
String departmentCode;
if ("0".equals(lastSupdepid)) {
// 一级部门
deptLevel = "1";
departmentCode = deptCodeRule.getCode() + "%s0000";
} else if ("0".equals(lastTopSupdepid)) {
// 二级部门
deptLevel = "2";
String firstSerial = getSubstringByLevel(lastSupCode, "1");
departmentCode = deptCodeRule.getCode() + firstSerial + "%s00";
} else {
// 三级部门
deptLevel = "3";
String secondSerial = getSubstringByLevel(lastSupCode, "2");
String firstSerial = getSubstringByLevel(lastTopSupCode,"1");
departmentCode = deptCodeRule.getCode() + firstSerial + secondSerial + "%s";
}
//3.根据当前部门所属层级 获取上级部门与该部门相同的部门编号进行比较
List<String> departmentSerial = getDepartmentSerial(subcompanyId, deptCodeRule.getCode(), deptLevel,lastSupdepid);
//如果本身已经存在编码 需要移除该编号
if (StringUtils.isNotEmpty(deptId)) {
String code = getSubstringByLevel(deptInfo.getDepartmentCode(deptId),deptLevel);
departmentSerial.removeIf(element -> element.equals(code));
}
//List<String>中元素 ["01","02","03","06","05","24","08"] 如 01 - 24若是连续且存在 则当前部门流水号 24+12.若不连续则使用跳号中最小的数字作为当前部门流水号
List<Integer> sortedNumbers = departmentSerial.stream()
.map(Integer::parseInt)
.sorted()
.collect(Collectors.toList());
// 查找跳号
int nextNumber = IntStream.rangeClosed(1, sortedNumbers.isEmpty() ? 1 : sortedNumbers.get(sortedNumbers.size() - 1) + 1)
.filter(num ->!sortedNumbers.contains(num))
.findFirst()
.orElseGet(() -> sortedNumbers.isEmpty() ? 1 : sortedNumbers.get(sortedNumbers.size() - 1) + 1);
// 格式化结果
String newSerialnum = String.format("%02d", nextNumber);
return String.format(departmentCode,newSerialnum);
}
public List<String> getDepartmentSerial(String subcompanyId,String code,String deptLevel,String lastSupdepid) {
RecordSet rs = new RecordSet();
List<String> deptSerial = new ArrayList<>();
rs.executeQuery("select departmentcode from hrmdepartment where subcompanyid1 = ? and departmentcode like '"+code+"%' and supdepid = ?",subcompanyId,lastSupdepid);
while (rs.next()) {
String departmentcode = Util.null2String(rs.getString("departmentcode"));
//D010000 deptLevel="1" 截取23位 deptLevel="2" 截取45位 deptLevel="3" 截取67位
String serialNumber = getSubstringByLevel(departmentcode, deptLevel);
deptSerial.add(serialNumber);
}
//去除List<String>中 为 00 的元素 ["00","01","02","03","06","05","00"]
return deptSerial.stream()
.filter(element -> !"00".equals(element))
.collect(Collectors.toList());
}
public String getSubstringByLevel(String str, String deptLevel) {
// 根据 deptLevel 获取对应的索引范围
int[] indices = DEPT_LABEL_MAP.get(deptLevel);
if (indices != null && str.length() >= indices[1]) {
// 若存在对应的索引范围且字符串长度足够,则进行截取
return str.substring(indices[0], indices[1]);
}
return "00";
}
public Map<String,String> getDepartmentCode(String deptId) {
RecordSet rs = new RecordSet();
Map<String,String> data = new HashMap<>();
rs.executeQuery("select departmentcode,supdepid from hrmdepartment where id = ?",deptId);
rs.next();
data.put("departmentcode",Util.null2String(rs.getString("departmentcode")));
data.put("supdepid",Util.null2String(rs.getString("supdepid")));
return data;
}
}
Loading…
Cancel
Save