ScheduleController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package com.template.controller;
  2. import com.seewo.open.sdk.DefaultSeewoClient;
  3. import com.seewo.open.sdk.SeewoClient;
  4. import com.seewo.open.sdk.auth.Account;
  5. import com.template.common.utils.TimeExchange;
  6. import com.template.config.ScheduleConfig;
  7. import com.template.config.SeewoConfig;
  8. import com.template.model.pojo.SmartAttendance;
  9. import com.template.model.pojo.SmartClass;
  10. import com.template.model.pojo.SmartUser;
  11. import com.template.model.result.CommonResult;
  12. import com.template.model.seewo.*;
  13. import com.template.services.SmartAttendanceService;
  14. import com.template.services.SmartClassService;
  15. import com.template.services.SmartUserService;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.scheduling.annotation.Async;
  18. import org.springframework.scheduling.annotation.Scheduled;
  19. import org.springframework.stereotype.Component;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import javax.annotation.Resource;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Optional;
  26. @Component
  27. //@EnableAsync
  28. public class ScheduleController {
  29. @Resource
  30. private SeewoConfig seewoConfig;
  31. @Resource
  32. private ScheduleConfig scheduleConfig;
  33. @Autowired
  34. private SmartClassService smartClassService;
  35. @Autowired
  36. private SmartUserService smartUserService;
  37. @Autowired
  38. private SmartAttendanceService smartAttendanceService;
  39. /**
  40. * @Scheduled注解会在默认情况下以单线程的方式执行定时任务。 这个“单线程”指两个方面:
  41. * 如果一个定时任务执行时间大于其任务间隔时间,那么下一次将会等待上一次执行结束后再继续执行。
  42. * 如果多个定时任务在同一时刻执行,任务会依次执行。
  43. * @Async:对某个方法进行异步执行
  44. * @EnableAsync:开启异步支持
  45. */
  46. //定时格式参考:https://blog.csdn.net/java13992394428/article/details/108740453
  47. /**
  48. * 每天八点自动派单
  49. * 周六周日定时器不生效
  50. * 其余时间都是早上八点前捞一遍当前时间以前的单子
  51. * 有合适的维修师傅就把单子派给维修师傅
  52. * 周一到周五早上七点执行:0 0 7 ? * MON-FRI
  53. * 周一到周五1、2、3、4、5、6、7、18、19、20、21、22点执行:0 0 1,2,3,4,5,6,7,18,19,20,21,22 ? * MON-FRI
  54. */
  55. //凌晨两点:0 0 2 * * ?
  56. //每小时执行一次:0 0 */1 * * ?
  57. //每分钟执行一次:0 */1 * * * ?
  58. //周一到周五早上七点执行:0 0 7 ? * MON-FRI
  59. @Async
  60. @Scheduled(cron = "0 */1 * * * ? ")
  61. @Transactional(rollbackFor = {Exception.class})
  62. public void autoDispatch() throws Exception {
  63. if (scheduleConfig.getIsOpen().equals("1")) {
  64. List<SmartAttendance> attendances = new ArrayList<>();
  65. List<SmartUser> students = smartUserService.queryStudentDatas();
  66. //循环班级的classUid
  67. List<SmartClass> classes = smartClassService.getSmartClasss();
  68. //当天已存在的考勤数据 判断是否重复使用
  69. List<SmartAttendance> attendanceList = smartAttendanceService.queryAttendances(TimeExchange.getStartOfDayStr(new Date()), TimeExchange.getEndOfDayStr(new Date()));
  70. for (SmartClass data : classes) {
  71. //region 获取考勤事件ID
  72. //初始化客户端
  73. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  74. AttendanceRuleListEventByClazzParam kParam = new AttendanceRuleListEventByClazzParam();
  75. //响应体,MimeType为 application/json
  76. AttendanceRuleListEventByClazzParam.RequestBody kRequestBody = AttendanceRuleListEventByClazzParam.RequestBody.builder()
  77. .build();
  78. kParam.setRequestBody(kRequestBody);
  79. //query
  80. AttendanceRuleListEventByClazzParam.Query kQuery = AttendanceRuleListEventByClazzParam.Query.builder()
  81. .appId(seewoConfig.getAppId())
  82. .schoolUid(seewoConfig.getSchoolId())
  83. .date(TimeExchange.getDate())
  84. .classUid(data.getClassUid())
  85. .page(1)
  86. .pageSize(20)
  87. .build();
  88. kRequestBody.setQuery(kQuery);
  89. kParam.setRequestBody(kRequestBody);
  90. AttendanceRuleListEventByClazzRequest kRequest = new AttendanceRuleListEventByClazzRequest(kParam);
  91. System.out.println("入参:" + kRequest);
  92. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  93. //request.setServerUrl("https://openapi.test.seewo.com")
  94. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  95. AttendanceRuleListEventByClazzResult kResult = seewoClient.invoke(kRequest);
  96. System.out.println("出参:" + kResult);
  97. //考勤事件ID
  98. List<String> eventIds = new ArrayList<>();
  99. if (kResult != null && kResult.getResponseBody().getCode().equals("000000")) {
  100. List<AttendanceRuleListEventByClazzResult.EventsItem> eventItems = kResult.getResponseBody().getData().getEvents();
  101. for (AttendanceRuleListEventByClazzResult.EventsItem eventItem : eventItems) {
  102. eventIds.add(eventItem.getRuleId());
  103. }
  104. }
  105. //endregion
  106. for (String eventId : eventIds) {
  107. /**
  108. * 定时获取考勤
  109. */
  110. //初始化客户端
  111. //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  112. AttendanceServiceListAttendClassRecordsParam param = new AttendanceServiceListAttendClassRecordsParam();
  113. //响应体,MimeType为 application/json
  114. AttendanceServiceListAttendClassRecordsParam.RequestBody requestBody = AttendanceServiceListAttendClassRecordsParam.RequestBody.builder()
  115. .build();
  116. param.setRequestBody(requestBody);
  117. //query
  118. AttendanceServiceListAttendClassRecordsParam.Query query = AttendanceServiceListAttendClassRecordsParam.Query.builder()
  119. .eventId(eventId)//考勤事件ID 固定写死
  120. .attendDate(TimeExchange.getDate())//考勤日期
  121. .appId(seewoConfig.getAppId())//appid
  122. .grade(1)//年级序号
  123. .classUid(data.getClassUid())//班级uid 班级uid与年级序号、班级序号二选一确定具体的班级,如果都填以classUid为准
  124. .schoolUid(seewoConfig.getSchoolId())//学校uid
  125. .attendType(1)//考勤类型 时间考勤(默认):1 课程考勤:2
  126. .build();
  127. requestBody.setQuery(query);
  128. param.setRequestBody(requestBody);
  129. AttendanceServiceListAttendClassRecordsRequest request = new AttendanceServiceListAttendClassRecordsRequest(param);
  130. System.out.println("入参:" + request);
  131. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  132. //request.setServerUrl("https://openapi.test.seewo.com")
  133. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  134. AttendanceServiceListAttendClassRecordsResult result = seewoClient.invoke(request);
  135. System.out.println("出参:" + result);
  136. if (result != null && result.getResponseBody().getCode().equals("000000")) {
  137. String userUid = "";
  138. List<AttendanceServiceListAttendClassRecordsResult.RecordsItem> items = result.getResponseBody().getData().getRecords();
  139. if (students != null && students.size() > 0) {
  140. for (AttendanceServiceListAttendClassRecordsResult.RecordsItem item : items) {
  141. Optional<SmartUser> student = students.stream().filter(e -> e.getXwStudentUid().equals(item.getUserUid())).findFirst();
  142. if(student != null && student.isPresent()){
  143. Optional<SmartAttendance> existData = attendanceList.stream().filter(e -> e.getUserId().equals(student.get().getId())
  144. && e.getClassId().equals(student.get().getSchoolClass()) && e.getAttendTime().equals(TimeExchange.StringToDate((TimeExchange.getDate() + " " + item.getAttendTime()),"yyyy-MM-dd HH:mm:ss"))).findFirst();
  145. if(!(existData != null && existData.isPresent())){
  146. SmartAttendance attendance = new SmartAttendance();
  147. attendance.setUserId(student.get().getId());
  148. attendance.setUserUid(item.getUserUid());
  149. attendance.setClassId(student.get().getSchoolClass());
  150. attendance.setClassUid(result.getResponseBody().getData().getClassUid());
  151. attendance.setXwUserName(item.getUserName());
  152. attendance.setXwStudentCode(item.getStudentCode());
  153. attendance.setAttendTime(TimeExchange.StringToDate((TimeExchange.getDate() + " " + item.getAttendTime()),"yyyy-MM-dd HH:mm:ss"));
  154. attendance.setStatus(item.getStatus());
  155. attendances.add(attendance);
  156. }
  157. }
  158. }
  159. }
  160. }
  161. }
  162. }
  163. if(attendances.size() > 0){
  164. smartAttendanceService.saveBatch(attendances);
  165. }
  166. }
  167. }
  168. }