Skip to content

Commit f6f4b89

Browse files
committed
🆕 #1641 企业微信增加OA提交审批申请的接口
1 parent 3b8c66a commit f6f4b89

File tree

13 files changed

+352
-50
lines changed

13 files changed

+352
-50
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,10 +1069,26 @@ public enum WxCpErrorMsgEnum {
10691069
* 获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天.
10701070
*/
10711071
CODE_301024(301024, "获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天"),
1072+
/**
1073+
* 提交审批单请求参数错误
1074+
*/
1075+
CODE_301025(301025,"提交审批单请求参数错误"),
10721076
/**
10731077
* 不允许更新该用户的userid.
10741078
*/
10751079
CODE_301036(301036, "不允许更新该用户的userid"),
1080+
/**
1081+
* 无审批应用权限,或者提单者不在审批应用/自建应用的可见范围
1082+
*/
1083+
CODE_301055(301055,"无审批应用权限,或者提单者不在审批应用/自建应用的可见范围"),
1084+
/**
1085+
* 审批应用已停用
1086+
*/
1087+
CODE_301056(301056,"审批应用已停用"),
1088+
/**
1089+
* 通用错误码,提交审批单内部接口失败
1090+
*/
1091+
CODE_301057(301057,"通用错误码,提交审批单内部接口失败"),
10761092
/**
10771093
* 批量导入任务的文件中userid有重复.
10781094
*/

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@
1515
*/
1616
public interface WxCpOaService {
1717

18+
/**
19+
* <pre>提交审批申请
20+
* 调试工具
21+
* 企业可通过审批应用或自建应用Secret调用本接口,代应用可见范围内员工在企业微信“审批应用”内提交指定类型的审批申请。
22+
*
23+
* 请求方式:POST(HTTPS)
24+
* 请求地址: https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=ACCESS_TOKEN
25+
* 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/91853
26+
* </pre>
27+
*
28+
* @param request 请求
29+
* @return 表单提交成功后,返回的表单编号
30+
* @throws WxErrorException .
31+
*/
32+
String apply(WxCpOaApplyEventRequest request) throws WxErrorException;
33+
1834
/**
1935
* <pre>
2036
* 获取打卡数据
@@ -40,7 +56,7 @@ List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date startTime
4056
* @param datetime 需要获取规则的当天日期
4157
* @param userIdList 需要获取打卡规则的用户列表
4258
* @return 打卡规则列表
43-
* @throws WxErrorException
59+
* @throws WxErrorException .
4460
*/
4561
List<WxCpCheckinOption> getCheckinOption(Date datetime, List<String> userIdList) throws WxErrorException;
4662

@@ -63,7 +79,7 @@ List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date startTime
6379
* @param size 一次请求拉取审批单数量,默认值为100,上限值为100
6480
* @param filters 筛选条件,可对批量拉取的审批申请设置约束条件,支持设置多个条件,nullable
6581
* @return WxCpApprovalInfo
66-
* @throws WxErrorException
82+
* @throws WxErrorException .
6783
*/
6884
WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime, Integer cursor, Integer size,
6985
List<WxCpApprovalInfoQueryFilter> filters) throws WxErrorException;
@@ -74,7 +90,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
7490
* @param startTime 开始时间
7591
* @param endTime 结束时间
7692
* @return WxCpApprovalInfo
77-
* @throws WxErrorException
93+
* @throws WxErrorException .
7894
* @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
7995
*/
8096
WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime) throws WxErrorException;
@@ -90,7 +106,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
90106
*
91107
* @param spNo 审批单编号。
92108
* @return WxCpApprovaldetail
93-
* @throws WxErrorException
109+
* @throws WxErrorException .
94110
*/
95111
WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws WxErrorException;
96112

@@ -104,7 +120,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
104120
* @param startTime 获取审批记录的开始时间
105121
* @param endTime 获取审批记录的结束时间
106122
* @param nextSpnum 第一个拉取的审批单号,不填从该时间段的第一个审批单拉取
107-
* @throws WxErrorException
123+
* @throws WxErrorException .
108124
* @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
109125
* @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalDetail
110126
*/
@@ -118,18 +134,19 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
118134
* @param endTime 查询的结束时间戳
119135
* @param offset 分页查询的偏移量
120136
* @param limit 分页查询的每页大小,默认为100条,如该参数大于100则按100处理
121-
* @return
122-
* @throws WxErrorException
137+
* @return .
138+
* @throws WxErrorException .
123139
*/
124140
List<WxCpDialRecord> getDialRecord(Date startTime, Date endTime, Integer offset,
125141
Integer limit) throws WxErrorException;
126142

127143
/**
128144
* 获取审批模板详情
145+
*
129146
* @param templateId 模板ID
130-
* @return
131-
* @throws WxErrorException
147+
* @return .
148+
* @throws WxErrorException .
132149
*/
133-
WxCpTemplateResult getTemplateDetail(@NonNull String templateId)throws WxErrorException;
150+
WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws WxErrorException;
134151

