diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ToJson.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ToJson.java new file mode 100644 index 000000000..b8bfaabb0 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ToJson.java @@ -0,0 +1,15 @@ +package me.chanjar.weixin.common.bean; + +/** + * 包含toJson()方法的接口. + * + * @author Binary Wang + * @date 2020-10-05 + */ +public interface ToJson { + /** + * 转换为json字符串 + * @return json字符串 + */ + String toJson(); +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java index 030ba6fa5..ee330b03e 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java @@ -193,6 +193,10 @@ public class GsonHelper { jsonObject.addProperty(key.toString(), (Number) value); } else if (value instanceof JsonElement) { jsonObject.add(key.toString(), (JsonElement) value); + } else if (value instanceof List) { + JsonArray array = new JsonArray(); + ((List) value).forEach(a -> array.add(a.toString())); + jsonObject.add(key.toString(), array); } else { jsonObject.addProperty(key.toString(), value.toString()); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaCalendarService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaCalendarService.java index 8dc0d3136..91010ce21 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaCalendarService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaCalendarService.java @@ -3,6 +3,8 @@ package me.chanjar.weixin.cp.api; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.bean.oa.calendar.WxCpOaCalendar; +import java.util.List; + /** * 企业微信日历接口. * @@ -26,4 +28,56 @@ public interface WxCpOaCalendarService { * @throws WxErrorException . */ String add(WxCpOaCalendar calendar) throws WxErrorException; + + /** + * 更新日历. + *
+   * 该接口用于修改指定日历的信息。
+   * 注意,更新操作是覆盖式,而不是增量式
+   * 企业微信需要更新到3.0.2及以上版本
+   * 请求方式: POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/oa/calendar/update?access_token=ACCESS_TOKEN
+   *
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/92619
+   * 
+ * + * @param calendar 日历对象 + * @throws WxErrorException . + */ + void update(WxCpOaCalendar calendar) throws WxErrorException; + + /** + * 获取日历. + *
+   * 该接口用于获取应用在企业内创建的日历信息。
+   *
+   * 注: 企业微信需要更新到3.0.2及以上版本
+   *
+   * 请求方式: POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/oa/calendar/get?access_token=ACCESS_TOKEN
+   *
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/92621
+   * 
+ * + * @param calIds 日历id列表 + * @return 日历对象列表 + * @throws WxErrorException . + */ + List get(List calIds) throws WxErrorException; + + /** + * 删除日历. + *
+   * 该接口用于删除指定日历。
+   * 注: 企业微信需要更新到3.0.2及以上版本
+   * 请求方式: POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/oa/calendar/del?access_token=ACCESS_TOKEN
+   *
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/92620
+   * 
+ * + * @param calId 日历id + * @throws WxErrorException . + */ + void delete(String calId) throws WxErrorException; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index b7ae0f766..90c66ab91 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.cp.api; +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.bean.ToJson; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.WxSession; @@ -179,6 +181,26 @@ public interface WxCpService { */ String post(String url, String postData) throws WxErrorException; + /** + * 内部使用. + * + * @param url 接口地址 + * @param jsonObject 请求body的json对象 + * @return the string + * @throws WxErrorException the wx error exception + */ + String post(String url, JsonObject jsonObject) throws WxErrorException; + + /** + * 内部使用. + * + * @param url 接口地址 + * @param obj 请求body的对象,实现了ToJson接口 + * @return the string + * @throws WxErrorException the wx error exception + */ + String post(String url, ToJson obj) throws WxErrorException; + /** * 当不需要自动带accessToken的时候,可以用这个发起post请求 * @@ -403,11 +425,12 @@ public interface WxCpService { * @return 群机器人消息推送服务 group robot service */ WxCpGroupRobotService getGroupRobotService(); + /* - * 获取工作台服务 - * - * @return the workbench service - * */ + * 获取工作台服务 + * + * @return the workbench service + * */ WxCpAgentWorkBenchService getWorkBenchService(); /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java index 3cf6db567..092e48eb6 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -5,6 +5,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.ToJson; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; @@ -211,6 +212,16 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH return execute(SimplePostRequestExecutor.create(this), url, postData); } + @Override + public String post(String url, JsonObject jsonObject) throws WxErrorException { + return this.post(url, jsonObject.toString()); + } + + @Override + public String post(String url, ToJson obj) throws WxErrorException { + return this.post(url, obj.toJson()); + } + @Override public String postWithoutToken(String url, String postData) throws WxErrorException { return this.executeNormal(SimplePostRequestExecutor.create(this), url, postData); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImpl.java index c5b0a4aac..7e604934b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImpl.java @@ -1,12 +1,18 @@ package me.chanjar.weixin.cp.api.impl; +import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonHelper; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpOaCalendarService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.oa.calendar.WxCpOaCalendar; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; -import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Oa.CALENDAR_ADD; +import java.util.List; + +import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Oa.*; /** * . @@ -20,6 +26,26 @@ public class WxCpOaCalendarServiceImpl implements WxCpOaCalendarService { @Override public String add(WxCpOaCalendar calendar) throws WxErrorException { - return this.wxCpService.post(this.wxCpService.getWxCpConfigStorage().getApiUrl(CALENDAR_ADD),calendar.toJson()); + return this.wxCpService.post(this.wxCpService.getWxCpConfigStorage().getApiUrl(CALENDAR_ADD), calendar); + } + + @Override + public void update(WxCpOaCalendar calendar) throws WxErrorException { + this.wxCpService.post(this.wxCpService.getWxCpConfigStorage().getApiUrl(CALENDAR_UPDATE), calendar); + } + + @Override + public List get(List calIds) throws WxErrorException { + String response = this.wxCpService.post(this.wxCpService.getWxCpConfigStorage().getApiUrl(CALENDAR_GET), + GsonHelper.buildJsonObject("cal_id_list", calIds)); + return WxCpGsonBuilder.create().fromJson(GsonParser.parse(response).get("calendar_list").getAsJsonArray().toString(), + new TypeToken>() { + }.getType()); + } + + @Override + public void delete(String calId) throws WxErrorException { + this.wxCpService.post(this.wxCpService.getWxCpConfigStorage().getApiUrl(CALENDAR_DEL), + GsonHelper.buildJsonObject("cal_id", calId)); } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/calendar/WxCpOaCalendar.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/calendar/WxCpOaCalendar.java index d4d9fd7f7..9f8b69ae5 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/calendar/WxCpOaCalendar.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/calendar/WxCpOaCalendar.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import me.chanjar.weixin.common.bean.ToJson; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.io.Serializable; @@ -23,9 +24,17 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) -public class WxCpOaCalendar implements Serializable { +public class WxCpOaCalendar implements Serializable, ToJson { private static final long serialVersionUID = -817988838579546989L; + /** + * 变量名:cal_id + * 是否必须:更新时必须提供 + * 描述:日历ID + */ + @SerializedName("cal_id") + private String calId; + /** * 变量名:organizer * 是否必须:是 @@ -99,7 +108,8 @@ public class WxCpOaCalendar implements Serializable { private Integer readonly; } + @Override public String toJson() { - return WxCpGsonBuilder.create().toJson(ImmutableMap.of("calendar",this)); + return WxCpGsonBuilder.create().toJson(ImmutableMap.of("calendar", this)); } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImplTest.java index 905dc4995..9f9cec331 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaCalendarServiceImplTest.java @@ -9,6 +9,9 @@ import org.testng.annotations.Guice; import org.testng.annotations.Test; import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; /** * 单元测试. @@ -22,18 +25,46 @@ import java.util.Arrays; public class WxCpOaCalendarServiceImplTest { @Inject protected WxCpService wxService; + private final String calId = "wcbBJNCQAARipW967iE8DKPAp5Kb96qQ"; @Test public void testAdd() throws WxErrorException { this.wxService.getOaCalendarService().add(WxCpOaCalendar.builder() - .organizer("userid1") + .organizer("binary") .readonly(1) .setAsDefault(1) .summary("test_summary") .color("#FF3030") .description("test_describe") - .shares(Arrays.asList(new WxCpOaCalendar.ShareInfo("userid2", null), - new WxCpOaCalendar.ShareInfo("userid3", 1))) + .shares(Arrays.asList(new WxCpOaCalendar.ShareInfo("binary", null), + new WxCpOaCalendar.ShareInfo("binary", 1))) .build()); } + + @Test + public void testUpdate() throws WxErrorException { + this.wxService.getOaCalendarService().update(WxCpOaCalendar.builder() + .calId(calId) + .organizer("binary") + .readonly(1) + .setAsDefault(1) + .summary("test_summary") + .color("#FF3030") + .description("test_describe") + .shares(Arrays.asList(new WxCpOaCalendar.ShareInfo("binary", null), + new WxCpOaCalendar.ShareInfo("binary", 1))) + .build()); + } + + @Test + public void testGet() throws WxErrorException { + final List calendars = this.wxService.getOaCalendarService() + .get(Arrays.asList(calId)); + assertThat(calendars).isNotEmpty(); + } + + @Test + public void testDelete() throws WxErrorException { + this.wxService.getOaCalendarService().delete(calId); + } }