UnmeasureTemperatureAlarmTask.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. package com.jpsoft.smart.schduled;
  2. import com.jpsoft.smart.config.WxConfig;
  3. import com.jpsoft.smart.modules.base.entity.*;
  4. import com.jpsoft.smart.modules.base.service.*;
  5. import com.jpsoft.smart.modules.business.entity.WorkAttendance;
  6. import com.jpsoft.smart.modules.business.service.WorkAttendanceService;
  7. import com.jpsoft.smart.modules.common.utils.WechatMessageUtil;
  8. import com.sun.corba.se.spi.orbutil.threadpool.Work;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.joda.time.DateTime;
  12. import org.joda.time.Days;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.scheduling.annotation.Async;
  15. import org.springframework.scheduling.annotation.Scheduled;
  16. import org.springframework.stereotype.Component;
  17. import java.text.ParseException;
  18. import java.text.SimpleDateFormat;
  19. import java.util.Date;
  20. import java.util.List;
  21. import java.util.UUID;
  22. @Component
  23. @Slf4j
  24. public class UnmeasureTemperatureAlarmTask {
  25. @Autowired
  26. private AlarmConfigService alarmConfigService;
  27. @Autowired
  28. private WarningPusherService warningPusherService;
  29. @Autowired
  30. private PersonDeviceFilterLogService personDeviceFilterLogService;
  31. @Autowired
  32. private CompanyInfoService companyInfoService;
  33. @Autowired
  34. private WorkAttendanceService workAttendanceService;
  35. @Autowired
  36. private PersonDeviceLogService personDeviceLogService;
  37. @Autowired
  38. private WxConfig wxConfig;
  39. public int batchUpdate(String companyId,Date startDate,Date endDate) throws Exception {
  40. DateTime dt1 = new DateTime(startDate);
  41. DateTime dt2 = new DateTime(endDate);
  42. int days = Days.daysBetween(dt1,dt2).getDays();
  43. List<AlarmConfig> configList = alarmConfigService.findByCompanyId(companyId);
  44. CompanyInfo companyInfo = companyInfoService.get(companyId);
  45. workAttendanceService.deleteByCompanyCodeAndDate(companyInfo.getCode() + "%",startDate,endDate);
  46. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  47. int affectCount = 0;
  48. for (int i=0;i<days;i++){
  49. DateTime now = dt1.plusDays(i);
  50. String date = now.toString("yyyy-MM-dd");
  51. for (AlarmConfig alarmConfig : configList) {
  52. //是否工作日
  53. if (alarmConfig.getWeekdays().indexOf(String.valueOf(now.getDayOfWeek())) == -1) {
  54. continue;
  55. }
  56. DateTime startTime = new DateTime(sdf.parse(date + " " + alarmConfig.getStartTime()));
  57. DateTime attendanceTime = new DateTime(sdf.parse(date + " " + alarmConfig.getAttendanceTime()));
  58. DateTime endTime = new DateTime(sdf.parse(date + " " + alarmConfig.getEndTime()));
  59. if (alarmConfig.getClassifier().equals(1)) {
  60. //todo 上班考勤
  61. //准时上班
  62. affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.SUCCESS);
  63. //迟到
  64. affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.LATE);
  65. //缺卡
  66. affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
  67. } else {
  68. //todo 下班考勤
  69. //早退
  70. affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.LEAVE_EARLY);
  71. //准时下班
  72. affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.SUCCESS);
  73. //缺卡
  74. affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
  75. }
  76. }
  77. }
  78. return affectCount;
  79. }
  80. //每5分钟执行一次
  81. @Scheduled(cron="0 0/5 * * * ?")
  82. public void run() {
  83. int intervalMinute = 5;
  84. List<AlarmConfig> configList = alarmConfigService.list();
  85. DateTime now = DateTime.now();
  86. String date = now.toString("yyyy-MM-dd");
  87. int weekday = now.getDayOfWeek();
  88. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  89. for (AlarmConfig alarmConfig : configList) {
  90. try {
  91. String weekdays = alarmConfig.getWeekdays();
  92. DateTime startTime = new DateTime(sdf.parse(date + " " + alarmConfig.getStartTime()));
  93. DateTime attendanceTime = new DateTime(sdf.parse(date + " " + alarmConfig.getAttendanceTime()));
  94. DateTime endTime = new DateTime(sdf.parse(date + " " + alarmConfig.getEndTime()));
  95. DateTime alarmTime = attendanceTime.plusMinutes(-10);
  96. //开始时间
  97. if (weekdays.indexOf(String.valueOf(weekday)) != -1) {
  98. //todo 考勤时间提前10分钟通知人员
  99. if (now.compareTo(alarmTime)>=0 && now.compareTo(alarmTime.plusMinutes(intervalMinute))<0) {
  100. //todo 通知个人
  101. noticePerson(alarmConfig,startTime,attendanceTime,endTime);
  102. }
  103. //todo 考勤时间已到
  104. if (now.compareTo(attendanceTime)>=0 && now.compareTo(attendanceTime.plusMinutes(intervalMinute))<0) {
  105. //todo 未测量人通知管理人员
  106. if(alarmConfig.getClassifier().equals(1)){
  107. //上班
  108. noticeManager(alarmConfig,startTime,attendanceTime);
  109. }
  110. //todo 记录考勤
  111. if (alarmConfig.getClassifier().equals(1)) {
  112. //上班时间前打卡算正常上班
  113. recordAttendance(alarmConfig, startTime.toDate(), attendanceTime.toDate(), WorkAttendance.SUCCESS);
  114. }
  115. else{
  116. //下班时间前打卡算早退
  117. recordAttendance(alarmConfig, startTime.toDate(), attendanceTime.toDate(), WorkAttendance.LEAVE_EARLY);
  118. }
  119. }
  120. //todo 截止时间已到
  121. if (now.compareTo(endTime)>=0 && now.compareTo(endTime.plusMinutes(intervalMinute))<0) {
  122. if(alarmConfig.getClassifier().equals(2)){
  123. //下班
  124. noticeManager(alarmConfig,attendanceTime,endTime);
  125. }
  126. //todo 记录考勤
  127. if (alarmConfig.getClassifier().equals(1)) {
  128. //上班时间后截止时间前打卡算迟到
  129. recordAttendance(alarmConfig, attendanceTime.toDate(), endTime.toDate(),WorkAttendance.LATE);
  130. }
  131. else{
  132. //下班时间后截止时间前打卡算正常下班
  133. recordAttendance(alarmConfig, attendanceTime.toDate(), endTime.toDate(),WorkAttendance.SUCCESS);
  134. }
  135. //未到开始截止时间内打开算旷工
  136. recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
  137. }
  138. }
  139. }
  140. catch (Exception ex){
  141. log.error(ex.getMessage(),ex);
  142. }
  143. }
  144. }
  145. /**
  146. * 记录未考勤人员
  147. * @param alarmConfig
  148. * @param startDate
  149. * @param endDate
  150. * @param result
  151. */
  152. private int recordUnAttendance(AlarmConfig alarmConfig, Date startDate,Date attendanceDate, Date endDate, String result) {
  153. int affectCount = 0;
  154. CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
  155. String companyCode = companyInfo.getCode();
  156. if (alarmConfig.getSubordinate() != null && alarmConfig.getSubordinate()) {
  157. companyCode += "%";
  158. }
  159. //todo 查询该单位当前时间段未考勤人员列表
  160. List<PersonInfo> attendanceList = personDeviceLogService.queryUnAttendanceList(companyCode, startDate, endDate);
  161. for (PersonInfo personInfo : attendanceList) {
  162. WorkAttendance workAttendance = new WorkAttendance();
  163. workAttendance.setId(UUID.randomUUID().toString());
  164. workAttendance.setPersonId(personInfo.getId());
  165. workAttendance.setAlarmConfigId(alarmConfig.getId());
  166. workAttendance.setCreateTime(new Date());
  167. workAttendance.setRecordTime(attendanceDate);
  168. workAttendance.setResult(result);
  169. workAttendance.setDelFlag(false);
  170. affectCount+= workAttendanceService.insert(workAttendance);
  171. }
  172. return affectCount;
  173. }
  174. /**
  175. * 记录考勤
  176. * @param alarmConfig
  177. */
  178. private int recordAttendance(AlarmConfig alarmConfig,Date startDate,Date endDate,String result) {
  179. CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
  180. String companyCode = companyInfo.getCode();
  181. if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){
  182. companyCode += "%";
  183. }
  184. int affectCount = 0;
  185. //todo 查询该单位当前时间段考勤人员列表
  186. List<PersonInfo> attendanceList = personDeviceLogService.queryAttendanceList(companyCode,startDate,endDate);
  187. for (PersonInfo personInfo: attendanceList) {
  188. WorkAttendance workAttendance = new WorkAttendance();
  189. workAttendance.setId(UUID.randomUUID().toString());
  190. workAttendance.setPersonId(personInfo.getId());
  191. workAttendance.setAlarmConfigId(alarmConfig.getId());
  192. workAttendance.setCreateTime(new Date());
  193. workAttendance.setResult(result);
  194. workAttendance.setDelFlag(false);
  195. List<PersonDeviceLog> logList = personDeviceLogService.findByPersonAndDate(personInfo.getId(),startDate,endDate);
  196. if (logList.size()>0) {
  197. PersonDeviceLog personDeviceLog = null;
  198. if (alarmConfig.getClassifier().equals(1)) {
  199. //上班算最早一次考勤
  200. personDeviceLog = logList.get(0);
  201. } else {
  202. //下班算最迟一次考勤
  203. personDeviceLog = logList.get(logList.size()-1);
  204. }
  205. workAttendance.setRecordTime(personDeviceLog.getRecordTime());
  206. workAttendance.setTemperature(personDeviceLog.getTemperature());
  207. }
  208. affectCount += workAttendanceService.insert(workAttendance);
  209. }
  210. return affectCount;
  211. }
  212. @Async
  213. public void noticePerson(AlarmConfig alarmConfig, DateTime startTime, DateTime attendanceTime,DateTime endTime) {
  214. CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
  215. String companyCode = companyInfo.getCode();
  216. if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){
  217. companyCode += "%";
  218. }
  219. //todo 查询该单位当前时间段是否有人员未测体温
  220. List<PersonInfo> unmeasuredList = personDeviceLogService.queryUnAttendanceList(companyCode,startTime.toDate(),endTime.toDate());
  221. if (unmeasuredList.size()==0){
  222. return;
  223. }
  224. //todo 给未测量人推送微信通知
  225. for (PersonInfo personInfo : unmeasuredList) {
  226. if (personInfo.getWechatNoticeEnabled()!=null
  227. && personInfo.getWechatNoticeEnabled()
  228. && StringUtils.isNotEmpty(personInfo.getOpenId())) {
  229. String message = "尊敬的用户:" + personInfo.getName();
  230. if (alarmConfig.getClassifier()!=null && alarmConfig.getClassifier().equals(1)){
  231. message += ",请在" + startTime.toString("HH:mm") + "至" + attendanceTime.toString("HH:mm") + "时间内测量体温!";
  232. }
  233. else{
  234. message += ",请在" + attendanceTime.toString("HH:mm") + "至" + endTime.toString("HH:mm") + "时间内测量体温!";
  235. }
  236. WechatMessageUtil.sendUnmeasureAlarmInfo(personInfo.getOpenId(), companyInfo.getName(), message, wxConfig.getAppId(), wxConfig.getAppSecret());
  237. }
  238. }
  239. }
  240. @Async
  241. public void noticeManager(AlarmConfig alarmConfig, DateTime startTime, DateTime endTime) {
  242. CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
  243. String companyCode = companyInfo.getCode();
  244. if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){
  245. companyCode += "%";
  246. }
  247. //todo 查询该单位当前时间段是否有人员未测体温
  248. List<PersonInfo> unmeasuredList = personDeviceLogService.queryUnAttendanceList(companyCode,startTime.toDate(),endTime.toDate());
  249. if (unmeasuredList.size()==0){
  250. return;
  251. }
  252. StringBuilder sb = new StringBuilder();
  253. int total = 0;
  254. //todo 汇总未测温人
  255. for (PersonInfo personInfo : unmeasuredList) {
  256. if (sb.length() != 0) {
  257. sb.append(",");
  258. }
  259. sb.append(personInfo.getName());
  260. total++;
  261. }
  262. //todo 查询该单位的通知人
  263. List<WarningPusher> pusherList = warningPusherService.findByCompanyId(companyInfo.getId());
  264. //todo 给单位相关人员推送通知
  265. for (WarningPusher pusher: pusherList) {
  266. if (StringUtils.isNotEmpty(pusher.getOpenId())
  267. && pusher.getMissingNoticeEnabled()!=null && pusher.getMissingNoticeEnabled()) {
  268. String message = "尊敬的用户:" + pusher.getName()
  269. + ",当天时段" + startTime.toString("HH:mm") + "至" + endTime.toString("HH:mm")
  270. + ",有" + total + "人未测量体温。名单如下:" + sb.toString();
  271. WechatMessageUtil.sendUnmeasureAlarmInfo(
  272. pusher.getOpenId(),
  273. companyInfo.getName(),
  274. message, wxConfig.getAppId(), wxConfig.getAppSecret());
  275. }
  276. }
  277. }
  278. public static void main(String[] args) {
  279. Boolean result = null;
  280. if (result){
  281. System.out.println("yes");
  282. }
  283. else{
  284. System.out.println("no");
  285. }
  286. }
  287. }