Просмотр исходного кода

把统计任务 放到每次同步数据结束的地方 不再使用定时器

fancy 5 лет назад
Родитель
Сommit
316167f5a4

+ 27 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/DingdingAttendanceQueue.java

@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -52,6 +53,13 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
         }
     }
 
+    private boolean isSameDay(Date startDate, Date endDate) {
+        Calendar start = Calendar.getInstance();
+        start.setTime( startDate );
+        Calendar end = Calendar.getInstance();
+        end.setTime(endDate);
+        return (start.get(Calendar.YEAR) == end.get(Calendar.YEAR) && start.get(Calendar.DAY_OF_YEAR) == end.get(Calendar.DAY_OF_YEAR));
+    }
     private void dingdingSync(DingdingQywxSyncRecord record) throws Exception {
         Application app = ThisApplication.context().applications().randomWithWeight(x_organization_assemble_control.class.getName());
         //开始分页查询人员
@@ -124,7 +132,21 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
             }
         }
         logger.info("结束 插入:"+saveNumber+" 条");
-
+        //插入数据成功 开始统计程序
+
+        boolean hasNextDate = true;
+        Date statisticDate = fromDate;
+        while (hasNextDate) {
+            logger.info("发起钉钉考勤数据统计, date:"+ DateTools.format(statisticDate));
+            ThisApplication.personStatisticQueue.send(statisticDate);
+            ThisApplication.unitStatisticQueue.send(statisticDate);
+            if (!isSameDay(statisticDate, toDate)) {
+                statisticDate = DateTools.addDay(statisticDate, 1);
+            }else {
+                hasNextDate = false;
+            }
+        }
+        logger.info("发起数据统计程序 完成。。。。。。。。。。");
     }
     private void deleteDingdingAttendance(Date fromDate, Date toDate) throws Exception{
         try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -161,6 +183,10 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
                     DingdingAttendanceResultItem item = list.get(i);
                     AttendanceDingtalkDetail detail = DingdingAttendanceResultItem.copier.copy(item);
                     detail.setDdId(item.getId());
+                    if (detail.getUserCheckTime() > 0) {
+                        Date date = new Date(detail.getUserCheckTime());
+                        detail.setUserCheckTimeDate(date);
+                    }
                     //添加o2组织和用户
                     Optional<Person> first = personList.stream().filter(p -> item.userId.equals(p.getDingdingId())).findFirst();
                     if (first.isPresent()) {

+ 1 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/QywxAttendanceSyncQueue.java

@@ -145,7 +145,7 @@ public class QywxAttendanceSyncQueue  extends AbstractQueue<DingdingQywxSyncReco
             logger.info("删除");
             if (detailList != null) {
                 logger.info("删除 list:"+detailList.size());
-                emc.beginTransaction(AttendanceDingtalkDetail.class);
+                emc.beginTransaction(AttendanceQywxDetail.class);
                 for (int i = 0; i < detailList.size(); i++) {
                     emc.remove(detailList.get(i));
                 }

+ 3 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/ThisApplication.java

@@ -31,8 +31,9 @@ public class ThisApplication {
 				personStatisticQueue.start();
 				unitStatisticQueue.start();
 				context.schedule(DingdingAttendanceSyncScheduleTask.class, "0 0 1 * * ?");
-				context().schedule(DingdingAttendanceStatisticScheduleTask.class, "0 0 3 * * ?");
-				context().schedule(DingdingAttendanceStatisticPersonScheduleTask.class, "0 0 3 * * ?");
+				//已经将任务 放到了同步结束后执行 暂时不需要开定时任务了
+//				context.schedule(DingdingAttendanceStatisticScheduleTask.class, "0 0 3 * * ?");
+//				context.schedule(DingdingAttendanceStatisticPersonScheduleTask.class, "0 0 3 * * ?");
 			}
 			if (BooleanUtils.isTrue(Config.qiyeweixin().getAttendanceSyncEnable())) {
 				qywxQueue.start();

+ 30 - 1
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/DingdingAttendanceQueue.java

@@ -13,6 +13,13 @@ import com.x.base.core.project.organization.Person;
 import com.x.base.core.project.queue.AbstractQueue;
 import com.x.base.core.project.x_organization_assemble_control;
 
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecord> {
@@ -29,6 +36,13 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
         }
     }
 
+    private boolean isSameDay(Date startDate, Date endDate) {
+        Calendar start = Calendar.getInstance();
+        start.setTime( startDate );
+        Calendar end = Calendar.getInstance();
+        end.setTime(endDate);
+        return (start.get(Calendar.YEAR) == end.get(Calendar.YEAR) && start.get(Calendar.DAY_OF_YEAR) == end.get(Calendar.DAY_OF_YEAR));
+    }
     private void dingdingSync(DingdingQywxSyncRecord record) throws Exception {
         logger.debug(record.toString());
         Application app = ThisApplication.context().applications().randomWithWeight(x_organization_assemble_control.class.getName());
@@ -92,7 +106,22 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
                 updateSyncRecord(record, null);
             }
         }
-
+        logger.info("结束 插入:"+saveNumber+" 条");
+        //插入数据成功 开始统计程序
+
+        boolean hasNextDate = true;
+        Date statisticDate = fromDate;
+        while (hasNextDate) {
+            logger.info("发起钉钉考勤数据统计, date:"+ DateTools.format(statisticDate));
+            ThisApplication.personStatisticQueue.send(statisticDate);
+            ThisApplication.unitStatisticQueue.send(statisticDate);
+            if (!isSameDay(statisticDate, toDate)) {
+                statisticDate = DateTools.addDay(statisticDate, 1);
+            }else {
+                hasNextDate = false;
+            }
+        }
+        logger.info("发起数据统计程序 完成。。。。。。。。。。");
     }
 
     private void saveDingdingRecord(List<DingdingAttendanceResultItem> list) throws Exception {

+ 13 - 0
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceDingtalkDetail.java

@@ -7,6 +7,7 @@ import com.x.base.core.entity.annotation.ContainerEntity;
 import com.x.base.core.project.annotation.FieldDescribe;
 
 import javax.persistence.*;
+import java.util.Date;
 
 @ContainerEntity
 @Entity
@@ -69,6 +70,10 @@ public class AttendanceDingtalkDetail extends SliceJpaObject  {
     @Column(name = ColumnNamePrefix + "userCheckTime")
     private long userCheckTime;
 
+    @FieldDescribe("实际打卡时间,  用Date格式存储")
+    @Column(name = ColumnNamePrefix + "userCheckTimeDate")
+    private Date userCheckTimeDate;
+
     @FieldDescribe("工作日")
     @Column(name = ColumnNamePrefix + "workDate")
     private long workDate;
@@ -261,4 +266,12 @@ public class AttendanceDingtalkDetail extends SliceJpaObject  {
     public void setRecordId(long recordId) {
         this.recordId = recordId;
     }
+
+    public Date getUserCheckTimeDate() {
+        return userCheckTimeDate;
+    }
+
+    public void setUserCheckTimeDate(Date userCheckTimeDate) {
+        this.userCheckTimeDate = userCheckTimeDate;
+    }
 }