| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- 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<TSBaseUser> userList = userService.findHql(userHql);
- Map<String, TSBaseUser> map_user = new HashMap<>();
-
- List<String> userIdList = new ArrayList<String>();
- 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<List<String>> userIdListBy50 = new ArrayList<List<String>>();
- int listSize = userIdList.size();
- int toIndex = 50;
- for(int i = 0; i < userIdList.size(); i += 50) {
- if(i + 50 > listSize){
- toIndex = listSize - i;
- }
- List<String> 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<Map<String, Object>> 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<KaoqinEntity> kaoqinList = new ArrayList<KaoqinEntity>();
- DingTool dingTool = new DingTool();
- for(List<String> searchUserIdList : userIdListBy50) {
- // 调用钉钉考勤接口
- List<KaoqinEntity> 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<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
- Map<String, String> map_user2depart = new HashMap<>();
- for(Map<String, Object> 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<Map<String, Object>> dingdingMapList = systemService.findForJdbc(dingdingSql.toString());
-
- Map<String, String> map_dingid2user = new HashMap<>();
- for(Map<String, Object> 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<com.daju.mix.dao.entity.TSBaseUser> 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<TBUserClock> 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;
- }
- }
|