新创元报表 公司人员规模分析

新创元报表
Chengliang 2 years ago
parent 7acfd26638
commit 1cc23736f7

@ -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<T> {
private String title;
private T count;
private String color;
}

@ -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<String,Object>
*/
Map<String,Object> getTop(Integer year);
}

@ -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);
}

@ -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<Object> 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<String> allSubDepartment = new ArrayList<>();
departmentComInfo.getAllChildDeptByDepId(allSubDepartment, String.valueOf(id));
allSubDepartment.add(String.valueOf(id));
String allId = StringUtils.join(allSubDepartment, ",");
List<YearMonth> 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;
}

@ -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<ReportColumns> columns = getPSReportColumns();
List<String> addList = new ArrayList<>();
List<String> addRate = new ArrayList<>();
List<ReportChildrenData> datas = getPersonnelSizeData(year,addList,addRate);
return TendencyReportVO.builder()
.columns(columns)
.datas(datas)
.build();
}
@Override
public Map<String, Object> getTop(Integer year) {
Map<String,Object> result = new HashMap<>(4);
List<String> addList = new ArrayList<>();
List<String> addRate = new ArrayList<>();
if (year == null) {
year = Year.now().getValue();
}
getPersonnelSizeData(year,addList,addRate);
List<PersonnelSizeTop> 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<ReportChildrenData> getPersonnelSizeData(Integer year, List<String> addList, List<String> addRate) {
RecordSet rs = new RecordSet();
List<ReportChildrenData> result = new ArrayList<>();
if (year == null) {
year = Year.now().getValue();
}
List<YearMonth> yearMonths = CommonDateUtil.getYearMonths(year);
for (int i = 0; i < yearMonths.size(); i++) {
List<String> 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<ReportColumns> getPSReportColumns() {
List<ReportColumns> 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<Integer> countList) {
RecordSet rs = new RecordSet();
@ -246,5 +371,25 @@ public class ReportCollectServiceImpl extends Service implements ReportCollectSe
.orElse(new ArrayList<>());
}
/**
*
* @return
*/
private String calculateRate(List<String> 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;
}
}

@ -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<List<Object>> excelSheetData = new ArrayList<>();
List<ReportColumns> columns = personTendency.getColumns();
String[] header = columns.stream()
.map(ReportColumns::getTitle)
.toArray(String[]::new);
excelSheetData.add(Arrays.asList(header));
//数据
List<ReportChildrenData> datas = personTendency.getDatas();
List<List<Object>> rows = datas.stream()
.map(data -> (List<Object>) new ArrayList<Object>(data.getData()))
.collect(Collectors.toList());
excelSheetData.addAll(rows);
return ExcelUtil.genWorkbook(excelSheetData, sheetName);
}
}

@ -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());
}
}

@ -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));
}

@ -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<String, TendencyReportVO>(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<Integer, TendencyReportVO>(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<Integer, Map<String,Object>>(user).run(getReportCollectService(user) :: getTop,year);
}
}

@ -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();
}
}

Loading…
Cancel
Save