View Javadoc
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 }