You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
9.7 KiB
Java
235 lines
9.7 KiB
Java
3 months ago
|
package com.engine.wysecond.service.impl;
|
||
|
|
||
|
import com.engine.core.impl.Service;
|
||
|
import com.engine.wysecond.entity.*;
|
||
|
import com.engine.wysecond.service.PostionMatrixService;
|
||
|
import com.weaver.general.Util;
|
||
|
import lombok.SneakyThrows;
|
||
|
import weaver.conn.RecordSet;
|
||
|
import weaver.hrm.company.DepartmentComInfo;
|
||
|
import weaver.hrm.resource.ResourceComInfo;
|
||
|
|
||
|
import java.text.ParseException;
|
||
|
import java.text.SimpleDateFormat;
|
||
|
import java.util.*;
|
||
|
import java.util.stream.Collectors;
|
||
|
|
||
|
/**
|
||
|
* @Author liang.cheng
|
||
|
* @Date 2025/2/26 10:04
|
||
|
* @Description:
|
||
|
* @Version 1.0
|
||
|
*/
|
||
|
public class PostionMatrixServiceImpl extends Service implements PostionMatrixService {
|
||
|
|
||
|
@SneakyThrows
|
||
|
@Override
|
||
|
public PostionMatrixVo postionMatrix() {
|
||
|
|
||
|
PostionMatrixVo postionMatrixVo = new PostionMatrixVo();
|
||
|
|
||
|
RecordSet rs = new RecordSet();
|
||
|
//1.人员信息获取
|
||
|
List<ResourcesPo> resourcesList = new ArrayList<>();
|
||
|
ResourceComInfo resource = new ResourceComInfo();
|
||
|
rs.executeQuery("select xm,szbm,ywzwxl,ywzwcj,rbywzwcjqssj from uf_ywzwxx where rbywzwcjqssj is not null");
|
||
|
while (rs.next()) {
|
||
|
resourcesList.add(ResourcesPo.builder()
|
||
|
.resourceId(Util.null2String(rs.getString("xm")))
|
||
|
.resource(resource.getLastname(Util.null2String(rs.getString("xm"))))
|
||
|
.department(Util.null2String(rs.getString("szbm")))
|
||
|
.postionType(Util.null2String(rs.getString("ywzwxl")))
|
||
|
.postion(Util.null2String(rs.getString("ywzwcj")))
|
||
|
.workDate(Util.null2String(rs.getString("rbywzwcjqssj")))
|
||
|
.build());
|
||
|
}
|
||
|
|
||
|
//过滤后数据
|
||
|
List<ResourcesPo> resourcesPoList = filterClosestWorkDate(resourcesList);
|
||
|
|
||
|
//2.报表岗位层级数据
|
||
|
LinkedList<Postion> tops = new LinkedList<>();
|
||
|
rs.executeQuery("select id,ywzwxl,ywzwcj from uf_ywzwcj");
|
||
|
while (rs.next()) {
|
||
|
tops.add(Postion.builder()
|
||
|
.id(Util.null2String(rs.getString("id")))
|
||
|
.postionType(Util.getIntValue(rs.getString("ywzwxl")))
|
||
|
.postionName(Util.null2String(rs.getString("ywzwcj")))
|
||
|
.build());
|
||
|
}
|
||
|
|
||
|
|
||
|
//3.双层循环构造中间数据
|
||
|
LinkedList<PostionPeople> centers = new LinkedList<>();
|
||
|
DepartmentComInfo dept = new DepartmentComInfo();
|
||
|
Map<String, List<ResourcesPo>> groupedByDepartment = resourcesPoList.stream()
|
||
|
.collect(Collectors.groupingBy(ResourcesPo::getDepartment));
|
||
|
for (Map.Entry<String, List<ResourcesPo>> entry : groupedByDepartment.entrySet()) {
|
||
|
String department = entry.getKey();
|
||
|
List<ResourcesPo> poList = entry.getValue();
|
||
|
|
||
|
//职能管理序列
|
||
|
List<ResourcesPo> fDatasAll = poList.stream()
|
||
|
.filter(po -> ("1".equals(po.getPostionType()) && department.equals(po.getDepartment())))
|
||
|
.collect(Collectors.toList());
|
||
|
|
||
|
LinkedList<PeoplesAndNames> fDatas = new LinkedList<>();
|
||
|
for (int i = 0; i < tops.size(); i++) {
|
||
|
Postion postion = tops.get(i);
|
||
|
List<ResourcesPo> collect = fDatasAll.stream()
|
||
|
.filter(po -> postion.getId().equals(po.getPostionType()))
|
||
|
.collect(Collectors.toList());
|
||
|
String names = collect.stream()
|
||
|
.map(ResourcesPo::getResource)
|
||
|
.collect(Collectors.joining("、"));
|
||
|
|
||
|
fDatas.add(PeoplesAndNames.builder()
|
||
|
.peoples(collect.size())
|
||
|
.names(names)
|
||
|
.build());
|
||
|
}
|
||
|
|
||
|
//专业技术序列
|
||
|
List<ResourcesPo> sDatasAll = poList.stream()
|
||
|
.filter(po -> ("2".equals(po.getPostionType()) && department.equals(po.getDepartment())))
|
||
|
.collect(Collectors.toList());
|
||
|
LinkedList<PeoplesAndNames> sDatas = new LinkedList<>();
|
||
|
for (int i = 0; i < tops.size(); i++) {
|
||
|
Postion postion = tops.get(i);
|
||
|
List<ResourcesPo> collect = sDatasAll.stream()
|
||
|
.filter(po -> postion.getId().equals(po.getPostionType()))
|
||
|
.collect(Collectors.toList());
|
||
|
String names = collect.stream()
|
||
|
.map(ResourcesPo::getResource)
|
||
|
.collect(Collectors.joining("、"));
|
||
|
|
||
|
sDatas.add(PeoplesAndNames.builder()
|
||
|
.peoples(collect.size())
|
||
|
.names(names)
|
||
|
.build());
|
||
|
}
|
||
|
|
||
|
int row = 1;
|
||
|
if (fDatasAll.size() > 0 && sDatasAll.size() > 0) {
|
||
|
row = 2;
|
||
|
}
|
||
|
|
||
|
centers.add(PostionPeople.builder()
|
||
|
.name(dept.getDepartmentName(department))
|
||
|
.row(row)
|
||
|
.fsum(fDatasAll.size())
|
||
|
.ssum(sDatasAll.size())
|
||
|
.fdatas(fDatas)
|
||
|
.sdatas(sDatas)
|
||
|
.build());
|
||
|
}
|
||
|
|
||
|
//4.底部合计数据
|
||
|
LinkedList<PeopleSums> footers = new LinkedList<>();
|
||
|
//1.职能管理序列
|
||
|
LinkedList<Integer> zndatas = new LinkedList<>();
|
||
|
for (int i = 0; i < tops.size(); i++) {
|
||
|
Postion postion = tops.get(i);
|
||
|
rs.executeQuery("select xm,rbywzwcjqssj from uf_ywzwxx where ywzwxl = 1 " +
|
||
|
" and ywzwcj = ? and rbywzwcjqssj is not null",postion.getId());
|
||
|
List<ResourcesPo> resourcesPos = new ArrayList<>();
|
||
|
while (rs.next()) {
|
||
|
resourcesPos.add(ResourcesPo.builder()
|
||
|
.resourceId(Util.null2String(rs.getString("xm")))
|
||
|
.workDate(Util.null2String(rs.getString("rbywzwcjqssj"))).build());
|
||
|
}
|
||
|
|
||
|
List<ResourcesPo> filterAll = filterClosestWorkDate(resourcesPos);
|
||
|
zndatas.add(filterAll.size());
|
||
|
//名单列 增加null代替不展示
|
||
|
zndatas.add(null);
|
||
|
if (i == tops.size() - 1) {
|
||
|
//增加合计值 todo
|
||
|
zndatas.add(null);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
footers.add(PeopleSums.builder().type("职能管理序列").datas(zndatas).build());
|
||
|
|
||
|
//2.专业管理序列
|
||
|
LinkedList<Integer> zydatas = new LinkedList<>();
|
||
|
for (int i = 0; i < tops.size(); i++) {
|
||
|
Postion postion = tops.get(i);
|
||
|
rs.executeQuery("select xm,rbywzwcjqssj from uf_ywzwxx where ywzwxl = 2 " +
|
||
|
" and ywzwcj = ? and rbywzwcjqssj is not null",postion.getId());
|
||
|
List<ResourcesPo> resourcesPos = new ArrayList<>();
|
||
|
while (rs.next()) {
|
||
|
resourcesPos.add(ResourcesPo.builder()
|
||
|
.resourceId(Util.null2String(rs.getString("xm")))
|
||
|
.workDate(Util.null2String(rs.getString("rbywzwcjqssj"))).build());
|
||
|
}
|
||
|
|
||
|
List<ResourcesPo> filterAll = filterClosestWorkDate(resourcesPos);
|
||
|
zydatas.add(filterAll.size());
|
||
|
//名单列 增加null代替不展示
|
||
|
zydatas.add(null);
|
||
|
if (i == tops.size() - 1) {
|
||
|
//增加合计值 todo
|
||
|
zydatas.add(null);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
footers.add(PeopleSums.builder().type("专业技术序列").datas(zydatas).build());
|
||
|
|
||
|
//3.总计
|
||
|
LinkedList<Integer> zjdatas = new LinkedList<>();
|
||
|
for (int i = 0; i < tops.size(); i++) {
|
||
|
Postion postion = tops.get(i);
|
||
|
|
||
|
rs.executeQuery("select xm,rbywzwcjqssj from uf_ywzwxx where ywzwcj = ? and rbywzwcjqssj is not null",postion.getId());
|
||
|
List<ResourcesPo> resourcesPos = new ArrayList<>();
|
||
|
while (rs.next()) {
|
||
|
resourcesPos.add(ResourcesPo.builder()
|
||
|
.resourceId(Util.null2String(rs.getString("xm")))
|
||
|
.workDate(Util.null2String(rs.getString("rbywzwcjqssj"))).build());
|
||
|
}
|
||
|
|
||
|
List<ResourcesPo> filterAll = filterClosestWorkDate(resourcesPos);
|
||
|
zjdatas.add(filterAll.size());
|
||
|
//名单列 增加null代替不展示
|
||
|
zjdatas.add(null);
|
||
|
if (i == tops.size() - 1) {
|
||
|
//增加合计值 todo
|
||
|
zjdatas.add(null);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
footers.add(PeopleSums.builder().type("总计").datas(zjdatas).build());
|
||
|
|
||
|
return PostionMatrixVo.builder().tops(tops).centers(centers).footers(footers).build();
|
||
|
}
|
||
|
|
||
|
private static List<ResourcesPo> filterClosestWorkDate(List<ResourcesPo> resourcesPos) {
|
||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
||
|
// 按 resourceId 分组
|
||
|
Map<String, List<ResourcesPo>> groupedByResource = resourcesPos.stream()
|
||
|
.collect(Collectors.groupingBy(ResourcesPo::getResourceId));
|
||
|
|
||
|
List<ResourcesPo> result = new ArrayList<>();
|
||
|
// 遍历分组结果
|
||
|
groupedByResource.forEach((resource, group) -> {
|
||
|
try {
|
||
|
// 找出该分组中 workDate 最大(最近)的元素
|
||
|
Optional<ResourcesPo> maxDatePo = group.stream()
|
||
|
.max(Comparator.comparing(po -> {
|
||
|
try {
|
||
|
return sdf.parse(po.getWorkDate());
|
||
|
} catch (ParseException e) {
|
||
|
throw new RuntimeException(e);
|
||
|
}
|
||
|
}));
|
||
|
maxDatePo.ifPresent(result::add);
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
});
|
||
|
return result;
|
||
|
|
||
|
}
|
||
|
}
|