Kaynağa Gözat

钉钉考勤查询

fancy 5 yıl önce
ebeveyn
işleme
c4b15c406a

+ 31 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/DingdingAttendanceQueue.java

@@ -16,6 +16,7 @@ import com.x.base.core.project.gson.GsonPropertyObject;
 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.organization.Unit;
 import com.x.base.core.project.queue.AbstractQueue;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
@@ -29,6 +30,7 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecord> {
@@ -91,7 +93,7 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
                         DingdingAttendanceResult result = HttpConnection.postAsObject(dingdingUrl, null, post.toString(), DingdingAttendanceResult.class);
                         if (result.errcode != null && result.errcode == 0) {
                             List<DingdingAttendanceResultItem> resultList = result.getRecordresult();
-                            saveDingdingAttendance(resultList);
+                            saveDingdingAttendance(resultList, list);
                             saveNumber += resultList.size();
                             if (result.hasMore) {
                                 page++;
@@ -150,20 +152,47 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
         }
     }
 
-    private void saveDingdingAttendance(List<DingdingAttendanceResultItem> list) throws Exception {
+    private void saveDingdingAttendance(List<DingdingAttendanceResultItem> list, List<Person> personList) throws Exception {
         if (list != null && !list.isEmpty()) {
             try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+                Business business = new Business(emc);
                 emc.beginTransaction(AttendanceDingtalkDetail.class);
                 for (int i = 0; i < list.size(); i++) {
                     DingdingAttendanceResultItem item = list.get(i);
                     AttendanceDingtalkDetail detail = DingdingAttendanceResultItem.copier.copy(item);
                     detail.setDdId(item.getId());
+                    //添加o2组织和用户
+                    Optional<Person> first = personList.stream().filter(p -> item.userId.equals(p.getDingdingId())).findFirst();
+                    if (first.isPresent()) {
+                        Person person = first.get();
+                        String unit = getUnitWithPerson(person.getDistinguishedName(), business);
+                        detail.setO2Unit(unit);
+                        detail.setO2User(person.getDistinguishedName());
+                    }
                     emc.persist(detail);
                 }
                 emc.commit();
             }
         }
     }
+    private String getUnitWithPerson(String person, Business business) throws Exception {
+        String result = null;
+        Integer level = 0;
+        Unit unit = null;
+        List<String> unitNames = business.organization().unit().listWithPerson( person );
+        if( ListTools.isNotEmpty( unitNames ) ) {
+            for( String unitName : unitNames ) {
+                if( StringUtils.isNotEmpty( unitName ) && !"null".equals( unitName ) ) {
+                    unit = business.organization().unit().getObject( unitName );
+                    if( level < unit.getLevel() ) {
+                        level = unit.getLevel();
+                        result = unitName;
+                    }
+                }
+            }
+        }
+        return result;
+    }
 
     private void updateSyncRecord(DingdingQywxSyncRecord record, String errMsg) throws Exception {
         try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {

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

@@ -2,7 +2,10 @@ package com.x.attendance.assemble.control.jaxrs.dingding;
 
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.dingding.exception.SearchArgEmptyException;
+import com.x.attendance.assemble.control.jaxrs.dingding.exception.TimeEmptyException;
 import com.x.attendance.entity.AttendanceDingtalkDetail;
+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;
@@ -11,11 +14,19 @@ 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.jaxrs.BetweenTerms;
+import com.x.base.core.project.jaxrs.EqualsTerms;
+import com.x.base.core.project.jaxrs.InTerms;
 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 com.x.base.core.project.tools.ListTools;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -24,60 +35,164 @@ public class ActionListDDAttendanceDetail extends BaseAction {
 
     private static final Logger logger = LoggerFactory.getLogger(ActionListDDAttendanceDetail.class);
 
-    public ActionResult<List<Wo>> execute(JsonElement jsonElement) throws Exception {
+    public ActionResult<List<Wo>> execute(String flag, Integer count, 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 && !wi.getPerson().isEmpty()) {
-                Person person = business.organization().person().getObject(wi.getPerson());
-                dingdingUser = person.getDingdingId();
+            logger.info("传入参数:"+wi.toString());
+            if (StringUtils.isEmpty(wi.getYear())) {
+                throw new TimeEmptyException();
             }
-            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);
+            if (StringUtils.isEmpty(wi.getPerson()) && StringUtils.isEmpty(wi.getUnit()) && StringUtils.isEmpty(wi.getTopUnit())) {
+                throw new SearchArgEmptyException();
             }
+            Date startDay  ;
+            Date endDay;
+            if (StringUtils.isEmpty(wi.getMonth())) {
+                startDay = getDay(wi.getYear(), "1", "1");
+                endDay = getDay(wi.getYear(), "12", "31");
+            }else {
+                if (StringUtils.isEmpty(wi.getDay())) {
+                    startDay = getDay(wi.getYear(), wi.getMonth(), "1");
+                    endDay = getMonthLastDay(wi.getYear(), wi.getMonth());
+                }else {
+                    startDay = getDay(wi.getYear(), wi.getMonth(), wi.getDay());
+                    endDay = getEndDay(wi.getYear(), wi.getMonth(), wi.getDay());
+                }
+            }
+            logger.info("startDay:"+DateTools.format(startDay));
+            logger.info("endDay:"+DateTools.format(endDay));
+            BetweenTerms betweenTerms = new BetweenTerms();
+            betweenTerms.put("userCheckTime", ListTools.toList(startDay.getTime(), endDay.getTime()));
+            logger.info("between :"+betweenTerms.toString());
+            String id = EMPTY_SYMBOL;
+            /** 如果不是空位标志位 */
+            if (!StringUtils.equals(EMPTY_SYMBOL, flag)) {
+                id = flag;
+            }
+            if (StringUtils.isNotEmpty(wi.getPerson())) {
+                EqualsTerms equals = new EqualsTerms();
+                equals.put("o2User", wi.getPerson());
+                logger.info("equals :"+equals.toString());
+                result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, equals, null,
+                        null, null, null, null, null, betweenTerms, true, DESC);
+            }
+            if (StringUtils.isNotEmpty(wi.getUnit())) {
+                EqualsTerms equals = new EqualsTerms();
+                equals.put("o2Unit", wi.getUnit());
+                logger.info("equals :"+equals.toString());
+                result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, equals, null,
+                        null, null, null, null, null, betweenTerms, true, DESC);
+            }
+            if (StringUtils.isNotEmpty(wi.getTopUnit())) {
+                InTerms ins = new InTerms();
+                List<String> subUnits = business.organization().unit().listWithUnitSubNested( wi.getTopUnit() );
+                if (subUnits == null || subUnits.isEmpty()) {
+                    subUnits = new ArrayList<>();
+                }
+                subUnits.add(wi.getTopUnit());
+                ins.put("o2Unit", subUnits);
+                logger.info("ins :"+ins.toString());
+                result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, null, null,
+                        null, ins, null, null, null, betweenTerms, true, DESC);
+            }
+
         }
         return result;
     }
 
