From 42a2dd4a40131ae3eb332a88fce5bee965de37ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 02:01:04 +0000 Subject: [PATCH 1/3] Initial plan From a19aa0353966395ab9796b73c1f70ee156597b83 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 02:07:59 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BA=BA=E4=BA=8B=E5=8A=A9=E6=89=8B=E7=9B=B8?= =?UTF-8?q?=E5=85=B3API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../chanjar/weixin/cp/api/WxCpHrService.java | 60 +++++++++++ .../me/chanjar/weixin/cp/api/WxCpService.java | 7 ++ .../cp/api/impl/BaseWxCpServiceImpl.java | 6 ++ .../weixin/cp/api/impl/WxCpHrServiceImpl.java | 65 +++++++++++ .../cp/bean/hr/WxCpHrEmployeeFieldData.java | 52 +++++++++ .../bean/hr/WxCpHrEmployeeFieldDataResp.java | 38 +++++++ .../cp/bean/hr/WxCpHrEmployeeFieldInfo.java | 101 ++++++++++++++++++ .../bean/hr/WxCpHrEmployeeFieldInfoResp.java | 38 +++++++ .../cp/bean/hr/WxCpHrEmployeeFieldValue.java | 94 ++++++++++++++++ .../weixin/cp/constant/WxCpApiPathConsts.java | 21 ++++ .../cp/api/impl/WxCpHrServiceImplTest.java | 100 +++++++++++++++++ 11 files changed, 582 insertions(+) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpHrService.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpHrServiceImpl.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldData.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldDataResp.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldInfo.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldInfoResp.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldValue.java create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpHrServiceImplTest.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpHrService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpHrService.java new file mode 100644 index 000000000..fdfe536d1 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpHrService.java @@ -0,0 +1,60 @@ +package me.chanjar.weixin.cp.api; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldData; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldDataResp; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldInfoResp; + +import java.util.List; + +/** + * 人事助手相关接口. + * 官方文档:https://developer.work.weixin.qq.com/document/path/99132 + * + * @author leejoker created on 2024-01-01 + */ +public interface WxCpHrService { + + /** + * 获取员工档案字段信息. + *

+ * 请求方式:POST(HTTPS) + * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/hr/employee/get_field_info?access_token=ACCESS_TOKEN + * 权限说明: + * 需要配置人事助手的secret,调用接口前需给对应成员赋予人事小助手应用的权限。 + * + * @param fields 指定字段key列表,不填则返回全部字段 + * @return 字段信息响应 wx cp hr employee field info resp + * @throws WxErrorException the wx error exception + */ + WxCpHrEmployeeFieldInfoResp getFieldInfo(List fields) throws WxErrorException; + + /** + * 获取员工档案数据. + *

+ * 请求方式:POST(HTTPS) + * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/hr/employee/get_employee_field_info?access_token=ACCESS_TOKEN + * 权限说明: + * 需要配置人事助手的secret,调用接口前需给对应成员赋予人事小助手应用的权限。 + * + * @param userids 员工userid列表,不超过20个 + * @param fields 指定字段key列表,不填则返回全部字段 + * @return 员工档案数据响应 wx cp hr employee field data resp + * @throws WxErrorException the wx error exception + */ + WxCpHrEmployeeFieldDataResp getEmployeeFieldInfo(List userids, List fields) throws WxErrorException; + + /** + * 更新员工档案数据. + *

+ * 请求方式:POST(HTTPS) + * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/hr/employee/update_employee_field_info?access_token=ACCESS_TOKEN + * 权限说明: + * 需要配置人事助手的secret,调用接口前需给对应成员赋予人事小助手应用的权限。 + * + * @param userid 员工userid + * @param fieldList 字段数据列表 + * @throws WxErrorException the wx error exception + */ + void updateEmployeeFieldInfo(String userid, List fieldList) 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 76012a281..3427d656e 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 @@ -594,4 +594,11 @@ public interface WxCpService extends WxService { * @return 智能机器人服务 intelligent robot service */ WxCpIntelligentRobotService getIntelligentRobotService(); + + /** + * 获取人事助手服务 + * + * @return 人事助手服务 hr service + */ + WxCpHrService getHrService(); } 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 bc18c9bc7..9c6932930 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 @@ -75,6 +75,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH private final WxCpMeetingService meetingService = new WxCpMeetingServiceImpl(this); private final WxCpCorpGroupService corpGroupService = new WxCpCorpGroupServiceImpl(this); private final WxCpIntelligentRobotService intelligentRobotService = new WxCpIntelligentRobotServiceImpl(this); + private final WxCpHrService hrService = new WxCpHrServiceImpl(this); /** * 全局的是否正在刷新access token的锁. @@ -708,4 +709,9 @@ public WxCpCorpGroupService getCorpGroupService() { public WxCpIntelligentRobotService getIntelligentRobotService() { return this.intelligentRobotService; } + + @Override + public WxCpHrService getHrService() { + return this.hrService; + } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpHrServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpHrServiceImpl.java new file mode 100644 index 000000000..0175699de --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpHrServiceImpl.java @@ -0,0 +1,65 @@ +package me.chanjar.weixin.cp.api.impl; + +import com.google.gson.JsonObject; +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpHrService; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldData; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldDataResp; +import me.chanjar.weixin.cp.bean.hr.WxCpHrEmployeeFieldInfoResp; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.util.List; + +import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Hr.*; + +/** + * 人事助手相关接口实现类. + * 官方文档:https://developer.work.weixin.qq.com/document/path/99132 + * + * @author leejoker created on 2024-01-01 + */ +@RequiredArgsConstructor +public class WxCpHrServiceImpl implements WxCpHrService { + + private final WxCpService cpService; + + @Override + public WxCpHrEmployeeFieldInfoResp getFieldInfo(List fields) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + if (fields != null && !fields.isEmpty()) { + jsonObject.add("fields", WxCpGsonBuilder.create().toJsonTree(fields)); + } + String response = this.cpService.post( + this.cpService.getWxCpConfigStorage().getApiUrl(GET_FIELD_INFO), + jsonObject.toString() + ); + return WxCpHrEmployeeFieldInfoResp.fromJson(response); + } + + @Override + public WxCpHrEmployeeFieldDataResp getEmployeeFieldInfo(List userids, List fields) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.add("userids", WxCpGsonBuilder.create().toJsonTree(userids)); + if (fields != null && !fields.isEmpty()) { + jsonObject.add("fields", WxCpGsonBuilder.create().toJsonTree(fields)); + } + String response = this.cpService.post( + this.cpService.getWxCpConfigStorage().getApiUrl(GET_EMPLOYEE_FIELD_INFO), + jsonObject.toString() + ); + return WxCpHrEmployeeFieldDataResp.fromJson(response); + } + + @Override + public void updateEmployeeFieldInfo(String userid, List fieldList) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("userid", userid); + jsonObject.add("field_list", WxCpGsonBuilder.create().toJsonTree(fieldList)); + this.cpService.post( + this.cpService.getWxCpConfigStorage().getApiUrl(UPDATE_EMPLOYEE_FIELD_INFO), + jsonObject.toString() + ); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldData.java new file mode 100644 index 000000000..971e5958d --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldData.java @@ -0,0 +1,52 @@ +package me.chanjar.weixin.cp.bean.hr; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 人事助手-员工档案数据(单个员工). + * + * @author leejoker created on 2024-01-01 + */ +@Data +@NoArgsConstructor +public class WxCpHrEmployeeFieldData implements Serializable { + private static final long serialVersionUID = 4593693598671765396L; + + /** + * 员工userid. + */ + @SerializedName("userid") + private String userid; + + /** + * 字段数据列表. + */ + @SerializedName("field_list") + private List fieldList; + + /** + * 字段数据项. + */ + @Data + @NoArgsConstructor + public static class FieldItem implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 字段key. + */ + @SerializedName("field_key") + private String fieldKey; + + /** + * 字段值. + */ + @SerializedName("field_value") + private WxCpHrEmployeeFieldValue fieldValue; + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldDataResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldDataResp.java new file mode 100644 index 000000000..07e286c2e --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldDataResp.java @@ -0,0 +1,38 @@ +package me.chanjar.weixin.cp.bean.hr; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.util.List; + +/** + * 人事助手-获取员工档案数据响应. + * + * @author leejoker created on 2024-01-01 + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class WxCpHrEmployeeFieldDataResp extends WxCpBaseResp { + private static final long serialVersionUID = 6593693598671765396L; + + /** + * 员工档案数据列表. + */ + @SerializedName("employee_field_list") + private List employeeFieldList; + + /** + * From json wx cp hr employee field data resp. + * + * @param json the json + * @return the wx cp hr employee field data resp + */ + public static WxCpHrEmployeeFieldDataResp fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpHrEmployeeFieldDataResp.class); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldInfo.java new file mode 100644 index 000000000..219ad6abf --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/hr/WxCpHrEmployeeFieldInfo.java @@ -0,0 +1,101 @@ +package me.chanjar.weixin.cp.bean.hr; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 人事助手-员工档案字段信息. + * + * @author leejoker created on 2024-01-01 + */ +@Data +@NoArgsConstructor +public class WxCpHrEmployeeFieldInfo implements Serializable { + private static final long serialVersionUID = 2593693598671765396L; + + /** + * 字段key. + */ + @SerializedName("field_key") + private String fieldKey; + + /** + * 字段英文名称. + */ + @SerializedName("field_en_name") + private String fieldEnName; + + /** + * 字段中文名称. + */ + @SerializedName("field_zh_name") + private String fieldZhName; + + /** + * 字段类型. + * 1: 文本 + * 2: 日期 + * 3: 数字 + * 4: 单选 + * 5: 多选 + * 6: 附件 + * 7: 手机 + * 8: 邮箱 + */ + @SerializedName("field_type") + private Integer fieldType; + + /** + * 是否系统字段. + * 0: 否 + * 1: 是 + */ + @SerializedName("is_sys") + private Integer isSys; + + /** + * 字段详情. + */ + @SerializedName("field_detail") + private FieldDetail fieldDetail; + + /** + * 字段详情. + */ + @Data + @NoArgsConstructor + public static class FieldDetail implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 选项列表(单选/多选字段专用). + */ + @SerializedName("option_list") + private List