135152
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ public class WxCpOaServiceImpl implements WxCpOaService {
3131
private static final int MONTH_SECONDS = 30 * 24 * 60 * 60;
3232
private static final int USER_IDS_LIMIT = 100;
3333

34+
@Override
35+
public String apply(WxCpOaApplyEventRequest request) throws WxErrorException {
36+
String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(APPLY_EVENT),
37+
request.toJson());
38+
return GsonParser.parse(responseContent).get("sp_no").getAsString();
39+
}
40+
3441
@Override
3542
public List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date startTime, Date endTime,
3643
List<String> userIdList) throws WxErrorException {
@@ -42,19 +49,19 @@ public List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date st
4249
throw new RuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
4350
}
4451

45-
long endtimestamp = endTime.getTime() / 1000L;
46-
long starttimestamp = startTime.getTime() / 1000L;
52+
long endTimestamp = endTime.getTime() / 1000L;
53+
long startTimestamp = startTime.getTime() / 1000L;
4754

48-
if (endtimestamp - starttimestamp < 0 || endtimestamp - starttimestamp >= MONTH_SECONDS) {
55+
if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) {
4956
throw new RuntimeException("获取记录时间跨度不超过一个月");
5057
}
5158

5259
JsonObject jsonObject = new JsonObject();
5360
JsonArray jsonArray = new JsonArray();
5461

5562
jsonObject.addProperty("opencheckindatatype", openCheckinDataType);
56-
jsonObject.addProperty("starttime", starttimestamp);
57-
jsonObject.addProperty("endtime", endtimestamp);
63+
jsonObject.addProperty("starttime", startTimestamp);
64+
jsonObject.addProperty("endtime", endTimestamp);
5865

