Sfoglia il codice sorgente

钉钉考勤统计接口

fancy 5 anni fa
parent
commit
9887f403ad
11 ha cambiato i file con 327 aggiunte e 3 eliminazioni
  1. 43 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java
  2. 2 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/DingdingJaxrsFilter.java
  3. 46 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionEnableType.java
  4. 18 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/AttendanceSettingAction.java
  5. 59 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ActionListDDAttendanceDetail.java
  6. 42 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/ActionPersonStatistic.java
  7. 42 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/ActionUnitStatistic.java
  8. 42 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/DingdingAttendanceStatisticAction.java
  9. 13 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/EmptyArgsException.java
  10. 2 1
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/jaxrs/DingdingJaxrsFilter.java
  11. 18 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/jaxrs/attendancesetting/AttendanceSettingAction.java

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

@@ -133,6 +133,49 @@ public class DingdingAttendanceFactory extends AbstractFactory {
     }
 
 
+    /**
+     * 人员统计数据
+     * @param person
+     * @param year
+     * @param month
+     * @return
+     * @throws Exception
+     */
+    public List<StatisticDingdingPersonForMonth> findPersonStatistic(String person, String year, String month) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(StatisticDingdingPersonForMonth.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<StatisticDingdingPersonForMonth> query = cb.createQuery(StatisticDingdingPersonForMonth.class);
+        Root<StatisticDingdingPersonForMonth> root = query.from(StatisticDingdingPersonForMonth.class);
+        Predicate p = cb.equal(root.get(StatisticDingdingPersonForMonth_.o2User), person);
+        p = cb.and(p, cb.equal(root.get(StatisticDingdingPersonForMonth_.statisticYear), year));
+        p = cb.and(p, cb.equal(root.get(StatisticDingdingPersonForMonth_.statisticMonth), month));
+
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
+
+    /**
+     * 部门统计数据
+     * @param unit
+     * @param year
+     * @param month
+     * @return
+     * @throws Exception
+     */
+    public List<StatisticDingdingUnitForMonth> findUnitStatistic(String unit, String year, String month) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(StatisticDingdingUnitForMonth.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<StatisticDingdingUnitForMonth> query = cb.createQuery(StatisticDingdingUnitForMonth.class);
+        Root<StatisticDingdingUnitForMonth> root = query.from(StatisticDingdingUnitForMonth.class);
+        Predicate p = cb.equal(root.get(StatisticDingdingUnitForMonth_.o2Unit), unit);
+        p = cb.and(p, cb.equal(root.get(StatisticDingdingUnitForMonth_.statisticYear), year));
+        p = cb.and(p, cb.equal(root.get(StatisticDingdingUnitForMonth_.statisticMonth), month));
+
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
     ////////////////////////////////统计/////////////////////////////
 
     /**

+ 2 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/DingdingJaxrsFilter.java

@@ -1,10 +1,11 @@
 package com.x.attendance.assemble.control.jaxrs;
 
 import com.x.base.core.project.jaxrs.CipherManagerJaxrsFilter;
+import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
 
 import javax.servlet.annotation.WebFilter;
 
 
 @WebFilter(urlPatterns = "/jaxrs/dingding/*", asyncSupported = true)
-public class DingdingJaxrsFilter extends CipherManagerJaxrsFilter {
+public class DingdingJaxrsFilter extends ManagerUserJaxrsFilter {
 }

+ 46 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionEnableType.java

@@ -0,0 +1,46 @@
+package com.x.attendance.assemble.control.jaxrs.attendancesetting;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapString;
+import com.x.base.core.project.organization.OrganizationDefinition;
+
+
+class ActionEnableType extends BaseAction {
+
+	public static final String TYPE_QIYEWEIXIN = "qywx";
+	public static final String TYPE_DINGDING = "dingding";
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			if (effectivePerson.isNotManager() && (!business.organization().person().hasRole(effectivePerson,
+					OrganizationDefinition.Manager, OrganizationDefinition.AttendanceManager))) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+			ActionResult<Wo> result = new ActionResult<>();
+
+			Wo wo = new Wo();
+
+			if (Config.qiyeweixin().getEnable() && Config.qiyeweixin().getAttendanceSyncEnable()) {
+				wo.setValue(TYPE_QIYEWEIXIN);
+			} else if (Config.dingding().getEnable() && Config.dingding().getAttendanceSyncEnable()) {
+				wo.setValue(TYPE_DINGDING);
+			} else {
+				wo.setValue("");
+			}
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WrapString {
+
+	}
+
+}

+ 18 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/AttendanceSettingAction.java

@@ -152,4 +152,22 @@ public class AttendanceSettingAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "是否启用钉钉考勤或企业微信考勤", action = ActionEnableType.class)
+	@GET
+	@Path("enable/type")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void enableType(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionEnableType.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionEnableType().execute(effectivePerson);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			result.error(e);
+			logger.error(e, effectivePerson, request, null);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }

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

@@ -74,6 +74,12 @@ public class ActionListDDAttendanceDetail extends BaseAction {
             if (StringUtils.isNotEmpty(wi.getPerson())) {
                 EqualsTerms equals = new EqualsTerms();
                 equals.put("o2User", wi.getPerson());
+                if (isCheckTypeEnable(wi.getCheckType())){
+                    equals.put("checkType", wi.getCheckType());
+                }
+                if (isTimeResultEnable(wi.getTimeResult())) {
+                    equals.put("timeResult", wi.getTimeResult());
+                }
                 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);
@@ -81,11 +87,24 @@ public class ActionListDDAttendanceDetail extends BaseAction {
             if (StringUtils.isNotEmpty(wi.getUnit())) {
                 EqualsTerms equals = new EqualsTerms();
                 equals.put("o2Unit", wi.getUnit());
+                if (isCheckTypeEnable(wi.getCheckType())){
+                    equals.put("checkType", wi.getCheckType());
+                }
+                if (isTimeResultEnable(wi.getTimeResult())) {
+                    equals.put("timeResult", wi.getTimeResult());
+                }
                 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())) {
+                EqualsTerms equals = new EqualsTerms();
+                if (isCheckTypeEnable(wi.getCheckType())){
+                    equals.put("checkType", wi.getCheckType());
+                }
+                if (isTimeResultEnable(wi.getTimeResult())) {
+                    equals.put("timeResult", wi.getTimeResult());
+                }
                 InTerms ins = new InTerms();
                 List<String> subUnits = business.organization().unit().listWithUnitSubNested( wi.getTopUnit() );
                 if (subUnits == null || subUnits.isEmpty()) {
@@ -94,7 +113,7 @@ public class ActionListDDAttendanceDetail extends BaseAction {
                 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,
+                result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, equals, null,
                         null, ins, null, null, null, betweenTerms, true, DESC);
             }
 
@@ -102,6 +121,26 @@ public class ActionListDDAttendanceDetail extends BaseAction {
         return result;
     }
 
+    private boolean isCheckTypeEnable(String type) {
+        if (StringUtils.isEmpty(type) || (!AttendanceDingtalkDetail.OffDuty.equals(type) && !AttendanceDingtalkDetail.OnDuty.equals(type))) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean isTimeResultEnable(String result) {
+        if (StringUtils.isEmpty(result) ||
+                (!AttendanceDingtalkDetail.TIMERESULT_Absenteeism.equals(result)
+                        && !AttendanceDingtalkDetail.TIMERESULT_Early.equals(result)
+                        && !AttendanceDingtalkDetail.TIMERESULT_Late.equals(result)
+                        && !AttendanceDingtalkDetail.TIMERESULT_NORMAL.equals(result)
+                        && !AttendanceDingtalkDetail.TIMERESULT_NotSigned.equals(result)
+                        && !AttendanceDingtalkDetail.TIMERESULT_SeriousLate.equals(result))) {
+            return false;
+        }
+        return true;
+    }
+
     public static Date getMonthLastDay(String year, String month) throws Exception {
         Calendar cal = Calendar.getInstance();
         int yearInt = Integer.parseInt(year);
@@ -160,8 +199,27 @@ public class ActionListDDAttendanceDetail extends BaseAction {
         private String unit;
         @FieldDescribe("顶级部门,会及联查询下级部门")
         private String topUnit;
+        @FieldDescribe("打卡类型:OffDuty|OnDuty")
+        private String checkType;
+        @FieldDescribe("打卡结果:Normal|Early|Late|SeriousLate|Absenteeism|NotSigned")
+        private String timeResult;
+
+
+        public String getCheckType() {
+            return checkType;
+        }
 
+        public void setCheckType(String checkType) {
+            this.checkType = checkType;
+        }
 
+        public String getTimeResult() {
+            return timeResult;
+        }
+
+        public void setTimeResult(String timeResult) {
+            this.timeResult = timeResult;
+        }
 
         public String getYear() {
             return year;

+ 42 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/ActionPersonStatistic.java

@@ -0,0 +1,42 @@
+package com.x.attendance.assemble.control.jaxrs.dingdingstatistic;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.StatisticDingdingPersonForMonth;
+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.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * Created by fancyLou on 2020-04-07.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class ActionPersonStatistic extends BaseAction {
+
+
+    ActionResult<List<Wo>> execute(String person, String year, String month) throws Exception {
+        ActionResult<List<Wo>> result = new ActionResult<>();
+        if (StringUtils.isEmpty(person) || StringUtils.isEmpty(year) || StringUtils.isEmpty(month)) {
+            throw new EmptyArgsException();
+        }
+        try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+            Business business = new Business(emc);
+            List<StatisticDingdingPersonForMonth> list = business.dingdingAttendanceFactory().findPersonStatistic(person, year, month);
+            result.setData(Wo.copier.copy(list));
+        }
+        return result;
+    }
+
+
+
+    public static class Wo extends StatisticDingdingPersonForMonth {
+        static final WrapCopier<StatisticDingdingPersonForMonth, Wo> copier = WrapCopierFactory.wo(StatisticDingdingPersonForMonth.class, Wo.class,
+                null, JpaObject.FieldsInvisible);
+
+    }
+}

+ 42 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/ActionUnitStatistic.java

@@ -0,0 +1,42 @@
+package com.x.attendance.assemble.control.jaxrs.dingdingstatistic;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.StatisticDingdingUnitForMonth;
+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.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * Created by fancyLou on 2020-04-07.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class ActionUnitStatistic extends BaseAction {
+
+
+    ActionResult<List<Wo>> execute(String unit, String year, String month) throws Exception {
+        ActionResult<List<Wo>> result = new ActionResult<>();
+        if (StringUtils.isEmpty(unit) || StringUtils.isEmpty(year) || StringUtils.isEmpty(month)) {
+            throw new EmptyArgsException();
+        }
+        try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+            Business business = new Business(emc);
+            List<StatisticDingdingUnitForMonth> list = business.dingdingAttendanceFactory().findUnitStatistic(unit, year, month);
+            result.setData(Wo.copier.copy(list));
+        }
+        return result;
+    }
+
+
+
+    public static class Wo extends StatisticDingdingUnitForMonth {
+        static final WrapCopier<StatisticDingdingUnitForMonth, Wo> copier = WrapCopierFactory.wo(StatisticDingdingUnitForMonth.class, Wo.class,
+                null, JpaObject.FieldsInvisible);
+
+    }
+}

+ 42 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/DingdingAttendanceStatisticAction.java

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control.jaxrs.dingdingstatistic;
 
 import com.x.base.core.project.annotation.JaxrsDescribe;
 import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.http.HttpMediaType;
@@ -17,6 +18,7 @@ import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import java.util.List;
 
 /**
  * Created by fancyLou on 2020-04-05.
@@ -45,4 +47,44 @@ public class DingdingAttendanceStatisticAction extends StandardJaxrsAction {
         asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
     }
 
+    @JaxrsMethodDescribe(value = "人员月份统计查询", action = ActionPersonStatistic.class)
+    @GET
+    @Path("person/{person}/{year}/{month}")
+    @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public void personMonth(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+                            @JaxrsParameterDescribe("人员") @PathParam("person") String person,
+                            @JaxrsParameterDescribe("年份: yyyy") @PathParam("year") String year,
+                            @JaxrsParameterDescribe("月份: MM") @PathParam("month") String month) {
+        ActionResult<List<ActionPersonStatistic.Wo>> result = new ActionResult<>();
+        EffectivePerson effectivePerson = this.effectivePerson(request);
+        try {
+            result = new ActionPersonStatistic().execute(person, year, month);
+        }catch (Exception e) {
+            logger.error(e, effectivePerson, request, null);
+            result.error(e);
+        }
+        asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+    }
+
+    @JaxrsMethodDescribe(value = "部门月份统计查询", action = ActionUnitStatistic.class)
+    @GET
+    @Path("unit/{unit}/{year}/{month}")
+    @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public void unitMonth(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+                            @JaxrsParameterDescribe("部门") @PathParam("unit") String unit,
+                            @JaxrsParameterDescribe("年份: yyyy") @PathParam("year") String year,
+                            @JaxrsParameterDescribe("月份: MM") @PathParam("month") String month) {
+        ActionResult<List<ActionUnitStatistic.Wo>> result = new ActionResult<>();
+        EffectivePerson effectivePerson = this.effectivePerson(request);
+        try {
+            result = new ActionUnitStatistic().execute(unit, year, month);
+        }catch (Exception e) {
+            logger.error(e, effectivePerson, request, null);
+            result.error(e);
+        }
+        asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+    }
+
 }

+ 13 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/EmptyArgsException.java

@@ -0,0 +1,13 @@
+package com.x.attendance.assemble.control.jaxrs.dingdingstatistic;
+
+import com.x.base.core.project.exception.PromptException;
+
+/**
+ * Created by fancyLou on 2020-04-07.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class EmptyArgsException extends PromptException {
+    public EmptyArgsException() {
+        super("传入参数不能为空!");
+    }
+}

+ 2 - 1
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/jaxrs/DingdingJaxrsFilter.java

@@ -1,10 +1,11 @@
 package com.x.attendance.assemble.control.jaxrs;
 
 import com.x.base.core.project.jaxrs.CipherManagerJaxrsFilter;
+import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
 
 import javax.servlet.annotation.WebFilter;
 
 
 @WebFilter(urlPatterns = "/jaxrs/dingding/*", asyncSupported = true)
-public class DingdingJaxrsFilter extends CipherManagerJaxrsFilter {
+public class DingdingJaxrsFilter extends ManagerUserJaxrsFilter {
 }

+ 18 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/jaxrs/attendancesetting/AttendanceSettingAction.java

@@ -152,4 +152,22 @@ public class AttendanceSettingAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "是否启用钉钉考勤或企业微信考勤", action = ActionEnableType.class)
+	@GET
+	@Path("enable/type")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void enableType(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionEnableType.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionEnableType().execute(effectivePerson);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			result.error(e);
+			logger.error(e, effectivePerson, request, null);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }