| @@ -28,6 +28,11 @@ public interface WxCpChatService { | |||
| */ | |||
| String chatCreate(String name, String owner, List<String> users, String chatId) throws WxErrorException; | |||
| /** | |||
| * chatCreate 同名方法 | |||
| */ | |||
| String create(String name, String owner, List<String> users, String chatId) throws WxErrorException; | |||
| /** | |||
| * 修改群聊会话. | |||
| * | |||
| @@ -40,6 +45,11 @@ public interface WxCpChatService { | |||
| */ | |||
| void chatUpdate(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) throws WxErrorException; | |||
| /** | |||
| * chatUpdate 同名方法 | |||
| */ | |||
| void update(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) throws WxErrorException; | |||
| /** | |||
| * 获取群聊会话. | |||
| * | |||
| @@ -49,6 +59,11 @@ public interface WxCpChatService { | |||
| */ | |||
| WxCpChat chatGet(String chatId) throws WxErrorException; | |||
| /** | |||
| * chatGet 同名方法 | |||
| */ | |||
| WxCpChat get(String chatId) throws WxErrorException; | |||
| /** | |||
| * 应用支持推送文本、图片、视频、文件、图文等类型. | |||
| * 请求方式: POST(HTTPS) | |||
| @@ -0,0 +1,66 @@ | |||
| package me.chanjar.weixin.cp.api; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.cp.bean.WxCpApprovalDataResult; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinData; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinOption; | |||
| import me.chanjar.weixin.cp.bean.WxCpDialRecord; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.api | |||
| * @date 2019-04-06 10:52 | |||
| * @Description: <pre> | |||
| * 企业微信OA相关接口 | |||
| * | |||
| * </pre> | |||
| */ | |||
| public interface WxCpOAService { | |||
| /** | |||
| * <pre> | |||
| * 获取打卡数据 | |||
| * API doc : https://work.weixin.qq.com/api/doc#90000/90135/90262 | |||
| * </pre> | |||
| * | |||
| * @param openCheckinDataType 打卡类型。1:上下班打卡;2:外出打卡;3:全部打卡 | |||
| * @param starttime 获取打卡记录的开始时间 | |||
| * @param endtime 获取打卡记录的结束时间 | |||
| * @param userIdList 需要获取打卡记录的用户列表 | |||
| */ | |||
| List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date starttime, Date endtime, List<String> userIdList) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 获取打卡规则 | |||
| * API doc : https://work.weixin.qq.com/api/doc#90000/90135/90263 | |||
| * </pre> | |||
| * | |||
| * @param datetime 需要获取规则的当天日期 | |||
| * @param userIdList 需要获取打卡规则的用户列表 | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| List<WxCpCheckinOption> getCheckinOption(Date datetime, List<String> userIdList) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 获取审批数据 | |||
| * 通过本接口来获取公司一段时间内的审批记录。一次拉取调用最多拉取10000个审批记录,可以通过多次拉取的方式来满足需求,但调用频率不可超过600次/分。 | |||
| * API doc : https://work.weixin.qq.com/api/doc#90000/90135/91530 | |||
| * </pre> | |||
| * | |||
| * @param starttime 获取审批记录的开始时间 | |||
| * @param endtime 获取审批记录的结束时间 | |||
| * @param nextSpnum 第一个拉取的审批单号,不填从该时间段的第一个审批单拉取 | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| WxCpApprovalDataResult getApprovalData(Date starttime, Date endtime, Long nextSpnum) throws WxErrorException; | |||
| List<WxCpDialRecord> getDialRecord(Date starttime, Date endtime, Integer offset, Integer limit) throws WxErrorException; | |||
| } | |||
| @@ -303,6 +303,8 @@ public interface WxCpService { | |||
| WxCpAgentService getAgentService(); | |||
| WxCpOAService getOAService(); | |||
| /** | |||
| * http请求对象 | |||
| */ | |||
| @@ -45,6 +45,7 @@ public abstract class BaseWxCpServiceImpl<H, P> implements WxCpService, RequestH | |||
| private WxCpOAuth2Service oauth2Service = new WxCpOAuth2ServiceImpl(this); | |||
| private WxCpTagService tagService = new WxCpTagServiceImpl(this); | |||
| private WxCpAgentService agentService = new WxCpAgentServiceImpl(this); | |||
| private WxCpOAService oaService = new WxCpOAServiceImpl(this); | |||
| /** | |||
| * 全局的是否正在刷新access token的锁 | |||
| @@ -386,6 +387,11 @@ public abstract class BaseWxCpServiceImpl<H, P> implements WxCpService, RequestH | |||
| return chatService; | |||
| } | |||
| @Override | |||
| public WxCpOAService getOAService() { | |||
| return oaService; | |||
| } | |||
| @Override | |||
| public RequestHttp<?, ?> getRequestHttp() { | |||
| return this; | |||
| @@ -1,11 +1,5 @@ | |||
| package me.chanjar.weixin.cp.api.impl; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import com.google.gson.JsonParser; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||
| @@ -14,6 +8,11 @@ import me.chanjar.weixin.cp.api.WxCpService; | |||
| import me.chanjar.weixin.cp.bean.WxCpAppChatMessage; | |||
| import me.chanjar.weixin.cp.bean.WxCpChat; | |||
| import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| /** | |||
| * 群聊服务实现. | |||
| @@ -52,6 +51,11 @@ public class WxCpChatServiceImpl implements WxCpChatService { | |||
| return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString(); | |||
| } | |||
| @Override | |||
| public String create(String name, String owner, List<String> users, String chatId) throws WxErrorException { | |||
| return chatCreate(name, owner, users, chatId); | |||
| } | |||
| @Override | |||
| public void chatUpdate(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) | |||
| throws WxErrorException { | |||
| @@ -75,6 +79,11 @@ public class WxCpChatServiceImpl implements WxCpChatService { | |||
| this.cpService.post(APPCHAT_UPDATE, WxGsonBuilder.create().toJson(data)); | |||
| } | |||
| @Override | |||
| public void update(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) throws WxErrorException { | |||
| chatUpdate(chatId, name, owner, usersToAdd, usersToDelete); | |||
| } | |||
| @Override | |||
| public WxCpChat chatGet(String chatId) throws WxErrorException { | |||
| String result = this.cpService.get(APPCHAT_GET_CHATID + chatId, null); | |||
| @@ -82,6 +91,11 @@ public class WxCpChatServiceImpl implements WxCpChatService { | |||
| .fromJson(JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(), WxCpChat.class); | |||
| } | |||
| @Override | |||
| public WxCpChat get(String chatId) throws WxErrorException { | |||
| return chatGet(chatId); | |||
| } | |||
| @Override | |||
| public void sendMsg(WxCpAppChatMessage message) throws WxErrorException { | |||
| this.cpService.post("https://qyapi.weixin.qq.com/cgi-bin/appchat/send", message.toJson()); | |||
| @@ -0,0 +1,165 @@ | |||
| package me.chanjar.weixin.cp.api.impl; | |||
| import com.google.gson.JsonArray; | |||
| import com.google.gson.JsonElement; | |||
| import com.google.gson.JsonObject; | |||
| import com.google.gson.JsonParser; | |||
| import com.google.gson.reflect.TypeToken; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.cp.api.WxCpOAService; | |||
| import me.chanjar.weixin.cp.api.WxCpService; | |||
| import me.chanjar.weixin.cp.bean.WxCpApprovalDataResult; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinData; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinOption; | |||
| import me.chanjar.weixin.cp.bean.WxCpDialRecord; | |||
| import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.api.impl | |||
| * @date 2019-04-06 11:20 | |||
| * @Description: TODO | |||
| */ | |||
| public class WxCpOAServiceImpl implements WxCpOAService { | |||
| private WxCpService mainService; | |||
| public WxCpOAServiceImpl(WxCpService mainService) { | |||
| this.mainService = mainService; | |||
| } | |||
| @Override | |||
| public List<WxCpCheckinData> getCheckinData(Integer openCheckinDataType, Date starttime, Date endtime, List<String> userIdList) throws WxErrorException { | |||
| if (starttime == null || endtime == null) { | |||
| throw new RuntimeException("starttime and endtime can't be null"); | |||
| } | |||
| if (userIdList == null || userIdList.size() > 100) { | |||
| throw new RuntimeException("用户列表不能为空,不超过100个,若用户超过100个,请分批获取"); | |||
| } | |||
| long endtimestamp = endtime.getTime() / 1000L; | |||
| long starttimestamp = starttime.getTime() / 1000L; | |||
| if (endtimestamp - starttimestamp < 0 || endtimestamp - starttimestamp >= 30 * 24 * 60 * 60) { | |||
| throw new RuntimeException("获取记录时间跨度不超过一个月"); | |||
| } | |||
| String url = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata"; | |||
| JsonObject jsonObject = new JsonObject(); | |||
| JsonArray jsonArray = new JsonArray(); | |||
| jsonObject.addProperty("opencheckindatatype", openCheckinDataType); | |||
| jsonObject.addProperty("starttime", starttimestamp); | |||
| jsonObject.addProperty("endtime", endtimestamp); | |||
| for (String userid : userIdList) { | |||
| jsonArray.add(userid); | |||
| } | |||
| jsonObject.add("useridlist", jsonArray); | |||
| String responseContent = this.mainService.post(url, jsonObject.toString()); | |||
| JsonElement tmpJsonElement = new JsonParser().parse(responseContent); | |||
| return WxCpGsonBuilder.create() | |||
| .fromJson( | |||
| tmpJsonElement.getAsJsonObject().get("checkindata"), | |||
| new TypeToken<List<WxCpCheckinData>>() { | |||
| }.getType() | |||
| ); | |||
| } | |||
| @Override | |||
| public List<WxCpCheckinOption> getCheckinOption(Date datetime, List<String> userIdList) throws WxErrorException { | |||
| String url = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckinoption"; | |||
| if (datetime == null) { | |||
| throw new RuntimeException("datetime can't be null"); | |||
| } | |||
| if (userIdList == null || userIdList.size() > 100) { | |||
| throw new RuntimeException("用户列表不能为空,不超过100个,若用户超过100个,请分批获取"); | |||
| } | |||
| JsonArray jsonArray = new JsonArray(); | |||
| for (String userid : userIdList) { | |||
| jsonArray.add(userid); | |||
| } | |||
| JsonObject jsonObject = new JsonObject(); | |||
| jsonObject.addProperty("datetime", datetime.getTime() / 1000L); | |||
| jsonObject.add("useridlist", jsonArray); | |||
| String responseContent = this.mainService.post(url, jsonObject.toString()); | |||
| JsonElement tmpJsonElement = new JsonParser().parse(responseContent); | |||
| return WxCpGsonBuilder.create() | |||
| .fromJson( | |||
| tmpJsonElement.getAsJsonObject().get("info"), | |||
| new TypeToken<List<WxCpCheckinOption>>() { | |||
| }.getType() | |||
| ); | |||
| } | |||
| @Override | |||
| public WxCpApprovalDataResult getApprovalData(Date starttime, Date endtime, Long nextSpnum) throws WxErrorException { | |||
| String url = "https://qyapi.weixin.qq.com/cgi-bin/corp/getapprovaldata"; | |||
| JsonObject jsonObject = new JsonObject(); | |||
| jsonObject.addProperty("starttime", starttime.getTime() / 1000L); | |||
| jsonObject.addProperty("endtime", endtime.getTime() / 1000L); | |||
| if (nextSpnum != null) { | |||
| jsonObject.addProperty("next_spnum", nextSpnum); | |||
| } | |||
| String responseContent = this.mainService.post(url, jsonObject.toString()); | |||
| return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDataResult.class); | |||
| } | |||
| @Override | |||
| public List<WxCpDialRecord> getDialRecord(Date starttime, Date endtime, Integer offset, Integer limit) throws WxErrorException { | |||
| String url = "https://qyapi.weixin.qq.com/cgi-bin/dial/get_dial_record"; | |||
| JsonObject jsonObject = new JsonObject(); | |||
| if (offset == null) { | |||
| offset = 0; | |||
| } | |||
| if (limit == null || limit <= 0) { | |||
| limit = 100; | |||
| } | |||
| jsonObject.addProperty("offset", offset); | |||
| jsonObject.addProperty("limit", limit); | |||
| if (starttime != null && endtime != null) { | |||
| long endtimestamp = endtime.getTime() / 1000L; | |||
| long starttimestamp = starttime.getTime() / 1000L; | |||
| if (endtimestamp - starttimestamp < 0 || endtimestamp - starttimestamp >= 30 * 24 * 60 * 60) { | |||
| throw new RuntimeException("受限于网络传输,起止时间的最大跨度为30天,如超过30天,则以结束时间为基准向前取30天进行查询"); | |||
| } | |||
| jsonObject.addProperty("start_time", starttimestamp); | |||
| jsonObject.addProperty("end_time", endtimestamp); | |||
| } | |||
| String responseContent = this.mainService.post(url, jsonObject.toString()); | |||
| JsonElement tmpJsonElement = new JsonParser().parse(responseContent); | |||
| return WxCpGsonBuilder.create() | |||
| .fromJson( | |||
| tmpJsonElement.getAsJsonObject().get("record"), | |||
| new TypeToken<List<WxCpDialRecord>>() { | |||
| }.getType() | |||
| ); | |||
| } | |||
| } | |||
| @@ -8,6 +8,7 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.common.util.http.HttpType; | |||
| import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||
| import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; | |||
| import me.chanjar.weixin.cp.api.WxCpOAService; | |||
| import me.chanjar.weixin.cp.config.WxCpConfigStorage; | |||
| import org.apache.http.HttpHost; | |||
| import org.apache.http.client.config.RequestConfig; | |||
| @@ -0,0 +1,69 @@ | |||
| package me.chanjar.weixin.cp.bean; | |||
| import com.google.gson.annotations.SerializedName; | |||
| import lombok.Data; | |||
| import java.io.Serializable; | |||
| import java.util.Map; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.bean | |||
| * @date 2019-04-06 14:36 | |||
| * @Description: 企业微信 OA 审批数据 | |||
| */ | |||
| @Data | |||
| public class WxCpApprovalDataResult implements Serializable { | |||
| private static final long serialVersionUID = -1046940445840716590L; | |||
| @SerializedName("errcode") | |||
| private Integer errCode; | |||
| @SerializedName("errmsg") | |||
| private String errMsg; | |||
| private Integer count; | |||
| private Integer total; | |||
| @SerializedName("next_spnum") | |||
| private Long nextSpnum; | |||
| private WxCpApprovalData[] data; | |||
| @Data | |||
| public static class WxCpApprovalData implements Serializable{ | |||
| private static final long serialVersionUID = -3051785319608491640L; | |||
| private String spname; | |||
| @SerializedName("apply_name") | |||
| private String applyName; | |||
| @SerializedName("apply_org") | |||
| private String applyOrg; | |||
| @SerializedName("approval_name") | |||
| private String[] approvalName; | |||
| @SerializedName("notify_name") | |||
| private String[] notifyName; | |||
| @SerializedName("sp_status") | |||
| private Integer spStatus; | |||
| @SerializedName("sp_num") | |||
| private Long spNum; | |||
| @SerializedName("apply_time") | |||
| private Long applyTime; | |||
| @SerializedName("apply_user_id") | |||
| private String applyUserId; | |||
| @SerializedName("comm") | |||
| private Map<String,String> comm; | |||
| } | |||
| } | |||
| @@ -0,0 +1,51 @@ | |||
| package me.chanjar.weixin.cp.bean; | |||
| import com.google.gson.annotations.SerializedName; | |||
| import lombok.Data; | |||
| import java.io.Serializable; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.bean | |||
| * @date 2019-04-06 11:01 | |||
| * @Description: 企业微信打卡数据 | |||
| */ | |||
| @Data | |||
| public class WxCpCheckinData implements Serializable { | |||
| private static final long serialVersionUID = 1915820330847799605L; | |||
| @SerializedName("userid") | |||
| private String userId; | |||
| @SerializedName("groupname") | |||
| private String groupName; | |||
| @SerializedName("checkin_type") | |||
| private String checkinType; | |||
| @SerializedName("exception_type") | |||
| private String exceptionType; | |||
| @SerializedName("checkin_time") | |||
| private Long checkinTime; | |||
| @SerializedName("location_title") | |||
| private String locationTitle; | |||
| @SerializedName("location_detail") | |||
| private String locationDetail; | |||
| @SerializedName("wifiname") | |||
| private String wifiName; | |||
| @SerializedName("wifimac") | |||
| private String wifiMAC; | |||
| private String notes; | |||
| @SerializedName("mediaids") | |||
| private List<String> mediaIds; | |||
| } | |||
| @@ -0,0 +1,151 @@ | |||
| package me.chanjar.weixin.cp.bean; | |||
| import com.google.gson.annotations.SerializedName; | |||
| import lombok.Data; | |||
| import java.io.Serializable; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.bean | |||
| * @date 2019-04-06 13:22 | |||
| * @Description: 企业微信打卡规则 | |||
| */ | |||
| @Data | |||
| public class WxCpCheckinOption implements Serializable { | |||
| private static final long serialVersionUID = -1964233697990417482L; | |||
| @SerializedName("userid") | |||
| private String userId; | |||
| private Group group; | |||
| @Data | |||
| public static class CheckinDate implements Serializable { | |||
| private static final long serialVersionUID = -5601722383347110974L; | |||
| private List<Integer> workdays; | |||
| @SerializedName("checkintime") | |||
| private CheckinTime[] checkinTime; | |||
| @SerializedName("flex_time") | |||
| private Long flexTime; | |||
| @SerializedName("noneed_offwork") | |||
| private Boolean noneedOffwork; | |||
| @SerializedName("limit_aheadtime") | |||
| private Long limitAheadtime; | |||
| } | |||
| @Data | |||
| public static class CheckinTime implements Serializable { | |||
| private static final long serialVersionUID = -8579954143265336276L; | |||
| @SerializedName("work_sec") | |||
| private Long workSec; | |||
| @SerializedName("off_work_sec") | |||
| private Long offWorkSec; | |||
| @SerializedName("remind_work_sec") | |||
| private Long remindWorkSec; | |||
| @SerializedName("remind_off_work_sec") | |||
| private Long remindOffWorkSec; | |||
| } | |||
| @Data | |||
| public static class Group implements Serializable { | |||
| private static final long serialVersionUID = -5888406969613403044L; | |||
| @SerializedName("groupid") | |||
| private Long id; | |||
| @SerializedName("groupname") | |||
| private String name; | |||
| @SerializedName("grouptype") | |||
| private Integer type; | |||
| @SerializedName("checkindate") | |||
| private List<CheckinDate> checkinDate; | |||
| @SerializedName("spe_workdays") | |||
| private List<SpeDay> speWorkdays; | |||
| @SerializedName("spe_offdays") | |||
| private List<SpeDay> speOffdays; | |||
| @SerializedName("sync_holidays") | |||
| private Boolean syncHolidays; | |||
| @SerializedName("need_photo") | |||
| private Boolean needPhoto; | |||
| @SerializedName("note_can_use_local_pic") | |||
| private Boolean note_can_use_local_pic; | |||
| @SerializedName("allow_checkin_offworkday") | |||
| private Boolean allow_checkin_offworkday; | |||
| @SerializedName("allow_apply_offworkday") | |||
| private Boolean allow_apply_offworkday; | |||
| @SerializedName("wifimac_infos") | |||
| private List<WifiMACInfo> wifiMACInfos; | |||
| @SerializedName("loc_infos") | |||
| private List<LocInfo> locInfos; | |||
| } | |||
| @Data | |||
| public static class WifiMACInfo implements Serializable{ | |||
| private static final long serialVersionUID = -4657809185716627368L; | |||
| @SerializedName("wifiname") | |||
| private String name; | |||
| @SerializedName("wifimac") | |||
| private String mac; | |||
| } | |||
| @Data | |||
| public static class LocInfo implements Serializable{ | |||
| private static final long serialVersionUID = -618965280668099608L; | |||
| private Long lat; | |||
| private Long lng; | |||
| @SerializedName("loc_title") | |||
| private String title; | |||
| @SerializedName("loc_detail") | |||
| private String detail; | |||
| private Long distance; | |||
| } | |||
| @Data | |||
| public static class SpeDay implements Serializable{ | |||
| private static final long serialVersionUID = -3538818921359212748L; | |||
| private Long timestamp; | |||
| private String notes; | |||
| @SerializedName("checkintime") | |||
| private List<CheckinTime> checkinTime; | |||
| } | |||
| } | |||
| @@ -0,0 +1,73 @@ | |||
| package me.chanjar.weixin.cp.bean; | |||
| import com.google.gson.annotations.SerializedName; | |||
| import lombok.Data; | |||
| import java.io.Serializable; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.bean | |||
| * @date 2019-04-06 15:38 | |||
| * @Description: 公费电话拨打记录 | |||
| */ | |||
| @Data | |||
| public class WxCpDialRecord implements Serializable { | |||
| private static final long serialVersionUID = 4178886812949929116L; | |||
| @SerializedName("call_time") | |||
| private Long callTime; | |||
| /** | |||
| * 总通话时长,单位为分钟 | |||
| */ | |||
| @SerializedName("total_duration") | |||
| private Integer totalDuration; | |||
| /** | |||
| * 通话类型,1-单人通话 2-多人通话 | |||
| */ | |||
| @SerializedName("call_type") | |||
| private Integer callType; | |||
| private Caller caller; | |||
| private List<Callee> callee; | |||
| /** | |||
| * 主叫信息 | |||
| */ | |||
| @Data | |||
| public static class Caller implements Serializable{ | |||
| private static final long serialVersionUID = 4792200404338145607L; | |||
| @SerializedName("userid") | |||
| private String userId; | |||
| private Integer duration; | |||
| } | |||
| /** | |||
| * 被叫信息 | |||
| */ | |||
| @Data | |||
| public static class Callee implements Serializable{ | |||
| private static final long serialVersionUID = 2390963671336179550L; | |||
| /** | |||
| * 被叫用户的userid,当被叫用户为企业内用户时返回 | |||
| */ | |||
| @SerializedName("userid") | |||
| private String userId; | |||
| /** | |||
| * 被叫用户的号码,当被叫用户为外部用户时返回 | |||
| */ | |||
| private String phone; | |||
| private Integer duration; | |||
| } | |||
| } | |||
| @@ -0,0 +1,67 @@ | |||
| package me.chanjar.weixin.cp.api.impl; | |||
| import com.google.gson.Gson; | |||
| import com.google.inject.Inject; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.cp.api.ApiTestModule; | |||
| import me.chanjar.weixin.cp.api.WxCpService; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinData; | |||
| import me.chanjar.weixin.cp.bean.WxCpCheckinOption; | |||
| import org.apache.commons.lang3.time.DateFormatUtils; | |||
| import org.testng.annotations.Guice; | |||
| import org.testng.annotations.Test; | |||
| import java.text.ParseException; | |||
| import java.util.ArrayList; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| /** | |||
| * @author Element | |||
| * @Package me.chanjar.weixin.cp.api.impl | |||
| * @date 2019-04-20 13:46 | |||
| * @Description: TODO | |||
| */ | |||
| @Guice(modules = ApiTestModule.class) | |||
| public class WxCpOAServiceImplTest { | |||
| @Inject | |||
| protected WxCpService wxService; | |||
| @Inject | |||
| protected Gson gson; | |||
| @Test | |||
| public void testGetCheckinData() throws ParseException, WxErrorException { | |||
| Date starttime,endtime; | |||
| List<String> userLists = new ArrayList<>(); | |||
| starttime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2019-01-01"); | |||
| endtime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2019-01-20"); | |||
| userLists.add("1"); | |||
| userLists.add("2"); | |||
| userLists.add("3"); | |||
| List<WxCpCheckinData> results = wxService.getOAService().getCheckinData(1, starttime,endtime,userLists); | |||
| System.out.println("results "); | |||
| System.out.println(gson.toJson(results)); | |||
| } | |||
| @Test | |||
| public void testGetCheckinOption() throws WxErrorException{ | |||
| Date now = new Date(); | |||
| List<String> userLists = new ArrayList<>(); | |||
| userLists.add("user@aliyun.com"); | |||
| List<WxCpCheckinOption> results = wxService.getOAService().getCheckinOption(now,userLists); | |||
| System.out.println("results "); | |||
| System.out.println(gson.toJson(results)); | |||
| } | |||
| } | |||