1.我们先是呢要做好开始项目的准备工作
如果你是企业微信管理员可以看到,或者是你弄一个企业号如下:企业ID
同样方法可以在审批找到
有啦这两个可以获取到token
二:我这边创建一个表存获取到的审批相关信息(抽取了部分数据,较为关键)
三:下面就是写我们的获取相关代码啦
相关工具类如下
1.AccessTokenDTO
@Getter
@Setter
@ToString
public class AccessTokenDTO {
private Integer errcode;
private String errmsg;
@JsonProperty(value = "access_token")
private String accessToken;
@JsonProperty(value = "expires_in")
private String expiresIn;
}
2.ApprovalDetailDTO
@Getter
@Setter
@ToString
public class ApprovalDetailDTO {
/**
* errcode : 0
* errmsg : ok
* info : {"sp_no":"201909270002","sp_name":"全字段","sp_status":1,"template_id":"Bs5KJ2NT4ncf4ZygaE8MB3779yUW8nsMaJd3mmE9v","apply_time":1569584428,"applyer":{"userid":"WuJunJie","partyid":"2"},"sp_record":[{"sp_status":1,"approverattr":1,"details":[{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]}],"notifyer":[{"userid":"LiuXiaoGang"}],"apply_data":{"contents":[{"control":"Text","id":"Text-15111111111","title":[{"text":"文本控件","lang":"zh_CN"}],"value":{"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}}]},"comments":[{"commentUserInfo":{"userid":"WuJunJie"},"commenttime":1569584111,"commentcontent":"这是备注信息","commentid":"6741314136717778040","media_id":["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]}]}
*/
private Integer errcode;
private String errmsg;
private InfoBean info;
@Getter
@Setter
public static class InfoBean {
/**
* sp_no : 201909270002
* sp_name : 全字段
* sp_status : 1
* template_id : Bs5KJ2NT4ncf4ZygaE8MB3779yUW8nsMaJd3mmE9v
* apply_time : 1569584428
* applyer : {"userid":"WuJunJie","partyid":"2"}
* sp_record : [{"sp_status":1,"approverattr":1,"details":[{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]}]
* notifyer : [{"userid":"LiuXiaoGang"}]
* apply_data : {"contents":[{"control":"Text","id":"Text-15111111111","title":[{"text":"文本控件","lang":"zh_CN"}],"value":{"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}}]}
* comments : [{"commentUserInfo":{"userid":"WuJunJie"},"commenttime":1569584111,"commentcontent":"这是备注信息","commentid":"6741314136717778040","media_id":["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]}]
*/
@JsonProperty(value = "sp_no")
private String spNo;
@JsonProperty(value = "sp_name")
private String spName;
@JsonProperty(value = "sp_status")
private Integer spStatus;
@JsonProperty(value = "template_id")
private String templateId;
@JsonProperty(value = "apply_time")
private Long applyTime;
private ApplyerBean applyer;
@JsonProperty(value = "apply_data")
private ApplyDataBean applyData;
@JsonProperty(value = "sp_record")
private List<SpRecordBean> spRecord;
private List<NotifyerBean> notifyer;
private List<CommentsBean> comments;
@Getter
@Setter
public static class ApplyerBean {
/**
* userid : WuJunJie
* partyid : 2
*/
private String userid;
private String partyid;
}
@Getter
@Setter
public static class ApplyDataBean {
private List<ContentsBean> contents;
@Getter
@Setter
public static class ContentsBean {
/**
* control : Text
* id : Text-15111111111
* title : [{"text":"文本控件","lang":"zh_CN"}]
* value : {"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}
*/
private String control;
private String id;
private ValueBean value;
private List<TitleBean> title;
@Getter
@Setter
public static class ValueBean {
/**
* text : 文本填写的内容
* tips : []
* members : []
* departments : []
* files : []
* children : []
* stat_field : []
*/
private String text;
private List<?> tips;
private List<?> members;
private List<?> departments;
private List<?> files;
private List<?> children;
private SelectorBean selector;
@JsonProperty(value = "stat_field")
private List<?> statField;
@JsonProperty(value = "new_money")
private Double newMoney;
@Getter
@Setter
public static class SelectorBean {
/**
* type : single
* options : [{"key":"option-1643070328","value":[{"text":"差旅费","lang":"zh_CN"}]}]
*/
private String type;
private List<OptionsBean> options;
@Getter
@Setter
public static class OptionsBean {
/**
* key : option-1643070328
* value : [{"text":"差旅费","lang":"zh_CN"}]
*/
private String key;
private List<TextBean> value;
@Getter
@Setter
public static class TextBean {
/**
* text : 差旅费
* lang : zh_CN
*/
private String text;
private String lang;
}
}
}
}
@Getter
@Setter
public static class TitleBean {
/**
* text : 文本控件
* lang : zh_CN
*/
private String text;
private String lang;
}
}
}
@Getter
@Setter
public static class SpRecordBean {
/**
* sp_status : 1
* approverattr : 1
* details : [{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]
*/
@JsonProperty(value = "sp_status")
private Integer spStatus;
private Integer approverattr;
private List<DetailsBean> details;
@Getter
@Setter
public static class DetailsBean {
/**
* approver : {"userid":"WuJunJie"}
* speech :
* sp_status : 1
* sptime : 0
* media_id : []
*/
private ApproverBean approver;
private String speech;
@JsonProperty(value = "sp_status")
private Integer spStatus;
private Long sptime;
@JsonProperty(value = "media_id")
private List<?> mediaId;
@Getter
@Setter
public static class ApproverBean {
/**
* userid : WuJunJie
*/
private String userid;
}
}
}
@Getter
@Setter
public static class NotifyerBean {
/**
* userid : LiuXiaoGang
*/
private String userid;
}
@Getter
@Setter
public static class CommentsBean {
/**
* commentUserInfo : {"userid":"WuJunJie"}
* commenttime : 1569584111
* commentcontent : 这是备注信息
* commentid : 6741314136717778040
* media_id : ["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]
*/
private CommentUserInfoBean commentUserInfo;
@JsonProperty(value = "commenttime")
private Long commentTime;
@JsonProperty(value = "commentcontent")
private String commentContent;
@JsonProperty(value = "commentid")
private String commentId;
@JsonProperty(value = "media_id")
private List<String> mediaId;
@Getter
@Setter
public static class CommentUserInfoBean {
/**
* userid : WuJunJie
*/
private String userid;
}
}
}
}
3.ApprovalDetailQuery
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class ApprovalDetailQuery {
@JSONField(name = "sp_no")
private String spNo;
}
4.SpNoQuery
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class SpNoQuery {
private String starttime;
private String endtime;
private Integer cursor;
private Integer size;
}
5.WechatConfig
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "wechat")
@PropertySource("classpath:application.yml")
public class WechatConfig {
private String agentId;
private String secret;
private String accessTokenUrl;
private String spNoListUrl;
private String dataUrl;
}
6.在application.yml添加相关值配置
wechat:
agentId: 企业ID
secret: 审批id
accessTokenUrl:获取tokenurl
spNoListUrl: 获取审批号
dataUrl: 审批数据
四:下面就是写mvc部分
1.实体类WeixinApproval
@Getter
@Setter
@ToString
@TableName(value = "weixin_approval")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WeixinApproval extends BaseBean {
/**
* 审批编号
*/
@NotNull(message = "审批编号不能为空")
@ApiModelProperty(value = "审批编号", name = "SpNo", dataType = "String")
private String spNo;
/**
* 版本名称
*/
@ApiModelProperty(value = "版本名称", name = "spName", dataType = "String")
private String spName;
/**
* 加入时间
*/
@ApiModelProperty(value = "加入时间", name = "applyTime", dataType = "Date")
private LocalDateTime applyTime;
/**
* 用户userId
*/
@ApiModelProperty(value = "用户userId", name = "userId", dataType = "String")
private String userId;
/**
* 审批金额
*/
@ApiModelProperty(value = "审批金额", name = "newMoney", dataType = "Double")
private Double newMoney;
/**
* 审批类型
*/
@ApiModelProperty(value = "审批类型", name = "costType", dataType = "String")
private String costType;
/**
* 审批状态
*/
@ApiModelProperty(value = "审批状态", name = "spStatus", dataType = "Integer")
private Integer spStatus;
}
2.WeixinApprovalMapper
import java.util.List;
public interface WeixinApprovalMapper extends BaseMapper<WeixinApproval> {
@Select("SELECT * from weixin_approval wt WHERE wt.sp_status= 2")
List<WeixinApproval> WeixinApprovalAdopt();
}
3.WeixinApprovalService
import java.util.List;
public interface WeixinApprovalService extends BaseService<WeixinApproval> {
void fetchData();
List<WeixinApproval> WeixinApprovalAdopt();
}
4.WeixinApprovalServiceImpl
@Service
@Slf4j
@AllArgsConstructor
public class WeixinApprovalServiceImpl extends BaseServiceImpl<WeixinApprovalMapper, WeixinApproval> implements WeixinApprovalService {
private final RestTemplate restTemplate;
private final WechatConfig wechatConfig;
@Override
public void fetchData() {
//1.获取AccessToken
AccessTokenDTO accessTokenDTO = restTemplate.getForObject(wechatConfig.getAccessTokenUrl() + "?corpid=" + wechatConfig.getAgentId() + "&corpsecret=" + wechatConfig.getSecret() + "", AccessTokenDTO.class);
log.info("AccessTokenDTO:{}", accessTokenDTO);
if (null == accessTokenDTO || 0 != accessTokenDTO.getErrcode()) {
log.warn("获取accessToken异常,返回状态码:{}", accessTokenDTO);
return;
}
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
//2.获取审批单号, 需对审批单号进行过滤,库中已存在的,则无需再获取
LocalDateTime startTime = LocalDateTime.of(2020, 3, 20, 0, 0, 0);
LocalDateTime endTime = LocalDateTime.of(2020, 3, 25, 23, 59, 59);
HttpEntity<Object> spDataEntity = new HttpEntity<>(JSON.toJSON(new SpNoQuery(LocalDateUtils.getSecondsByTime(startTime) + "", LocalDateUtils.getSecondsByTime(endTime) + "", 0, 100)), headers);
SpDataListDTO spDataList = restTemplate.postForObject(wechatConfig.getSpNoListUrl() + "?access_token=" + accessTokenDTO.getAccessToken(), spDataEntity, SpDataListDTO.class);
if (spDataList == null || 0 != spDataList.getErrcode() || null == spDataList.getSpNoList() || spDataList.getSpNoList().isEmpty()) {
log.warn("获取审批单号异常,返回状态码:{}", spDataList);
return;
}
//3.根据审批单号获取审批详情数据
HttpEntity<Object> dataFormEntity;
ApprovalDetailDTO approvalDetailDTO;
for (String spNo : spDataList.getSpNoList()) {
dataFormEntity = new HttpEntity<>(JSON.toJSON(new ApprovalDetailQuery(spNo)), headers);
approvalDetailDTO = restTemplate.postForObject(wechatConfig.getDataUrl() + "?access_token=" + accessTokenDTO.getAccessToken() + "", dataFormEntity, ApprovalDetailDTO.class);
if (null == approvalDetailDTO || 0 != approvalDetailDTO.getErrcode()) {
log.warn("获取审批详情数据异常,返回状态码:{}", approvalDetailDTO);
return;
}
WeixinApproval existBean = getOne(Wrappers.<WeixinApproval>lambdaQuery().eq(WeixinApproval::getSpNo, approvalDetailDTO.getInfo().getSpNo()));
WeixinApproval weixinApproval = WeixinApproval.builder()
.spName(approvalDetailDTO.getInfo().getSpName())
.spNo(approvalDetailDTO.getInfo().getSpNo())
.applyTime(LocalDateTime.ofEpochSecond(approvalDetailDTO.getInfo().getApplyTime(),0, ZoneOffset.ofHours(8)))
.spStatus(approvalDetailDTO.getInfo().getSpStatus())
.userId(approvalDetailDTO.getInfo().getApplyer().getUserid())
.build();
List<ApprovalDetailDTO.InfoBean.ApplyDataBean.ContentsBean> contents = approvalDetailDTO.getInfo().getApplyData().getContents();
//设置费用类型
contents.stream().filter(item -> "Selector".equals(item.getControl())).findFirst().ifPresent(item -> weixinApproval.setCostType(item.getValue().getSelector().getOptions().get(0).getValue().get(0).getText()));
//设置金额
contents.stream().filter(item -> "Money".equals(item.getControl())).findFirst().ifPresent(item -> weixinApproval.setNewMoney(item.getValue().getNewMoney()));
if (null == existBean) {
existBean = weixinApproval;
} else {
existBean.setNewMoney(weixinApproval.getNewMoney());
existBean.setCostType(weixinApproval.getCostType());
existBean.setApplyTime(weixinApproval.getApplyTime());
existBean.setSpName(weixinApproval.getSpName());
existBean.setSpNo(weixinApproval.getSpNo());
existBean.setUserId(weixinApproval.getUserId());
existBean.setSpStatus(weixinApproval.getSpStatus());
}
saveOrUpdate(existBean);
}
}
@Override
public List<WeixinApproval> WeixinApprovalAdopt() {
return this.baseMapper.WeixinApprovalAdopt();
}
}
5.WeixinApprovalController
@RequestMapping("/weixin")
@RestController
@Api(tags = "企业微信测试")
@AllArgsConstructor
public class WeixinApprovalController {
private final WeixinApprovalService weixinApprovalService;
@GetMapping
public ResponseUtil<WeixinApproval> list() {
return ResponseUtil.responseSuccess(weixinApprovalService.list());
}
@GetMapping("/WeixinApprovalAdopt")
public ResponseUtil<WeixinApproval> WeixinApprovalAdopt(){
return ResponseUtil.responseSuccess(weixinApprovalService.WeixinApprovalAdopt());
}
}
写完之后,接着就是测试啦,启动项目后访问
总结:像企业微信开发,公众号开发都有提供API