5966
for (String userid : userIdList) {
6067
jsonArray.add(userid);
@@ -213,9 +220,9 @@ public List<WxCpDialRecord> getDialRecord(Date startTime, Date endTime, Integer
213220
@Override
214221
public WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws WxErrorException {
215222
JsonObject jsonObject = new JsonObject();
216-
jsonObject.addProperty("template_id",templateId);
223+
jsonObject.addProperty("template_id", templateId);
217224
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_TEMPLATE_DETAIL);
218225
String responseContent = this.mainService.post(url, jsonObject.toString());
219-
return WxCpGsonBuilder.create().fromJson(responseContent,WxCpTemplateResult.class);
226+
return WxCpGsonBuilder.create().fromJson(responseContent, WxCpTemplateResult.class);
220227
}
221228
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package me.chanjar.weixin.cp.bean.oa;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.experimental.Accessors;
6+
import me.chanjar.weixin.cp.bean.oa.WxCpOaApplyEventRequest;
7+
8+
import java.io.Serializable;
9+
import java.util.List;
10+
11+
/**
12+
* 摘要行信息,用于定义某一行摘要显示的内容.
13+
*
14+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
15+
* @date 2020-07-19
16+
*/
17+
@Data
18+
@Accessors(chain = true)
19+
public class SummaryInfo implements Serializable {
20+
private static final long serialVersionUID = 8262265774851382414L;
21+
/**
22+
* 摘要行信息,用于定义某一行摘要显示的内容
23+
*/
24+
@SerializedName("summary_info")
25+
private List<SummaryInfoData> summaryInfoData;
26+
27+
@Data
28+
@Accessors(chain = true)
29+
public static class SummaryInfoData implements Serializable {
30+
private static final long serialVersionUID = 5314161929610113856L;
31+
/**
32+
* 摘要行显示文字,用于记录列表和消息通知的显示,不要超过20个字符
33+
*/
34+
private String text;
35+
36+
/**
37+
* 摘要行显示语言
38+
*/
39+
private String lang;
40+
}
41+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyer.java renamed to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* @author element
1111
*/
1212
@Data
13-
public class WxCpApprovalApplyer extends WxCpOperator implements Serializable {
13+
public class WxCpApprovalApplier extends WxCpOperator implements Serializable {
1414

1515
private static final long serialVersionUID = -8974662568286821271L;
1616

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package me.chanjar.weixin.cp.bean.oa;
22

33
import lombok.Data;
4-
import me.chanjar.weixin.cp.bean.oa.applydata.Content;
4+
import me.chanjar.weixin.cp.bean.oa.applydata.ApplyDataContent;
55

66
import java.io.Serializable;
77
import java.util.List;
@@ -16,6 +16,6 @@ public class WxCpApprovalApplyData implements Serializable {
1616

1717
private static final long serialVersionUID = 4061352949894274704L;
1818

19-
private List<Content> contents;
19+
private List<ApplyDataContent> contents;
2020

2121
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetail.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class WxCpApprovalDetail implements Serializable {
4949
* 申请人信息
5050
*/
5151
@SerializedName("applyer")
52-
private WxCpApprovalApplyer applier;
52+
private WxCpApprovalApplier applier;
5353

5454
/**
5555
* 审批流程信息,可能有多个审批节点
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package me.chanjar.weixin.cp.bean.oa;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.experimental.Accessors;
6+
import me.chanjar.weixin.cp.bean.oa.applydata.ApplyDataContent;
7+
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
8+
9+
import java.io.Serializable;
10+
import java.util.List;
11+
12+
/**
13+
* 提交审批申请 请求对象类.
14+
*
15+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
16+
* @date 2020-07-18
17+
*/
18+
@Data
19+
@Accessors(chain = true)
20+
public class WxCpOaApplyEventRequest implements Serializable {
21+
private static final long serialVersionUID = 3362660678938569341L;
22+
23+
/**
24+
* 申请人userid,此审批申请将以此员工身份提交,申请人需在应用可见范围内
25+
*/
26+
@SerializedName("creator_userid")
27+
private String creatorUserId;
28+
29+
/**
30+
* 模板id。可在“获取审批申请详情”、“审批状态变化回调通知”中获得,也可在审批模板的模板编辑页面链接中获得。暂不支持通过接口提交[打卡补卡][调班]模板审批单。
31+
*/
32+
@SerializedName("template_id")
33+
private String templateId;
34+
35+
/**
36+
* 审批人模式:0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用); 1-使用此模板在管理后台设置的审批流程,支持条件审批。默认为0
37+
*/
38+
@SerializedName("use_template_approver")
39+
private Integer useTemplateApprover;
40+
41+
/**
42+
* 审批流程信息,用于指定审批申请的审批流程,支持单人审批、多人会签、多人或签,可能有多个审批节点,仅use_template_approver为0时生效。
43+
*/
44+
@SerializedName("approver")
45+
private List<Approver> approvers;
46+
47+
/**
48+
* 抄送人节点userid列表,仅use_template_approver为0时生效。
49+
*/
50+
@SerializedName("notifyer")
51+
private String[] notifiers;
52+
53+
/**
54+
* 抄送方式:1-提单时抄送(默认值); 2-单据通过后抄送;3-提单和单据通过后抄送。仅use_template_approver为0时生效。
55+
*/
56+
@SerializedName("notify_type")
57+
private Integer notifyType;
58+
59+
/**
60+
* 审批申请数据,可定义审批申请中各个控件的值,其中必填项必须有值,选填项可为空,数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data”
61+
*/
62+
@SerializedName("apply_data")
63+
private ApplyData applyData;
64+
65+
/**
66+
* 摘要信息,用于显示在审批通知卡片、审批列表的摘要信息,最多3行
67+
*/
68+
@SerializedName("summary_list")
69+
private List<SummaryInfo> summaryList;
70+
71+
public String toJson() {
72+
return WxCpGsonBuilder.create().toJson(this);
73+
}
74+
75+
@Data
76+
@Accessors(chain = true)
77+
public static class Approver implements Serializable {
78+
private static final long serialVersionUID = 7625206971546930988L;
79+
80+
/**
81+
* 节点审批方式:1-或签;2-会签,仅在节点为多人审批时有效
82+
*/
83+
private Integer attr;
84+
85+
/**
86+
* 审批节点审批人userid列表,若为多人会签、多人或签,需填写每个人的userid
87+
*/
88+
@SerializedName("userid")
89+
private String[] userIds;
90+
}
91+
92+
@Data
93+
@Accessors(chain = true)
94+
public static class ApplyData implements Serializable {
95+
private static final long serialVersionUID = -2462732405265306981L;
96+
97+
/**
98+
* 审批申请数据,可定义审批申请中各个控件的值,其中必填项必须有值,选填项可为空,
99+
* 数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data”
100+
*/
101+
@SerializedName("contents")
102+
private List<ApplyDataContent> contents;
103+
}
104+
105+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package me.chanjar.weixin.cp.bean.oa.applydata;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.experimental.Accessors;
6+
7+
import java.io.Serializable;
8+
import java.util.List;
9+
10+
/**
11+
* @author element
12+
*/
13+
@Data
14+
@Accessors(chain = true)
15+
public class ApplyDataContent implements Serializable {
16+
private static final long serialVersionUID = 8456821731930526935L;
17+
/**
18+
* 控件类型:Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;
19+
* Selector-单选/多选;;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;
20+
*/
21+
private String control;
22+
23+
/**
24+
* 控件id:控件的唯一id,可通过“获取审批模板详情”接口获取
25+
*/
26+
private String id;
27+
28+
@SerializedName("title")
29+
private List<ContentTitle> titles;
30+
31+
/**
32+
* 控件值 ,需在此为申请人在各个控件中填写内容不同控件有不同的赋值参数,具体说明详见附录。模板配置的控件属性为必填时,对应value值需要有值。
33+
*/
34+
private ContentValue value;
35+
}

0 commit comments

Comments
 (0)