From 6733d55725cf98775f299a6767d31daa9c1a23b3 Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Fri, 28 Mar 2025 14:25:32 +0800 Subject: [PATCH] =?UTF-8?q?=20=E6=96=B0=E9=83=A8=E9=97=A8=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=20=E6=8C=89=E9=83=A8=E9=97=A8=20=E5=AD=90=E9=83=A8?= =?UTF-8?q?=E9=97=A8=20=E5=AD=90=E9=83=A8=E9=97=A8=E6=B5=81=E6=B0=B4=20?= =?UTF-8?q?=EF=BC=88=E9=83=A8=E9=97=A8=E6=9C=80=E5=A4=9A=E4=B8=89=E7=BA=A7?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/hrm/util/CodeRuleManager.java | 6 +- .../xmgsecond/util/DepartmentCodeUtil.java | 2 +- .../xmgsecond/util/DepartmentNewCodeUtil.java | 171 ++++++++++++++++++ 3 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 src/com/engine/xmgsecond/util/DepartmentNewCodeUtil.java diff --git a/src/com/engine/hrm/util/CodeRuleManager.java b/src/com/engine/hrm/util/CodeRuleManager.java index c7cbafa..dd80c1b 100644 --- a/src/com/engine/hrm/util/CodeRuleManager.java +++ b/src/com/engine/hrm/util/CodeRuleManager.java @@ -1,7 +1,7 @@ package com.engine.hrm.util; 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.lang3.StringUtils; import weaver.conn.RecordSet; @@ -66,7 +66,7 @@ public class CodeRuleManager extends BaseBean { //QC3600738 新美光HR项目 部门自定义编码 新建(卡片 导入等) if("DEPARTMENT".equals(serialtype.getValue())) { - DepartmentCodeUtil departmentCodeUtil = new DepartmentCodeUtil(); + DepartmentNewCodeUtil departmentCodeUtil = new DepartmentNewCodeUtil(); return departmentCodeUtil.generateRuleCode(subcompanyid,"",supDeptid); } @@ -98,7 +98,7 @@ public class CodeRuleManager extends BaseBean { //QC3600738 新美光HR项目 部门自定义编码 重新生成编号 if("DEPARTMENT".equals(serialtype.getValue())) { - DepartmentCodeUtil departmentCodeUtil = new DepartmentCodeUtil(); + DepartmentNewCodeUtil departmentCodeUtil = new DepartmentNewCodeUtil(); return departmentCodeUtil.generateRuleCode(subcompanyid,deptid,""); } diff --git a/src/com/engine/xmgsecond/util/DepartmentCodeUtil.java b/src/com/engine/xmgsecond/util/DepartmentCodeUtil.java index f17a5e0..5c15261 100644 --- a/src/com/engine/xmgsecond/util/DepartmentCodeUtil.java +++ b/src/com/engine/xmgsecond/util/DepartmentCodeUtil.java @@ -17,7 +17,7 @@ import java.util.stream.IntStream; /** * @Author liang.cheng * @Date 2025/3/25 14:48 - * @Description: 新部门编号 + * @Description: 新部门编号 按层级流水 一级部门 二级部门 三级部门 * @Version 1.0 */ public class DepartmentCodeUtil { diff --git a/src/com/engine/xmgsecond/util/DepartmentNewCodeUtil.java b/src/com/engine/xmgsecond/util/DepartmentNewCodeUtil.java new file mode 100644 index 0000000..40546b2 --- /dev/null +++ b/src/com/engine/xmgsecond/util/DepartmentNewCodeUtil.java @@ -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 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 lastData = getDepartmentCode(lastSupdepid); + + + String lastSupCode = lastData.get("departmentcode"); + lastSupdepid = lastSupdepid == null || lastSupdepid.isEmpty() ? "0" : lastSupdepid; + + + //上上级部门id + Map 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 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中元素 ["01","02","03","06","05","24","08"] 如 01 - 24,若是连续且存在 则当前部门流水号 24+1;2.若不连续则使用跳号中最小的数字作为当前部门流水号 + List 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 getDepartmentSerial(String subcompanyId,String code,String deptLevel,String lastSupdepid) { + RecordSet rs = new RecordSet(); + List 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中 为 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 getDepartmentCode(String deptId) { + RecordSet rs = new RecordSet(); + Map 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; + } + + +}