From c050bdb59eca1f9cdd3e526770c0a887a439693b Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Thu, 31 Oct 2024 18:06:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=9A=E6=89=8D=E6=9E=97=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/param/TransferParam.java | 24 ++++ .../jclproduct/entity/vo/CaluResourceVo.java | 46 ++++++++ .../jclproduct/entity/vo/LeaveResourceVo.java | 4 +- .../jclproduct/entity/vo/TimeResourceVo.java | 4 +- .../entity/vo/TransferResourceVo.java | 4 +- .../service/EmployeeRecordReportService.java | 11 ++ .../impl/EmployeeRecordReportServiceImpl.java | 105 ++++++++++++++++++ .../jclproduct/utils/EmploymentUtil.java | 69 +++++++++++- src/test/MainTest.java | 29 ++--- 9 files changed, 272 insertions(+), 24 deletions(-) create mode 100644 src/com/engine/jclproduct/entity/param/TransferParam.java create mode 100644 src/com/engine/jclproduct/entity/vo/CaluResourceVo.java diff --git a/src/com/engine/jclproduct/entity/param/TransferParam.java b/src/com/engine/jclproduct/entity/param/TransferParam.java new file mode 100644 index 0000000..947caa8 --- /dev/null +++ b/src/com/engine/jclproduct/entity/param/TransferParam.java @@ -0,0 +1,24 @@ +package com.engine.jclproduct.entity.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/10/31 10:38 AM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TransferParam { + + private Integer changeOldDept; + + private Integer changeNewDept; +} diff --git a/src/com/engine/jclproduct/entity/vo/CaluResourceVo.java b/src/com/engine/jclproduct/entity/vo/CaluResourceVo.java new file mode 100644 index 0000000..937c25d --- /dev/null +++ b/src/com/engine/jclproduct/entity/vo/CaluResourceVo.java @@ -0,0 +1,46 @@ +package com.engine.jclproduct.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @Author liang.cheng + * @Date 2024/10/30 2:24 PM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CaluResourceVo { + + private Integer key; + + private Integer superKey; + + private String departmentName; + + private Integer startNumber; + + private Integer entryNumber; + + private Integer transferNumber; + + private Integer leaveNumber; + + private Integer onNumber; + + private Integer outNumber; + + private Integer endNumber; + + private List children; + + +} diff --git a/src/com/engine/jclproduct/entity/vo/LeaveResourceVo.java b/src/com/engine/jclproduct/entity/vo/LeaveResourceVo.java index 0d006c7..ffd38b3 100644 --- a/src/com/engine/jclproduct/entity/vo/LeaveResourceVo.java +++ b/src/com/engine/jclproduct/entity/vo/LeaveResourceVo.java @@ -118,8 +118,8 @@ public class LeaveResourceVo { /** * 司龄 */ - @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") - private Integer workyear; +// @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") +// private Integer workyear; /** * 性别 */ diff --git a/src/com/engine/jclproduct/entity/vo/TimeResourceVo.java b/src/com/engine/jclproduct/entity/vo/TimeResourceVo.java index b993097..ccf14e0 100644 --- a/src/com/engine/jclproduct/entity/vo/TimeResourceVo.java +++ b/src/com/engine/jclproduct/entity/vo/TimeResourceVo.java @@ -117,8 +117,8 @@ public class TimeResourceVo { /** * 司龄 */ - @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") - private Integer workyear; +// @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") +// private Integer workyear; /** * 性别 */ diff --git a/src/com/engine/jclproduct/entity/vo/TransferResourceVo.java b/src/com/engine/jclproduct/entity/vo/TransferResourceVo.java index 9141481..a2aa736 100644 --- a/src/com/engine/jclproduct/entity/vo/TransferResourceVo.java +++ b/src/com/engine/jclproduct/entity/vo/TransferResourceVo.java @@ -125,8 +125,8 @@ public class TransferResourceVo { /** * 司龄 */ - @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") - private Integer workyear; +// @WeaverTableColumn( text = "司龄", width = "10%", column = "workyear") +// private Integer workyear; /** * 性别 */ diff --git a/src/com/engine/jclproduct/service/EmployeeRecordReportService.java b/src/com/engine/jclproduct/service/EmployeeRecordReportService.java index aee5c0e..af004ad 100644 --- a/src/com/engine/jclproduct/service/EmployeeRecordReportService.java +++ b/src/com/engine/jclproduct/service/EmployeeRecordReportService.java @@ -51,4 +51,15 @@ public interface EmployeeRecordReportService { */ Map transferResourece(Map params); + + + /** + * @Description: 管理幅度统计 + * @Author: liang.cheng + * @Date: 2024/10/25 2:21 PM + * @param: [] + * @return: java.util.Map + */ + Map caluResourece(Map params); + } diff --git a/src/com/engine/jclproduct/service/impl/EmployeeRecordReportServiceImpl.java b/src/com/engine/jclproduct/service/impl/EmployeeRecordReportServiceImpl.java index b4a88af..79a84ae 100644 --- a/src/com/engine/jclproduct/service/impl/EmployeeRecordReportServiceImpl.java +++ b/src/com/engine/jclproduct/service/impl/EmployeeRecordReportServiceImpl.java @@ -1,8 +1,11 @@ package com.engine.jclproduct.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.core.impl.Service; import com.engine.jclproduct.component.WeaverWeaTable; +import com.engine.jclproduct.entity.param.TransferParam; +import com.engine.jclproduct.entity.vo.CaluResourceVo; import com.engine.jclproduct.entity.vo.LeaveResourceVo; import com.engine.jclproduct.entity.vo.TimeResourceVo; import com.engine.jclproduct.entity.vo.TransferResourceVo; @@ -10,10 +13,16 @@ import com.engine.jclproduct.service.EmployeeRecordReportService; import com.engine.jclproduct.utils.EmploymentUtil; import org.apache.commons.lang3.StringUtils; import weaver.common.DateUtil; +import weaver.conn.RecordSet; 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.function.Function; +import java.util.stream.Collectors; /** * @Author liang.cheng @@ -37,6 +46,9 @@ public class EmployeeRecordReportServiceImpl extends Service implements Employee case "2": result = transferResourece(params); break; + case "3": + result = caluResourece(params); + break; default: break; } @@ -51,6 +63,7 @@ public class EmployeeRecordReportServiceImpl extends Service implements Employee WeaverWeaTable table = new WeaverWeaTable<>(user, TimeResourceVo.class); String sqlWhere = buildtimeResoureceSql(params); + //sqlWhere += " order by userid asc"; table.setSqlwhere(sqlWhere); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); @@ -89,6 +102,98 @@ public class EmployeeRecordReportServiceImpl extends Service implements Employee return resultMap; } + @Override + public Map caluResourece(Map params) { + RecordSet rs = new RecordSet(); + Map resultMap = new HashMap<>(4); + + List caluResourceVos = new ArrayList<>(); + String departmentId = Util.null2String(params.get("departmentId")); + String date = Util.null2String(params.get("date")); + DepartmentComInfo departmentComInfo = new DepartmentComInfo(); + + String sql = "select id,supdepid,departmentname from hrmdepartment where (canceled is null or canceled != 1) "; + if(!"".equals(departmentId)){ + ArrayList lists = new ArrayList<>(); + lists.add(departmentId); + departmentComInfo.getAllChildDeptByDepId(lists,departmentId); + String join = CollectionUtil.join(lists, ","); + sql += " and id in ("+join+")"; + } + + sql += " order by showorder,id asc"; + + //1.获取部门数据信息 + rs.executeQuery(sql); + while (rs.next()) { + caluResourceVos.add(CaluResourceVo.builder() + .key(Util.getIntValue(rs.getString("id"))) + .superKey(Util.getIntValue(rs.getString("supdepid"),0)) + .departmentName(Util.null2String(rs.getString("departmentname"))) + .build()); + } + + //2.人数统计计算 + String firstDayOfMonth = EmploymentUtil.firstDayOfMonth(date); + String lastDayOfMonth = EmploymentUtil.lastDayOfMonth(date); + //期初人数 + Map startMap = EmploymentUtil.sumPerson(firstDayOfMonth, "0,1,2,3"); + //期末人数 + Map endMap = EmploymentUtil.sumPerson(lastDayOfMonth, "0,1,2,3"); + //入职人数 + Map entryMap = EmploymentUtil.rangePerson(firstDayOfMonth, lastDayOfMonth, "0"); + //转正人数 + Map transferMap = EmploymentUtil.rangePerson(firstDayOfMonth, lastDayOfMonth, "1"); + //离职人数 + Map leaveMap = EmploymentUtil.rangePerson(firstDayOfMonth, lastDayOfMonth, "4,5"); + //调动信息 + List transferList = EmploymentUtil.transferPerson(firstDayOfMonth, lastDayOfMonth); + + + + caluResourceVos.forEach(e-> { + e.setStartNumber(startMap.getOrDefault(e.getKey(), 0)); + e.setEntryNumber(entryMap.getOrDefault(e.getKey(), 0)); + e.setTransferNumber(transferMap.getOrDefault(e.getKey(), 0)); + e.setLeaveNumber(leaveMap.getOrDefault(e.getKey(), 0)); + int oldCount = (int) transferList.stream() + .filter(param -> param.getChangeOldDept() != null && param.getChangeOldDept().equals(e.getKey())) + .count(); + int newCount = (int) transferList.stream() + .filter(param -> param.getChangeNewDept() != null && param.getChangeNewDept().equals(e.getKey())) + .count(); + e.setOnNumber(newCount); + e.setOutNumber(oldCount); + e.setEndNumber(endMap.getOrDefault(e.getKey(), 0)); + }); + + + + //3.构建上下级关系 + List topLevelResources = new ArrayList<>(); + + Map resourceMap = caluResourceVos.stream() + .collect(Collectors.toMap(CaluResourceVo::getKey, Function.identity())); + + caluResourceVos.forEach(resource -> { + if (resource.getSuperKey() == 0 || String.valueOf(resource.getKey()).equals(departmentId)) { + // 如果 superKey 为 0,说明是顶级元素 或者departmentId出现 + topLevelResources.add(resource); + } else { + CaluResourceVo parent = resourceMap.get(resource.getSuperKey()); + if (parent != null) { + if (parent.getChildren() == null) { + parent.setChildren( new ArrayList<>()); + } + parent.getChildren().add(resource); + } + } + }); + + resultMap.put("dataSource",topLevelResources); + return resultMap; + } + private String buildtransferResoureceSql(Map params) { String pointValue = Util.null2String(params.get("pointValue")); String startDate = Util.null2String(params.get("startDate")); diff --git a/src/com/engine/jclproduct/utils/EmploymentUtil.java b/src/com/engine/jclproduct/utils/EmploymentUtil.java index ce94e34..03003b4 100644 --- a/src/com/engine/jclproduct/utils/EmploymentUtil.java +++ b/src/com/engine/jclproduct/utils/EmploymentUtil.java @@ -1,5 +1,6 @@ package com.engine.jclproduct.utils; +import com.engine.jclproduct.entity.param.TransferParam; import com.engine.jclproduct.entity.po.EmploymentRecordPo; import com.engine.jclproduct.entity.po.HrmresourcePo; import com.weaver.general.Util; @@ -76,7 +77,7 @@ public class EmploymentUtil { public static List getHrmResources(){ List hrmresourcePoList = new ArrayList<>(); RecordSet rs = new RecordSet(); - rs.executeQuery("select id,workcode,status,companystartdate,companyworkyear,sex,birthday,jobtitle,departmentid,subcompanyid1,managerid from hrmresource"); + rs.executeQuery("select id,workcode,status,companystartdate,companyworkyear,sex,birthday,jobtitle,departmentid,subcompanyid1,managerid from hrmresource order by id asc"); while (rs.next()) { hrmresourcePoList.add(HrmresourcePo.builder() .userId(Util.getIntValue(rs.getString("id"))) @@ -182,6 +183,72 @@ public class EmploymentUtil { } + public static String firstDayOfMonth(String yearMonthStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter); + LocalDate firstDayOfMonth = yearMonth.atDay(1); + return firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + + } + + + public static String lastDayOfMonth(String yearMonthStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter); + LocalDate lastDayOfMonth = yearMonth.atEndOfMonth(); + return lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + } + + + public static Map sumPerson(String date,String employeeStatus) { + Map map = new HashMap<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select count(1) as nums,departmentid" + + " from uf_EmploymentRecord where employeeStatus in ("+employeeStatus+") " + + " and startDate <= '"+date+"' and stopDate >= '"+date+"'" + + " group by departmentid"); + while (rs.next()) { + int departmentid = Util.getIntValue(rs.getString("departmentid")); + int nums = Util.getIntValue(rs.getString("nums")); + map.put(departmentid,nums); + } + return map; + } + + + public static Map rangePerson(String startDate,String endDate,String employeeStatus) { + Map map = new HashMap<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select count(1) as nums,departmentid" + + " from uf_EmploymentRecord where employeeStatus in ("+employeeStatus+") and changtype != 2" + + " and startDate >= '"+startDate+"' and startDate <= '"+endDate+"' and stopDate >= '"+endDate+"'" + + " group by departmentid"); + while (rs.next()) { + int departmentid = Util.getIntValue(rs.getString("departmentid")); + int nums = Util.getIntValue(rs.getString("nums")); + map.put(departmentid,nums); + } + return map; + } + + + public static List transferPerson(String startDate,String endDate) { + List paramList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select changeOldDept,changeNewDept " + + " from uf_EmploymentRecord where changtype = 2 " + + " and startDate >= '"+startDate+"' and startDate <= '"+endDate+"' and stopDate >= '"+endDate+"'"); + while (rs.next()) { + int changeOldDept = Util.getIntValue(rs.getString("changeOldDept")); + int changeNewDept = Util.getIntValue(rs.getString("changeNewDept")); + paramList.add(TransferParam.builder().changeNewDept(changeNewDept).changeOldDept(changeOldDept).build()); + } + return paramList; + } + + } diff --git a/src/test/MainTest.java b/src/test/MainTest.java index e1c3dc3..793ce43 100644 --- a/src/test/MainTest.java +++ b/src/test/MainTest.java @@ -19,27 +19,22 @@ import java.util.Map; public class MainTest { public static void main(String[] args) { - // 获取当前日期 - LocalDate now = LocalDate.now(); + String yearMonthStr = "2023-02"; - // 获取上一年的 Year 对象 - Year previousYear = Year.from(now).minusYears(1); + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); - // 获取上一年的第一天 - LocalDate firstDayOfPreviousYear = previousYear.atDay(1); + // 解析字符串为 YearMonth 对象 + YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter); - // 获取上一年的最后一天 - LocalDate lastDayOfPreviousYear = previousYear.atMonth(12).atEndOfMonth(); + // 获取该月的第一天 + LocalDate firstDayOfMonth = yearMonth.atDay(1); - // 创建日期格式化器 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 获取该月的最后一天 + LocalDate lastDayOfMonth = yearMonth.atEndOfMonth(); - // 格式化日期为字符串 - String firstDayOfPreviousYearStr = firstDayOfPreviousYear.format(formatter); - String lastDayOfPreviousYearStr = lastDayOfPreviousYear.format(formatter); - - // 打印结果 - System.out.println("上一年的第一天: " + firstDayOfPreviousYearStr); - System.out.println("上一年的最后一天: " + lastDayOfPreviousYearStr); + // 格式化输出 + System.out.println("First day of month: " + firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + System.out.println("Last day of month: " + lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } }