12-17-人员管理大屏-修复循环注入版-修复timeType版-消息回复-完善-修复版

This commit is contained in:
2025-12-17 19:47:48 +08:00
parent 5de6dff86b
commit c5bf75a6eb

View File

@ -50,6 +50,7 @@ import org.dromara.project.service.*;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysOssService;
import org.dromara.system.service.ISysUserService;
import org.dromara.websocket.ChatServerHandler;
@ -63,6 +64,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@ -111,6 +113,8 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
private final ISysUserService userService;
private final SysUserMapper userMapper;
private final ChatServerHandler chatServerHandler;
// private final ISubUserSalaryDetailService userSalaryDetailService;
@ -2788,6 +2792,8 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
List<SubConstructionUser> list = constructionUserService.list(lqw);
//再去从聊天服务中获取在线的ID
List<String> onlineUserList = ChatServerHandler.getOnlineUserList();
//先查询出用户列表
List<SysUserVo> users = userMapper.selectVoList(Wrappers.lambdaQuery());
//构建将要返回的 数据
List<SysUserVo> info = new ArrayList<>();
long zx = 0; //在线
@ -2803,26 +2809,46 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
zx++;
//此项目 在线的 userId 去获取缓存的坐标信息 GpsEquipmentServiceImpl.setData()
String key = "rydw_userId_:" + constructionUser.getSysUserId();
SysUserVo cacheUserVo = RedisUtils.getCacheObject(key);
if (cacheUserVo == null){
org.dromara.gps.domain.bo.GpsEquipmentSonBo cache = RedisUtils.getCacheObject(key);
if (cache == null){
continue;
}
SysUserVo cacheSysUserVo = null;
for (SysUserVo user : users) {
if (user.getUserId().equals(constructionUser.getSysUserId())){
cacheSysUserVo = user;
break;
}
}
if (cacheSysUserVo == null){
continue;
}
cacheSysUserVo.setJd(cache.getLocLongitude());
cacheSysUserVo.setWd(cache.getLocLatitude());
cacheSysUserVo.setZhdwsj(cache.getCreateTime());
cacheSysUserVo.setAvatarUrl(cache.getAvatar());
cacheSysUserVo.setGz(constructionUser.getTypeOfWork());
//去判断是什么种类的用户
list.stream().filter(item -> item.getSysUserId().equals(constructionUser.getSysUserId()))
.findFirst().ifPresent(item -> {
SysUserVo sysUserVo = userService.queryById(item.getSysUserId());
if (sysUserVo != null){
//app用户类型 0-施工人员 1-管理人员 2-分包人员
if (sysUserVo.getAppUserType().equals("0")){
cacheUserVo.setJslx("施工");
sg.set(sg.getAndIncrement()+1);
}else if (sysUserVo.getAppUserType().equals("2")){
cacheUserVo.setJslx("分包");
fb.set(fb.getAndIncrement()+1);
}
}
});
info.add(cacheUserVo);
// list.stream().filter(item -> item.getSysUserId().equals(constructionUser.getSysUserId()))
// .findFirst().ifPresent(item -> {
// //app用户类型 0-施工人员 1-管理人员 2-分包人员
// if (cacheSysUserVo.getAppUserType().equals("0")){
// cacheSysUserVo.setJslx("施工");
// sg.set(sg.getAndIncrement()+1);
// }else if (cacheSysUserVo.getAppUserType().equals("2")){
// cacheSysUserVo.setJslx("分包");
// fb.set(fb.getAndIncrement()+1);
// }
// });
//app用户类型 0-施工人员 1-管理人员 2-分包人员
if (cacheSysUserVo.getAppUserType().equals("0")){
cacheSysUserVo.setJslx("施工");
sg.set(sg.getAndIncrement()+1);
}else if (cacheSysUserVo.getAppUserType().equals("2")){
cacheSysUserVo.setJslx("分包");
fb.set(fb.getAndIncrement()+1);
}
info.add(cacheSysUserVo);
}else {
lx++;
}
@ -2849,16 +2875,28 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
LambdaQueryWrapper<SubConstructionUser> lqw = new LambdaQueryWrapper<>();
lqw.eq(SubConstructionUser::getProjectId, projectId);
List<SubConstructionUser> list = constructionUserService.list(lqw);
//先查询出用户列表
List<SysUserVo> users = userMapper.selectVoList(Wrappers.lambdaQuery());
//根据分包和班组的id进行分类 统计都有多少人 未入场人员没有两项数据 无法统计 仅能计算为总数
List<RyglWebSocketVo> fbList = new ArrayList<>();
List<RyglWebSocketVo> bzList = new ArrayList<>();
for (SubConstructionUser constructionUser : list) {
//统计该项目下的分包和班组各应有多少人
SysUserVo sysUserVo = userService.queryById(constructionUser.getSysUserId());
SysUserVo sysUserVo = null;
for (SysUserVo user : users) {
if (user.getUserId().equals(constructionUser.getSysUserId())){
sysUserVo = user;
break;
}
}
if (sysUserVo == null){
continue;
}
// SysUserVo sysUserVo = userService.queryById(constructionUser.getSysUserId());
// if (sysUserVo == null){
// continue;
// }
//判断userType app用户类型 0-施工人员 1-管理人员 2-分包人员
if (sysUserVo.getAppUserType().equals("0")){
checkAndSetValue(bzList,constructionUser,0,timeType,projectId);
@ -2898,12 +2936,23 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
}
//总人数
if (timeType == 2L) {
// 获取本周一到今天的天数
LocalDate today = LocalDate.now();
LocalDate monday = today.with(DayOfWeek.MONDAY);
timeType = ChronoUnit.DAYS.between(monday, today) + 1;
} else if (timeType == 3L) {
// 获取本月1日到今天的天数
LocalDate today = LocalDate.now();
LocalDate firstDay = today.withDayOfMonth(1);
timeType = ChronoUnit.DAYS.between(firstDay, today) + 1;
}
zrs = (long) list.size() * timeType;
//总出勤人
cqr = fbcqr + bzcqr;
//出勤率
if (zrs != 0L){
cql = (BigDecimal.valueOf(fbcqr).add(BigDecimal.valueOf(bzcqr))).divide(BigDecimal.valueOf(zrs),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
cql = ((BigDecimal.valueOf(fbcqr).add(BigDecimal.valueOf(bzcqr)))).divide(BigDecimal.valueOf(zrs),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
}
@ -2919,10 +2968,16 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
*/
private void checkAndSetValue(List<RyglWebSocketVo> ryglWebSocketVoList, SubConstructionUser info,int type,Long time,Long projectId){
//timeType 1:今天 2:本周 3:本月 此参数的校验放在连接时获取参数进行校验
if (time == 2L){
time = 7L;
}else if (time == 3L){
time = 30L;
if (time == 2L) {
// 获取本周一到今天的天数
LocalDate today = LocalDate.now();
LocalDate monday = today.with(DayOfWeek.MONDAY);
time = ChronoUnit.DAYS.between(monday, today) + 1;
} else if (time == 3L) {
// 获取本月1日到今天的天数
LocalDate today = LocalDate.now();
LocalDate firstDay = today.withDayOfMonth(1);
time = ChronoUnit.DAYS.between(firstDay, today) + 1;
}
Long finalTime = time;