diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index be10a77e..8e766a4a 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -1,1184 +1,1216 @@
-package com.foxinmy.weixin4j.qy;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.List;
-
-import com.alibaba.fastjson.JSONObject;
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.http.weixin.JsonResult;
-import com.foxinmy.weixin4j.model.Button;
-import com.foxinmy.weixin4j.model.MediaCounter;
-import com.foxinmy.weixin4j.model.MediaDownloadResult;
-import com.foxinmy.weixin4j.model.MediaItem;
-import com.foxinmy.weixin4j.model.MediaRecord;
-import com.foxinmy.weixin4j.model.MediaUploadResult;
-import com.foxinmy.weixin4j.model.Pageable;
-import com.foxinmy.weixin4j.qy.api.AgentApi;
-import com.foxinmy.weixin4j.qy.api.BatchApi;
-import com.foxinmy.weixin4j.qy.api.ChatApi;
-import com.foxinmy.weixin4j.qy.api.HelperApi;
-import com.foxinmy.weixin4j.qy.api.MediaApi;
-import com.foxinmy.weixin4j.qy.api.MenuApi;
-import com.foxinmy.weixin4j.qy.api.NotifyApi;
-import com.foxinmy.weixin4j.qy.api.PartyApi;
-import com.foxinmy.weixin4j.qy.api.QyApi;
-import com.foxinmy.weixin4j.qy.api.TagApi;
-import com.foxinmy.weixin4j.qy.api.UserApi;
-import com.foxinmy.weixin4j.qy.message.ChatMessage;
-import com.foxinmy.weixin4j.qy.message.NotifyMessage;
-import com.foxinmy.weixin4j.qy.model.AgentInfo;
-import com.foxinmy.weixin4j.qy.model.AgentOverview;
-import com.foxinmy.weixin4j.qy.model.AgentSetter;
-import com.foxinmy.weixin4j.qy.model.BatchResult;
-import com.foxinmy.weixin4j.qy.model.Callback;
-import com.foxinmy.weixin4j.qy.model.ChatInfo;
-import com.foxinmy.weixin4j.qy.model.ChatMute;
-import com.foxinmy.weixin4j.qy.model.IdParameter;
-import com.foxinmy.weixin4j.qy.model.Party;
-import com.foxinmy.weixin4j.qy.model.Tag;
-import com.foxinmy.weixin4j.qy.model.User;
-import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
-import com.foxinmy.weixin4j.qy.type.ChatType;
-import com.foxinmy.weixin4j.qy.type.InviteType;
-import com.foxinmy.weixin4j.qy.type.UserStatus;
-import com.foxinmy.weixin4j.token.TokenHolder;
-import com.foxinmy.weixin4j.token.TokenStorager;
-import com.foxinmy.weixin4j.tuple.MpArticle;
-import com.foxinmy.weixin4j.type.MediaType;
-
-/**
- * 微信企业号接口实现
- *
- * @className WeixinProxy
- * @author jy
- * @date 2014年11月19日
- * @since JDK 1.7
- * @see api文档
- */
-public class WeixinProxy {
-
- private final MediaApi mediaApi;
- private final MenuApi menuApi;
- private final NotifyApi notifyApi;
- private final PartyApi partyApi;
- private final UserApi userApi;
- private final TagApi tagApi;
- private final HelperApi helperApi;
- private final AgentApi agentApi;
- private final BatchApi batchApi;
- private final ChatApi chatApi;
-
- private final TokenHolder tokenHolder;
-
- /**
- * 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
- */
- public WeixinProxy() {
- this(QyApi.DEFAULT_TOKEN_STORAGER);
- }
-
- /**
- * 默认使用weixin4j.properties配置的账号信息
- *
- * @param tokenStorager
- * token存储策略
- */
- public WeixinProxy(TokenStorager tokenStorager) {
- this(QyApi.DEFAULT_WEIXIN_ACCOUNT.getId(), QyApi.DEFAULT_WEIXIN_ACCOUNT
- .getSecret(), tokenStorager);
- }
-
- /**
- * corpid,corpsecret
- *
- * @param corpid
- * @param corpsecret
- */
- public WeixinProxy(String corpid, String corpsecret) {
- this(corpid, corpsecret, QyApi.DEFAULT_TOKEN_STORAGER);
- }
-
- /**
- *
- * @param corpid
- * 企业号ID
- * @param corpsecret
- * 企业号secret
- * @param tokenStorager
- * 企业号token存储器
- */
- public WeixinProxy(String corpid, String corpsecret,
- TokenStorager tokenStorager) {
- this(new TokenHolder(new WeixinTokenCreator(corpid, corpsecret),
- tokenStorager));
- }
-
- public WeixinProxy(TokenHolder tokenHolder) {
- this.tokenHolder = tokenHolder;
- this.partyApi = new PartyApi(tokenHolder);
- this.userApi = new UserApi(tokenHolder);
- this.tagApi = new TagApi(tokenHolder);
- this.helperApi = new HelperApi(tokenHolder);
- this.agentApi = new AgentApi(tokenHolder);
- this.batchApi = new BatchApi(tokenHolder);
- this.notifyApi = new NotifyApi(tokenHolder);
- this.menuApi = new MenuApi(tokenHolder);
- this.mediaApi = new MediaApi(tokenHolder);
- this.chatApi = new ChatApi(tokenHolder);
- }
-
- public TokenHolder getTokenHolder() {
- return this.tokenHolder;
- }
-
- /**
- * 发送客服消息(需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败)
- *
- * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明
- * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid
- * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid
- *
- *
- * @param message
- * 客服消息对象
- * @return
- * 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分
- * { "errcode": 0, "errmsg": "ok", "invaliduser": "UserID1",
- * "invalidparty":"PartyID1", "invalidtag":"TagID1" }
- * @throws WeixinException
- * @see com.foxinmy.weixin4j.qy.api.NotifyApi
- * @see 发送接口说明
- * @see 发送格式说明
- * @see com.foxinmy.weixin4j.tuple.Text
- * @see com.foxinmy.weixin4j.tuple.Image
- * @see com.foxinmy.weixin4j.tuple.Voice
- * @see com.foxinmy.weixin4j.tuple.Video
- * @see com.foxinmy.weixin4j.tuple.File
- * @see com.foxinmy.weixin4j.tuple.News
- * @see com.foxinmy.weixin4j.tuple.MpNews
- * @see com.foxinmy.weixin4j.qy.message.NotifyMessage
- */
- public JSONObject sendNotifyMessage(NotifyMessage message)
- throws WeixinException {
- return notifyApi.sendNotifyMessage(message);
- }
-
- /**
- * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式)
- *
- * @param btnList
- * 菜单列表
- * @param agentid
- * 应用ID
- * @throws WeixinException
- * @see com.foxinmy.weixin4j.qy.api.MenuApi
- * @see 创建自定义菜单
- * @see com.foxinmy.weixin4j.model.Button
- */
- public JsonResult createMenu(List