listUser(int partyId, boolean fetchChild,
UserStatus userStatus, boolean findDetail) throws WeixinException {
- return userApi.listUser(departId, fetchChild, userStatus, findDetail);
+ return userApi.listUser(partyId, fetchChild, userStatus, findDetail);
}
/**
@@ -445,4 +451,114 @@ public class WeixinProxy {
public JsonResult setAgent(AgentSetter agentSet) throws WeixinException {
return agentApi.setAgent(agentSet);
}
+
+ /**
+ * 批量邀请成员关注
+ *
+ * @param parameter
+ * 成员ID,标签ID,部门ID
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @param tips
+ * 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.IdParameter
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see com.foxinmy.weixin4j.qy.api.BatchApi
+ * @see 邀请成员关注
+ * @throws WeixinException
+ */
+ public String inviteuser(IdParameter parameter, Callback callback,
+ String tips) throws WeixinException {
+ return batchApi.inviteuser(parameter, callback, tips);
+ }
+
+ /**
+ * 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。
+ *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字
+ * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 3.文件中存在、通讯录中不存在的成员,执行添加操作
+ * 4.通讯录中存在、文件中不存在的成员,保持不变
+ *
+ *
+ * @param mediaId
+ * 带user信息的cvs文件上传后的media_id
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see com.foxinmy.weixin4j.qy.api.BatchApi
+ * @see 批量更新成员
+ * @throws WeixinException
+ */
+ public String syncuser(String mediaId, Callback callback)
+ throws WeixinException {
+ return batchApi.syncuser(mediaId, callback);
+ }
+
+ /**
+ * 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。
+ *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 2.文件中存在、通讯录中也存在的成员,完全以文件为准
+ * 3.文件中存在、通讯录中不存在的成员,执行添加操作
+ * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人,
+ * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码
+ *
+ *
+ * @param mediaId
+ * 带userid信息的cvs文件上传后的media_id
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see com.foxinmy.weixin4j.qy.api.BatchApi
+ * @see 批量覆盖成员
+ * @throws WeixinException
+ */
+ public String replaceuser(String mediaId, Callback callback)
+ throws WeixinException {
+ return batchApi.replaceuser(mediaId, callback);
+ }
+ /**
+ * 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。
+ *
+ * 1.文件中存在、通讯录中也存在的部门,执行修改操作 2.文件中存在、通讯录中不存在的部门,执行添加操作
+ * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作
+ * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序
+ *
+ *
+ * @param mediaId
+ * 带partyid信息的cvs文件上传后的media_id
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see com.foxinmy.weixin4j.qy.api.BatchApi
+ * @see 批量覆盖部门
+ * @throws WeixinException
+ */
+ public String replaceparty(String mediaId, Callback callback)
+ throws WeixinException {
+ return batchApi.replaceparty(mediaId, callback);
+ }
+
+ /**
+ * 获取异步任务执行的结果
+ *
+ * @param jobId
+ * 任务ID
+ * @return 效果信息
+ * @see com.foxinmy.weixin4j.qy.model.BatchResult
+ * @see com.foxinmy.weixin4j.qy.api.BatchApi
+ * @see 获取异步任务执行结果
+ * @throws WeixinException
+ */
+ public BatchResult getresult(String jobId) throws WeixinException {
+ return batchApi.getresult(jobId);
+ }
}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java
new file mode 100644
index 00000000..9dbd7cf2
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java
@@ -0,0 +1,168 @@
+package com.foxinmy.weixin4j.qy.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.http.Response;
+import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.qy.model.BatchResult;
+import com.foxinmy.weixin4j.qy.model.Callback;
+import com.foxinmy.weixin4j.qy.model.IdParameter;
+import com.foxinmy.weixin4j.token.TokenHolder;
+
+/**
+ * 批量异步任务API
+ *
+ * 异步任务接口用于大批量数据的处理,提交后接口即返回,企业号会在后台继续执行任务。执行完成后,通过任务事件通知企业获取结果
+ *
+ *
+ * @className BatchApi
+ * @author jy
+ * @date 2015年3月30日
+ * @since JDK 1.7
+ * @see 批量任务
+ */
+public class BatchApi extends QyApi {
+
+ private final TokenHolder tokenHolder;
+
+ public BatchApi(TokenHolder tokenHolder) {
+ this.tokenHolder = tokenHolder;
+ }
+
+ /**
+ * 批量邀请成员关注
+ *
+ * @param parameter
+ * 成员ID,标签ID,部门ID
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @param tips
+ * 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.IdParameter
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see 邀请成员关注
+ * @throws WeixinException
+ */
+ public String inviteuser(IdParameter parameter, Callback callback,
+ String tips) throws WeixinException {
+ String batch_inviteuser_uri = getRequestUri("batch_inviteuser_uri");
+ Token token = tokenHolder.getToken();
+ JSONObject obj = new JSONObject();
+ obj.putAll(parameter.getParameter());
+ obj.put("callback", callback);
+ obj.put("invite_tips", tips);
+ Response response = request.post(
+ String.format(batch_inviteuser_uri, token.getAccessToken()),
+ obj.toJSONString());
+ return response.getAsJson().getString("jobid");
+ }
+
+ /**
+ * 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。
+ *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字
+ * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 3.文件中存在、通讯录中不存在的成员,执行添加操作
+ * 4.通讯录中存在、文件中不存在的成员,保持不变
+ *
+ *
+ * @param mediaId
+ * 带user信息的cvs文件上传后的media_id TODO
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see 批量更新成员
+ * @throws WeixinException
+ */
+ public String syncuser(String mediaId, Callback callback)
+ throws WeixinException {
+ String batch_syncuser_uri = getRequestUri("batch_syncuser_uri");
+ return batch(batch_syncuser_uri, mediaId, callback);
+ }
+
+ private String batch(String batchUrl, String mediaId, Callback callback)
+ throws WeixinException {
+ Token token = tokenHolder.getToken();
+ JSONObject obj = new JSONObject();
+ obj.put("media_id", mediaId);
+ obj.put("callback", callback);
+ Response response = request.post(
+ String.format(batchUrl, token.getAccessToken()),
+ obj.toJSONString());
+ return response.getAsJson().getString("jobid");
+ }
+
+ /**
+ * 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。
+ *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 2.文件中存在、通讯录中也存在的成员,完全以文件为准
+ * 3.文件中存在、通讯录中不存在的成员,执行添加操作
+ * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人,
+ * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码
+ *
+ *
+ * @param mediaId
+ * 带userid信息的cvs文件上传后的media_id
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see 批量覆盖成员
+ * @throws WeixinException
+ */
+ public String replaceuser(String mediaId, Callback callback)
+ throws WeixinException {
+ String batch_replaceuser_uri = getRequestUri("batch_replaceuser_uri");
+ return batch(batch_replaceuser_uri, mediaId, callback);
+ }
+
+ /**
+ * 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。
+ *
+ * 1.文件中存在、通讯录中也存在的部门,执行修改操作 2.文件中存在、通讯录中不存在的部门,执行添加操作
+ * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作
+ * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序
+ *
+ *
+ * @param mediaId
+ * 带partyid信息的cvs文件上传后的media_id
+ * @param callback
+ * 接收任务执行结果的回调地址等信息
+ * @return 异步任务id,最大长度为64字符
+ * @see com.foxinmy.weixin4j.qy.model.Callback
+ * @see 批量覆盖部门
+ * @throws WeixinException
+ */
+ public String replaceparty(String mediaId, Callback callback)
+ throws WeixinException {
+ String batch_replaceparty_uri = getRequestUri("batch_replaceparty_uri");
+ return batch(batch_replaceparty_uri, mediaId, callback);
+ }
+
+ /**
+ * 获取异步任务执行的结果
+ *
+ * @param jobId
+ * 任务ID
+ * @return 效果信息
+ * @see com.foxinmy.weixin4j.qy.model.BatchResult
+ * @see 获取异步任务执行结果
+ * @throws WeixinException
+ */
+ public BatchResult getresult(String jobId) throws WeixinException {
+ Token token = tokenHolder.getToken();
+ String batch_getresult_uri = getRequestUri("batch_getresult_uri");
+ Response response = request.get(String.format(batch_getresult_uri,
+ token.getAccessToken(), jobId));
+ return response.getAsObject(new TypeReference() {
+ });
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java
similarity index 79%
rename from weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java
rename to weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java
index c5a3490d..3a77f97e 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java
@@ -8,24 +8,24 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.qy.model.Department;
+import com.foxinmy.weixin4j.qy.model.Party;
import com.foxinmy.weixin4j.token.TokenHolder;
/**
* 部门API
*
- * @className DepartApi
+ * @className PartyApi
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
- * @see com.foxinmy.weixin4j.qy.model.Department
+ * @see com.foxinmy.weixin4j.qy.model.Party
* @see 管理部门说明
*/
-public class DepartApi extends QyApi {
+public class PartyApi extends QyApi {
private final TokenHolder tokenHolder;
- public DepartApi(TokenHolder tokenHolder) {
+ public PartyApi(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
}
@@ -34,13 +34,13 @@ public class DepartApi extends QyApi {
*
* @param depart
* 部门对象
- * @see com.foxinmy.weixin4j.qy.model.Department
+ * @see com.foxinmy.weixin4j.qy.model.Party
* @see 创建部门说明
* @return 部门ID
* @throws WeixinException
*/
- public int createDepart(Department depart) throws WeixinException {
+ public int createParty(Party depart) throws WeixinException {
String department_create_uri = getRequestUri("department_create_uri");
JSONObject obj = (JSONObject) JSON.toJSON(depart);
obj.remove("id");
@@ -56,15 +56,15 @@ public class DepartApi extends QyApi {
*
* @param depart
* 部门对象
- * @see com.foxinmy.weixin4j.qy.model.Department
+ * @see com.foxinmy.weixin4j.qy.model.Party
* @see 更新部门说明
* @return 处理结果
* @throws WeixinException
*/
- public JsonResult updateDepart(Department depart) throws WeixinException {
+ public JsonResult updateParty(Party party) throws WeixinException {
String department_update_uri = getRequestUri("department_update_uri");
- JSONObject obj = (JSONObject) JSON.toJSON(depart);
+ JSONObject obj = (JSONObject) JSON.toJSON(party);
Token token = tokenHolder.getToken();
Response response = request.post(
String.format(department_update_uri, token.getAccessToken()),
@@ -75,37 +75,37 @@ public class DepartApi extends QyApi {
/**
* 查询部门列表(以部门的order字段从小到大排列)
*
- * @param departId 部门ID。获取指定部门ID下的子部门
- * @see com.foxinmy.weixin4j.qy.model.Department
+ * @param partId 部门ID。获取指定部门ID下的子部门
+ * @see com.foxinmy.weixin4j.qy.model.Party
* @see 获取部门列表
* @return 部门列表
* @throws WeixinException
*/
- public List listDepart(int departId) throws WeixinException {
+ public List listParty(int partId) throws WeixinException {
String department_list_uri = getRequestUri("department_list_uri");
Token token = tokenHolder.getToken();
Response response = request.post(String.format(department_list_uri,
token.getAccessToken()));
return JSON.parseArray(response.getAsJson().getString("department"),
- Department.class);
+ Party.class);
}
/**
* 删除部门(不能删除根部门;不能删除含有子部门、成员的部门)
*
- * @param departId
+ * @param partId
* 部门ID
* @see 删除部门说明
* @return 处理结果
* @throws WeixinException
*/
- public JsonResult deleteDepart(int departId) throws WeixinException {
+ public JsonResult deleteParty(int partId) throws WeixinException {
String department_delete_uri = getRequestUri("department_delete_uri");
Token token = tokenHolder.getToken();
Response response = request.post(String.format(department_delete_uri,
- token.getAccessToken(), departId));
+ token.getAccessToken(), partId));
return response.getAsJsonResult();
}
}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
index f6eb71e2..b36c4b3c 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
@@ -64,4 +64,14 @@ getcallbackip_uri={api_base_url}/getcallbackip?access_token=%s
# \u83b7\u53d6\u4f01\u4e1a\u53f7\u5e94\u7528\u4fe1\u606f
agent_get_uri={api_base_url}/agent/get?access_token=%s&agentid=%d
# \u8bbe\u7f6e\u4f01\u4e1a\u53f7\u5e94\u7528\u4fe1\u606f
-agent_set_uri={api_base_url}/agent/set?access_token=%s
\ No newline at end of file
+agent_set_uri={api_base_url}/agent/set?access_token=%s
+# \u6279\u91cf\u9080\u8bf7\u6210\u5458\u5173\u6ce8
+batch_inviteuser_uri={api_base_url}/batch/inviteuser?access_token=%s
+# \u6279\u91cf\u66f4\u65b0\u6210\u5458
+batch_syncuser_uri={api_base_url}/batch/syncuser?access_token=%s
+# \u6279\u91cf\u8986\u76d6\u6210\u5458
+batch_replaceuser_uri={api_base_url}/batch/replaceuser?access_token=%s
+# \u6279\u91cf\u8986\u76d6\u90e8\u95e8
+batch_replaceparty_uri={api_base_url}/batch/replaceparty?access_token=%s
+# \u83b7\u53d6\u5f02\u6b65\u4efb\u52a1\u6267\u884c\u7ed3\u679c
+batch_getresult_uri={api_base_url}/batch/getresult?access_token=%s&jobid=%s
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/BatchResult.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/BatchResult.java
new file mode 100644
index 00000000..559e89b2
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/BatchResult.java
@@ -0,0 +1,99 @@
+package com.foxinmy.weixin4j.qy.model;
+
+import com.alibaba.fastjson.JSONArray;
+import com.foxinmy.weixin4j.http.JsonResult;
+import com.foxinmy.weixin4j.qy.type.BatchStatus;
+import com.foxinmy.weixin4j.qy.type.BatchType;
+
+/**
+ * 异步任务执行结果
+ *
+ * @className BatchResult
+ * @author jy
+ * @date 2015年3月31日
+ * @since JDK 1.7
+ * @see
+ */
+public class BatchResult extends JsonResult {
+
+ private static final long serialVersionUID = 4985338631992208903L;
+ /**
+ * 任务状态
+ */
+ private int status;
+ /**
+ * 任务类型
+ */
+ private String type;
+ /**
+ * 任务运行总条数
+ */
+ private int total;
+ /**
+ * 目前运行百分比,当任务完成时为100
+ */
+ private int percentage;
+ /**
+ * 预估剩余时间(单位:分钟),当任务完成时为0
+ */
+ private int remaintime;
+ /**
+ * 详细的处理结果 TODO
+ */
+ private JSONArray result;
+
+ public BatchStatus getStatus() {
+ return BatchStatus.values()[status - 1];
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public BatchType getType() {
+ return BatchType.valueOf(type);
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public int getPercentage() {
+ return percentage;
+ }
+
+ public void setPercentage(int percentage) {
+ this.percentage = percentage;
+ }
+
+ public int getRemaintime() {
+ return remaintime;
+ }
+
+ public void setRemaintime(int remaintime) {
+ this.remaintime = remaintime;
+ }
+
+ public JSONArray getResult() {
+ return result;
+ }
+
+ public void setResult(JSONArray result) {
+ this.result = result;
+ }
+
+ @Override
+ public String toString() {
+ return "BatchResult [status=" + status + ", type=" + type + ", total="
+ + total + ", percentage=" + percentage + ", remaintime="
+ + remaintime + ", result=" + result + "]";
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Callback.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Callback.java
new file mode 100644
index 00000000..70cfe3b2
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Callback.java
@@ -0,0 +1,52 @@
+package com.foxinmy.weixin4j.qy.model;
+
+import java.io.Serializable;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * 调用某些接口时填入的回调信息
+ *
+ * @className Callback
+ * @author jy
+ * @date 2015年3月30日
+ * @since JDK 1.7
+ * @see
+ */
+public class Callback implements Serializable {
+
+ private static final long serialVersionUID = 8575808461248605317L;
+
+ /**
+ * 企业应用接收企业号推送请求的访问协议和地址,支持http或https协议
+ */
+ private String url;
+ /**
+ * 用于生成签名
+ */
+ private String token;
+ /**
+ * 用于消息体的加密,是AES密钥的Base64编码
+ */
+ @JSONField(name = "encodingaeskey")
+ private String aesKey;
+
+ public Callback(String url, String token, String aesKey) {
+ this.url = url;
+ this.token = token;
+ this.aesKey = aesKey;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public String getAesKey() {
+ return aesKey;
+ }
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java
new file mode 100644
index 00000000..8306b7de
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java
@@ -0,0 +1,64 @@
+package com.foxinmy.weixin4j.qy.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * id参数集
+ *
+ * @className IdParameter
+ * @author jy
+ * @date 2015年3月30日
+ * @since JDK 1.7
+ * @see
+ */
+public class IdParameter implements Serializable {
+
+ private static final long serialVersionUID = -2689758682205591133L;
+
+ private Map parameterMap;
+
+ public IdParameter() {
+ this.parameterMap = new HashMap();
+ }
+
+ /**
+ * 成员ID列表,最多支持1000个
+ *
+ * @param userIds
+ * @return
+ */
+ public IdParameter putUseIds(String... userIds) {
+ parameterMap.put("touser", StringUtils.join(userIds, '|'));
+ return this;
+ }
+
+ /**
+ * 部门ID列表,最多支持100个
+ *
+ * @param partyIds
+ * @return
+ */
+ public IdParameter putUseIds(int... partyIds) {
+ parameterMap.put("toparty", StringUtils.join(partyIds, '|'));
+ return this;
+ }
+
+ /**
+ * 标签ID列表
+ *
+ * @param tagIds
+ * @return
+ */
+ public IdParameter putTagIds(int... tagIds) {
+ parameterMap.put("totag", StringUtils.join(tagIds, '|'));
+ return this;
+ }
+
+ public Map getParameter() {
+ return parameterMap;
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Department.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java
similarity index 83%
rename from weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Department.java
rename to weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java
index 7542f6bd..ed0498e5 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Department.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java
@@ -5,14 +5,14 @@ import java.io.Serializable;
/**
* 部门对象
*
- * @className Department
+ * @className Party
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
* @see 管理部门说明
*/
-public class Department implements Serializable {
+public class Party implements Serializable {
private static final long serialVersionUID = -2567893218591084288L;
/**
@@ -32,15 +32,15 @@ public class Department implements Serializable {
*/
private int order;
- public Department() {
+ public Party() {
}
- public Department(String name) {
+ public Party(String name) {
this(name, 1, 1);
}
- public Department(String name, int parentid, int order) {
+ public Party(String name, int parentid, int order) {
this.name = name;
this.parentid = parentid;
this.order = order;
@@ -80,7 +80,7 @@ public class Department implements Serializable {
@Override
public String toString() {
- return "Department [id=" + id + ", name=" + name + ", parentid="
+ return "Party [id=" + id + ", name=" + name + ", parentid="
+ parentid + ", order=" + order + "]";
}
}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchStatus.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchStatus.java
new file mode 100644
index 00000000..58e2ed64
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchStatus.java
@@ -0,0 +1,34 @@
+package com.foxinmy.weixin4j.qy.type;
+
+/**
+ * 异步任务的状态
+ *
+ * @className BatchStatus
+ * @author jy
+ * @date 2015年3月31日
+ * @since JDK 1.7
+ * @see
+ */
+public enum BatchStatus {
+ /**
+ * 开始
+ */
+ START(1),
+ /**
+ * 进行中
+ */
+ PROCESS(2),
+ /**
+ * 完成
+ */
+ DONE(3);
+ private int code;
+
+ BatchStatus(int code) {
+ this.code = code;
+ }
+
+ public int getCode() {
+ return code;
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchType.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchType.java
new file mode 100644
index 00000000..9de8b673
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/BatchType.java
@@ -0,0 +1,39 @@
+package com.foxinmy.weixin4j.qy.type;
+
+/**
+ * 异步任务的类型
+ *
+ * @className BatchType
+ * @author jy
+ * @date 2015年3月31日
+ * @since JDK 1.7
+ * @see
+ */
+public enum BatchType {
+ /**
+ * 增量更新成员
+ */
+ SYNC_USER(1),
+ /**
+ * 全量覆盖成员
+ */
+ REPLACE_USER(2),
+ /**
+ * 邀请成员关注
+ */
+ INVITE_USER(3),
+ /**
+ * 全量覆盖部门
+ */
+ REPLACE_PARTY(4);
+
+ private int code;
+
+ BatchType(int code) {
+ this.code = code;
+ }
+
+ public int getCode() {
+ return code;
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/BatchTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/BatchTest.java
new file mode 100644
index 00000000..e5dd07da
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/BatchTest.java
@@ -0,0 +1,39 @@
+package com.foxinmy.weixin4j.qy.test;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.qy.api.BatchApi;
+import com.foxinmy.weixin4j.qy.model.BatchResult;
+import com.foxinmy.weixin4j.qy.model.Callback;
+
+/**
+ * 异步任务测试
+ *
+ * @className BatchTest
+ * @author jy
+ * @date 2015年3月31日
+ * @since JDK 1.7
+ * @see
+ */
+public class BatchTest extends TokenTest {
+ public BatchApi batchApi;
+
+ @Before
+ public void init() {
+ this.batchApi = new BatchApi(tokenHolder);
+ }
+
+ @Test
+ public void replaceparty() throws WeixinException {
+ String jobId = batchApi.replaceparty("mediaId", new Callback("url", "token", "aesKey"));
+ System.err.println(jobId);
+ }
+
+ @Test
+ public void getresult() throws WeixinException {
+ BatchResult result = batchApi.getresult("jobId");
+ System.err.println(result);
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/DepartTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/PartyTest.java
similarity index 58%
rename from weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/DepartTest.java
rename to weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/PartyTest.java
index 811d38f8..dcdcff04 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/DepartTest.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/PartyTest.java
@@ -8,51 +8,51 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
-import com.foxinmy.weixin4j.qy.api.DepartApi;
-import com.foxinmy.weixin4j.qy.model.Department;
+import com.foxinmy.weixin4j.qy.api.PartyApi;
+import com.foxinmy.weixin4j.qy.model.Party;
/**
* 部门API测试
*
- * @className DepartTest
+ * @className PartyTest
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
* @see
*/
-public class DepartTest extends TokenTest {
- public DepartApi departApi;
+public class PartyTest extends TokenTest {
+ public PartyApi partyApi;
@Before
public void init() {
- this.departApi = new DepartApi(tokenHolder);
+ this.partyApi = new PartyApi(tokenHolder);
}
@Test
public void create() throws WeixinException {
- Department depart = new Department("苦逼组");
- int id = departApi.createDepart(depart);
+ Party Party = new Party("苦逼组");
+ int id = partyApi.createParty(Party);
Assert.assertTrue(id > 0);
}
@Test
public void update() throws WeixinException {
- Department depart = new Department("苦逼组111");
- depart.setId(2);
- JsonResult result = departApi.updateDepart(depart);
+ Party Party = new Party("苦逼组111");
+ Party.setId(2);
+ JsonResult result = partyApi.updateParty(Party);
Assert.assertEquals("updated", result.getDesc());
}
@Test
public void list() throws WeixinException {
- List list = departApi.listDepart(1);
+ List list = partyApi.listParty(1);
Assert.assertFalse(list.isEmpty());
System.out.println(list);
}
@Test
public void delete() throws WeixinException {
- JsonResult result = departApi.deleteDepart(2);
+ JsonResult result = partyApi.deleteParty(2);
Assert.assertEquals("deleted", result.getDesc());
}
}
diff --git a/weixin4j-qy/weixin4j-qy-server/README.md b/weixin4j-qy/weixin4j-qy-server/README.md
index 9013090d..adee59c9 100644
--- a/weixin4j-qy/weixin4j-qy-server/README.md
+++ b/weixin4j-qy/weixin4j-qy-server/README.md
@@ -71,4 +71,8 @@ weixin4j-qy-server
* 2015-03-25
- + 新增deploy.xml远程部署ant脚本
\ No newline at end of file
+ + 新增deploy.xml远程部署ant脚本
+
+* 2015-04-01
+
+ + 新增批量任务执行完成事件
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/BatchJobAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/BatchJobAction.java
new file mode 100644
index 00000000..49912608
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/BatchJobAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.BatchjobresultMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 异步任务完成事件
+ *
+ * @className BatchJobAction
+ * @author jy
+ * @date 2015年3月31日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.BatchjobresultMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.batch_job_result })
+public class BatchJobAction extends DebugAction {
+
+}