|
|
@@ -7,10 +7,7 @@ import com.malk.Util.UtilMap;
|
|
|
import com.malk.Util.UtilMc;
|
|
|
import com.malk.server.common.McException;
|
|
|
import com.malk.server.fxiaoke.FXKConf;
|
|
|
-import com.malk.service.dingtalk.DDClient;
|
|
|
-import com.malk.service.dingtalk.DDClient_Attendance;
|
|
|
-import com.malk.service.dingtalk.DDClient_Contacts;
|
|
|
-import com.malk.service.dingtalk.DDClient_Workflow;
|
|
|
+import com.malk.service.dingtalk.*;
|
|
|
import com.malk.service.fxiaoke.FXKClient;
|
|
|
import com.malk.xiding.repository.dao.XdDdApproveRecordDao;
|
|
|
import com.malk.xiding.repository.dao.XdDdApproveRecordDao2;
|
|
|
@@ -50,6 +47,9 @@ public class XDImplService implements XDService {
|
|
|
@Autowired
|
|
|
private DDClient_Attendance ddClient_attendance;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private DDService ddService;
|
|
|
+
|
|
|
@Autowired
|
|
|
private FXKClient fxkClient;
|
|
|
|
|
|
@@ -124,9 +124,14 @@ public class XDImplService implements XDService {
|
|
|
.endTime(eTime)
|
|
|
.type(type)
|
|
|
.build();
|
|
|
+ // prd 2023-07 出差考勤同步仅适用于营销中心以及其子部门
|
|
|
+ if (type.equals("出差")) {
|
|
|
+ // 离职人员同步已过滤
|
|
|
+ approveRecordPo.setMarketing(ddService.matchDepartment(ddClient.getAccessToken(), userId, Arrays.asList(37263540L)));
|
|
|
+ }
|
|
|
ddApproveRecordDao.save(approveRecordPo);
|
|
|
log.info("同步出差和人员信息, {}, {}", userPo, approveRecordPo);
|
|
|
- _attendanceSync(sTime, eTime, userPo.getIdFxxk(), userId); // 兼容后补审批记录
|
|
|
+ _attendanceSync(sTime, eTime, userPo.getIdFxxk(), userId, type); // 兼容后补审批记录
|
|
|
}
|
|
|
|
|
|
// 同步纷享销客人员信息
|
|
|
@@ -211,23 +216,31 @@ public class XDImplService implements XDService {
|
|
|
}
|
|
|
|
|
|
/// 后补审批单, 同步考勤
|
|
|
- private void _attendanceSync(Date sTime, Date eTime, String openUserId, String ddUserId) {
|
|
|
+ private void _attendanceSync(Date sTime, Date eTime, String openUserId, String ddUserId, String type) {
|
|
|
// [人员匹配 & 开始时间小于当前同步时间, 若当前时间大于结束时间取结束时间]
|
|
|
Date syncTime = eTime.after(new Date()) ? new Date() : eTime;
|
|
|
if (sTime.after(syncTime) || StringUtils.isBlank(openUserId)) {
|
|
|
return;
|
|
|
}
|
|
|
- // 不跨月统计, 纷享销客查询范围仅支持40天内
|
|
|
- if (sTime.getMonth() != eTime.getMonth()) {
|
|
|
- sTime = new Date(sTime.getYear(), eTime.getMonth(), 1);
|
|
|
+ if (type.equals("外出")) {
|
|
|
+ // 不跨月统计, 纷享销客查询范围仅支持40天内
|
|
|
+ if (sTime.getMonth() != eTime.getMonth()) {
|
|
|
+ sTime = new Date(sTime.getYear(), eTime.getMonth(), 1);
|
|
|
+ }
|
|
|
+ List<Map> attendanceList = fxkClient.getAttendance_All(fxkClient.getAccessToken(), fxkConf.getCorpId(), sTime.getTime(), eTime.getTime(), Arrays.asList(openUserId));
|
|
|
+ log.info("后补人员 = {}, 考勤数量 = {}", openUserId, attendanceList.size());
|
|
|
+ attendanceList.forEach(item -> {
|
|
|
+ XdFxkDdAttendancePo attendancePo = JSON.parseObject(JSON.toJSONString(item), XdFxkDdAttendancePo.class);
|
|
|
+ attendancePo.setIdDd(ddUserId);
|
|
|
+ _attendanceRule(attendancePo);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ // 提交出差后, 就会有对应的排班, 无需重复查询; 同步时匹配出差结束时间, 不写入未来时间考勤
|
|
|
+ for (int day = sTime.getDate(); day <= eTime.getDate(); day++) {
|
|
|
+ log.info("出差后补 = {}, 考勤时间 = {}", ddUserId, day);
|
|
|
+ _attendanceRule(ddUserId, ddFxkRelationDao.findByIdDd(ddUserId).getName(), UtilDateTime.formatDate(new Date(sTime.getYear(), eTime.getMonth(), day)) + " 09:00:00");
|
|
|
+ }
|
|
|
}
|
|
|
- List<Map> attendanceList = fxkClient.getAttendance_All(fxkClient.getAccessToken(), fxkConf.getCorpId(), sTime.getTime(), eTime.getTime(), Arrays.asList(openUserId));
|
|
|
- log.info("后补人员 = {}, 考勤数量 = {}", openUserId, attendanceList.size());
|
|
|
- attendanceList.forEach(item -> {
|
|
|
- XdFxkDdAttendancePo attendancePo = JSON.parseObject(JSON.toJSONString(item), XdFxkDdAttendancePo.class);
|
|
|
- attendancePo.setIdDd(ddUserId);
|
|
|
- _attendanceRule(attendancePo);
|
|
|
- });
|
|
|
}
|
|
|
|
|
|
// 考勤写入规则
|
|
|
@@ -262,7 +275,7 @@ public class XDImplService implements XDService {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
- String ss = "纷享销客同步: " + UtilDateTime.formatDateTime(new Date(attendancePo.getCheckTime().getTime()));
|
|
|
+ String ss = "纷享销客同步" + ": " + UtilDateTime.formatDateTime(new Date(attendancePo.getCheckTime().getTime()));
|
|
|
// 燕江 0953580166764920
|
|
|
ddClient_attendance.uploadAttendanceRecord(ddClient.getAccessToken(), attendancePo.getIdDd(), ss, "纷享销客同步", null, check);
|
|
|
attendancePo.setRemark("同步成功");
|
|
|
@@ -272,4 +285,60 @@ public class XDImplService implements XDService {
|
|
|
log.error(e.getMessage(), e); // 记录错误日志
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步出差记录考勤 [营销中心]
|
|
|
+ * -
|
|
|
+ * 18点同步, 自动上传 [同步时匹配出差时间 [仅同步: 出差开始时间/同步开始 ~ 同步结束/出差结束时间]
|
|
|
+ * 废弃同步排班原因: 提交出差后, 就会有对应的排班, 无需重复查询. 且不同出差单起止时间不一致, 需要处理
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void syncAttendanceForCC(int page, Date sTime, Date eTime) {
|
|
|
+ Page<XdDdApproveRecordPo> poPage = approveRecordDao2.findAllByEndTimeAfterAndTypeAndMarketing(sTime, "出差", true, PageRequest.of(page, 50));
|
|
|
+ // 不能去重, 批量同步时, 可能一个时间段内会有多个出差单
|
|
|
+ List<XdDdApproveRecordPo> poList = poPage.getContent();
|
|
|
+ poList.forEach(po -> {
|
|
|
+ // 提交出差后, 就会有对应的排班, 无需重复查询; 同步时匹配出差时间 [仅同步: 出差开始时间/同步开始 ~ 同步结束/出差结束时间]
|
|
|
+ Date ssTime = sTime.before(po.getStartTime()) ? po.getStartTime() : sTime;
|
|
|
+ Date eeTime = eTime.after(po.getEndTime()) ? po.getEndTime() : eTime;
|
|
|
+ if (ssTime.after(eeTime)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("同步出差记录考勤, {}, {} ~ {}", ddFxkRelationDao.findByIdDd(po.getUserId()).getName(), ssTime, eeTime);
|
|
|
+ for (int day = ssTime.getDate(); day <= eeTime.getDate(); day++) {
|
|
|
+ _attendanceRule(po.getUserId(), ddFxkRelationDao.findByIdDd(po.getUserId()).getName(), UtilDateTime.formatDate(new Date(ssTime.getYear(), eeTime.getMonth(), day)) + " 09:00:00");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!poPage.isLast()) {
|
|
|
+ syncAttendanceForCC(poPage.getNumber() + 1, sTime, eTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 考勤写入规则 [23.07 出差自动同步]
|
|
|
+ private void _attendanceRule(String userId, String userName, String date) {
|
|
|
+ XdFxkDdAttendancePo attendancePo = XdFxkDdAttendancePo.builder()
|
|
|
+ .idDd(userId)
|
|
|
+ .checkTime(UtilDateTime.parseDateTime(date))
|
|
|
+ .userName(userName)
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ boolean hasRecord = attendanceDao.existsByIdDdAndCheckTimeEquals(attendancePo.getIdDd(), attendancePo.getCheckTime());
|
|
|
+ if (hasRecord) {
|
|
|
+ log.info("存在考勤, {}, {}", attendancePo.getUserName(), attendancePo.getCheckTime());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String ss = "出差考勤同步" + ": " + UtilDateTime.formatDateTime(attendancePo.getCheckTime());
|
|
|
+ // 燕江 0953580166764920
|
|
|
+ ddClient_attendance.uploadAttendanceRecord(ddClient.getAccessToken(), attendancePo.getIdDd(), ss, "出差考勤同步", null, attendancePo.getCheckTime().getTime());
|
|
|
+ attendancePo.setRemark("同步成功");
|
|
|
+ attendanceDao.save(attendancePo);
|
|
|
+ log.info("写入考勤, {}, {}", attendancePo.getUserName(), attendancePo.getCheckTime());
|
|
|
+ } catch (McException e) {
|
|
|
+ log.error(e.getMessage(), e); // 记录错误日志
|
|
|
+ }
|
|
|
+ // 同时写入下班考勤
|
|
|
+ if (date.endsWith(" 09:00:00")) {
|
|
|
+ _attendanceRule(userId, userName, date.replace(" 09:00:00", " 18:00:00"));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|