package com.jpsoft.smart.schduled; import com.jpsoft.smart.config.WxConfig; import com.jpsoft.smart.modules.base.entity.*; import com.jpsoft.smart.modules.base.service.*; import com.jpsoft.smart.modules.business.entity.WorkAttendance; import com.jpsoft.smart.modules.business.service.WorkAttendanceService; import com.jpsoft.smart.modules.common.utils.WechatMessageUtil; import com.sun.corba.se.spi.orbutil.threadpool.Work; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.Days; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.UUID; @Component @Slf4j public class UnmeasureTemperatureAlarmTask { @Autowired private AlarmConfigService alarmConfigService; @Autowired private WarningPusherService warningPusherService; @Autowired private PersonDeviceFilterLogService personDeviceFilterLogService; @Autowired private CompanyInfoService companyInfoService; @Autowired private WorkAttendanceService workAttendanceService; @Autowired private PersonDeviceLogService personDeviceLogService; @Autowired private WxConfig wxConfig; public int batchUpdate(String companyId,Date startDate,Date endDate) throws Exception { DateTime dt1 = new DateTime(startDate); DateTime dt2 = new DateTime(endDate); int days = Days.daysBetween(dt1,dt2).getDays(); List configList = alarmConfigService.findByCompanyId(companyId); CompanyInfo companyInfo = companyInfoService.get(companyId); workAttendanceService.deleteByCompanyCodeAndDate(companyInfo.getCode() + "%",startDate,endDate); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); int affectCount = 0; for (int i=0;i configList = alarmConfigService.list(); DateTime now = DateTime.now(); String date = now.toString("yyyy-MM-dd"); int weekday = now.getDayOfWeek(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); for (AlarmConfig alarmConfig : configList) { try { String weekdays = alarmConfig.getWeekdays(); DateTime startTime = new DateTime(sdf.parse(date + " " + alarmConfig.getStartTime())); DateTime attendanceTime = new DateTime(sdf.parse(date + " " + alarmConfig.getAttendanceTime())); DateTime endTime = new DateTime(sdf.parse(date + " " + alarmConfig.getEndTime())); DateTime alarmTime = attendanceTime.plusMinutes(-10); //开始时间 if (weekdays.indexOf(String.valueOf(weekday)) != -1) { //todo 考勤时间提前10分钟通知人员 if (now.compareTo(alarmTime)>=0 && now.compareTo(alarmTime.plusMinutes(intervalMinute))<0) { //todo 通知个人 noticePerson(alarmConfig,startTime,attendanceTime,endTime); } //todo 考勤时间已到 if (now.compareTo(attendanceTime)>=0 && now.compareTo(attendanceTime.plusMinutes(intervalMinute))<0) { //todo 未测量人通知管理人员 if(alarmConfig.getClassifier().equals(1)){ //上班 noticeManager(alarmConfig,startTime,attendanceTime); } //todo 记录考勤 if (alarmConfig.getClassifier().equals(1)) { //上班时间前打卡算正常上班 recordAttendance(alarmConfig, startTime.toDate(), attendanceTime.toDate(), WorkAttendance.SUCCESS); } else{ //下班时间前打卡算早退 recordAttendance(alarmConfig, startTime.toDate(), attendanceTime.toDate(), WorkAttendance.LEAVE_EARLY); } } //todo 截止时间已到 if (now.compareTo(endTime)>=0 && now.compareTo(endTime.plusMinutes(intervalMinute))<0) { if(alarmConfig.getClassifier().equals(2)){ //下班 noticeManager(alarmConfig,attendanceTime,endTime); } //todo 记录考勤 if (alarmConfig.getClassifier().equals(1)) { //上班时间后截止时间前打卡算迟到 recordAttendance(alarmConfig, attendanceTime.toDate(), endTime.toDate(),WorkAttendance.LATE); } else{ //下班时间后截止时间前打卡算正常下班 recordAttendance(alarmConfig, attendanceTime.toDate(), endTime.toDate(),WorkAttendance.SUCCESS); } //未到开始截止时间内打开算旷工 recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING); } } } catch (Exception ex){ log.error(ex.getMessage(),ex); } } } /** * 记录未考勤人员 * @param alarmConfig * @param startDate * @param endDate * @param result */ private int recordUnAttendance(AlarmConfig alarmConfig, Date startDate,Date attendanceDate, Date endDate, String result) { int affectCount = 0; CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId()); String companyCode = companyInfo.getCode(); if (alarmConfig.getSubordinate() != null && alarmConfig.getSubordinate()) { companyCode += "%"; } //todo 查询该单位当前时间段未考勤人员列表 List attendanceList = personDeviceLogService.queryUnAttendanceList(companyCode, startDate, endDate); for (PersonInfo personInfo : attendanceList) { WorkAttendance workAttendance = new WorkAttendance(); workAttendance.setId(UUID.randomUUID().toString()); workAttendance.setPersonId(personInfo.getId()); workAttendance.setAlarmConfigId(alarmConfig.getId()); workAttendance.setCreateTime(new Date()); workAttendance.setRecordTime(attendanceDate); workAttendance.setResult(result); workAttendance.setDelFlag(false); affectCount+= workAttendanceService.insert(workAttendance); } return affectCount; } /** * 记录考勤 * @param alarmConfig */ private int recordAttendance(AlarmConfig alarmConfig,Date startDate,Date endDate,String result) { CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId()); String companyCode = companyInfo.getCode(); if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){ companyCode += "%"; } int affectCount = 0; //todo 查询该单位当前时间段考勤人员列表 List attendanceList = personDeviceLogService.queryAttendanceList(companyCode,startDate,endDate); for (PersonInfo personInfo: attendanceList) { WorkAttendance workAttendance = new WorkAttendance(); workAttendance.setId(UUID.randomUUID().toString()); workAttendance.setPersonId(personInfo.getId()); workAttendance.setAlarmConfigId(alarmConfig.getId()); workAttendance.setCreateTime(new Date()); workAttendance.setResult(result); workAttendance.setDelFlag(false); List logList = personDeviceLogService.findByPersonAndDate(personInfo.getId(),startDate,endDate); if (logList.size()>0) { PersonDeviceLog personDeviceLog = null; if (alarmConfig.getClassifier().equals(1)) { //上班算最早一次考勤 personDeviceLog = logList.get(0); } else { //下班算最迟一次考勤 personDeviceLog = logList.get(logList.size()-1); } workAttendance.setRecordTime(personDeviceLog.getRecordTime()); workAttendance.setTemperature(personDeviceLog.getTemperature()); } affectCount += workAttendanceService.insert(workAttendance); } return affectCount; } @Async public void noticePerson(AlarmConfig alarmConfig, DateTime startTime, DateTime attendanceTime,DateTime endTime) { CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId()); String companyCode = companyInfo.getCode(); if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){ companyCode += "%"; } //todo 查询该单位当前时间段是否有人员未测体温 List unmeasuredList = personDeviceLogService.queryUnAttendanceList(companyCode,startTime.toDate(),endTime.toDate()); if (unmeasuredList.size()==0){ return; } //todo 给未测量人推送微信通知 for (PersonInfo personInfo : unmeasuredList) { if (personInfo.getWechatNoticeEnabled()!=null && personInfo.getWechatNoticeEnabled() && StringUtils.isNotEmpty(personInfo.getOpenId())) { String message = "尊敬的用户:" + personInfo.getName(); if (alarmConfig.getClassifier()!=null && alarmConfig.getClassifier().equals(1)){ message += ",请在" + startTime.toString("HH:mm") + "至" + attendanceTime.toString("HH:mm") + "时间内测量体温!"; } else{ message += ",请在" + attendanceTime.toString("HH:mm") + "至" + endTime.toString("HH:mm") + "时间内测量体温!"; } WechatMessageUtil.sendUnmeasureAlarmInfo(personInfo.getOpenId(), companyInfo.getName(), message, wxConfig.getAppId(), wxConfig.getAppSecret()); } } } @Async public void noticeManager(AlarmConfig alarmConfig, DateTime startTime, DateTime endTime) { CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId()); String companyCode = companyInfo.getCode(); if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){ companyCode += "%"; } //todo 查询该单位当前时间段是否有人员未测体温 List unmeasuredList = personDeviceLogService.queryUnAttendanceList(companyCode,startTime.toDate(),endTime.toDate()); if (unmeasuredList.size()==0){ return; } StringBuilder sb = new StringBuilder(); int total = 0; //todo 汇总未测温人 for (PersonInfo personInfo : unmeasuredList) { if (sb.length() != 0) { sb.append(","); } sb.append(personInfo.getName()); total++; } //todo 查询该单位的通知人 List pusherList = warningPusherService.findByCompanyId(companyInfo.getId()); //todo 给单位相关人员推送通知 for (WarningPusher pusher: pusherList) { if (StringUtils.isNotEmpty(pusher.getOpenId()) && pusher.getMissingNoticeEnabled()!=null && pusher.getMissingNoticeEnabled()) { String message = "尊敬的用户:" + pusher.getName() + ",当天时段" + startTime.toString("HH:mm") + "至" + endTime.toString("HH:mm") + ",有" + total + "人未测量体温。名单如下:" + sb.toString(); WechatMessageUtil.sendUnmeasureAlarmInfo( pusher.getOpenId(), companyInfo.getName(), message, wxConfig.getAppId(), wxConfig.getAppSecret()); } } } public static void main(String[] args) { Boolean result = null; if (result){ System.out.println("yes"); } else{ System.out.println("no"); } } }