1 package com.foxinmy.weixin4j.qy.api;
2
3 import com.alibaba.fastjson.JSONObject;
4 import com.alibaba.fastjson.TypeReference;
5 import com.foxinmy.weixin4j.exception.WeixinException;
6 import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
7 import com.foxinmy.weixin4j.model.Token;
8 import com.foxinmy.weixin4j.qy.model.BatchResult;
9 import com.foxinmy.weixin4j.qy.model.Callback;
10 import com.foxinmy.weixin4j.qy.model.IdParameter;
11 import com.foxinmy.weixin4j.token.TokenManager;
12
13 /**
14 * 批量异步任务API
15 * <p>
16 * 异步任务接口用于大批量数据的处理,提交后接口即返回,企业号会在后台继续执行任务。执行完成后,通过任务事件通知企业获取结果
17 * </p>
18 *
19 * @className BatchApi
20 * @author jinyu(foxinmy@gmail.com)
21 * @date 2015年3月30日
22 * @since JDK 1.6
23 * @see <a href="https://work.weixin.qq.com/api/doc#10138">批量任务</a>
24 */
25 public class BatchApi extends QyApi {
26
27 private final TokenManager tokenManager;
28
29 public BatchApi(TokenManager tokenManager) {
30 this.tokenManager = tokenManager;
31 }
32
33 /**
34 * 批量邀请成员关注
35 *
36 * @param parameter
37 * 成员ID,标签ID,部门ID
38 * @param callback
39 * 接收任务执行结果的回调地址等信息
40 * @param tips
41 * 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。
42 * @return 异步任务id,最大长度为64字符
43 * @see com.foxinmy.weixin4j.qy.model.IdParameter
44 * @see com.foxinmy.weixin4j.qy.model.Callback
45 * @see <a
46 * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8">邀请成员关注</a>
47 * @throws WeixinException
48 */
49 public String inviteUser(IdParameter parameter, Callback callback,
50 String tips) throws WeixinException {
51 String batch_inviteuser_uri = getRequestUri("batch_inviteuser_uri");
52 Token token = tokenManager.getCache();
53 JSONObject obj = new JSONObject();
54 obj.putAll(parameter.getParameter());
55 obj.put("callback", callback);
56 obj.put("invite_tips", tips);
57 WeixinResponse response = weixinExecutor.post(
58 String.format(batch_inviteuser_uri, token.getAccessToken()),
59 obj.toJSONString());
60 return response.getAsJson().getString("jobid");
61 }
62
63 /**
64 * 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。
65 *
66 * <p>
67 * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br>
68 * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 </br> 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
69 * 4.通讯录中存在、文件中不存在的成员,保持不变</br>
70 * </p>
71 *
72 * @param mediaId
73 * 带user信息的cvs文件上传后的media_id
74 * @param callback
75 * 接收任务执行结果的回调地址等信息
76 * @return 异步任务id,最大长度为64字符
77 * @see {@link MediaApi#batchUploadUsers(java.util.List)}
78 * @see com.foxinmy.weixin4j.qy.model.Callback
79 * @see <a href="https://work.weixin.qq.com/api/doc#10138/增量更新成员">批量更新成员</a>
80 * @throws WeixinException
81 */
82 public String syncUser(String mediaId, Callback callback)
83 throws WeixinException {
84 String batch_syncuser_uri = getRequestUri("batch_syncuser_uri");
85 return batch(batch_syncuser_uri, mediaId, callback);
86 }
87
88 private String batch(String batchUrl, String mediaId, Callback callback)
89 throws WeixinException {
90 Token token = tokenManager.getCache();
91 JSONObject obj = new JSONObject();
92 obj.put("media_id", mediaId);
93 obj.put("callback", callback);
94 WeixinResponse response = weixinExecutor.post(
95 String.format(batchUrl, token.getAccessToken()),
96 obj.toJSONString());
97 return response.getAsJson().getString("jobid");
98 }
99
100 /**
101 * 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。
102 * <p>
103 * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br> 2.文件中存在、通讯录中也存在的成员,完全以文件为准</br>
104 * 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
105 * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人,
106 * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码
107 * </p>
108 *
109 * @param mediaId
110 * 带userid信息的cvs文件上传后的media_id
111 * @param callback
112 * 接收任务执行结果的回调地址等信息
113 * @return 异步任务id,最大长度为64字符
114 * @see {@link MediaApi#batchUploadUsers(java.util.List)}
115 * @see com.foxinmy.weixin4j.qy.model.Callback
116 * @see <a href="https://work.weixin.qq.com/api/doc#10138/全量覆盖成员">批量覆盖成员</a>
117 * @throws WeixinException
118 */
119 public String replaceUser(String mediaId, Callback callback)
120 throws WeixinException {
121 String batch_replaceuser_uri = getRequestUri("batch_replaceuser_uri");
122 return batch(batch_replaceuser_uri, mediaId, callback);
123 }
124
125 /**
126 * 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。
127 * <p>
128 * 1.文件中存在、通讯录中也存在的部门,执行修改操作</br> 2.文件中存在、通讯录中不存在的部门,执行添加操作</br>
129 * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作</br>
130 * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序
131 * </p>
132 *
133 * @param mediaId
134 * 带partyid信息的cvs文件上传后的media_id
135 * @param callback
136 * 接收任务执行结果的回调地址等信息
137 * @return 异步任务id,最大长度为64字符
138 * @see {@link MediaApi#batchUploadParties(java.util.List)}
139 * @see com.foxinmy.weixin4j.qy.model.Callback
140 * @see <a href="https://work.weixin.qq.com/api/doc#10138/全量覆盖部门">批量覆盖部门</a>
141 * @throws WeixinException
142 */
143 public String replaceParty(String mediaId, Callback callback)
144 throws WeixinException {
145 String batch_replaceparty_uri = getRequestUri("batch_replaceparty_uri");
146 return batch(batch_replaceparty_uri, mediaId, callback);
147 }
148
149 /**
150 * 获取异步任务执行的结果
151 *
152 * @param jobId
153 * 任务ID
154 * @return 执行结果对象
155 * @see com.foxinmy.weixin4j.qy.model.BatchResult
156 * @see <a
157 * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E8.8E.B7.E5.8F.96.E5.BC.82.E6.AD.A5.E4.BB.BB.E5.8A.A1.E7.BB.93.E6.9E.9C">获取异步任务执行结果</a>
158 * @throws WeixinException
159 */
160 public BatchResult getBatchResult(String jobId) throws WeixinException {
161 Token token = tokenManager.getCache();
162 String batch_getresult_uri = getRequestUri("batch_getresult_uri");
163 WeixinResponse response = weixinExecutor.get(String.format(
164 batch_getresult_uri, token.getAccessToken(), jobId));
165 return response.getAsObject(new TypeReference<BatchResult>() {
166 });
167 }
168 }