Browse Source

钉钉考勤结果查询

fancy 5 years ago
parent
commit
1933800f59

+ 9 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/exception/DingdingFindNoArgumentError.java

@@ -0,0 +1,9 @@
+package com.x.attendance.assemble.control.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class DingdingFindNoArgumentError extends PromptException {
+    public DingdingFindNoArgumentError() {
+        super("没有传入正确的参数");
+    }
+}

+ 38 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java

@@ -2,14 +2,19 @@ package com.x.attendance.assemble.control.factory;
 
 import com.x.attendance.assemble.control.AbstractFactory;
 import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.exception.DingdingFindNoArgumentError;
+import com.x.attendance.entity.AttendanceDingtalkDetail;
+import com.x.attendance.entity.AttendanceDingtalkDetail_;
 import com.x.attendance.entity.DingdingQywxSyncRecord;
 import com.x.attendance.entity.DingdingQywxSyncRecord_;
+import com.x.base.core.project.tools.StringTools;
 
 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.Date;
 import java.util.List;
 
 public class DingdingAttendanceFactory extends AbstractFactory {
@@ -32,4 +37,37 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         query.select(root).where(p).orderBy(cb.desc(root.get(DingdingQywxSyncRecord_.startTime)));
         return em.createQuery(query).getResultList();
     }
+
+    /**
+     * 根据用户查询一段时间内的打开数据
+     * @param startTime
+     * @param endTime
+     * @param userId
+     * @return
+     * @throws Exception
+     */
+    public List<AttendanceDingtalkDetail> findAllDingdingAttendanceDetail(Date startTime, Date endTime, String userId) throws Exception {
+        if (startTime == null && endTime == null && userId == null) {
+            throw new DingdingFindNoArgumentError();
+        }
+        EntityManager em = this.entityManagerContainer().get(AttendanceDingtalkDetail.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<AttendanceDingtalkDetail> query = cb.createQuery(AttendanceDingtalkDetail.class);
+        Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class);
+        Predicate p = null;
+        if (startTime != null && endTime != null) {
+            long start = startTime.getTime();
+            long end = endTime.getTime();
+            p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), start, end);
+        }
+        if (userId != null) {
+            if (p != null) {
+                p = cb.and(p, cb.equal(root.get(AttendanceDingtalkDetail_.userId), userId));
+            }else {
+                p = cb.equal(root.get(AttendanceDingtalkDetail_.userId), userId);
+            }
+        }
+        query.select(root).where(p).orderBy(cb.desc(root.get(AttendanceDingtalkDetail_.userCheckTime)));
+        return em.createQuery(query).getResultList();
+    }
 }

+ 145 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ActionListDDAttendanceDetail.java

