|
|
@ -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+1;2.若不连续则使用跳号中最小的数字作为当前部门流水号
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|