ソースを参照

企业微信 统计功能完成

fancy 5 年 前
コミット
bd105872b7
12 ファイル変更338 行追加41 行削除
  1. 5 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/QywxAttendanceSyncQueue.java
  2. 72 7
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java
  3. 2 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/ActionApplication.java
  4. 10 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/QywxStatisticJaxrsFilter.java
  5. 0 15
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/ActionTest.java
  6. 1 16
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingdingstatistic/DingdingAttendanceStatisticAction.java
  7. 9 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywx/ActionListQywxAttendanceDetail.java
  8. 45 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/ActionPersonStatistic.java
  9. 45 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/ActionPersonStatisticWithUnit.java
  10. 49 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/ActionUnitStatistic.java
  11. 6 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/BaseAction.java
  12. 94 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/QywxAttendanceStatisticAction.java

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

@@ -160,6 +160,10 @@ public class QywxAttendanceSyncQueue  extends AbstractQueue<DingdingQywxSyncReco
                         detail.setO2Unit(unit);
                         detail.setO2User(person.getDistinguishedName());
                     }
+                    //设置正常的类型
+                    if (StringUtils.isEmpty(detail.getException_type())){
+                        detail.setException_type(AttendanceQywxDetail.EXCEPTION_TYPE_NORMAL);
+                    }
                     emc.persist(detail);
                 }
                 emc.commit();
@@ -193,9 +197,7 @@ public class QywxAttendanceSyncQueue  extends AbstractQueue<DingdingQywxSyncReco
             CriteriaBuilder cb = em.getCriteriaBuilder();
             CriteriaQuery<AttendanceQywxDetail> query = cb.createQuery(AttendanceQywxDetail.class);
             Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
-            long start = fromDate.getTime();
-            long end = toDate.getTime();
-            Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time), start, end);
+            Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), fromDate, toDate);
             query.select(root).where(p);
             List<AttendanceQywxDetail> detailList = em.createQuery(query).getResultList();
             //先删除

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