@@ -0,0 +1,145 @@
+package com.x.attendance.assemble.control.jaxrs.dingding;
+
+import com.google.gson.JsonElement;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceDingtalkDetail;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Person;
+import com.x.base.core.project.tools.DateTools;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ActionListDDAttendanceDetail extends BaseAction {
+
+    private static final Logger logger = LoggerFactory.getLogger(ActionListDDAttendanceDetail.class);
+
+    public ActionResult<List<Wo>> execute(JsonElement jsonElement) throws Exception {
+        ActionResult<List<Wo>> result = new ActionResult<>();
+        try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+            Business business = new Business(emc);
+            Wi wi = this.convertToWrapIn(jsonElement , Wi.class);
+            Date start = DateTools.parseDateTime(wi.getStartTime());
+            Date end = DateTools.parseDateTime(wi.getEndTime());
+            String dingdingUser = null;
+            //转化dingding的id
+            if (wi.getPerson() != null) {
+                Person person = business.organization().person().getObject(wi.getPerson());
+                dingdingUser = person.getDingdingId();
+            }
+            List<AttendanceDingtalkDetail> list = business.dingdingAttendanceFactory().findAllDingdingAttendanceDetail(start, end, dingdingUser);
+            if (list != null && !list.isEmpty()) {
+                List<Wo> wos = list.stream().map(detail -> {
+                    Wo wo = new Wo();
+                    try {
+                        wo = Wo.copier.copy(detail, wo);
+                        wo.formatDateTime();
+                    }catch (Exception e) {
+                        logger.error(e);
+                    }
+                    return wo;
+                }).collect(Collectors.toList());
+                result.setData(wos);
+            }
+        }
+        return result;
+    }
+
+    public static class Wi extends GsonPropertyObject {
+        @FieldDescribe("开始时间:yyyy-MM-dd HH:mm:ss")
+        private String startTime;
+        @FieldDescribe("结束时间:yyyy-MM-dd HH:mm:ss")
+        private String endTime;
+        @FieldDescribe("人员")
+        private String person;
+
+
+        public String getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(String startTime) {
+            this.startTime = startTime;
+        }
+
+        public String getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(String endTime) {
+            this.endTime = endTime;
+        }
+
+        public String getPerson() {
+            return person;
+        }
+
+        public void setPerson(String person) {
+            this.person = person;
+        }
+    }
+
+    public static class Wo extends AttendanceDingtalkDetail {
+        static final WrapCopier<AttendanceDingtalkDetail, Wo> copier =
+                WrapCopierFactory.wo(AttendanceDingtalkDetail.class, Wo.class, null, JpaObject.FieldsInvisible);
+
+        @FieldDescribe("实际打卡时间")
+        private Date userCheckTimeFormat;
+        @FieldDescribe("工作日")
+        private Date workDateFormat;
+        @FieldDescribe("基准时间,用于计算迟到和早退")
+        private Date baseCheckTimeFormat;
+
+        public void formatDateTime() {
+            if (userCheckTimeFormat == null) {
+                Date date = new Date();
+                date.setTime(getUserCheckTime());
+                setUserCheckTimeFormat(date);
+            }
+            if (workDateFormat == null) {
+                Date date = new Date();
+                date.setTime(getWorkDate());
+                setWorkDateFormat(date);
+            }
+            if (baseCheckTimeFormat == null) {
+                Date date = new Date();
+                date.setTime(getBaseCheckTime());
+                setBaseCheckTimeFormat(date);
+            }
+        }
+
+        public Date getUserCheckTimeFormat() {
+            return userCheckTimeFormat;
+        }
+
+        public void setUserCheckTimeFormat(Date userCheckTimeFormat) {
+            this.userCheckTimeFormat = userCheckTimeFormat;
+        }
+
+        public Date getWorkDateFormat() {
+            return workDateFormat;
+        }
+
+        public void setWorkDateFormat(Date workDateFormat) {
+            this.workDateFormat = workDateFormat;
+        }
+
+        public Date getBaseCheckTimeFormat() {
+            return baseCheckTimeFormat;
+        }
+
+        public void setBaseCheckTimeFormat(Date baseCheckTimeFormat) {
+            this.baseCheckTimeFormat = baseCheckTimeFormat;
+        }
+    }
+}

+ 17 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/DingdingAttendanceAction.java

@@ -87,5 +87,22 @@ public class DingdingAttendanceAction extends StandardJaxrsAction {
         asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
     }
 
+    @JaxrsMethodDescribe(value = "查询钉钉打卡结果", action = ActionListDDAttendanceDetail.class)
+    @PUT
+    @Path("attendance/list")
+    @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public void listDingdingAttendance(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {
+        ActionResult<List<ActionListDDAttendanceDetail.Wo>> result = new ActionResult<>();
+        EffectivePerson effectivePerson = this.effectivePerson(request);
+        try {
+            result = new ActionListDDAttendanceDetail().execute(jsonElement);
+        }catch (Exception e) {
+            logger.error(e, effectivePerson, request, null);
+            result.error(e);
+        }
+        asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+    }
+
 
 }