+    public static Date getMonthLastDay(String year, String month) throws Exception {
+        Calendar cal = Calendar.getInstance();
+        int yearInt = Integer.parseInt(year);
+        cal.set(Calendar.YEAR, yearInt);
+        int monthInt = Integer.parseInt(month);
+        cal.set(Calendar.MONTH, monthInt);
+        cal.set(Calendar.DAY_OF_MONTH, 1);
+        cal.set(Calendar.HOUR_OF_DAY, 23);
+        cal.set(Calendar.MINUTE, 59);
+        cal.set(Calendar.SECOND, 59);
+        cal.set(Calendar.MILLISECOND, 0);
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    public static Date getDay(String year, String month, String day) throws Exception {
+        Calendar cal = Calendar.getInstance();
+        int yearInt = Integer.parseInt(year);
+        cal.set(Calendar.YEAR, yearInt);
+        int monthInt = Integer.parseInt(month);
+        cal.set(Calendar.MONTH, monthInt-1);
+        int dayInt = Integer.parseInt(day);
+        cal.set(Calendar.DATE, dayInt);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+    public static Date getEndDay(String year, String month, String day) throws Exception {
+        Calendar cal = Calendar.getInstance();
+        int yearInt = Integer.parseInt(year);
+        cal.set(Calendar.YEAR, yearInt);
+        int monthInt = Integer.parseInt(month);
+        cal.set(Calendar.MONTH, monthInt-1);
+        int dayInt = Integer.parseInt(day);
+        cal.set(Calendar.DATE, dayInt);
+        cal.set(Calendar.HOUR_OF_DAY, 23);
+        cal.set(Calendar.MINUTE, 59);
+        cal.set(Calendar.SECOND, 59);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+
     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 year;
+        @FieldDescribe("月份")
+        private String month;
+        @FieldDescribe("日期")
+        private String day;
         @FieldDescribe("人员")
         private String person;
+        @FieldDescribe("部门")
+        private String unit;
+        @FieldDescribe("顶级部门,会及联查询下级部门")
+        private String topUnit;
+
+
+
+        public String getYear() {
+            return year;
+        }
+
+        public void setYear(String year) {
+            this.year = year;
+        }
+
+        public String getMonth() {
+            return month;
+        }
 
+        public void setMonth(String month) {
+            this.month = month;
+        }
 
-        public String getStartTime() {
-            return startTime;
+        public String getDay() {
+            return day;
         }
 
-        public void setStartTime(String startTime) {
-            this.startTime = startTime;
+        public void setDay(String day) {
+            this.day = day;
         }
 
-        public String getEndTime() {
-            return endTime;
+        public String getUnit() {
+            return unit;
         }
 
-        public void setEndTime(String endTime) {
-            this.endTime = endTime;
+        public void setUnit(String unit) {
+            this.unit = unit;
         }
 
         public String getPerson() {
@@ -87,6 +202,14 @@ public class ActionListDDAttendanceDetail extends BaseAction {
         public void setPerson(String person) {
             this.person = person;
         }
+
+        public String getTopUnit() {
+            return topUnit;
+        }
+
+        public void setTopUnit(String topUnit) {
+            this.topUnit = topUnit;
+        }
     }
 
     public static class Wo extends AttendanceDingtalkDetail {
@@ -99,6 +222,9 @@ public class ActionListDDAttendanceDetail extends BaseAction {
         private Date workDateFormat;
         @FieldDescribe("基准时间,用于计算迟到和早退")
         private Date baseCheckTimeFormat;
+        @FieldDescribe("排序号")
+        private Long rank;
+
 
         public void formatDateTime() {
             if (userCheckTimeFormat == null) {
@@ -118,6 +244,14 @@ public class ActionListDDAttendanceDetail extends BaseAction {
             }
         }
 
+        public Long getRank() {
+            return rank;
+        }
+
+        public void setRank(Long rank) {
+            this.rank = rank;
+        }
+
         public Date getUserCheckTimeFormat() {
             return userCheckTimeFormat;
         }

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

@@ -88,14 +88,17 @@ public class DingdingAttendanceAction extends StandardJaxrsAction {
 
     @JaxrsMethodDescribe(value = "查询钉钉打卡结果", action = ActionListDDAttendanceDetail.class)
     @PUT
-    @Path("attendance/list")
+    @Path("attendance/list/{id}/next/{count}")
     @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
     @Consumes(MediaType.APPLICATION_JSON)
-    public void listDingdingAttendance(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {
+    public void listNextDingdingAttendance(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+                                       @JaxrsParameterDescribe("最后一条数据ID") @PathParam("id") String id,
+                                       @JaxrsParameterDescribe("每页显示的条目数量") @PathParam("count") Integer count,
+                                       JsonElement jsonElement) {
         ActionResult<List<ActionListDDAttendanceDetail.Wo>> result = new ActionResult<>();
         EffectivePerson effectivePerson = this.effectivePerson(request);
         try {
-            result = new ActionListDDAttendanceDetail().execute(jsonElement);
+            result = new ActionListDDAttendanceDetail().execute(id, count, jsonElement);
         }catch (Exception e) {
             logger.error(e, effectivePerson, request, null);
             result.error(e);

+ 14 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/exception/SearchArgEmptyException.java

@@ -0,0 +1,14 @@
+package com.x.attendance.assemble.control.jaxrs.dingding.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+/**
+ * Created by fancyLou on 2020-04-01.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class SearchArgEmptyException extends PromptException {
+
+    public SearchArgEmptyException() {
+        super("传入参数不正确!");
+    }
+}

+ 14 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/exception/TimeEmptyException.java

@@ -0,0 +1,14 @@
+package com.x.attendance.assemble.control.jaxrs.dingding.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+/**
+ * Created by fancyLou on 2020-04-01.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class TimeEmptyException extends PromptException {
+
+    public TimeEmptyException() {
+        super("传入的时间参数不正确!");
+    }
+}

+ 3 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/UserManagerService.java

@@ -27,10 +27,10 @@ public class UserManagerService {
 		}
 	}
 	/**
-	 * 根据员工姓名获取组织名称
+	 * 根据员工获取所在组织
 	 * 如果用户有多个身份,则取组织级别最大的组织名称
-	 * @param employeeName
-	 * @return
+	 * @param personName dn
+	 * @return unit 也是 dn
 	 * @throws Exception 
 	 */
 	public String getUnitNameWithPersonName( String personName ) throws Exception{

+ 25 - 1
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceDingtalkDetail.java

@@ -49,10 +49,18 @@ public class AttendanceDingtalkDetail extends SliceJpaObject  {
     @Column(name = ColumnNamePrefix + "ddID")
     private long ddId;
 
-    @FieldDescribe("用户id")
+    @FieldDescribe("钉钉的用户id")
     @Column(name = ColumnNamePrefix + "userId", length = length_96B)
     private String userId;
 
+    @FieldDescribe("O2用户")
+    @Column(name = ColumnNamePrefix + "o2User", length = length_128B)
+    private String o2User;
+
+    @FieldDescribe("O2用户所在的组织")
+    @Column(name = ColumnNamePrefix + "o2Unit", length = length_128B)
+    private String o2Unit;
+
     @FieldDescribe("基准时间,用于计算迟到和早退")
     @Column(name = ColumnNamePrefix + "baseCheckTime")
     private long baseCheckTime;
@@ -142,6 +150,22 @@ public class AttendanceDingtalkDetail extends SliceJpaObject  {
 //    private String procInstId;
 
 
+    public String getO2User() {
+        return o2User;
+    }
+
+    public void setO2User(String o2User) {
+        this.o2User = o2User;
+    }
+
+    public String getO2Unit() {
+        return o2Unit;
+    }
+
+    public void setO2Unit(String o2Unit) {
+        this.o2Unit = o2Unit;
+    }
+
     public long getDdId() {
         return ddId;
     }