DingdingTransactionalServiceImpl.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package cn.com.lzt.dingding.service.impl;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.daju.mix.dao.entity.TBUserClock;
  11. import com.daju.mix.dao.mapper.TBUserClockMapper;
  12. import com.daju.mix.dao.mapper.TSBaseUserMapper;
  13. import org.jeecgframework.core.constant.Globals;
  14. import org.jeecgframework.core.util.StringUtil;
  15. import org.jeecgframework.web.system.pojo.base.TSBaseUser;
  16. import org.jeecgframework.web.system.service.SystemService;
  17. import org.jeecgframework.web.system.service.UserService;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Propagation;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import cn.com.lzt.arrangeduty.service.ArrangeDutyServiceI;
  23. import cn.com.lzt.attendancetemp.service.AttendanceTempServiceI;
  24. import cn.com.lzt.calendar.service.CalendarServiceI;
  25. import cn.com.lzt.common.util.dingding.DingTool;
  26. import cn.com.lzt.common.util.dingding.entity.KaoqinEntity;
  27. import cn.com.lzt.dingattendanceinfo.entity.DingAttendanceinfoEntity;
  28. import cn.com.lzt.dingattendanceinfo.service.DingAttendanceinfoServiceI;
  29. import cn.com.lzt.dingding.service.DingdingTransactionalService;
  30. import cn.com.lzt.projarrangedetail.service.ProjarrangeDetailServiceI;
  31. import cn.com.lzt.userarrangedetail.service.UserArrangeDetailServiceI;
  32. import javax.annotation.Resource;
  33. @Service("DingdingTransactionalService")
  34. @Transactional(propagation = Propagation.REQUIRES_NEW)
  35. public class DingdingTransactionalServiceImpl implements DingdingTransactionalService{
  36. @Autowired
  37. private UserService userService;
  38. @Autowired
  39. private DingAttendanceinfoServiceI dingAttendanceinfoService;
  40. @Autowired
  41. private SystemService systemService;
  42. @Autowired
  43. private CalendarServiceI calendarService;
  44. @Autowired
  45. private AttendanceTempServiceI attendanceTempService;
  46. @Autowired
  47. private ProjarrangeDetailServiceI projarrangeDetailService;
  48. @Autowired
  49. private UserArrangeDetailServiceI userArrangeDetailService;
  50. @Autowired
  51. private ArrangeDutyServiceI arrangeDutyService;
  52. @Resource
  53. private TSBaseUserMapper tsBaseUserMapper;
  54. @Resource
  55. private TBUserClockMapper tbUserClockMapper;
  56. /**
  57. * 同步所有人员的考勤记录到钉钉考勤原始信息表
  58. *
  59. */
  60. @Override
  61. public boolean signRecordSynchronization(String attendanceStime, String attendanceEtime) {
  62. boolean returnFlg = true;
  63. String message = "考勤记录同步成功";
  64. String userHql = "from TSBaseUser where deleteFlag <> 1";
  65. List<TSBaseUser> userList = userService.findHql(userHql);
  66. Map<String, TSBaseUser> map_user = new HashMap<>();
  67. List<String> userIdList = new ArrayList<String>();
  68. for(TSBaseUser baseUser : userList) {
  69. /*userIdList.add(baseUser.getId());
  70. map_user.put(baseUser.getId(), baseUser);*/
  71. // did为钉钉userId
  72. userIdList.add(baseUser.getDid());
  73. map_user.put(baseUser.getDid(), baseUser);
  74. }
  75. // 对用户列表进行分组,每50个用户一组
  76. List<List<String>> userIdListBy50 = new ArrayList<List<String>>();
  77. int listSize = userIdList.size();
  78. int toIndex = 50;
  79. for(int i = 0; i < userIdList.size(); i += 50) {
  80. if(i + 50 > listSize){
  81. toIndex = listSize - i;
  82. }
  83. List<String> newList = userIdList.subList(i,i+toIndex);
  84. userIdListBy50.add(newList);
  85. }
  86. // 获取考勤数据
  87. // 初始化开始、结束时间
  88. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  89. String startTime = "";
  90. String endTime = "";
  91. // 查询备份表中的最近日期
  92. String maxTimeSql = "select max(attendance_time) as lasttime from t_bus_ding_attendanceinfo_h";
  93. List<Map<String, Object>> maxTimeList = systemService.findForJdbc(maxTimeSql);
  94. Date maxBackupDate = null;
  95. if(maxTimeList.size() > 0) {
  96. maxBackupDate = (Date)maxTimeList.get(0).get("lasttime");
  97. }
  98. if(StringUtil.isEmpty(attendanceStime) && StringUtil.isEmpty(attendanceEtime)) {
  99. long endTimeLong = System.currentTimeMillis();
  100. // 留一小时的冗余时间
  101. long startTimeLong = endTimeLong - 3600000;
  102. startTime = dateFormat.format(startTimeLong);
  103. endTime = dateFormat.format(endTimeLong);
  104. }
  105. if(StringUtil.isNotEmpty(attendanceStime) && StringUtil.isNotEmpty(attendanceEtime)) {
  106. startTime = attendanceStime + " 00:00:00";
  107. endTime = attendanceEtime + " 23:59:59";
  108. }
  109. List<KaoqinEntity> kaoqinList = new ArrayList<KaoqinEntity>();
  110. DingTool dingTool = new DingTool();
  111. for(List<String> searchUserIdList : userIdListBy50) {
  112. // 调用钉钉考勤接口
  113. List<KaoqinEntity> kaoqinListTemp = dingTool.getSignRecord(searchUserIdList, startTime,endTime);
  114. kaoqinList.addAll(kaoqinListTemp);
  115. }
  116. StringBuilder mainOrgSql = new StringBuilder();
  117. mainOrgSql.append(" SELECT ");
  118. mainOrgSql.append(" userOrg.user_id userid,depart.id departid");
  119. mainOrgSql.append(" FROM t_s_user_org userOrg ");
  120. mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id ");
  121. mainOrgSql.append(" WHERE 1=1");
  122. // mainOrgSql.append(" userOrg.user_id = '" + kaoqinEntity.getUserId() + "'");
  123. mainOrgSql.append(" AND userOrg.status = '0' ");
  124. mainOrgSql.append(" AND userOrg.ifpluralism <> '1' ");
  125. List<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
  126. Map<String, String> map_user2depart = new HashMap<>();
  127. for(Map<String, Object> m : mainOrgMapList) {
  128. map_user2depart.put((String)m.get("userid"), (String)m.get("departid"));
  129. }
  130. StringBuilder dingdingSql = new StringBuilder();
  131. dingdingSql.append(" SELECT * from t_bus_ding_attendanceinfo where attendance_time between '");
  132. dingdingSql.append(startTime);
  133. dingdingSql.append("' and '").append(endTime).append("'");
  134. List<Map<String, Object>> dingdingMapList = systemService.findForJdbc(dingdingSql.toString());
  135. Map<String, String> map_dingid2user = new HashMap<>();
  136. for(Map<String, Object> dingmap : dingdingMapList) {
  137. map_dingid2user.put((String)dingmap.get("ding_uniqueid"), (String)dingmap.get("user_id"));
  138. }
  139. for(KaoqinEntity kaoqinEntity : kaoqinList) {
  140. // 根据ding_uniqueid查询钉钉原始记录
  141. if(!map_dingid2user.containsKey(kaoqinEntity.getId())) {
  142. DingAttendanceinfoEntity dingAttendanceinfoEntity = new DingAttendanceinfoEntity();
  143. // 检索用户信息
  144. //String userByIdHql = "from TSBaseUser where did = '" + kaoqinEntity.getUserId() + "'";
  145. //TSBaseUser baseUserInfo = map_user.get(kaoqinEntity.getUserId());
  146. LambdaQueryWrapper<com.daju.mix.dao.entity.TSBaseUser> wrapper = new LambdaQueryWrapper<>();
  147. wrapper.eq(com.daju.mix.dao.entity.TSBaseUser::getDid, kaoqinEntity.getUserId());
  148. com.daju.mix.dao.entity.TSBaseUser baseUserInfo = tsBaseUserMapper.selectOne(wrapper);
  149. // 查询主组织
  150. // 钉钉打卡日期及时间
  151. String timeString = dateFormat.format(Long.valueOf(kaoqinEntity.getUserCheckTime()));
  152. String dateString = timeString.substring(0, 10) + " 00:00:00";
  153. dingAttendanceinfoEntity.setUserId(kaoqinEntity.getUserId());
  154. dingAttendanceinfoEntity.setUserCode(baseUserInfo.getUsername());
  155. dingAttendanceinfoEntity.setRealname(baseUserInfo.getRealname());
  156. dingAttendanceinfoEntity.setBelongUnitid(map_user2depart.get(baseUserInfo.getId()));
  157. if(map_user2depart.get(kaoqinEntity.getUserId()) == null || map_user2depart.get(baseUserInfo.getId()) == "") {
  158. System.out.println("钉钉userId或部门id为null: "+kaoqinEntity.getUserId());
  159. }
  160. dingAttendanceinfoEntity.setDingUniqueid(kaoqinEntity.getId());
  161. try {
  162. Date attendanceTime = dateFormat.parse(timeString);
  163. dingAttendanceinfoEntity.setAttendanceTime(attendanceTime);
  164. dingAttendanceinfoEntity.setAttendanceDate(dateFormat.parse(dateString));
  165. // 同步过的数据(以备份到了_H表中),设置为已处理完成
  166. if (maxBackupDate == null) {
  167. maxBackupDate = attendanceTime;
  168. }
  169. if(attendanceTime.compareTo(maxBackupDate) <= 0) {
  170. dingAttendanceinfoEntity.setIsDispose(Globals.SHIFOU_01_1);
  171. }else {
  172. dingAttendanceinfoEntity.setIsDispose(Globals.SHIFOU_01_0);
  173. }
  174. } catch (ParseException e) {
  175. returnFlg = false;
  176. e.printStackTrace();
  177. }
  178. // 同步考勤记录管理表
  179. LambdaQueryWrapper<TBUserClock> wrapper1 = new LambdaQueryWrapper<>();
  180. wrapper1.eq(TBUserClock::getUserId, baseUserInfo.getId());
  181. wrapper1.eq(TBUserClock::getClockTime, timeString);
  182. TBUserClock tbUserClock = tbUserClockMapper.selectOne(wrapper1);
  183. if (tbUserClock == null){
  184. TBUserClock clock = new TBUserClock();
  185. clock.setClockTime(timeString);
  186. clock.setUserId(baseUserInfo.getId());
  187. clock.setName(baseUserInfo.getRealname());
  188. clock.setCode(kaoqinEntity.getUserId());
  189. tbUserClockMapper.insert(clock);
  190. }
  191. try {
  192. dingAttendanceinfoService.save(dingAttendanceinfoEntity);
  193. message = "UserCode:" + baseUserInfo.getUsername() + "考勤记录同步成功";
  194. //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  195. } catch (Exception e) {
  196. e.printStackTrace();
  197. returnFlg = false;
  198. message = "UserCode:" + baseUserInfo.getUsername() + "考勤记录同步失败";
  199. //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_ERROR);
  200. }
  201. }
  202. }
  203. return returnFlg;
  204. }
  205. }