@@ -116,9 +116,7 @@ public class DingdingAttendanceFactory extends AbstractFactory {
 
         Predicate p = null;
         if (startTime != null && endTime != null) {
-            long start = startTime.getTime();
-            long end = endTime.getTime();
-            p = cb.between(root.get(AttendanceQywxDetail_.checkin_time), start, end);
+            p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
         }
         if (userId != null && !userId.isEmpty()) {
             if (p != null) {
@@ -127,7 +125,7 @@ public class DingdingAttendanceFactory extends AbstractFactory {
                 p = cb.equal(root.get(AttendanceQywxDetail_.userid), userId);
             }
         }
-        query.select(root).where(p).orderBy(cb.desc(root.get(AttendanceQywxDetail_.checkin_time)));
+        query.select(root).where(p).orderBy(cb.desc(root.get(AttendanceQywxDetail_.checkin_time_date)));
         return em.createQuery(query).getResultList();
 
     }
@@ -466,6 +464,72 @@ public class DingdingAttendanceFactory extends AbstractFactory {
 
     /*********************企业微信统计 ******************************/
 
+
+    /**
+     * 部门统计数据
+     * @param unit
+     * @param year
+     * @param month
+     * @return
+     * @throws Exception
+     */
+    public List<StatisticQywxUnitForMonth> findQywxUnitStatistic(String unit, String year, String month) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(StatisticQywxUnitForMonth.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<StatisticQywxUnitForMonth> query = cb.createQuery(StatisticQywxUnitForMonth.class);
+        Root<StatisticQywxUnitForMonth> root = query.from(StatisticQywxUnitForMonth.class);
+        Predicate p = cb.equal(root.get(StatisticQywxUnitForMonth_.o2Unit), unit);
+        p = cb.and(p, cb.equal(root.get(StatisticQywxUnitForMonth_.statisticYear), year));
+        p = cb.and(p, cb.equal(root.get(StatisticQywxUnitForMonth_.statisticMonth), month));
+
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
+    /**
+     * 人员统计数据
+     * @param unit
+     * @param year
+     * @param month
+     * @return
+     * @throws Exception
+     */
+    public List<StatisticQywxPersonForMonth> findQywxPersonStatisticWithUnit(String unit, String year, String month) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(StatisticQywxPersonForMonth.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<StatisticQywxPersonForMonth> query = cb.createQuery(StatisticQywxPersonForMonth.class);
+        Root<StatisticQywxPersonForMonth> root = query.from(StatisticQywxPersonForMonth.class);
+        Predicate p = cb.equal(root.get(StatisticQywxPersonForMonth_.o2Unit), unit);
+        p = cb.and(p, cb.equal(root.get(StatisticQywxPersonForMonth_.statisticYear), year));
+        p = cb.and(p, cb.equal(root.get(StatisticQywxPersonForMonth_.statisticMonth), month));
+
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
+
+
+    /**
+     * 人员统计数据
+     * @param person
+     * @param year
+     * @param month
+     * @return
+     * @throws Exception
+     */
+    public List<StatisticQywxPersonForMonth> findQywxPersonStatistic(String person, String year, String month) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(StatisticQywxPersonForMonth.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<StatisticQywxPersonForMonth> query = cb.createQuery(StatisticQywxPersonForMonth.class);
+        Root<StatisticQywxPersonForMonth> root = query.from(StatisticQywxPersonForMonth.class);
+        Predicate p = cb.equal(root.get(StatisticQywxPersonForMonth_.o2User), person);
+        p = cb.and(p, cb.equal(root.get(StatisticQywxPersonForMonth_.statisticYear), year));
+        p = cb.and(p, cb.equal(root.get(StatisticQywxPersonForMonth_.statisticMonth), month));
+
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
     /**
      * 个人 月份 所有数据
      * @param year
@@ -477,11 +541,12 @@ public class DingdingAttendanceFactory extends AbstractFactory {
     public List<AttendanceQywxDetail> qywxPersonForMonthList(String year, String month, String person)  throws Exception {
         Date start = monthFirstDay(year, month);
         Date end = monthLastDay(year, month);
+
         EntityManager em = this.entityManagerContainer().get(AttendanceQywxDetail.class);
         CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<AttendanceQywxDetail> query = cb.createQuery(AttendanceQywxDetail.class);
         Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
-        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time), start.getTime(), end.getTime());
+        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), start, end);
         p = cb.and(p, cb.equal(root.get(AttendanceQywxDetail_.o2User), person));
         query.select(root).where(p);
         return em.createQuery(query).getResultList();
@@ -524,7 +589,7 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<AttendanceQywxDetail> query = cb.createQuery(AttendanceQywxDetail.class);
         Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
-        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time), startTime.getTime(), endTime.getTime());
+        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
         p = cb.and(p, cb.equal(root.get(AttendanceQywxDetail_.o2Unit), unit));
         query.select(root).where(p);
         return em.createQuery(query).getResultList();
@@ -544,7 +609,7 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaBuilder cb = em.getCriteriaBuilder();
         CriteriaQuery<String> query = cb.createQuery(String.class);
         Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
-        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time), startTime.getTime(), endTime.getTime());
+        Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
         query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p).distinct(true);
         return em.createQuery(query).getResultList();
     }

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

@@ -22,6 +22,7 @@ import com.x.attendance.assemble.control.jaxrs.dingding.DingdingAttendanceAction
 import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.DingdingAttendanceStatisticAction;
 import com.x.attendance.assemble.control.jaxrs.fileimport.AttendanceDetailFileImportAction;
 import com.x.attendance.assemble.control.jaxrs.qywx.QywxAttendanceAction;
+import com.x.attendance.assemble.control.jaxrs.qywxstatistic.QywxAttendanceStatisticAction;
 import com.x.attendance.assemble.control.jaxrs.selfholiday.AttendanceSelfHolidayAction;
 import com.x.attendance.assemble.control.jaxrs.selfholiday.AttendanceSelfHolidaySimpleAction;
 import com.x.attendance.assemble.control.jaxrs.uuid.UUIDAction;
@@ -54,6 +55,7 @@ public class ActionApplication extends AbstractActionApplication {
 		this.classes.add(DingdingAttendanceAction.class);
 		this.classes.add(QywxAttendanceAction.class);
 		this.classes.add(DingdingAttendanceStatisticAction.class);
+		this.classes.add(QywxAttendanceStatisticAction.class);
 		return this.classes;
 	}
 

+ 10 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/QywxStatisticJaxrsFilter.java

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

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

@@ -1,15 +0,0 @@
-package com.x.attendance.assemble.control.jaxrs.dingdingstatistic;
-
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.jaxrs.WrapBoolean;
-
-/**
- * Created by fancyLou on 2020-04-05.
- * Copyright © 2020 O2. All rights reserved.
- */
-public class ActionTest extends BaseAction {
-
-    ActionResult<WrapBoolean> execute() throws Exception {
-        return new ActionResult<>();
-    }
-}

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

@@ -30,22 +30,7 @@ public class DingdingAttendanceStatisticAction extends StandardJaxrsAction {
     private static final Logger logger = LoggerFactory.getLogger(DingdingAttendanceStatisticAction.class);
 
 
-    @JaxrsMethodDescribe(value = "测试", action = ActionTest.class)
-    @GET
-    @Path("demo")
-    @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public void syncData(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
-        ActionResult<WrapBoolean> result = new ActionResult<>();
-        EffectivePerson effectivePerson = this.effectivePerson(request);
-        try {
-            result = new ActionTest().execute();
-        }catch (Exception e) {
-            logger.error(e, effectivePerson, request, null);
-            result.error(e);
-        }
-        asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-    }
+
 
     @JaxrsMethodDescribe(value = "人员月份统计查询", action = ActionPersonStatistic.class)
     @GET

+ 9 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywx/ActionListQywxAttendanceDetail.java

@@ -205,7 +205,16 @@ public class ActionListQywxAttendanceDetail extends BaseAction {
 
         @FieldDescribe("实际打卡时间")
         private Date checkTimeFormat;
+        @FieldDescribe("排序号")
+        private Long rank;
 
+        public Long getRank() {
+            return rank;
+        }
+
+        public void setRank(Long rank) {
+            this.rank = rank;
+        }
 
         public void formatDateTime() {
             if (checkTimeFormat == null) {

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

@@ -0,0 +1,45 @@
+package com.x.attendance.assemble.control.jaxrs.qywxstatistic;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.BaseAction;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.EmptyArgsException;
+import com.x.attendance.entity.StatisticDingdingPersonForMonth;
+import com.x.attendance.entity.StatisticQywxPersonForMonth;
+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<StatisticQywxPersonForMonth> list = business.dingdingAttendanceFactory().findQywxPersonStatistic(person, year, month);
+            result.setData(Wo.copier.copy(list));
+        }
+        return result;
+    }
+
+
+
+    public static class Wo extends StatisticQywxPersonForMonth {
+        static final WrapCopier<StatisticQywxPersonForMonth, Wo> copier = WrapCopierFactory.wo(StatisticQywxPersonForMonth.class, Wo.class,
+                null, JpaObject.FieldsInvisible);
+
+    }
+}

+ 45 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/ActionPersonStatisticWithUnit.java

@@ -0,0 +1,45 @@
+package com.x.attendance.assemble.control.jaxrs.qywxstatistic;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.BaseAction;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.EmptyArgsException;
+import com.x.attendance.entity.StatisticDingdingPersonForMonth;
+import com.x.attendance.entity.StatisticQywxPersonForMonth;
+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 ActionPersonStatisticWithUnit 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<StatisticQywxPersonForMonth> list = business.dingdingAttendanceFactory().findQywxPersonStatisticWithUnit(unit, year, month);
+            result.setData(Wo.copier.copy(list));
+        }
+        return result;
+    }
+
+
+
+    public static class Wo extends StatisticQywxPersonForMonth {
+        static final WrapCopier<StatisticQywxPersonForMonth, Wo> copier = WrapCopierFactory.wo(StatisticQywxPersonForMonth.class, Wo.class,
+                null, JpaObject.FieldsInvisible);
+
+    }
+}

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

@@ -0,0 +1,49 @@
+package com.x.attendance.assemble.control.jaxrs.qywxstatistic;
+
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.BaseAction;
+import com.x.attendance.assemble.control.jaxrs.dingdingstatistic.EmptyArgsException;
+import com.x.attendance.entity.StatisticDingdingUnitForMonth;
+import com.x.attendance.entity.StatisticQywxUnitForMonth;
+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<Wo> execute(String unit, String year, String month) throws Exception {
+        ActionResult<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<StatisticQywxUnitForMonth> list = business.dingdingAttendanceFactory().findQywxUnitStatistic(unit, year, month);
+            if (list!=null && !list.isEmpty()) {
+                result.setData(Wo.copier.copy(list.get(0)));
+            }else {
+                result.setData(new Wo());
+            }
+        }
+        return result;
+    }
+
+
+
+    public static class Wo extends StatisticQywxUnitForMonth {
+        static final WrapCopier<StatisticQywxUnitForMonth, Wo> copier = WrapCopierFactory.wo(StatisticQywxUnitForMonth.class, Wo.class,
+                null, JpaObject.FieldsInvisible);
+
+    }
+}

+ 6 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/BaseAction.java

@@ -0,0 +1,6 @@
+package com.x.attendance.assemble.control.jaxrs.qywxstatistic;
+
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+
+public class BaseAction extends StandardJaxrsAction {
+}

+ 94 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/qywxstatistic/QywxAttendanceStatisticAction.java

@@ -0,0 +1,94 @@
+package com.x.attendance.assemble.control.jaxrs.qywxstatistic;
+
+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;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+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-21.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+
+@Path("qywxstatistic")
+@JaxrsDescribe("企业微信打卡数据统计管理")
+public class QywxAttendanceStatisticAction extends BaseAction {
+
+    private static final Logger logger = LoggerFactory.getLogger(QywxAttendanceStatisticAction.class);
+
+
+
+    @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 = ActionPersonStatisticWithUnit.class)
+    @GET
+    @Path("person/unit/{unit}/{year}/{month}")
+    @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public void personMonthWithUnit(@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<ActionPersonStatisticWithUnit.Wo>> result = new ActionResult<>();
+        EffectivePerson effectivePerson = this.effectivePerson(request);
+        try {
+            result = new ActionPersonStatisticWithUnit().execute(unit, 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<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));
+    }
+
+}