123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- 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<AlarmConfig> 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<days;i++){
- DateTime now = dt1.plusDays(i);
- String date = now.toString("yyyy-MM-dd");
- for (AlarmConfig alarmConfig : configList) {
- //是否工作日
- if (alarmConfig.getWeekdays().indexOf(String.valueOf(now.getDayOfWeek())) == -1) {
- continue;
- }
- 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()));
- if (alarmConfig.getClassifier().equals(1)) {
- //todo 上班考勤
- //准时上班
- affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.SUCCESS);
- //迟到
- affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.LATE);
- //缺卡
- affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
- } else {
- //todo 下班考勤
- //早退
- affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.LEAVE_EARLY);
- //准时下班
- affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.SUCCESS);
- //缺卡
- affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
- }
- }
- }
- return affectCount;
- }
- //每5分钟执行一次
- @Scheduled(cron="0 0/5 * * * ?")
- public void run() {
- int intervalMinute = 5;
- List<AlarmConfig> 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<PersonInfo> 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<PersonInfo> 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<PersonDeviceLog> 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<PersonInfo> 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<PersonInfo> 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<WarningPusher> 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");
- }
- }
- }
|