diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index cf110288c..33a489f1d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -30,7 +30,8 @@ or (TIMESTAMPDIFF(HOUR, a.nad_time, now()) >= 168 and a.worker_classify = 1)) then '核酸已超时' else '核酸未超时' end) as acid_status_name, wt.type_name, - if(wap.id is not null,1,2) presence + if(wap.id is not null,1,2) presence, + su.user_id as noticeUserId from worker_info a LEFT JOIN team_info b ON a.team_id = b.id LEFT JOIN department_info c ON a.department_id = c.id @@ -39,6 +40,7 @@ LEFT JOIN dictionaries_record e ON a.job_name = e.id LEFT JOIN enterprise_info en ON en.id = a.enterprise_id LEFT JOIN worker_attendance_presence wap ON wap.person_sn = a.person_sn + left join system_user su on su.worker_id = a.id join (select * from worker_attendance where 1=1 @@ -48,6 +50,12 @@ and create_time>=current_date group by person_sn ) wa on wa.person_sn = a.person_sn WHERE 1 = 1 + + and su.user_id in + + #{item} + + and a.id = #{param.id} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index eb775592c..bafbebbfa 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -185,7 +185,7 @@ public class WorkerInfoServiceImpl extends ServiceImpl statsDangerType(@Param("param") Map paramMap); + /** + * 获取超时的整改记录 + * + * @param projectSn + * @return + */ + List getWorkerSafeWatchTimeOutList(@Param("projectSn") String projectSn); } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz.security/mapper/xml/XzSecurityQualityInspectionRecordMapper.xml b/src/main/java/com/zhgd/xmgl/modules/xz.security/mapper/xml/XzSecurityQualityInspectionRecordMapper.xml index 018727b25..d8ef5f1ca 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz.security/mapper/xml/XzSecurityQualityInspectionRecordMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/xz.security/mapper/xml/XzSecurityQualityInspectionRecordMapper.xml @@ -53,9 +53,6 @@ and t.level = #{param.level} - - and t.status = #{param.status} - and t.urgent_level = #{param.urgentLevel} @@ -111,7 +108,7 @@ and t.status = #{param.status} - and t.change_limit_time current_date and t.status != 5 + and t.change_limit_time current_date and t.status != 5 and t.status != 6 and ( t.region_name like concat('%', @@ -279,7 +276,7 @@ and (t.status = 2 AND now() > t.change_limit_time) - and t.status != 5 + and t.status != 5 and t.status !=6 and t.level = #{param.enumType} @@ -322,7 +319,7 @@ and t.change_limit_time current_date - and t.status != 5 + and t.status != 5 and t.status != 6 and t.urgent_level = #{param.urgentLevel} @@ -694,4 +691,21 @@ )t2 on t1.year = t2.year and t1.month + 1 = t2.month or (t1.year + 1 = t2.year and t1.month = 12 and t2.month = 1) + + diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzWorkerSafeWatchAlarmController.java b/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzWorkerSafeWatchAlarmController.java index cccd1b9f3..fc66e0a53 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzWorkerSafeWatchAlarmController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzWorkerSafeWatchAlarmController.java @@ -77,7 +77,7 @@ public class XzWorkerSafeWatchAlarmController { Page page = PageUtil.getPage(map); queryWrapper.lambda().orderByDesc(XzWorkerSafeWatchAlarm::getAlarmTime); IPage pageList = xzWorkerSafeWatchAlarmService.page(page, queryWrapper); - String [] typeName = {"人员日常考勤", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过", "同一企业同一隐患连续检查到(x)次"}; + String[] typeName = {"人员日常考勤", "每个项目自检任务", "一个月内缺勤超过", "一个月内迟到超过", "同一企业同一隐患连续检查到(x)次", "一级安全隐患未整改超过(x)分钟", "一级安全隐患未复查超过(x)分钟", "一级安全隐患未核验超过(x)分钟", "二级安全隐患未整改超过(x)分钟", "二级安全隐患未复查超过(x)分钟", "二级安全隐患未核验超过(x)分钟", "三级安全隐患未整改超过(x)分钟", "三级安全隐患未复查超过(x)分钟", "三级安全隐患未核验超过(x)分钟", "四级安全隐患未整改超过(x)分钟", "四级安全隐患未复查超过(x)分钟", "四级安全隐患未核验超过(x)分钟"}; for (XzWorkerSafeWatchAlarm record : pageList.getRecords()) { record.setType(typeName[Integer.parseInt(record.getType()) - 1]); } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchAlarm.java b/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchAlarm.java index 062db0695..45e04b2a0 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchAlarm.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchAlarm.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -85,4 +86,8 @@ public class XzWorkerSafeWatchAlarm implements Serializable { */ @ApiModelProperty(value = "项目sn") private String projectSn; + + @TableField(exist = false) + @ApiModelProperty(value = "用户ID") + private Long userId; } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchConfig.java b/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchConfig.java index 4818ccb8a..89ccd56f0 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchConfig.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/entity/XzWorkerSafeWatchConfig.java @@ -32,16 +32,16 @@ public class XzWorkerSafeWatchConfig implements Serializable { @ApiModelProperty(value = "安全履职配置id") private Long id; /** - * 安全履职规则类型 + * 安全履职规则类型,6一级未整改、7级未复查、8一级未核验、9二级未整改、10二级未复查、11二级未核验、12三级未整改、13三级未复查、14三级未核验、15四级未整改、16四级未复查、17四级未核验 */ @Excel(name = "安全履职规则类型", width = 15) @ApiModelProperty(value = "安全履职规则类型") private String type; /** - * 连续未履职(天数) + * 连续未履职(天数)(或时间或次数) */ - @Excel(name = "连续未履职(天数)", width = 15) - @ApiModelProperty(value = "连续未履职(天数)") + @Excel(name = "连续未履职(天数)(或时间或次数)", width = 15) + @ApiModelProperty(value = "连续未履职(天数)(或时间或次数)") private Integer dayNum; /** * 项目sn diff --git a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java index fa443a07c..37238ba76 100644 --- a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java +++ b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.xmgl.modules.basicdata.entity.Notice; @@ -32,6 +33,7 @@ import com.zhgd.xmgl.modules.worker.service.IWorkerAttendancePresenceService; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.IWorkerCertificateService; import com.zhgd.xmgl.modules.worker.service.IWorkerMonthAttendanceStatisticsService; +import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzCertificateExpireAlarmRecord; import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchAlarm; import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchConfig; @@ -48,9 +50,12 @@ import com.zhgd.xmgl.modules.xz.service.IXzWorkerSafeWatchConfigService; import com.zhgd.xmgl.modules.xz.service.IXzWorkerSafeWatchManagerService; import com.zhgd.xmgl.modules.xz.service.impl.XzCertificateExpireAlarmRecordServiceImpl; import com.zhgd.xmgl.util.ElecardUtil; +import com.zhgd.xmgl.util.MapBuilder; +import com.zhgd.xmgl.util.NumberUtils; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -58,6 +63,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -71,6 +77,8 @@ import java.util.stream.Collectors; @RestController @RequestMapping("xmgl/task") public class WorkerTask { + @Autowired + WorkerInfoServiceImpl workerInfoService; @Autowired private ProjectExternalSystemServiceMapper projectExternalSystemServiceMapper; @Autowired @@ -81,10 +89,8 @@ public class WorkerTask { private SystemUserMapper systemUserMapper; @Autowired private SystemLogoConfigMapper systemLogoConfigMapper; - @Autowired private IWorkerAttendancePresenceService workerAttendancePresenceService; - @Autowired private INoticeService noticeService; @Autowired @@ -95,28 +101,20 @@ public class WorkerTask { private WorkerCertificateMapper workerCertificateMapper; @Autowired private WorkerBlacklistMapper workerBlacklistMapper; - @Autowired private XzCertificateExpireAlarmRecordServiceImpl xzCertificateExpireAlarmRecordService; - @Autowired private IXzWorkerSafeWatchConfigService xzWorkerSafeWatchConfigService; - @Autowired private IWorkerMonthAttendanceStatisticsService workerMonthAttendanceStatisticsService; - @Autowired private XzSecurityQualityInspectionRecordMapper xzSecurityQualityInspectionRecordMapper; - @Autowired private IWorkerAttendanceService workerAttendanceService; - @Autowired private IXzWorkerSafeWatchAlarmService xzWorkerSafeWatchAlarmService; - @Autowired private IXzWorkerSafeWatchManagerService xzWorkerSafeWatchManagerService; - @Autowired private XzSecurityInspectTaskRecordMapper xzSecurityInspectTaskRecordMapper; @Autowired @@ -294,11 +292,15 @@ public class WorkerTask { int day = DateUtil.dayOfMonth(new Date()); for (Project project : projects) { if (project.getEnableWorkerSafeWatch() != null && project.getEnableWorkerSafeWatch() == 1) { + List list = xzWorkerSafeWatchConfigService.list(Wrappers.lambdaQuery() + .eq(XzWorkerSafeWatchConfig::getProjectSn, project.getProjectSn())); + workerSafeWatchAlarmForHidden(list, project); + if (true) { + continue; + } if (StringUtils.isNotBlank(project.getWorkerSafeWatchTime()) && DateUtil.format(new Date(), "HH:mm").equals( DateUtil.format(DateUtil.parseTime(project.getWorkerSafeWatchTime()), "HH:mm"))) { - List list = xzWorkerSafeWatchConfigService.list(Wrappers.lambdaQuery() - .eq(XzWorkerSafeWatchConfig::getProjectSn, project.getProjectSn())); List alarmList = new ArrayList<>(); List noticeList = new ArrayList<>(); for (XzWorkerSafeWatchConfig xzWorkerSafeWatchConfig : list) { @@ -494,6 +496,180 @@ public class WorkerTask { } + private void workerSafeWatchAlarmForHidden(List list, Project project) { + //(定制)安全履职预警增加规则,一、二、三、四级安全隐患预警规则,分级对未整改、未复查、未核验超过多少时间进行循环通知。 + List alarmList = new ArrayList<>(); + List noticeList = new ArrayList<>(); + Map typeToConfigMap = list.stream().collect(Collectors.toMap(XzWorkerSafeWatchConfig::getType, Function.identity())); + List records = xzSecurityQualityInspectionRecordMapper.getWorkerSafeWatchTimeOutList(project.getProjectSn()); + if (CollUtil.isEmpty(records)) { + return; + } + Map> configIdToNoticeUserIdsMap = xzWorkerSafeWatchManagerService.list().stream().collect(Collectors.toMap(XzWorkerSafeWatchManager::getWatchConfigId, e -> { + return new HashSet<>(StrUtil.split(e.getUserId(), ",")); + }, (e, e2) -> { + e.addAll(e2); + return e; + })); + for (XzSecurityQualityInspectionRecord record : records) { + Integer level = record.getLevel(); + Integer status = record.getStatus(); + Integer minute = getMinute(level, status, typeToConfigMap); + if (minute == null) { + continue; + } + XzWorkerSafeWatchConfig config = getXzWorkerSafeWatchConfig(level, status, typeToConfigMap); + if (config == null) { + continue; + } + Long alarmUserId = getAlarmWorkerId(record); + Integer safeWatchAlarmExceedMinute = record.getSafeWatchAlarmExceedMinute(); + if (safeWatchAlarmExceedMinute >= minute) { + Integer mod = NumberUtils.mod(safeWatchAlarmExceedMinute, minute); + if (mod == 0) { + HashSet noticeUserIds = configIdToNoticeUserIdsMap.get(config.getId()); + String now = DateUtil.now(); + if (CollUtil.isNotEmpty(noticeUserIds)) { + for (String userId : noticeUserIds) { + //报警 + Notice notice = new Notice(); + notice.setType("35"); + notice.setMsg(StrUtil.format("有一条{}{}安全隐患预警,设置的预警时间是{}分钟,现在已超时{}分钟", getLevelName(level), getStatusName(status), minute, safeWatchAlarmExceedMinute)); + notice.setAccountId(Long.valueOf(userId)); + notice.setTitle("安全隐患预警"); + notice.setSendTime(now); + noticeList.add(notice); + } + } + + XzWorkerSafeWatchAlarm alarm = new XzWorkerSafeWatchAlarm(); + alarm.setType(getSafeType(level, status)); + alarm.setDayNum(safeWatchAlarmExceedMinute); + alarm.setAlarmTime(DateUtil.parse(now)); + alarm.setUserId(alarmUserId); + alarm.setProjectSn(project.getProjectSn()); + alarmList.add(alarm); + } + } + } + Set userIdSet = alarmList.stream().map(XzWorkerSafeWatchAlarm::getUserId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(userIdSet)) { + IPage workerInfoList = workerInfoService.selectWorkerInfoList(new MapBuilder().put("userIdList", userIdSet).build()); + List workerInfoListRecords = workerInfoList.getRecords(); + Map userIdMap = workerInfoListRecords.stream().collect(Collectors.toMap(WorkerInfo::getNoticeUserId, Function.identity(), (workerInfo, workerInfo2) -> workerInfo)); + for (XzWorkerSafeWatchAlarm alarm : alarmList) { + WorkerInfo workerInfo = userIdMap.get(alarm.getUserId()); + if (workerInfo != null) { + alarm.setWorkerId(workerInfo.getId()); + alarm.setWorkerName(workerInfo.getWorkerName()); + alarm.setEnterpriseId(workerInfo.getEnterpriseId()); + alarm.setEnterpriseName(workerInfo.getEnterpriseName()); + alarm.setDeptName(Objects.equals(workerInfo.getPersonType(), 1) ? workerInfo.getTeamName() : workerInfo.getDepartmentName()); + } + } + } + if (CollUtil.isNotEmpty(alarmList)) { + xzWorkerSafeWatchAlarmService.saveBatch(alarmList); + } + if (CollUtil.isNotEmpty(noticeList)) { + noticeService.saveBatch(noticeList); + } + } + + private Long getAlarmWorkerId(XzSecurityQualityInspectionRecord record) { + if (record.getStatus() == 2) { + return record.getChangeId(); + } else if (record.getStatus() == 3) { + return record.getReviewId(); + } else { + return record.getVerifyManId(); + } + } + + private String getStatusName(Integer status) { + if (status == null) { + return ""; + } + switch (status) { + case 2: + return "未整改"; + case 3: + return "未复查"; + case 4: + return "未核验"; + default: + return ""; + } + } + + private String getLevelName(Integer level) { + if (level == null) { + return ""; + } + switch (level) { + case 1: + return "一级"; + case 2: + return "二级"; + case 3: + return "三级"; + case 4: + return "四级"; + default: + return ""; + } + } + + private Integer getMinute(Integer level, Integer status, Map typeMap) { + if (level == null || status == null) { + return Integer.MAX_VALUE; + } + //6一级未整改、7一级未复查、8一级未核验、9二级未整改、10二级未复查、11二级未核验、12三级未整改、13三级未复查、14三级未核验、15四级未整改、16四级未复查、17四级未核验 + //1一级,2二级,3三级,4四级 + //2待整改,3待复查,4待核验,5合格 + XzWorkerSafeWatchConfig config = getXzWorkerSafeWatchConfig(level, status, typeMap); + if (config == null) { + return null; + } + return config.getDayNum(); + } + + @Nullable + private XzWorkerSafeWatchConfig getXzWorkerSafeWatchConfig(Integer level, Integer status, Map typeMap) { + XzWorkerSafeWatchConfig config = null; + config = typeMap.get(getSafeType(level, status)); + return config; + } + + private String getSafeType(Integer level, Integer status) { + if (level == 1 && status == 2) { + return "6"; + } else if (level == 1 && status == 3) { + return "7"; + } else if (level == 1 && status == 4) { + return "8"; + } else if (level == 2 && status == 2) { + return "9"; + } else if (level == 2 && status == 3) { + return "10"; + } else if (level == 2 && status == 4) { + return "11"; + } else if (level == 3 && status == 2) { + return "12"; + } else if (level == 3 && status == 3) { + return "13"; + } else if (level == 3 && status == 4) { + return "14"; + } else if (level == 4 && status == 2) { + return "15"; + } else if (level == 4 && status == 3) { + return "16"; + } else if (level == 4 && status == 4) { + return "17"; + } + return ""; + } + /** * 添加通知 * @@ -558,20 +734,4 @@ public class WorkerTask { } } - /** - * (定制)安全履职预警增加规则,一、二、三、四级安全隐患预警规则,分级对未整改、未复查、未核验超过多少时间进行循环通知。 - */ - @Scheduled(cron = "0 0/1 * * * ?") - @RequestMapping("/workerSafeWatchAlarmForHidden") - public void workerSafeWatchAlarmForHidden() { - //List list = xzWorkerSafeWatchConfigService.list(Wrappers.lambdaQuery() - // .eq(XzWorkerSafeWatchConfig::getProjectSn, project.getProjectSn())); - -// xzSecurityQualityInspectionRecordMapper.getWorkerSafeWatchAlarmList(); - //有一条四级未整改安全隐患预警,设置超时的时间是4分钟 - -//SELECT * FROM xz_security_quality_inspection_record WHERE inspect_time = '2024-05-16 22:21:42'; -// -//select timestampdiff(MINUTE,'2024-05-16 22:21:42','2024-05-16 22:57:45') % 5; - } } diff --git a/src/main/java/com/zhgd/xmgl/util/NumberUtils.java b/src/main/java/com/zhgd/xmgl/util/NumberUtils.java index 9cbe63c0e..ba5966333 100644 --- a/src/main/java/com/zhgd/xmgl/util/NumberUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/NumberUtils.java @@ -92,6 +92,18 @@ public class NumberUtils { return b1 != null && b2 != null && b1.equals(b2); } + /** + * 取余 + * + * @return + */ + public static Integer mod(Integer b1, Integer b2) { + if (b1 == null || b2 == null) { + return null; + } + return b1 % b2; + } + /** * description: 使用 String.format 格式化数字,实现左侧补 0 *