AttendanceMessageTaskTest.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. package com.xjrsoft.module.job;
  2. import cn.hutool.core.util.IdUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.http.HttpUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  8. import com.xjrsoft.XjrSoftApplication;
  9. import com.xjrsoft.common.enums.WeChatType;
  10. import com.xjrsoft.common.utils.VoToColumnUtil;
  11. import com.xjrsoft.common.utils.WeChatUtil;
  12. import com.xjrsoft.config.CommonPropertiesConfig;
  13. import com.xjrsoft.module.attendance.entity.AttendanceMessageSet;
  14. import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
  15. import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
  16. import com.xjrsoft.module.attendance.service.IAttendanceMessageSetService;
  17. import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
  18. import com.xjrsoft.module.concat.service.IXjrUserService;
  19. import com.xjrsoft.module.holiday.entity.HolidayDate;
  20. import com.xjrsoft.module.holiday.service.IHolidayDateService;
  21. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  22. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  23. import com.xjrsoft.module.organization.service.IWeChatService;
  24. import com.xjrsoft.module.outint.entity.StudentOutInRecord;
  25. import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
  26. import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
  27. import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
  28. import com.xjrsoft.module.student.entity.BaseStudent;
  29. import com.xjrsoft.module.system.entity.WechatMessageLog;
  30. import com.xjrsoft.module.system.service.IWechatMessageLogService;
  31. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  32. import com.xjrsoft.module.teacher.entity.XjrUser;
  33. import org.junit.jupiter.api.Test;
  34. import org.junit.runner.RunWith;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.boot.test.context.SpringBootTest;
  37. import org.springframework.test.context.junit4.SpringRunner;
  38. import java.math.BigDecimal;
  39. import java.math.RoundingMode;
  40. import java.time.LocalDateTime;
  41. import java.time.format.DateTimeFormatter;
  42. import java.time.temporal.ChronoUnit;
  43. import java.util.ArrayList;
  44. import java.util.Collections;
  45. import java.util.HashMap;
  46. import java.util.List;
  47. import java.util.Map;
  48. import java.util.stream.Collectors;
  49. /**
  50. * @author dzx
  51. * @date 2024/5/23
  52. */
  53. @RunWith(SpringRunner.class)
  54. @SpringBootTest(classes = XjrSoftApplication.class)
  55. class AttendanceMessageTaskTest {
  56. @Autowired
  57. private IAttendanceMessageSetService messageSetService;
  58. @Autowired
  59. private IAttendanceRuleCategoryService ruleCategoryService;
  60. @Autowired
  61. private IHolidayDateService holidayDateService;
  62. @Autowired
  63. private IXjrUserService userService;
  64. @Autowired
  65. private IStudentOutInRecordService studentOutInRecordService;
  66. @Autowired
  67. private ITeacherOutInRecordService teachertOutInRecordService;
  68. @Autowired
  69. private IWeChatService weChatService;
  70. @Autowired
  71. private CommonPropertiesConfig commonPropertiesConfig;
  72. @Autowired
  73. private WeChatUtil weChatUtil;
  74. @Autowired
  75. private IWechatMessageLogService wechatMessageLogService;
  76. @Test
  77. void test3(){
  78. LocalDateTime recentlyTime = LocalDateTime.now().withHour(8).withMinute(5).withSecond(0).withNano(0);
  79. long outInRecords = teachertOutInRecordService.count(
  80. new MPJLambdaWrapper<TeacherOutInRecord>()
  81. .le(TeacherOutInRecord::getRecordTime, recentlyTime)
  82. .eq(TeacherOutInRecord::getStatus, 1)
  83. .eq(true,"DATE_FORMAT(record_time, '%Y-%m-%d')" , recentlyTime.toLocalDate())
  84. .groupBy(TeacherOutInRecord::getUserId)
  85. );
  86. System.out.println(outInRecords);
  87. }
  88. @Test
  89. void test2(){
  90. String wechatTemplate = "o-KboOcqcJ3YpjPN2xwgM_NcjN-0yzwWlDDXYfTM0Q4";
  91. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  92. weChatSendMessageDto.setTemplateId(wechatTemplate);
  93. JSONObject paramJson = new JSONObject();
  94. JSONObject thing6 = new JSONObject();
  95. thing6.put("value", "教职工");
  96. paramJson.put("thing6", thing6);
  97. JSONObject time11 = new JSONObject();
  98. time11.put("value", "2024-6-12 11:02:30");
  99. paramJson.put("time11", time11);
  100. JSONObject const23 = new JSONObject();
  101. const23.put("value", "上午考勤");
  102. paramJson.put("const23", const23);
  103. JSONObject character_string18 = new JSONObject();
  104. character_string18.put("value", "222");
  105. paramJson.put("character_string18", character_string18);
  106. JSONObject const3 = new JSONObject();
  107. const3.put("value", "出勤率 99%");
  108. paramJson.put("const3", const3);
  109. weChatSendMessageDto.setContent(paramJson);
  110. weChatSendMessageDto.setUrl(StrUtil.format("{}pages/attendance/teacher/index", commonPropertiesConfig.getDomainApp()));
  111. List<String> userList = new ArrayList<>();
  112. userList.add("oWZy-wec72H78ApagVBFomC5TNyw");
  113. userList.add("oWZy-wUTki8Vi7ao3Wn5JGNDauVI");
  114. for (String xjrUser : userList) {
  115. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  116. weChatSendMessageDto.setUserId(xjrUser);
  117. weChatService.sendTemplateMessage(weChatSendMessageDto);
  118. }
  119. }
  120. @Test
  121. void test(){
  122. doExecute();
  123. }
  124. public void doExecute(){
  125. LocalDateTime now = LocalDateTime.now();
  126. HolidayDate holidayDate = holidayDateService.getOne(
  127. new QueryWrapper<HolidayDate>().lambda()
  128. .eq(HolidayDate::getDate, now.toLocalDate())
  129. );
  130. if(holidayDate != null && holidayDate.getWay() != null && holidayDate.getWay() != 0){
  131. return;
  132. }
  133. //查询今天的考勤规则
  134. List<AttendanceRuleDetails> ruleDetails = ruleCategoryService.getTodayRules();
  135. //获取最近的时间
  136. LocalDateTime recentlyTime = getRecentlyTime(ruleDetails, now);
  137. String wechatTemplate = weChatUtil.getAttendanceMsgLateTemplate();
  138. WechatMessageLog log = wechatMessageLogService.getOne(
  139. new QueryWrapper<WechatMessageLog>().lambda()
  140. .select(WechatMessageLog.class, x -> VoToColumnUtil.fieldsToColumns(WechatMessageLog.class).contains(x.getProperty()))
  141. .eq(WechatMessageLog::getSendTime, recentlyTime)
  142. .eq(WechatMessageLog::getTemplateId, wechatTemplate)
  143. );
  144. // if(log != null){//已经推送过,不再进行推送
  145. // return;
  146. // }
  147. WechatMessageLog messageLog = new WechatMessageLog();
  148. messageLog.setTemplateId(wechatTemplate);
  149. messageLog.setSendTime(recentlyTime);
  150. List<AttendanceMessageSet> list = messageSetService.list(
  151. new QueryWrapper<AttendanceMessageSet>().lambda()
  152. );
  153. //判断是上午还是下午
  154. Integer timePeriod = null;
  155. String timePeriodStr = null;
  156. if(now.getHour() <= 12){
  157. timePeriod = 1;
  158. timePeriodStr = "上午考勤";
  159. }else if(now.getHour() <= 18){
  160. timePeriod = 2;
  161. timePeriodStr = "下午考勤";
  162. }else{
  163. timePeriod = 3;
  164. timePeriodStr = "晚上考勤";
  165. }
  166. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  167. String format = recentlyTime.format(formatter);
  168. for (AttendanceMessageSet messageSet : list) {
  169. if(!messageSet.getTimePeriod().contains(timePeriod + "")){
  170. continue;
  171. }
  172. //查询需要通知的人
  173. List<XjrUser> userList = userService.list(
  174. new MPJLambdaWrapper<XjrUser>()
  175. .select(XjrUser::getId)
  176. .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
  177. .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  178. .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
  179. .eq(UserRoleRelation::getRoleId, messageSet.getRoleType())
  180. .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
  181. );
  182. //没有需要通知的,直接跳过
  183. if(userList.isEmpty()){
  184. continue;
  185. }
  186. if(messageSet.getRoleType() != null && messageSet.getRoleType() == 2){
  187. //教师总人数
  188. long teacherCout = userService.count(
  189. new MPJLambdaWrapper<XjrUser>()
  190. .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
  191. );
  192. //查询进入记录,就是实际到校的人数
  193. long outInRecords = teachertOutInRecordService.count(
  194. new MPJLambdaWrapper<TeacherOutInRecord>()
  195. .le(TeacherOutInRecord::getRecordTime, recentlyTime)
  196. .eq(TeacherOutInRecord::getStatus, 1)
  197. );
  198. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  199. weChatSendMessageDto.setTemplateId(wechatTemplate);
  200. JSONObject paramJson = new JSONObject();
  201. JSONObject thing6 = new JSONObject();
  202. thing6.put("value", "教职工");
  203. paramJson.put("thing6", thing6);
  204. JSONObject time11 = new JSONObject();
  205. time11.put("value", format);
  206. paramJson.put("time11", time11);
  207. JSONObject const23 = new JSONObject();
  208. const23.put("value", timePeriodStr);
  209. paramJson.put("const23", const23);
  210. JSONObject character_string18 = new JSONObject();
  211. character_string18.put("value", teacherCout - outInRecords);
  212. paramJson.put("character_string18", character_string18);
  213. JSONObject character_string16 = new JSONObject();
  214. character_string16.put("value", teacherCout);
  215. paramJson.put("character_string16", character_string16);
  216. weChatSendMessageDto.setContent(paramJson);
  217. weChatSendMessageDto.setUrl(StrUtil.format("{}pages/attendance/teacher/index", commonPropertiesConfig.getDomainApp()));
  218. for (XjrUser xjrUser : userList) {
  219. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  220. weChatSendMessageDto.setUserId(xjrUser.getOpenId());
  221. weChatService.sendTemplateMessage(weChatSendMessageDto);
  222. }
  223. }else if(messageSet.getRoleType() != null && messageSet.getRoleType() == 3){
  224. //教师总人数
  225. long teacherCout = userService.count(
  226. new MPJLambdaWrapper<XjrUser>()
  227. .leftJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId)
  228. );
  229. //查询进入记录,就是实际到校的人数
  230. long outInRecords = studentOutInRecordService.count(
  231. new MPJLambdaWrapper<StudentOutInRecord>()
  232. .le(StudentOutInRecord::getRecordTime, recentlyTime)
  233. .eq(StudentOutInRecord::getStatus, 1)
  234. );
  235. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  236. weChatSendMessageDto.setTemplateId(weChatUtil.getAttenDanceWarnTemplate());
  237. JSONObject paramJson = new JSONObject();
  238. JSONObject thing6 = new JSONObject();
  239. thing6.put("value", "教职工");
  240. paramJson.put("thing6", thing6);
  241. JSONObject time11 = new JSONObject();
  242. time11.put("value", format);
  243. paramJson.put("time11", time11);
  244. JSONObject const23 = new JSONObject();
  245. const23.put("value", timePeriodStr);
  246. paramJson.put("const23", const23);
  247. JSONObject character_string18 = new JSONObject();
  248. character_string18.put("value", teacherCout - outInRecords);
  249. paramJson.put("character_string18", character_string18);
  250. JSONObject character_string16 = new JSONObject();
  251. character_string16.put("value", teacherCout);
  252. paramJson.put("const3", character_string16);
  253. weChatSendMessageDto.setContent(paramJson);
  254. weChatSendMessageDto.setUrl(StrUtil.format("{}pages/attendance/class/index", commonPropertiesConfig.getDomainApp()));
  255. for (XjrUser xjrUser : userList) {
  256. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  257. weChatSendMessageDto.setUserId(xjrUser.getOpenId());
  258. weChatService.sendTemplateMessage(weChatSendMessageDto);
  259. }
  260. }
  261. }
  262. wechatMessageLogService.save(messageLog);
  263. }
  264. LocalDateTime getRecentlyTime(List<AttendanceRuleDetails> ruleDetails, LocalDateTime now){
  265. List<LocalDateTime> result = new ArrayList<>();
  266. for (AttendanceRuleDetails ruleDetail : ruleDetails) {
  267. if(ruleDetail.getIsAllowInOutSchool() != null && ruleDetail.getIsAllowInOutSchool() == 1
  268. && ruleDetail.getIsAttendance() != null && ruleDetail.getIsAttendance() == 1){
  269. if(ruleDetail.getAmStartTime() != null){
  270. LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime());
  271. result.add(amStartTime);
  272. }
  273. if(ruleDetail.getPmStartTime() != null){
  274. LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime());
  275. result.add(pmStartTime);
  276. }
  277. if(ruleDetail.getEveningStartTime() != null){
  278. LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime());
  279. result.add(eveningStartTime);
  280. }
  281. }
  282. }
  283. if(result.isEmpty()){
  284. return null;
  285. }
  286. Map<Long, LocalDateTime> timeMap = new HashMap<>();
  287. for (LocalDateTime localDateTime : result) {
  288. long between = ChronoUnit.SECONDS.between(now, localDateTime);
  289. timeMap.put(Math.abs(between), localDateTime);
  290. }
  291. List<Long> collect = timeMap.keySet().stream().collect(Collectors.toList());
  292. Collections.sort(collect, Long::compare);
  293. return timeMap.get(collect.get(0));
  294. }
  295. @Test
  296. void getRid(){
  297. String url = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token=" + weChatUtil.getToken(WeChatType.WEWEB);
  298. JSONObject rid = new JSONObject();
  299. rid.put("rid", "6667fb56-0c3a8942-466e7d5e");
  300. String result = HttpUtil.post(url, JSONObject.toJSONString(rid));
  301. System.out.print(result);
  302. }
  303. }