From 1cc23736f70431fd2a5bfe744d664a36351eefa8 Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Wed, 22 Nov 2023 16:05:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=88=9B=E5=85=83=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=20=E5=85=AC=E5=8F=B8=E4=BA=BA=E5=91=98=E8=A7=84=E6=A8=A1?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thinktrans/entity/PersonnelSizeTop.java | 26 +++ .../service/ReportCollectService.java | 20 +++ .../service/ReportExportService.java | 9 ++ .../impl/CubeRecordDataServiceImpl.java | 38 +++-- .../impl/ReportCollectServiceImpl.java | 151 +++++++++++++++++- .../service/impl/ReportExportServiceImpl.java | 26 +++ .../thinktrans/util/CommonDateUtil.java | 9 ++ src/com/engine/thinktrans/util/ExcelUtil.java | 5 +- .../web/ReportCollectController.java | 17 ++ .../web/ReportExportController.java | 21 +++ 10 files changed, 306 insertions(+), 16 deletions(-) create mode 100644 src/com/engine/thinktrans/entity/PersonnelSizeTop.java diff --git a/src/com/engine/thinktrans/entity/PersonnelSizeTop.java b/src/com/engine/thinktrans/entity/PersonnelSizeTop.java new file mode 100644 index 0000000..ef0e734 --- /dev/null +++ b/src/com/engine/thinktrans/entity/PersonnelSizeTop.java @@ -0,0 +1,26 @@ +package com.engine.thinktrans.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2023/11/22 2:32 PM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PersonnelSizeTop { + + private String title; + + private T count; + + private String color; +} diff --git a/src/com/engine/thinktrans/service/ReportCollectService.java b/src/com/engine/thinktrans/service/ReportCollectService.java index b5c1520..a9e4ce1 100644 --- a/src/com/engine/thinktrans/service/ReportCollectService.java +++ b/src/com/engine/thinktrans/service/ReportCollectService.java @@ -3,6 +3,8 @@ package com.engine.thinktrans.service; import com.engine.thinktrans.entity.param.TendencyReportParam; import com.engine.thinktrans.entity.vo.TendencyReportVO; +import java.util.Map; + /** * @Author liang.cheng * @Date 2023/11/16 10:43 AM @@ -28,4 +30,22 @@ public interface ReportCollectService { * @return: com.engine.thinktrans.entity.vo.TendencyReportVO */ TendencyReportVO getOnJobStatistics(); + + /** + * @Description: 公司人员规模分析表 + * @Author: liang.cheng + * @Date: 2023/11/22 10:11 AM + * @param: [year] + * @return: com.engine.thinktrans.entity.vo.TendencyReportVO + */ + TendencyReportVO getPersonnelSize(Integer year); + + /** + * @Description: 公司人员规模分析表顶部 + * @Author: liang.cheng + * @Date: 2023/11/22 2:30 PM + * @param: [integer] + * @return: Map + */ + Map getTop(Integer year); } diff --git a/src/com/engine/thinktrans/service/ReportExportService.java b/src/com/engine/thinktrans/service/ReportExportService.java index 7160490..5bd52f8 100644 --- a/src/com/engine/thinktrans/service/ReportExportService.java +++ b/src/com/engine/thinktrans/service/ReportExportService.java @@ -30,4 +30,13 @@ public interface ReportExportService { * @return: org.apache.poi.xssf.usermodel.XSSFWorkbook */ XSSFWorkbook onJobStatisticsExport(); + + /** + * @Description: 公司人员规模分析 + * @Author: liang.cheng + * @Date: 2023/11/22 3:02 PM + * @param: [year] + * @return: org.apache.poi.xssf.usermodel.XSSFWorkbook + */ + XSSFWorkbook personnelSizeExport(Integer year); } diff --git a/src/com/engine/thinktrans/service/impl/CubeRecordDataServiceImpl.java b/src/com/engine/thinktrans/service/impl/CubeRecordDataServiceImpl.java index aaaecb3..0f66103 100644 --- a/src/com/engine/thinktrans/service/impl/CubeRecordDataServiceImpl.java +++ b/src/com/engine/thinktrans/service/impl/CubeRecordDataServiceImpl.java @@ -34,14 +34,21 @@ public class CubeRecordDataServiceImpl extends Service implements CubeRecordData deptList.add(Util.getIntValue(rs.getString("deptid"))); } + // 合计 + deptList.add(-9999); + deptList.forEach(id -> { List yearList = getYearData(year,id); datas.add(yearList); }); - boolean flag = rs.executeBatchSql("", datas); + if (datas.size() > 0) { + rs.executeUpdate("delete from uf_lzlbb where nf = ?",year); + rs.executeBatchSql("insert into uf_lzlbb(bmmc,nf,bmmc1,lzrs1,zrl1,lzl1,lzrs2,zrl2,lzl2,lzrs3,zrl3,lzl3,lzrs4,zrl4,lzl4,lzrs5,zrl5,lzl5," + + " lzrs6,zrl6,lzl6,lzrs7,zrl7,lzl7,lzrs8,zrl8,lzl8,lzrs9,zrl9,lzl9,lzrs10,zrl10,lzl10,lzrs11,zrl11,lzl11,lzrs12,zrl12,lzl12) " + + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", datas); + } - result.put("flag",flag); result.put("count",datas.size()); return result; } @@ -54,20 +61,26 @@ public class CubeRecordDataServiceImpl extends Service implements CubeRecordData data.add(id); data.add(year); ArrayList allSubDepartment = new ArrayList<>(); - departmentComInfo.getAllChildDeptByDepId(allSubDepartment, String.valueOf(id)); - allSubDepartment.add(String.valueOf(id)); - String allId = StringUtils.join(allSubDepartment, ","); - List yearMonths = CommonDateUtil.getYearMonths(year); StringBuilder st = new StringBuilder(); - st.append("select count(1) as sum from hrmresource where companystartdate <= ? and departmentid in"); - st.append(" (").append(allId).append(")"); + st.append("select count(1) as sum from hrmresource where companystartdate <= ? "); StringBuilder sql = new StringBuilder(); sql.append("select count(1) as dimension from hrmstatushistory h left join hrmresource s on h.resourceid = s.id where h.type_n = 5 " + - " and h.changedate >= ? and h.changedate <= ? and s.departmentid in"); - sql.append(" (").append(allId).append(")"); + " and h.changedate >= ? and h.changedate <= ? "); + + if (id != -9999) { + data.add(departmentComInfo.getDepartmentName(String.valueOf(id))); + departmentComInfo.getAllChildDeptByDepId(allSubDepartment, String.valueOf(id)); + allSubDepartment.add(String.valueOf(id)); + String allId = StringUtils.join(allSubDepartment, ","); + st.append(" and departmentid in (").append(allId).append(")"); + sql.append(" and s.departmentid in (").append(allId).append(")"); + }else { + data.add("合计"); + } + for (YearMonth yearMonth : yearMonths) { int dimension = 0; @@ -82,11 +95,12 @@ public class CubeRecordDataServiceImpl extends Service implements CubeRecordData if (rs.next()) { dimension = Util.getIntValue(rs.getString("dimension")); } - float result = ((float)dimension) / sum; + float result = sum == 0 ? 0 : ((float)dimension) / sum; double rate = sum == 0 ? 0 : Math.round(result * 100.0) / 100.0; - data.add(rate); data.add(dimension); data.add(sum); + data.add(rate); + } return data; } diff --git a/src/com/engine/thinktrans/service/impl/ReportCollectServiceImpl.java b/src/com/engine/thinktrans/service/impl/ReportCollectServiceImpl.java index 92cadc9..05b7be2 100644 --- a/src/com/engine/thinktrans/service/impl/ReportCollectServiceImpl.java +++ b/src/com/engine/thinktrans/service/impl/ReportCollectServiceImpl.java @@ -1,6 +1,7 @@ package com.engine.thinktrans.service.impl; import com.engine.core.impl.Service; +import com.engine.thinktrans.entity.PersonnelSizeTop; import com.engine.thinktrans.entity.ReportChildrenData; import com.engine.thinktrans.entity.ReportColumns; import com.engine.thinktrans.entity.param.TendencyReportParam; @@ -13,12 +14,11 @@ import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.hrm.company.DepartmentComInfo; +import java.text.DecimalFormat; import java.time.LocalDate; import java.time.Year; import java.time.YearMonth; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -119,6 +119,131 @@ public class ReportCollectServiceImpl extends Service implements ReportCollectSe .build(); } + @Override + public TendencyReportVO getPersonnelSize(Integer year) { + List columns = getPSReportColumns(); + List addList = new ArrayList<>(); + List addRate = new ArrayList<>(); + List datas = getPersonnelSizeData(year,addList,addRate); + return TendencyReportVO.builder() + .columns(columns) + .datas(datas) + .build(); + } + + @Override + public Map getTop(Integer year) { + Map result = new HashMap<>(4); + List addList = new ArrayList<>(); + List addRate = new ArrayList<>(); + if (year == null) { + year = Year.now().getValue(); + } + getPersonnelSizeData(year,addList,addRate); + List pstList = new ArrayList<>(); + + RecordSet rs = new RecordSet(); + String startYear = CommonDateUtil.getYearDayFirst(year); + String endYear = CommonDateUtil.getYearDayEnd(year); + int sumStart = 0; + int sumEnd = 0; + int entrySum = 0; + int leaveSum = 0; + rs.executeQuery("select count(1) as sumstart from hrmresource where status < 4 and companystartdate <= ?",startYear); + if (rs.next()) { + sumStart = Util.getIntValue(rs.getString("sumstart")); + } + rs.executeQuery("select count(1) as sumend from hrmresource where status < 4 and companystartdate <= ?",endYear); + if (rs.next()) { + sumEnd = Util.getIntValue(rs.getString("sumend")); + } + rs.executeQuery("select count(1) as entrysum from hrmresource where companystartdate >= ? and companystartdate <= ?",startYear,endYear); + if (rs.next()) { + entrySum = Util.getIntValue(rs.getString("entrysum")); + } + rs.executeQuery("select count(1) as leavesum from hrmstatushistory where type_n = 5 and changedate >= ? and changedate <= ?",startYear,endYear); + if (rs.next()) { + leaveSum = Util.getIntValue(rs.getString("leavesum")); + } + int addPerson = entrySum - leaveSum; + + String rate = calculateRate(addRate,addPerson,sumStart); + + pstList.add(PersonnelSizeTop.builder().title("年初人数").count(sumStart).color("#67c29a").build()); + pstList.add(PersonnelSizeTop.builder().title("累计入职人数").count(entrySum).color("#9c5113").build()); + pstList.add(PersonnelSizeTop.builder().title("累计离职人数").count(leaveSum).color("#e26b0a").build()); + pstList.add(PersonnelSizeTop.builder().title("年末人数").count(sumEnd).color("#35889c").build()); + pstList.add(PersonnelSizeTop.builder().title("净增长率").count(rate).color("#f6d262").build()); + result.put("pstTop",pstList); + result.put("list",addList); + result.put("rate",addRate); + return result; + } + + private List getPersonnelSizeData(Integer year, List addList, List addRate) { + RecordSet rs = new RecordSet(); + List result = new ArrayList<>(); + if (year == null) { + year = Year.now().getValue(); + } + List yearMonths = CommonDateUtil.getYearMonths(year); + for (int i = 0; i < yearMonths.size(); i++) { + List data = new ArrayList<>(); + String startMonth = CommonDateUtil.getFormatYear(CommonDateUtil.toDateStartOfMonth(yearMonths.get(i))); + String endMonth = CommonDateUtil.getFormatYear(CommonDateUtil.toDateEndOfMonth(yearMonths.get(i))); + int sumStart = 0; + int sumEnd = 0; + int entrySum = 0; + int leaveSum = 0; + data.add(String.format("%d 月",i+1)); + rs.executeQuery("select count(1) as sumstart from hrmresource where status < 4 and companystartdate <= ?",startMonth); + if (rs.next()) { + sumStart = Util.getIntValue(rs.getString("sumstart")); + } + rs.executeQuery("select count(1) as sumend from hrmresource where status < 4 and companystartdate <= ?",endMonth); + if (rs.next()) { + sumEnd = Util.getIntValue(rs.getString("sumend")); + } + rs.executeQuery("select count(1) as entrysum from hrmresource where companystartdate >= ? and companystartdate <= ?",startMonth,endMonth); + if (rs.next()) { + entrySum = Util.getIntValue(rs.getString("entrysum")); + } + rs.executeQuery("select count(1) as leavesum from hrmstatushistory where type_n = 5 and changedate >= ? and changedate <= ?",startMonth,endMonth); + if (rs.next()) { + leaveSum = Util.getIntValue(rs.getString("leavesum")); + } + int addPerson = entrySum - leaveSum; + + String rate = calculateRate(addRate,addPerson,sumStart); + addList.add(String.valueOf(addPerson)); + + data.add(String.valueOf(sumStart)); + data.add(String.valueOf(entrySum)); + data.add(String.valueOf(leaveSum)); + data.add(String.valueOf(addPerson)); + data.add(String.valueOf(sumEnd)); + data.add(rate); + result.add(ReportChildrenData.builder().data(data).build()); + } + + return result; + + + } + + + private List getPSReportColumns() { + List columns = new ArrayList<>(); + columns.add(ReportColumns.builder().title("月份").key("0").build()); + columns.add(ReportColumns.builder().title("期初人数").key("1").build()); + columns.add(ReportColumns.builder().title("入职人数").key("2").build()); + columns.add(ReportColumns.builder().title("离职人数").key("3").build()); + columns.add(ReportColumns.builder().title("净增长人数").key("4").build()); + columns.add(ReportColumns.builder().title("期末人数").key("5").build()); + columns.add(ReportColumns.builder().title("净增长率").key("6").build()); + return columns; + } + @SneakyThrows private ReportChildrenData getOnJobChildrenData(Integer id, List countList) { RecordSet rs = new RecordSet(); @@ -246,5 +371,25 @@ public class ReportCollectServiceImpl extends Service implements ReportCollectSe .orElse(new ArrayList<>()); } + /** + * 求比例 + * @return + */ + private String calculateRate(List addRate,int add,int sum) { + String rate; + if (sum != 0) { + double rt = (double) add * 100 / sum; + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + decimalFormat.setRoundingMode(java.math.RoundingMode.HALF_UP); + rate = decimalFormat.format(rt) + "%"; + addRate.add(decimalFormat.format(rt)); + }else { + rate = String.valueOf(add * 100) +"%"; + addRate.add(String.valueOf(add * 100)); + } + + return rate; + } + } diff --git a/src/com/engine/thinktrans/service/impl/ReportExportServiceImpl.java b/src/com/engine/thinktrans/service/impl/ReportExportServiceImpl.java index 84fa389..1a7d193 100644 --- a/src/com/engine/thinktrans/service/impl/ReportExportServiceImpl.java +++ b/src/com/engine/thinktrans/service/impl/ReportExportServiceImpl.java @@ -83,4 +83,30 @@ public class ReportExportServiceImpl extends Service implements ReportExportServ excelSheetData.addAll(rows); return ExcelUtil.genWorkbook(excelSheetData, sheetName); } + + @Override + public XSSFWorkbook personnelSizeExport(Integer year) { + TendencyReportVO personTendency = getReportCollectService(user).getPersonnelSize(year); + + // 1.工作簿名称 + String sheetName = "公司人员规模分析"; + // 2.表头(后面动态获取) + List> excelSheetData = new ArrayList<>(); + + List columns = personTendency.getColumns(); + String[] header = columns.stream() + .map(ReportColumns::getTitle) + .toArray(String[]::new); + + excelSheetData.add(Arrays.asList(header)); + + //数据 + List datas = personTendency.getDatas(); + List> rows = datas.stream() + .map(data -> (List) new ArrayList(data.getData())) + .collect(Collectors.toList()); + + excelSheetData.addAll(rows); + return ExcelUtil.genWorkbook(excelSheetData, sheetName); + } } diff --git a/src/com/engine/thinktrans/util/CommonDateUtil.java b/src/com/engine/thinktrans/util/CommonDateUtil.java index e8b1476..9477210 100644 --- a/src/com/engine/thinktrans/util/CommonDateUtil.java +++ b/src/com/engine/thinktrans/util/CommonDateUtil.java @@ -104,4 +104,13 @@ public class CommonDateUtil { return sdf.format(calendar.getTime()); } + public static String getYearDayEnd(Integer year) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.add(Calendar.DAY_OF_MONTH, -1); + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMATTER_PATTERN); + return sdf.format(calendar.getTime()); + } + } diff --git a/src/com/engine/thinktrans/util/ExcelUtil.java b/src/com/engine/thinktrans/util/ExcelUtil.java index 085b5a0..631b8fb 100644 --- a/src/com/engine/thinktrans/util/ExcelUtil.java +++ b/src/com/engine/thinktrans/util/ExcelUtil.java @@ -48,7 +48,10 @@ public class ExcelUtil { if ("实时在职人数".equals(sheetName)){ sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 13)); - }else { + }else if ("公司人员规模分析".equals(sheetName)) { + sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 6)); + } + else { sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 12)); } diff --git a/src/com/engine/thinktrans/web/ReportCollectController.java b/src/com/engine/thinktrans/web/ReportCollectController.java index 675786f..bf6d3b0 100644 --- a/src/com/engine/thinktrans/web/ReportCollectController.java +++ b/src/com/engine/thinktrans/web/ReportCollectController.java @@ -17,6 +17,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import java.util.Map; /** * @Author liang.cheng @@ -49,5 +50,21 @@ public class ReportCollectController { return new ResponseResult(user).run(getReportCollectService(user) :: getOnJobStatistics); } + @GET + @Path("/personnelSize") + @Produces(MediaType.APPLICATION_JSON) + public String getPersonnelSize(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam("year") Integer year) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getReportCollectService(user) :: getPersonnelSize,year); + } + + @GET + @Path("/top") + @Produces(MediaType.APPLICATION_JSON) + public String getTop(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam("year") Integer year) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getReportCollectService(user) :: getTop,year); + } + } diff --git a/src/com/engine/thinktrans/web/ReportExportController.java b/src/com/engine/thinktrans/web/ReportExportController.java index e29863f..5137faa 100644 --- a/src/com/engine/thinktrans/web/ReportExportController.java +++ b/src/com/engine/thinktrans/web/ReportExportController.java @@ -77,4 +77,25 @@ public class ReportExportController { response.setContentType("application/octet-stream"); return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } + + @GET + @Path("/personnelSize/export") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response personnelSizeExport(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam("year") Integer year) { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getReportExportService(user).personnelSizeExport(year); + String time = LocalDate.now().toString(); + String fileName = "公司人员规模报表" + time; + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + } }