springboot2.1:获取企业微信的审批数据

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 

发布了237 篇原创文章 · 获赞 235 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/LRXmrlirixing/article/details/105097407
今日推荐