package cn.com.lzt.dingding.service.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.daju.mix.dao.entity.TBUserClock; import com.daju.mix.dao.mapper.TBUserClockMapper; import com.daju.mix.dao.mapper.TSBaseUserMapper; import org.jeecgframework.core.constant.Globals; import org.jeecgframework.core.util.StringUtil; import org.jeecgframework.web.system.pojo.base.TSBaseUser; import org.jeecgframework.web.system.service.SystemService; import org.jeecgframework.web.system.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import cn.com.lzt.arrangeduty.service.ArrangeDutyServiceI; import cn.com.lzt.attendancetemp.service.AttendanceTempServiceI; import cn.com.lzt.calendar.service.CalendarServiceI; import cn.com.lzt.common.util.dingding.DingTool; import cn.com.lzt.common.util.dingding.entity.KaoqinEntity; import cn.com.lzt.dingattendanceinfo.entity.DingAttendanceinfoEntity; import cn.com.lzt.dingattendanceinfo.service.DingAttendanceinfoServiceI; import cn.com.lzt.dingding.service.DingdingTransactionalService; import cn.com.lzt.projarrangedetail.service.ProjarrangeDetailServiceI; import cn.com.lzt.userarrangedetail.service.UserArrangeDetailServiceI; import javax.annotation.Resource; @Service("DingdingTransactionalService") @Transactional(propagation = Propagation.REQUIRES_NEW) public class DingdingTransactionalServiceImpl implements DingdingTransactionalService{ @Autowired private UserService userService; @Autowired private DingAttendanceinfoServiceI dingAttendanceinfoService; @Autowired private SystemService systemService; @Autowired private CalendarServiceI calendarService; @Autowired private AttendanceTempServiceI attendanceTempService; @Autowired private ProjarrangeDetailServiceI projarrangeDetailService; @Autowired private UserArrangeDetailServiceI userArrangeDetailService; @Autowired private ArrangeDutyServiceI arrangeDutyService; @Resource private TSBaseUserMapper tsBaseUserMapper; @Resource private TBUserClockMapper tbUserClockMapper; /** * 同步所有人员的考勤记录到钉钉考勤原始信息表 * */ @Override public boolean signRecordSynchronization(String attendanceStime, String attendanceEtime) { boolean returnFlg = true; String message = "考勤记录同步成功"; String userHql = "from TSBaseUser where deleteFlag <> 1"; List userList = userService.findHql(userHql); Map map_user = new HashMap<>(); List userIdList = new ArrayList(); for(TSBaseUser baseUser : userList) { /*userIdList.add(baseUser.getId()); map_user.put(baseUser.getId(), baseUser);*/ // did为钉钉userId userIdList.add(baseUser.getDid()); map_user.put(baseUser.getDid(), baseUser); } // 对用户列表进行分组,每50个用户一组 List> userIdListBy50 = new ArrayList>(); int listSize = userIdList.size(); int toIndex = 50; for(int i = 0; i < userIdList.size(); i += 50) { if(i + 50 > listSize){ toIndex = listSize - i; } List newList = userIdList.subList(i,i+toIndex); userIdListBy50.add(newList); } // 获取考勤数据 // 初始化开始、结束时间 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String startTime = ""; String endTime = ""; // 查询备份表中的最近日期 String maxTimeSql = "select max(attendance_time) as lasttime from t_bus_ding_attendanceinfo_h"; List> maxTimeList = systemService.findForJdbc(maxTimeSql); Date maxBackupDate = null; if(maxTimeList.size() > 0) { maxBackupDate = (Date)maxTimeList.get(0).get("lasttime"); } if(StringUtil.isEmpty(attendanceStime) && StringUtil.isEmpty(attendanceEtime)) { long endTimeLong = System.currentTimeMillis(); // 留一小时的冗余时间 long startTimeLong = endTimeLong - 3600000; startTime = dateFormat.format(startTimeLong); endTime = dateFormat.format(endTimeLong); } if(StringUtil.isNotEmpty(attendanceStime) && StringUtil.isNotEmpty(attendanceEtime)) { startTime = attendanceStime + " 00:00:00"; endTime = attendanceEtime + " 23:59:59"; } List kaoqinList = new ArrayList(); DingTool dingTool = new DingTool(); for(List searchUserIdList : userIdListBy50) { // 调用钉钉考勤接口 List kaoqinListTemp = dingTool.getSignRecord(searchUserIdList, startTime,endTime); kaoqinList.addAll(kaoqinListTemp); } StringBuilder mainOrgSql = new StringBuilder(); mainOrgSql.append(" SELECT "); mainOrgSql.append(" userOrg.user_id userid,depart.id departid"); mainOrgSql.append(" FROM t_s_user_org userOrg "); mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id "); mainOrgSql.append(" WHERE 1=1"); // mainOrgSql.append(" userOrg.user_id = '" + kaoqinEntity.getUserId() + "'"); mainOrgSql.append(" AND userOrg.status = '0' "); mainOrgSql.append(" AND userOrg.ifpluralism <> '1' "); List> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString()); Map map_user2depart = new HashMap<>(); for(Map m : mainOrgMapList) { map_user2depart.put((String)m.get("userid"), (String)m.get("departid")); } StringBuilder dingdingSql = new StringBuilder(); dingdingSql.append(" SELECT * from t_bus_ding_attendanceinfo where attendance_time between '"); dingdingSql.append(startTime); dingdingSql.append("' and '").append(endTime).append("'"); List> dingdingMapList = systemService.findForJdbc(dingdingSql.toString()); Map map_dingid2user = new HashMap<>(); for(Map dingmap : dingdingMapList) { map_dingid2user.put((String)dingmap.get("ding_uniqueid"), (String)dingmap.get("user_id")); } for(KaoqinEntity kaoqinEntity : kaoqinList) { // 根据ding_uniqueid查询钉钉原始记录 if(!map_dingid2user.containsKey(kaoqinEntity.getId())) { DingAttendanceinfoEntity dingAttendanceinfoEntity = new DingAttendanceinfoEntity(); // 检索用户信息 //String userByIdHql = "from TSBaseUser where did = '" + kaoqinEntity.getUserId() + "'"; //TSBaseUser baseUserInfo = map_user.get(kaoqinEntity.getUserId()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(com.daju.mix.dao.entity.TSBaseUser::getDid, kaoqinEntity.getUserId()); com.daju.mix.dao.entity.TSBaseUser baseUserInfo = tsBaseUserMapper.selectOne(wrapper); // 查询主组织 // 钉钉打卡日期及时间 String timeString = dateFormat.format(Long.valueOf(kaoqinEntity.getUserCheckTime())); String dateString = timeString.substring(0, 10) + " 00:00:00"; dingAttendanceinfoEntity.setUserId(kaoqinEntity.getUserId()); dingAttendanceinfoEntity.setUserCode(baseUserInfo.getUsername()); dingAttendanceinfoEntity.setRealname(baseUserInfo.getRealname()); dingAttendanceinfoEntity.setBelongUnitid(map_user2depart.get(baseUserInfo.getId())); if(map_user2depart.get(kaoqinEntity.getUserId()) == null || map_user2depart.get(baseUserInfo.getId()) == "") { System.out.println("钉钉userId或部门id为null: "+kaoqinEntity.getUserId()); } dingAttendanceinfoEntity.setDingUniqueid(kaoqinEntity.getId()); try { Date attendanceTime = dateFormat.parse(timeString); dingAttendanceinfoEntity.setAttendanceTime(attendanceTime); dingAttendanceinfoEntity.setAttendanceDate(dateFormat.parse(dateString)); // 同步过的数据(以备份到了_H表中),设置为已处理完成 if (maxBackupDate == null) { maxBackupDate = attendanceTime; } if(attendanceTime.compareTo(maxBackupDate) <= 0) { dingAttendanceinfoEntity.setIsDispose(Globals.SHIFOU_01_1); }else { dingAttendanceinfoEntity.setIsDispose(Globals.SHIFOU_01_0); } } catch (ParseException e) { returnFlg = false; e.printStackTrace(); } // 同步考勤记录管理表 LambdaQueryWrapper wrapper1 = new LambdaQueryWrapper<>(); wrapper1.eq(TBUserClock::getUserId, baseUserInfo.getId()); wrapper1.eq(TBUserClock::getClockTime, timeString); TBUserClock tbUserClock = tbUserClockMapper.selectOne(wrapper1); if (tbUserClock == null){ TBUserClock clock = new TBUserClock(); clock.setClockTime(timeString); clock.setUserId(baseUserInfo.getId()); clock.setName(baseUserInfo.getRealname()); clock.setCode(kaoqinEntity.getUserId()); tbUserClockMapper.insert(clock); } try { dingAttendanceinfoService.save(dingAttendanceinfoEntity); message = "UserCode:" + baseUserInfo.getUsername() + "考勤记录同步成功"; //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); } catch (Exception e) { e.printStackTrace(); returnFlg = false; message = "UserCode:" + baseUserInfo.getUsername() + "考勤记录同步失败"; //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_ERROR); } } } return returnFlg; } }