From 9f7ea6e5a05f55dea693f535faa6a0db009b34b0 Mon Sep 17 00:00:00 2001 From: liuwm Date: Thu, 15 Jul 2021 10:57:05 +0800 Subject: [PATCH 1/3] =?UTF-8?q?:bug:=20=E3=80=90=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=20=E8=8E=B7=E5=8F=96=E6=89=93?= =?UTF-8?q?=E5=8D=A1=E4=BA=BA=E5=91=98=E6=8E=92=E7=8F=AD=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/WxCpOaService.java | 2 +- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 9 +- .../cp/bean/oa/WxCpCheckinSchedule.java | 172 +++++++++--------- .../cp/api/impl/WxCpOaServiceImplTest.java | 2 +- 4 files changed, 86 insertions(+), 99 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java index cf7dfc1f0e..1dc7550597 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java @@ -165,7 +165,7 @@ List getDialRecord(Date startTime, Date endTime, Integer offset, * @return 排班表信息 * @throws WxErrorException the wx error exception */ - WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException; + List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java index 94d5d27f75..adb558ded6 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java @@ -285,7 +285,7 @@ public List getCheckinMonthData(Date startTime, Date endTi } @Override - public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException { + public List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException { if (startTime == null || endTime == null) { throw new WxRuntimeException("starttime and endtime can't be null"); } @@ -298,9 +298,6 @@ public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, long endTimestamp = endTime.getTime() / 1000L; long startTimestamp = startTime.getTime() / 1000L; - if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) { - throw new WxRuntimeException("获取记录时间跨度不超过一个月"); - } JsonObject jsonObject = new JsonObject(); JsonArray jsonArray = new JsonArray(); @@ -318,8 +315,8 @@ public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJson, - new TypeToken() { + tmpJson.get("schedule_list"), + new TypeToken>() { }.getType() ); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java index 02b55f974f..9517a64d4d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java @@ -13,132 +13,122 @@ @Data public class WxCpCheckinSchedule implements Serializable { - private static final long serialVersionUID = 5399197385827384108L; + private static final long serialVersionUID = 5515056962298169806L; /** - * schedule_list 排班表信息 + * userid 打卡人员userid */ - @SerializedName("schedule_list") - private List scheduleList; + @SerializedName("userid") + private String userid; - @Data - public class UserScheduleInfo implements Serializable { - private static final long serialVersionUID = 5515056962298169806L; - /** - * userid 打卡人员userid - */ - @SerializedName("userid") - private String userid; + /** + * yearmonth 排班表月份,格式为年月,如202011 + */ + @SerializedName("yearmonth") + private Integer yearmonth; - /** - * yearmonth 排班表月份,格式为年月,如202011 - */ - @SerializedName("yearmonth") - private Integer yearmonth; + /** + * groupid 打卡规则id + */ + @SerializedName("groupid") + private Integer groupid; - /** - * groupid 打卡规则id - */ - @SerializedName("groupid") - private Integer groupid; + /** + * groupname 打卡规则名 + */ + @SerializedName("groupname") + private String groupName; - /** - * groupname 打卡规则名 - */ - @SerializedName("groupname") - private String groupName; + /** + * schedule 个人排班信息 + */ + @SerializedName("schedule") + private UserSchedule schedule; + @Data + public class UserSchedule implements Serializable { + private static final long serialVersionUID = 9138985222324576857L; /** - * schedule 个人排班信息 + * scheduleList 个人排班表信息 */ - @SerializedName("schedule") - private UserSchedule schedule; + @SerializedName("scheduleList") + private List scheduleList; @Data - public class UserSchedule implements Serializable { - private static final long serialVersionUID = 9138985222324576857L; + public class Schedule implements Serializable { + + private static final long serialVersionUID = 8344153237512495728L; + /** - * scheduleList 个人排班表信息 + * day 排班日期,为表示当月第几天的数字 */ - @SerializedName("scheduleList") - private List scheduleList; + @SerializedName("day") + private Integer day; - @Data - public class Schedule implements Serializable{ + /** + * schedule_info 排班日期,为表示当月第几天的数字 + */ + @SerializedName("schedule_info") + private ScheduleInfo scheduleInfo; - private static final long serialVersionUID = 8344153237512495728L; + @Data + public class ScheduleInfo implements Serializable { + private static final long serialVersionUID = 1317096341116256963L; + /** + * schedule_id 当日安排班次id,班次id也可在打卡规则中查询获得 + */ + @SerializedName("schedule_id") + private Integer scheduleId; /** - * day 排班日期,为表示当月第几天的数字 + * schedule_name 排班日期,为表示当月第几天的数字 */ - @SerializedName("day") - private Integer day; + @SerializedName("schedule_name") + private String scheduleName; /** - * schedule_info 排班日期,为表示当月第几天的数字 + * time_section 排班日期,为表示当月第几天的数字 */ - @SerializedName("schedule_info") - private ScheduleInfo scheduleInfo; + @SerializedName("time_section") + private List timeSection; + @Data - public class ScheduleInfo implements Serializable { - private static final long serialVersionUID = 1317096341116256963L; + public class TimeSection implements Serializable { + private static final long serialVersionUID = -3447467962751285748L; /** - * schedule_id 当日安排班次id,班次id也可在打卡规则中查询获得 + * id 时段id,为班次中某一堆上下班时间组合的id */ - @SerializedName("schedule_id") - private Integer scheduleId; + @SerializedName("id") + private Integer id; /** - * schedule_name 排班日期,为表示当月第几天的数字 + * work_sec 上班时间。距当天00:00的秒数 */ - @SerializedName("schedule_name") - private String scheduleName; + @SerializedName("work_sec") + private Integer workSec; /** - * time_section 排班日期,为表示当月第几天的数字 + * off_work_sec 下班时间。距当天00:00的秒数 */ - @SerializedName("time_section") - private List timeSection; - - - @Data - public class TimeSection implements Serializable { - private static final long serialVersionUID = -3447467962751285748L; - /** - * id 时段id,为班次中某一堆上下班时间组合的id - */ - @SerializedName("id") - private Integer id; - - /** - * work_sec 上班时间。距当天00:00的秒数 - */ - @SerializedName("work_sec") - private Integer workSec; - - /** - * off_work_sec 下班时间。距当天00:00的秒数 - */ - @SerializedName("off_work_sec") - private Integer offWorkSec; - - /** - * remind_work_sec 上班提醒时间。距当天00:00的秒数 - */ - @SerializedName("remind_work_sec") - private Integer remindWorkSec; - - /** - * remind_off_work_sec 下班提醒时间。距当天00:00的秒数 - */ - @SerializedName("remind_off_work_sec") - private Integer remindOffWorkSec; - } + @SerializedName("off_work_sec") + private Integer offWorkSec; + + /** + * remind_work_sec 上班提醒时间。距当天00:00的秒数 + */ + @SerializedName("remind_work_sec") + private Integer remindWorkSec; + + /** + * remind_off_work_sec 下班提醒时间。距当天00:00的秒数 + */ + @SerializedName("remind_off_work_sec") + private Integer remindOffWorkSec; } } + } - } } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java index 968109f591..55c773305d 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java @@ -85,7 +85,7 @@ public void testGetCheckinScheduleData() throws ParseException, WxErrorException Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01"); Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31"); - WxCpCheckinSchedule results = wxService.getOaService() + List results = wxService.getOaService() .getCheckinScheduleList(startTime, endTime, Lists.newArrayList("12003648")); assertThat(results).isNotNull(); From 55056064f1b6143dfbc0d8e5f6e89dc084823897 Mon Sep 17 00:00:00 2001 From: liuwm Date: Wed, 21 Jul 2021 15:16:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?:new:=20=E3=80=90=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=20=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BC=81=E4=B8=9A=E6=89=80=E6=9C=89=E6=89=93=E5=8D=A1?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/WxCpOaService.java | 12 + .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 16 + .../cp/bean/oa/WxCpCropCheckinOption.java | 803 ++++++++++++++++++ .../weixin/cp/constant/WxCpApiPathConsts.java | 1 + .../cp/api/impl/WxCpOaServiceImplTest.java | 12 +- 5 files changed, 843 insertions(+), 1 deletion(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java index 1dc7550597..606155ec34 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java @@ -60,6 +60,18 @@ List getCheckinData(Integer openCheckinDataType, Date startTime */ List getCheckinOption(Date datetime, List userIdList) throws WxErrorException; + + /** + *
+   *   获取企业所有打卡规则
+   *   API doc : https://work.weixin.qq.com/api/doc/90000/90135/93384
+   * 
+ * + * @return 打卡规则列表 + * @throws WxErrorException the wx error exception + */ + List getCropCheckinOption() throws WxErrorException; + /** *
    *
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
index adb558ded6..3ba874401b 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
@@ -112,6 +112,22 @@ public List getCheckinOption(Date datetime, List user
       );
   }
 
+  @Override
+  public List getCropCheckinOption() throws WxErrorException {
+
+    JsonObject jsonObject = new JsonObject();
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_CHECKIN_OPTION);
+    String responseContent = this.mainService.post(url, jsonObject.toString());
+    JsonObject tmpJson = GsonParser.parse(responseContent);
+
+    return WxCpGsonBuilder.create()
+      .fromJson(
+        tmpJson.get("group"),
+        new TypeToken>() {
+        }.getType()
+      );
+  }
+
   @Override
   public WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
                                           Integer cursor, Integer size, List filters) throws WxErrorException {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
new file mode 100644
index 0000000000..c68741fcaf
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
@@ -0,0 +1,803 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业微信企业所有打卡规则.
+ *
+ * @author Liuwm
+ */
+@Data
+public class WxCpCropCheckinOption implements Serializable {
+  private static final long serialVersionUID = 1725954575430704232L;
+
+  /**
+   * 打卡规则类型,1:固定时间上下班;2:按班次上下班;3:自由上下班
+   */
+  @SerializedName("grouptype")
+  private Long groupType;
+
+  /**
+   * 	打卡规则id
+   */
+  @SerializedName("groupid")
+  private Long groupId;
+
+  /**
+   * 		打卡规则名称
+   */
+  @SerializedName("groupname")
+  private String groupName;
+
+  /**
+   * 	打卡时间,当规则类型为排班时没有意义
+   */
+  @SerializedName("checkindate")
+  private List checkinDate;
+
+  /**
+   * 	特殊日期-必须打卡日期信息,timestamp表示具体时间
+   */
+  @SerializedName("spe_workdays")
+  private List speWorkdays;
+
+  /**
+   * 	特殊日期-不用打卡日期信息, timestamp表示具体时间
+   */
+  @SerializedName("spe_offdays")
+  private List speOffDays;
+
+  /**
+   * 	是否同步法定节假日,true为同步,false为不同步,当前排班不支持
+   */
+  @SerializedName("sync_holidays")
+  private Boolean syncHolidays;
+
+  /**
+   * 	是否打卡必须拍照,true为必须拍照,false为不必须拍照
+   */
+  @SerializedName("need_photo")
+  private Boolean needPhoto;
+
+  /**
+   * 	是否备注时允许上传本地图片,true为允许,false为不允许
+   */
+  @SerializedName("note_can_use_local_pic")
+  private Boolean noteCanUseLocalPic;
+
+  /**
+   * 	是否非工作日允许打卡,true为允许,false为不允许
+   */
+  @SerializedName("allow_checkin_offworkday")
+  private Boolean allowCheckinOffWorkDay;
+
+  /**
+   * 	是否允许提交补卡申请,true为允许,false为不允许
+   */
+  @SerializedName("allow_apply_offworkday")
+  private Boolean allowApplyOffWorkDay;
+
+  /**
+   * 打卡地点-WiFi打卡信息
+   */
+  @SerializedName("wifimac_infos")
+  private List wifiMacInfos;
+
+  /**
+   * 打卡地点-WiFi打卡信息
+   */
+  @SerializedName("loc_infos")
+  private List locInfos;
+
+  /**
+   * 打卡人员信息
+   */
+  @SerializedName("range")
+  private Range range;
+
+  /**
+   * 创建打卡规则时间,为unix时间戳
+   */
+  @SerializedName("create_time")
+  private Long createTime;
+
+  /**
+   * 	打卡人员白名单,即不需要打卡人员,需要有设置白名单才能查看
+   */
+  @SerializedName("white_users")
+  private List whiteUsers;
+
+  /**
+   * 	打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+   */
+  @SerializedName("type")
+  private Integer type;
+
+  /**
+   * 	打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+   */
+  @SerializedName("reporterinfo")
+  private ReporterInfo reporterInfo;
+
+  /**
+   * 	加班信息,相关信息需要设置后才能显示
+   */
+  @SerializedName("ot_info")
+  private OtInfo otInfo;
+
+  /**
+   * 	每月最多补卡次数,默认-1表示不限制
+   */
+  @SerializedName("allow_apply_bk_cnt")
+  private Integer allowApplyBkCnt;
+
+  /**
+   * 	范围外打卡处理方式,0-视为范围外异常,默认值;1-视为正常外勤;2:不允许范围外打卡
+   */
+  @SerializedName("option_out_range")
+  private Integer optionOutRange;
+
+  /**
+   * 	规则创建人userid
+   */
+  @SerializedName("create_userid")
+  private String createUserid;
+
+  /**
+   * 	人脸识别打卡开关,true为启用,false为不启用
+   */
+  @SerializedName("use_face_detect")
+  private Boolean useFaceDetect;
+
+  /**
+   * 	允许补卡时限,默认-1表示不限制。单位天
+   */
+  @SerializedName("allow_apply_bk_day_limit")
+  private Integer allowApplyBkDayLimit;
+
+  /**
+   * 	规则最近编辑人userid
+   */
+  @SerializedName("update_userid")
+  private String updateUserid;
+
+  /**
+   * 	加班信息,相关信息需要设置后才能显示
+   */
+  @SerializedName("schedulelist")
+  private List schedulelist;
+
+
+  /**
+   * 	自由签到,上班打卡后xx秒可打下班卡
+   */
+  @SerializedName("offwork_interval_time")
+  private Integer offWorkIntervalTime;
+
+
+  @Data
+  public static class CheckinDate implements Serializable{
+    private static final long serialVersionUID = -8560643656775167406L;
+    /**
+     * 	工作日。若为固定时间上下班或自由上下班,则1到6分别表示星期一到星期六,0表示星期日
+     */
+    @SerializedName("workdays")
+    private List workdays;
+
+    /**
+     * 	工作日上下班打卡时间信息
+     */
+    @SerializedName("checkintime")
+    private List checkinTime;
+
+    /**
+     * 	下班不需要打卡,true为下班不需要打卡,false为下班需要打卡
+     */
+    @SerializedName("noneed_offwork")
+    private Boolean noneedOffwork;
+
+    /**
+     * 	打卡时间限制(毫秒)
+     */
+    @SerializedName("limit_aheadtime")
+    private Long limitAheadtime;
+
+    /**
+     * 	允许迟到时间,单位ms
+     */
+    @SerializedName("flex_on_duty_time")
+    private Integer flexOnDutyTime;
+
+    /**
+     * 	允许早退时间,单位ms
+     */
+    @SerializedName("flex_off_duty_time")
+    private Integer flexOffDutyTime;
+  }
+
+  @Data
+  public static class CheckinTime implements Serializable{
+
+    private static final long serialVersionUID = -5507709858609705279L;
+    /**
+     * 	上班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("work_sec")
+    private Integer workSec;
+
+    /**
+     * 	下班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("off_work_sec")
+    private Integer offWorkSec;
+
+    /**
+     * 	上班提醒时间,表示为距离当天0点的秒数。。
+     */
+    @SerializedName("remind_work_sec")
+    private Integer remindWorkSec;
+
+    /**
+     * 	下班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_off_work_sec")
+    private Integer remindOffWorkSec;
+  }
+
+  @Data
+  public static class SpeWorkday implements Serializable{
+
+    private static final long serialVersionUID = -4620710297258742666L;
+    /**
+     * 	特殊日期-必须打卡日期时间戳
+     */
+    @SerializedName("timestamp")
+    private Long timestamp;
+
+    /**
+     * 	特殊日期备注
+     */
+    @SerializedName("notes")
+    private String notes;
+
+    /**
+     * 	特殊日期-必须打卡日期-上下班打卡时间
+     */
+    @SerializedName("checkintime")
+    private List checkinTime;
+  }
+
+  @Data
+  public static class SpeOffDay implements Serializable{
+    private static final long serialVersionUID = 9214798931489490993L;
+    /**
+     * 	特殊日期-不用打卡日期时间戳
+     */
+    @SerializedName("timestamp")
+    private Long timestamp;
+
+    /**
+     * 	特殊日期备注
+     */
+    @SerializedName("notes")
+    private String notes;
+  }
+
+  @Data
+  public static class WifiMacInfo implements Serializable{
+
+    private static final long serialVersionUID = 6742659716677227089L;
+
+    /**
+     * 	WiFi打卡地点名称
+     */
+    @SerializedName("wifiname")
+    private String wifiname;
+
+    /**
+     * 	WiFi打卡地点MAC地址/bssid
+     */
+    @SerializedName("wifimac")
+    private String wifimac;
+  }
+
+  @Data
+  public static class LocInfo implements Serializable{
+
+    private static final long serialVersionUID = -5591379191341944101L;
+    /**
+     * 		位置打卡地点纬度,是实际纬度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+     */
+    @SerializedName("lat")
+    private Long lat;
+
+    /**
+     * 	位置打卡地点经度,是实际经度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+     */
+    @SerializedName("lng")
+    private Long lng;
+
+    /**
+     * 位置打卡地点名称
+     */
+    @SerializedName("loc_title")
+    private String locTitle;
+
+    /**
+     * 位置打卡地点详情
+     */
+    @SerializedName("loc_detail")
+    private String locDetail;
+
+    /**
+     * 	允许打卡范围(米)
+     */
+    @SerializedName("distance")
+    private Integer distance;
+  }
+
+  @Data
+  public static class Range implements Serializable{
+
+    private static final long serialVersionUID = 8940086218556453088L;
+
+    /**
+     * 	打卡人员中,单个打卡人员节点的userid
+     */
+    @SerializedName("party_id")
+    private List partyid;
+
+    /**
+     * 	打卡人员中,部门节点的id
+     */
+    @SerializedName("userid")
+    private List userid;
+
+    /**
+     * 	打卡人员中,标签节点的标签id
+     */
+    @SerializedName("tagid")
+    private List tagid;
+
+
+  }
+
+  @Data
+  public static class ReporterInfo implements Serializable{
+    private static final long serialVersionUID = 1132450350458936772L;
+    /**
+     * 		汇报对象,每个汇报人用userid表示
+     */
+    @SerializedName("reporters")
+    private List reporters;
+
+    /**
+     * 		汇报对象更新时间
+     */
+    @SerializedName("updatetime")
+    private long updateTime;
+  }
+
+  @Data
+  public static class Reporter implements Serializable {
+
+    private static final long serialVersionUID = 4925417850482005397L;
+
+    @SerializedName("userid")
+    private String userid;
+  }
+
+  @Data
+  public static class OtInfo implements Serializable{
+
+    private static final long serialVersionUID = 1610150484871066199L;
+
+    /**
+     * 加班类型
+     * 0:以加班申请核算打卡记录(根据打卡记录和加班申请核算),
+     * 1:以打卡时间为准(根据打卡时间计算),
+     * 2: 以加班申请审批为准(只根据加班申请计算)
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 		允许工作日加班,true为允许,false为不允许
+     */
+    @SerializedName("allow_ot_workingday")
+    private Boolean allowOtWorkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("allow_ot_nonworkingday")
+    private Boolean allowOtNonworkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("otcheckinfo")
+    private OtCheckInfo otcheckinfo;
+
+    /**
+     * 	更新时间
+     */
+    @SerializedName("uptime")
+    private Long uptime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("otapplyinfo")
+    private OtApplyInfo otapplyinfo;
+  }
+
+  @Data
+  public static class OtCheckInfo implements Serializable {
+
+    private static final long serialVersionUID = -2363047492489556390L;
+
+    /**
+     * 	允许工作日加班-加班开始时间:下班后xx秒开始计算加班,距离最晚下班时间的秒数,例如,1800(30分钟 乘以 60秒),默认值30分钟
+     */
+    @SerializedName("ot_workingday_time_start")
+    private Integer otWorkingDayTimeStart;
+
+    /**
+     * 	允许工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+     */
+    @SerializedName("ot_workingday_time_min")
+    private Integer otWorkingDayTimeMin;
+
+    /**
+     *  允许工作日加班-最长加班时长:超过则视为加班xx秒,单位秒,默认值240分钟
+     */
+    @SerializedName("ot_workingday_time_max")
+    private Integer otWorkingDayTimeMax;
+
+    /**
+     * 	允许非工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+     */
+    @SerializedName("ot_nonworkingday_time_min")
+    private Integer otNonworkingDayTimeMin;
+
+    /**
+     * 	允许非工作日加班-最长加班时长:超过则视为加班xx秒 单位秒,默认值240分钟
+     */
+    @SerializedName("ot_nonworkingday_time_max")
+    private Integer otNonworkingDayTimeMax;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("ot_nonworkingday_spanday_time")
+    private Integer otNonworkingDaySpanDayTime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_workingday_restinfo")
+    private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_nonworkingday_restinfo")
+    private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+  }
+
+  @Data
+  public static class OtWorkingDayRestInfo implements Serializable{
+
+    private static final long serialVersionUID = -4011047369711928306L;
+
+    /**
+     * 	工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 	工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+     */
+    @SerializedName("fix_time_rule")
+    private FixTimeRule fixTimeRule;
+
+    /**
+     * 	工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+     */
+    @SerializedName("cal_ottime_rule")
+    private CalOtTimeRule calOttimeRule;
+  }
+
+  @Data
+  public static class FixTimeRule implements Serializable{
+
+    private static final long serialVersionUID = 5709478500196619664L;
+
+    /**
+     * 	工作日加班-指定休息时间的开始时间, 距离当天00:00的秒数
+     */
+    @SerializedName("fix_time_begin_sec")
+    private Integer fixTimeBeginSec;
+
+    /**
+     * 	工作日加班-指定休息时间的结束时间, 距离当天00:00的秒数
+     */
+    @SerializedName("fix_time_end_sec")
+    private Integer fixTimeEndSec;
+  }
+
+  @Data
+  public static class CalOtTimeRule implements Serializable {
+
+    private static final long serialVersionUID = -2407839982631243413L;
+
+    /**
+     * 	工作日加班-按加班时长扣除条件信息
+     */
+    @SerializedName("items")
+    private List items;
+
+  }
+  @Data
+  public static class Item implements Serializable{
+
+    private static final long serialVersionUID = 5235770378506228461L;
+
+    /**
+     * 	加班满-时长(秒)
+     */
+    @SerializedName("ot_time")
+    private Integer otTime;
+
+    /**
+     * 	对应扣除-时长(秒)
+     */
+    @SerializedName("rest_time")
+    private Integer restTime;
+  }
+
+  @Data
+  public static class OtNonworkingDayRestInfo implements Serializable{
+
+    private static final long serialVersionUID = 3773846077049838088L;
+
+    /**
+     * 	非工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 	非工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+     */
+    @SerializedName("fix_time_rule")
+    private FixTimeRule fixTimeRule;
+
+    /**
+     * 	非工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+     */
+    @SerializedName("cal_ottime_rule")
+    private CalOtTimeRule calOttimeRule;
+  }
+
+  @Data
+  public static class OtApplyInfo implements Serializable{
+
+    private static final long serialVersionUID = 961217471918884103L;
+
+    /**
+     * 		允许工作日加班,true为允许,false为不允许
+     */
+    @SerializedName("allow_ot_workingday")
+    private Boolean allowOtWorkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("allow_ot_nonworkingday")
+    private Boolean allowOtNonworkingDay;
+
+    /**
+     * 	更新时间
+     */
+    @SerializedName("uptime")
+    private Long uptime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_workingday_restinfo")
+    private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_nonworkingday_restinfo")
+    private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("ot_nonworkingday_spanday_time")
+    private Integer otNonworkingDaySpanDayTime;
+
+  }
+
+  @Data
+  public static class Schedule implements Serializable{
+
+    private static final long serialVersionUID = -2461113644925307266L;
+
+    /**
+     * 	班次id
+     */
+    @SerializedName("schedule_id")
+    private Integer scheduleId;
+
+    /**
+     * 	班次名称
+     */
+    @SerializedName("schedule_name")
+    private String scheduleName;
+
+    /**
+     * 	班次上下班时段信息
+     */
+    @SerializedName("time_section")
+    private List timeSection;
+
+    /**
+     * 	允许提前打卡时间
+     */
+    @SerializedName("limit_aheadtime")
+    private Long limitAheadTime;
+
+    /**
+     * 	下班xx秒后不允许打下班卡
+     */
+    @SerializedName("limit_offtime")
+    private Integer limitOffTime;
+
+    /**
+     * 	下班不需要打卡
+     */
+    @SerializedName("noneed_offwork")
+    private Boolean noNeedOffWork;
+
+    /**
+     * 	是否允许弹性时间
+     */
+    @SerializedName("allow_flex")
+    private Boolean allowFlex;
+
+    /**
+     * 	允许迟到时间
+     */
+    @SerializedName("flex_on_duty_time")
+    private Integer flexOnDutyTime;
+
+    /**
+     * 	允许早退时间
+     */
+    @SerializedName("flex_off_duty_time")
+    private Integer flexOffDutyTime;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("late_rule")
+    private LateRule lateRule;
+
+    /**
+     * 	最早可打卡时间限制
+     */
+    @SerializedName("max_allow_arrive_early")
+    private Integer maxAllowArriveEarly;
+
+    /**
+     * 	最晚可打卡时间限制,max_allow_arrive_early、max_allow_arrive_early与flex_on_duty_time、flex_off_duty_time互斥,当设置其中一组时,另一组数值置0
+     */
+    @SerializedName("max_allow_arrive_late")
+    private Integer maxAllowArriveLate;
+
+  }
+
+
+  @Data
+  public static class TimeSection implements Serializable {
+    private static final long serialVersionUID = 7497252128339062724L;
+
+    /**
+     * 	时段id,为班次中某一堆上下班时间组合的id
+     */
+    @SerializedName("time_id")
+    private Integer timeId;
+
+    /**
+     * 	上班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("work_sec")
+    private Integer workSec;
+
+    /**
+     * 	下班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("off_work_sec")
+    private Integer offWorkSec;
+
+    /**
+     * 	上班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_work_sec")
+    private Long remindWorkSec;
+
+    /**
+     * 	下班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_off_work_sec")
+    private Integer remindOffWorkSec;
+
+    /**
+     * 		休息开始时间,仅单时段支持,距离0点的秒
+     */
+    @SerializedName("rest_begin_time")
+    private Integer restBeginTime;
+
+    /**
+     * 	休息结束时间,仅单时段支持,距离0点的秒
+     */
+    @SerializedName("rest_end_time")
+    private Integer restEndTime;
+
+    /**
+     * 	是否允许休息
+     */
+    @SerializedName("allow_rest")
+    private Boolean allowRest;
+  }
+
+
+  @Data
+  public static class LateRule implements Serializable{
+
+    private static final long serialVersionUID = 5604969713950037053L;
+
+
+    /**
+     *  是否允许超时下班(下班晚走次日晚到)允许时onwork_flex_time,offwork_after_time才有意义
+     */
+    @SerializedName("allow_offwork_after_time")
+    private Boolean allowOffWorkAfterTime;
+
+    /**
+     * 	迟到规则时间
+     */
+    @SerializedName("timerules")
+    private List timerules;
+  }
+
+  @Data
+  public static class TimeRule implements Serializable{
+
+    private static final long serialVersionUID = 5680614050081598333L;
+
+    /**
+     * 	晚走的时间 距离最晚一个下班的时间单位:秒
+     */
+    @SerializedName("offwork_after_time")
+    private Integer offWorkAfterTime;
+
+    /**
+     * 	第二天第一个班次允许迟到的弹性时间单位:秒
+     */
+    @SerializedName("onwork_flex_time")
+    private Integer onWorkFlexTime;
+
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 7ca857476b..f577fcb217 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -91,6 +91,7 @@ interface Menu {
   }
 
   interface Oa {
+    String GET_CORP_CHECKIN_OPTION = "/cgi-bin/checkin/getcorpcheckinoption";
     String GET_CHECKIN_DATA = "/cgi-bin/checkin/getcheckindata";
     String GET_CHECKIN_OPTION = "/cgi-bin/checkin/getcheckinoption";
     String GET_CHECKIN_DAY_DATA = "/cgi-bin/checkin/getcheckin_daydata";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index 55c773305d..f838837b00 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -53,7 +53,7 @@ public void testGetCheckinData() throws ParseException, WxErrorException {
 
   @Test
   public void testGetCheckinDayData() throws ParseException, WxErrorException {
-    Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+    Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-06-30");
     Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
 
     List results = wxService.getOaService()
@@ -103,6 +103,16 @@ public void testGetCheckinOption() throws WxErrorException {
     System.out.println(gson.toJson(results));
   }
 
+  @Test
+  public void testGetCropCheckinOption() throws WxErrorException {
+
+    Date now = new Date();
+    List results = wxService.getOaService().getCropCheckinOption();
+    assertThat(results).isNotNull();
+    System.out.println("results ");
+    System.out.println(gson.toJson(results));
+  }
+
   @Test
   public void testGetApprovalInfo() throws WxErrorException, ParseException {
     Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2019-12-01");

From dc21621e3ee0c28bcbb2a4d27578246d139589c1 Mon Sep 17 00:00:00 2001
From: liuwm 
Date: Wed, 21 Jul 2021 15:16:58 +0800
Subject: [PATCH 3/3] =?UTF-8?q?:new:=20=E3=80=90=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=20=E6=96=B0=E5=A2=9E=E8=8E=B7?=
 =?UTF-8?q?=E5=8F=96=E4=BC=81=E4=B8=9A=E6=89=80=E6=9C=89=E6=89=93=E5=8D=A1?=
 =?UTF-8?q?=E8=A7=84=E5=88=99=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../chanjar/weixin/cp/api/WxCpOaService.java  |  12 +
 .../weixin/cp/api/impl/WxCpOaServiceImpl.java |  16 +
 .../cp/bean/oa/WxCpCropCheckinOption.java     | 803 ++++++++++++++++++
 .../weixin/cp/constant/WxCpApiPathConsts.java |   1 +
 .../cp/api/impl/WxCpOaServiceImplTest.java    |  12 +-
 5 files changed, 843 insertions(+), 1 deletion(-)
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
index 1dc7550597..606155ec34 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
@@ -60,6 +60,18 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
    */
   List getCheckinOption(Date datetime, List userIdList) throws WxErrorException;
 
+
+  /**
+   * 
+   *   获取企业所有打卡规则
+   *   API doc : https://work.weixin.qq.com/api/doc/90000/90135/93384
+   * 
+ * + * @return 打卡规则列表 + * @throws WxErrorException the wx error exception + */ + List getCropCheckinOption() throws WxErrorException; + /** *
    *
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
index adb558ded6..3ba874401b 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
@@ -112,6 +112,22 @@ public List getCheckinOption(Date datetime, List user
       );
   }
 
+  @Override
+  public List getCropCheckinOption() throws WxErrorException {
+
+    JsonObject jsonObject = new JsonObject();
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_CHECKIN_OPTION);
+    String responseContent = this.mainService.post(url, jsonObject.toString());
+    JsonObject tmpJson = GsonParser.parse(responseContent);
+
+    return WxCpGsonBuilder.create()
+      .fromJson(
+        tmpJson.get("group"),
+        new TypeToken>() {
+        }.getType()
+      );
+  }
+
   @Override
   public WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
                                           Integer cursor, Integer size, List filters) throws WxErrorException {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
new file mode 100644
index 0000000000..c68741fcaf
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
@@ -0,0 +1,803 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业微信企业所有打卡规则.
+ *
+ * @author Liuwm
+ */
+@Data
+public class WxCpCropCheckinOption implements Serializable {
+  private static final long serialVersionUID = 1725954575430704232L;
+
+  /**
+   * 打卡规则类型,1:固定时间上下班;2:按班次上下班;3:自由上下班
+   */
+  @SerializedName("grouptype")
+  private Long groupType;
+
+  /**
+   * 	打卡规则id
+   */
+  @SerializedName("groupid")
+  private Long groupId;
+
+  /**
+   * 		打卡规则名称
+   */
+  @SerializedName("groupname")
+  private String groupName;
+
+  /**
+   * 	打卡时间,当规则类型为排班时没有意义
+   */
+  @SerializedName("checkindate")
+  private List checkinDate;
+
+  /**
+   * 	特殊日期-必须打卡日期信息,timestamp表示具体时间
+   */
+  @SerializedName("spe_workdays")
+  private List speWorkdays;
+
+  /**
+   * 	特殊日期-不用打卡日期信息, timestamp表示具体时间
+   */
+  @SerializedName("spe_offdays")
+  private List speOffDays;
+
+  /**
+   * 	是否同步法定节假日,true为同步,false为不同步,当前排班不支持
+   */
+  @SerializedName("sync_holidays")
+  private Boolean syncHolidays;
+
+  /**
+   * 	是否打卡必须拍照,true为必须拍照,false为不必须拍照
+   */
+  @SerializedName("need_photo")
+  private Boolean needPhoto;
+
+  /**
+   * 	是否备注时允许上传本地图片,true为允许,false为不允许
+   */
+  @SerializedName("note_can_use_local_pic")
+  private Boolean noteCanUseLocalPic;
+
+  /**
+   * 	是否非工作日允许打卡,true为允许,false为不允许
+   */
+  @SerializedName("allow_checkin_offworkday")
+  private Boolean allowCheckinOffWorkDay;
+
+  /**
+   * 	是否允许提交补卡申请,true为允许,false为不允许
+   */
+  @SerializedName("allow_apply_offworkday")
+  private Boolean allowApplyOffWorkDay;
+
+  /**
+   * 打卡地点-WiFi打卡信息
+   */
+  @SerializedName("wifimac_infos")
+  private List wifiMacInfos;
+
+  /**
+   * 打卡地点-WiFi打卡信息
+   */
+  @SerializedName("loc_infos")
+  private List locInfos;
+
+  /**
+   * 打卡人员信息
+   */
+  @SerializedName("range")
+  private Range range;
+
+  /**
+   * 创建打卡规则时间,为unix时间戳
+   */
+  @SerializedName("create_time")
+  private Long createTime;
+
+  /**
+   * 	打卡人员白名单,即不需要打卡人员,需要有设置白名单才能查看
+   */
+  @SerializedName("white_users")
+  private List whiteUsers;
+
+  /**
+   * 	打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+   */
+  @SerializedName("type")
+  private Integer type;
+
+  /**
+   * 	打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+   */
+  @SerializedName("reporterinfo")
+  private ReporterInfo reporterInfo;
+
+  /**
+   * 	加班信息,相关信息需要设置后才能显示
+   */
+  @SerializedName("ot_info")
+  private OtInfo otInfo;
+
+  /**
+   * 	每月最多补卡次数,默认-1表示不限制
+   */
+  @SerializedName("allow_apply_bk_cnt")
+  private Integer allowApplyBkCnt;
+
+  /**
+   * 	范围外打卡处理方式,0-视为范围外异常,默认值;1-视为正常外勤;2:不允许范围外打卡
+   */
+  @SerializedName("option_out_range")
+  private Integer optionOutRange;
+
+  /**
+   * 	规则创建人userid
+   */
+  @SerializedName("create_userid")
+  private String createUserid;
+
+  /**
+   * 	人脸识别打卡开关,true为启用,false为不启用
+   */
+  @SerializedName("use_face_detect")
+  private Boolean useFaceDetect;
+
+  /**
+   * 	允许补卡时限,默认-1表示不限制。单位天
+   */
+  @SerializedName("allow_apply_bk_day_limit")
+  private Integer allowApplyBkDayLimit;
+
+  /**
+   * 	规则最近编辑人userid
+   */
+  @SerializedName("update_userid")
+  private String updateUserid;
+
+  /**
+   * 	加班信息,相关信息需要设置后才能显示
+   */
+  @SerializedName("schedulelist")
+  private List schedulelist;
+
+
+  /**
+   * 	自由签到,上班打卡后xx秒可打下班卡
+   */
+  @SerializedName("offwork_interval_time")
+  private Integer offWorkIntervalTime;
+
+
+  @Data
+  public static class CheckinDate implements Serializable{
+    private static final long serialVersionUID = -8560643656775167406L;
+    /**
+     * 	工作日。若为固定时间上下班或自由上下班,则1到6分别表示星期一到星期六,0表示星期日
+     */
+    @SerializedName("workdays")
+    private List workdays;
+
+    /**
+     * 	工作日上下班打卡时间信息
+     */
+    @SerializedName("checkintime")
+    private List checkinTime;
+
+    /**
+     * 	下班不需要打卡,true为下班不需要打卡,false为下班需要打卡
+     */
+    @SerializedName("noneed_offwork")
+    private Boolean noneedOffwork;
+
+    /**
+     * 	打卡时间限制(毫秒)
+     */
+    @SerializedName("limit_aheadtime")
+    private Long limitAheadtime;
+
+    /**
+     * 	允许迟到时间,单位ms
+     */
+    @SerializedName("flex_on_duty_time")
+    private Integer flexOnDutyTime;
+
+    /**
+     * 	允许早退时间,单位ms
+     */
+    @SerializedName("flex_off_duty_time")
+    private Integer flexOffDutyTime;
+  }
+
+  @Data
+  public static class CheckinTime implements Serializable{
+
+    private static final long serialVersionUID = -5507709858609705279L;
+    /**
+     * 	上班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("work_sec")
+    private Integer workSec;
+
+    /**
+     * 	下班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("off_work_sec")
+    private Integer offWorkSec;
+
+    /**
+     * 	上班提醒时间,表示为距离当天0点的秒数。。
+     */
+    @SerializedName("remind_work_sec")
+    private Integer remindWorkSec;
+
+    /**
+     * 	下班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_off_work_sec")
+    private Integer remindOffWorkSec;
+  }
+
+  @Data
+  public static class SpeWorkday implements Serializable{
+
+    private static final long serialVersionUID = -4620710297258742666L;
+    /**
+     * 	特殊日期-必须打卡日期时间戳
+     */
+    @SerializedName("timestamp")
+    private Long timestamp;
+
+    /**
+     * 	特殊日期备注
+     */
+    @SerializedName("notes")
+    private String notes;
+
+    /**
+     * 	特殊日期-必须打卡日期-上下班打卡时间
+     */
+    @SerializedName("checkintime")
+    private List checkinTime;
+  }
+
+  @Data
+  public static class SpeOffDay implements Serializable{
+    private static final long serialVersionUID = 9214798931489490993L;
+    /**
+     * 	特殊日期-不用打卡日期时间戳
+     */
+    @SerializedName("timestamp")
+    private Long timestamp;
+
+    /**
+     * 	特殊日期备注
+     */
+    @SerializedName("notes")
+    private String notes;
+  }
+
+  @Data
+  public static class WifiMacInfo implements Serializable{
+
+    private static final long serialVersionUID = 6742659716677227089L;
+
+    /**
+     * 	WiFi打卡地点名称
+     */
+    @SerializedName("wifiname")
+    private String wifiname;
+
+    /**
+     * 	WiFi打卡地点MAC地址/bssid
+     */
+    @SerializedName("wifimac")
+    private String wifimac;
+  }
+
+  @Data
+  public static class LocInfo implements Serializable{
+
+    private static final long serialVersionUID = -5591379191341944101L;
+    /**
+     * 		位置打卡地点纬度,是实际纬度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+     */
+    @SerializedName("lat")
+    private Long lat;
+
+    /**
+     * 	位置打卡地点经度,是实际经度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+     */
+    @SerializedName("lng")
+    private Long lng;
+
+    /**
+     * 位置打卡地点名称
+     */
+    @SerializedName("loc_title")
+    private String locTitle;
+
+    /**
+     * 位置打卡地点详情
+     */
+    @SerializedName("loc_detail")
+    private String locDetail;
+
+    /**
+     * 	允许打卡范围(米)
+     */
+    @SerializedName("distance")
+    private Integer distance;
+  }
+
+  @Data
+  public static class Range implements Serializable{
+
+    private static final long serialVersionUID = 8940086218556453088L;
+
+    /**
+     * 	打卡人员中,单个打卡人员节点的userid
+     */
+    @SerializedName("party_id")
+    private List partyid;
+
+    /**
+     * 	打卡人员中,部门节点的id
+     */
+    @SerializedName("userid")
+    private List userid;
+
+    /**
+     * 	打卡人员中,标签节点的标签id
+     */
+    @SerializedName("tagid")
+    private List tagid;
+
+
+  }
+
+  @Data
+  public static class ReporterInfo implements Serializable{
+    private static final long serialVersionUID = 1132450350458936772L;
+    /**
+     * 		汇报对象,每个汇报人用userid表示
+     */
+    @SerializedName("reporters")
+    private List reporters;
+
+    /**
+     * 		汇报对象更新时间
+     */
+    @SerializedName("updatetime")
+    private long updateTime;
+  }
+
+  @Data
+  public static class Reporter implements Serializable {
+
+    private static final long serialVersionUID = 4925417850482005397L;
+
+    @SerializedName("userid")
+    private String userid;
+  }
+
+  @Data
+  public static class OtInfo implements Serializable{
+
+    private static final long serialVersionUID = 1610150484871066199L;
+
+    /**
+     * 加班类型
+     * 0:以加班申请核算打卡记录(根据打卡记录和加班申请核算),
+     * 1:以打卡时间为准(根据打卡时间计算),
+     * 2: 以加班申请审批为准(只根据加班申请计算)
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 		允许工作日加班,true为允许,false为不允许
+     */
+    @SerializedName("allow_ot_workingday")
+    private Boolean allowOtWorkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("allow_ot_nonworkingday")
+    private Boolean allowOtNonworkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("otcheckinfo")
+    private OtCheckInfo otcheckinfo;
+
+    /**
+     * 	更新时间
+     */
+    @SerializedName("uptime")
+    private Long uptime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("otapplyinfo")
+    private OtApplyInfo otapplyinfo;
+  }
+
+  @Data
+  public static class OtCheckInfo implements Serializable {
+
+    private static final long serialVersionUID = -2363047492489556390L;
+
+    /**
+     * 	允许工作日加班-加班开始时间:下班后xx秒开始计算加班,距离最晚下班时间的秒数,例如,1800(30分钟 乘以 60秒),默认值30分钟
+     */
+    @SerializedName("ot_workingday_time_start")
+    private Integer otWorkingDayTimeStart;
+
+    /**
+     * 	允许工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+     */
+    @SerializedName("ot_workingday_time_min")
+    private Integer otWorkingDayTimeMin;
+
+    /**
+     *  允许工作日加班-最长加班时长:超过则视为加班xx秒,单位秒,默认值240分钟
+     */
+    @SerializedName("ot_workingday_time_max")
+    private Integer otWorkingDayTimeMax;
+
+    /**
+     * 	允许非工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+     */
+    @SerializedName("ot_nonworkingday_time_min")
+    private Integer otNonworkingDayTimeMin;
+
+    /**
+     * 	允许非工作日加班-最长加班时长:超过则视为加班xx秒 单位秒,默认值240分钟
+     */
+    @SerializedName("ot_nonworkingday_time_max")
+    private Integer otNonworkingDayTimeMax;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("ot_nonworkingday_spanday_time")
+    private Integer otNonworkingDaySpanDayTime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_workingday_restinfo")
+    private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_nonworkingday_restinfo")
+    private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+  }
+
+  @Data
+  public static class OtWorkingDayRestInfo implements Serializable{
+
+    private static final long serialVersionUID = -4011047369711928306L;
+
+    /**
+     * 	工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 	工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+     */
+    @SerializedName("fix_time_rule")
+    private FixTimeRule fixTimeRule;
+
+    /**
+     * 	工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+     */
+    @SerializedName("cal_ottime_rule")
+    private CalOtTimeRule calOttimeRule;
+  }
+
+  @Data
+  public static class FixTimeRule implements Serializable{
+
+    private static final long serialVersionUID = 5709478500196619664L;
+
+    /**
+     * 	工作日加班-指定休息时间的开始时间, 距离当天00:00的秒数
+     */
+    @SerializedName("fix_time_begin_sec")
+    private Integer fixTimeBeginSec;
+
+    /**
+     * 	工作日加班-指定休息时间的结束时间, 距离当天00:00的秒数
+     */
+    @SerializedName("fix_time_end_sec")
+    private Integer fixTimeEndSec;
+  }
+
+  @Data
+  public static class CalOtTimeRule implements Serializable {
+
+    private static final long serialVersionUID = -2407839982631243413L;
+
+    /**
+     * 	工作日加班-按加班时长扣除条件信息
+     */
+    @SerializedName("items")
+    private List items;
+
+  }
+  @Data
+  public static class Item implements Serializable{
+
+    private static final long serialVersionUID = 5235770378506228461L;
+
+    /**
+     * 	加班满-时长(秒)
+     */
+    @SerializedName("ot_time")
+    private Integer otTime;
+
+    /**
+     * 	对应扣除-时长(秒)
+     */
+    @SerializedName("rest_time")
+    private Integer restTime;
+  }
+
+  @Data
+  public static class OtNonworkingDayRestInfo implements Serializable{
+
+    private static final long serialVersionUID = 3773846077049838088L;
+
+    /**
+     * 	非工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+     */
+    @SerializedName("type")
+    private Integer type;
+
+    /**
+     * 	非工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+     */
+    @SerializedName("fix_time_rule")
+    private FixTimeRule fixTimeRule;
+
+    /**
+     * 	非工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+     */
+    @SerializedName("cal_ottime_rule")
+    private CalOtTimeRule calOttimeRule;
+  }
+
+  @Data
+  public static class OtApplyInfo implements Serializable{
+
+    private static final long serialVersionUID = 961217471918884103L;
+
+    /**
+     * 		允许工作日加班,true为允许,false为不允许
+     */
+    @SerializedName("allow_ot_workingday")
+    private Boolean allowOtWorkingDay;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("allow_ot_nonworkingday")
+    private Boolean allowOtNonworkingDay;
+
+    /**
+     * 	更新时间
+     */
+    @SerializedName("uptime")
+    private Long uptime;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_workingday_restinfo")
+    private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+    /**
+     * 		允许非工作日加班,true为允许,flase为不允许
+     */
+    @SerializedName("ot_nonworkingday_restinfo")
+    private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("ot_nonworkingday_spanday_time")
+    private Integer otNonworkingDaySpanDayTime;
+
+  }
+
+  @Data
+  public static class Schedule implements Serializable{
+
+    private static final long serialVersionUID = -2461113644925307266L;
+
+    /**
+     * 	班次id
+     */
+    @SerializedName("schedule_id")
+    private Integer scheduleId;
+
+    /**
+     * 	班次名称
+     */
+    @SerializedName("schedule_name")
+    private String scheduleName;
+
+    /**
+     * 	班次上下班时段信息
+     */
+    @SerializedName("time_section")
+    private List timeSection;
+
+    /**
+     * 	允许提前打卡时间
+     */
+    @SerializedName("limit_aheadtime")
+    private Long limitAheadTime;
+
+    /**
+     * 	下班xx秒后不允许打下班卡
+     */
+    @SerializedName("limit_offtime")
+    private Integer limitOffTime;
+
+    /**
+     * 	下班不需要打卡
+     */
+    @SerializedName("noneed_offwork")
+    private Boolean noNeedOffWork;
+
+    /**
+     * 	是否允许弹性时间
+     */
+    @SerializedName("allow_flex")
+    private Boolean allowFlex;
+
+    /**
+     * 	允许迟到时间
+     */
+    @SerializedName("flex_on_duty_time")
+    private Integer flexOnDutyTime;
+
+    /**
+     * 	允许早退时间
+     */
+    @SerializedName("flex_off_duty_time")
+    private Integer flexOffDutyTime;
+
+    /**
+     * 	非工作日加班,跨天时间,距离当天00:00的秒数
+     */
+    @SerializedName("late_rule")
+    private LateRule lateRule;
+
+    /**
+     * 	最早可打卡时间限制
+     */
+    @SerializedName("max_allow_arrive_early")
+    private Integer maxAllowArriveEarly;
+
+    /**
+     * 	最晚可打卡时间限制,max_allow_arrive_early、max_allow_arrive_early与flex_on_duty_time、flex_off_duty_time互斥,当设置其中一组时,另一组数值置0
+     */
+    @SerializedName("max_allow_arrive_late")
+    private Integer maxAllowArriveLate;
+
+  }
+
+
+  @Data
+  public static class TimeSection implements Serializable {
+    private static final long serialVersionUID = 7497252128339062724L;
+
+    /**
+     * 	时段id,为班次中某一堆上下班时间组合的id
+     */
+    @SerializedName("time_id")
+    private Integer timeId;
+
+    /**
+     * 	上班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("work_sec")
+    private Integer workSec;
+
+    /**
+     * 	下班时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("off_work_sec")
+    private Integer offWorkSec;
+
+    /**
+     * 	上班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_work_sec")
+    private Long remindWorkSec;
+
+    /**
+     * 	下班提醒时间,表示为距离当天0点的秒数。
+     */
+    @SerializedName("remind_off_work_sec")
+    private Integer remindOffWorkSec;
+
+    /**
+     * 		休息开始时间,仅单时段支持,距离0点的秒
+     */
+    @SerializedName("rest_begin_time")
+    private Integer restBeginTime;
+
+    /**
+     * 	休息结束时间,仅单时段支持,距离0点的秒
+     */
+    @SerializedName("rest_end_time")
+    private Integer restEndTime;
+
+    /**
+     * 	是否允许休息
+     */
+    @SerializedName("allow_rest")
+    private Boolean allowRest;
+  }
+
+
+  @Data
+  public static class LateRule implements Serializable{
+
+    private static final long serialVersionUID = 5604969713950037053L;
+
+
+    /**
+     *  是否允许超时下班(下班晚走次日晚到)允许时onwork_flex_time,offwork_after_time才有意义
+     */
+    @SerializedName("allow_offwork_after_time")
+    private Boolean allowOffWorkAfterTime;
+
+    /**
+     * 	迟到规则时间
+     */
+    @SerializedName("timerules")
+    private List timerules;
+  }
+
+  @Data
+  public static class TimeRule implements Serializable{
+
+    private static final long serialVersionUID = 5680614050081598333L;
+
+    /**
+     * 	晚走的时间 距离最晚一个下班的时间单位:秒
+     */
+    @SerializedName("offwork_after_time")
+    private Integer offWorkAfterTime;
+
+    /**
+     * 	第二天第一个班次允许迟到的弹性时间单位:秒
+     */
+    @SerializedName("onwork_flex_time")
+    private Integer onWorkFlexTime;
+
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 7ca857476b..f577fcb217 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -91,6 +91,7 @@ interface Menu {
   }
 
   interface Oa {
+    String GET_CORP_CHECKIN_OPTION = "/cgi-bin/checkin/getcorpcheckinoption";
     String GET_CHECKIN_DATA = "/cgi-bin/checkin/getcheckindata";
     String GET_CHECKIN_OPTION = "/cgi-bin/checkin/getcheckinoption";
     String GET_CHECKIN_DAY_DATA = "/cgi-bin/checkin/getcheckin_daydata";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index 55c773305d..f838837b00 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -53,7 +53,7 @@ public void testGetCheckinData() throws ParseException, WxErrorException {
 
   @Test
   public void testGetCheckinDayData() throws ParseException, WxErrorException {
-    Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+    Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-06-30");
     Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
 
     List results = wxService.getOaService()
@@ -103,6 +103,16 @@ public void testGetCheckinOption() throws WxErrorException {
     System.out.println(gson.toJson(results));
   }
 
+  @Test
+  public void testGetCropCheckinOption() throws WxErrorException {
+
+    Date now = new Date();
+    List results = wxService.getOaService().getCropCheckinOption();
+    assertThat(results).isNotNull();
+    System.out.println("results ");
+    System.out.println(gson.toJson(results));
+  }
+
   @Test
   public void testGetApprovalInfo() throws WxErrorException, ParseException {
     Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2019-12-01");