|
@@ -0,0 +1,640 @@
|
|
|
+package com.xxh.cloud.frontend.custuser.web.controller;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.web.bind.annotation.GetMapping;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.alibaba.fastjson.TypeReference;
|
|
|
+import com.company.cloud.sdk.weixin.common.config.WxApiConfig;
|
|
|
+import com.company.cloud.sdk.weixin.common.utils.AesUtils;
|
|
|
+import com.company.cloud.sdk.weixin.common.utils.WxVerificationUtils;
|
|
|
+import com.company.cloud.sdk.weixin.common.utils.XmlUtils;
|
|
|
+import com.company.cloud.sdk.weixin.mp.WxMpMsgManageApi;
|
|
|
+import com.company.cloud.sdk.weixin.mp.WxMpUserManageApi;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.QRcodeWithParamsResp;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.msgmanage.ReceiveEventFullModel;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.usermanage.UserBasicInfoBatchReqModel;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.usermanage.UserBasicInfoBatchResp;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.usermanage.UserBasicInfoReqModel;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.usermanage.UserOpenidListModel;
|
|
|
+import com.company.cloud.sdk.weixin.mp.model.usermanage.UserOpenidListResp;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.HisApiHelper;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.config.SysProjectConfig;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.dto.WechatQrCodeDTO;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.model.HisAccessTokenModel;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.model.PatBindModel;
|
|
|
+import com.xxh.cloud.frontend.common.modules.his.model.PatInfoModel;
|
|
|
+import com.xxh.cloud.frontend.common.modules.modules.Result;
|
|
|
+import com.xxh.cloud.frontend.common.modules.util.IpWhite;
|
|
|
+import com.xxh.cloud.frontend.common.modules.weixin.ThirdWeixinAccessTokenService;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.http.HttpRequest;
|
|
|
+import cn.hutool.http.HttpUtil;
|
|
|
+import io.swagger.annotations.Api;
|
|
|
+import io.swagger.annotations.ApiOperation;
|
|
|
+import lombok.extern.log4j.Log4j2;
|
|
|
+
|
|
|
+@Log4j2
|
|
|
+@RestController
|
|
|
+@RequestMapping("/sys/healthy/wechat")
|
|
|
+@Api(tags = "微信相关")
|
|
|
+public class WechatController {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysProjectConfig sysProjectConfig;
|
|
|
+ @Autowired
|
|
|
+ private ThirdWeixinAccessTokenService thirdWeixinAccessTokenService;
|
|
|
+ @Autowired
|
|
|
+ private IpWhite ipWhite;
|
|
|
+
|
|
|
+ @Value("${wechat.mp.token}")
|
|
|
+ private String token;
|
|
|
+ @Value("${wechat.mp.encodingAesKey:}")
|
|
|
+ private String encodingAesKey;
|
|
|
+
|
|
|
+
|
|
|
+ // 事件处理url
|
|
|
+ @Value("${wechat.mp.eventDealUrl:}")
|
|
|
+ private String eventDealUrl;
|
|
|
+
|
|
|
+ // 开放平台事件处理url
|
|
|
+ @Value("${wechat.open.componentEventDealUrl:}")
|
|
|
+ private String componentEventDealUrl;
|
|
|
+
|
|
|
+ // 开放平台component_verify_ticket事件处理url
|
|
|
+ @Value("${wechat.open.componentVerifyTicketUrl:}")
|
|
|
+ private String componentVerifyTicketUrl;
|
|
|
+
|
|
|
+
|
|
|
+ // 生产带参数的二维码
|
|
|
+ // @PostMapping("/qrcodewithparams")
|
|
|
+ // @ApiOperation(value = "生成带参数的二维码", response = QRcodeWithParamsResp.class)
|
|
|
+ // public QRcodeWithParamsResp createQRCode(@RequestBody String params) {
|
|
|
+ // // ip白名单限制
|
|
|
+ // ipWhite.validatorIpWhite();
|
|
|
+
|
|
|
+ // log.info("/sys/healthy/wechat/msg/qrcodewithparams:params >>>>>> {}", params);
|
|
|
+
|
|
|
+ // // 获取accessToken
|
|
|
+ // String accessToken = "";
|
|
|
+ // if ("his".equals(sysProjectConfig.getAccess())) { //调用his获取
|
|
|
+ // log.info("从第三方获取acessToken >>>>>>>");
|
|
|
+ // Result<HisAccessTokenModel> resp = HisApiHelper.getAccessToken(sysProjectConfig);
|
|
|
+
|
|
|
+ // if (resp.getCode() != 0) {
|
|
|
+ // log.error("----获取AccessToken失败----");
|
|
|
+ // }
|
|
|
+ // accessToken = resp.getData().getAccToken();
|
|
|
+ // } else { //调用微信获取
|
|
|
+ // log.info("直接从微信获取acessToken >>>>>>>");
|
|
|
+ // WxApiConfig wxApiConfig = new WxApiConfig();
|
|
|
+ // wxApiConfig.setAppid(sysProjectConfig.getAppid());
|
|
|
+ // wxApiConfig.setSecret(sysProjectConfig.getSecret());
|
|
|
+ // accessToken = thirdWeixinAccessTokenService.getAccessToken(wxApiConfig);
|
|
|
+ // }
|
|
|
+ // log.info("获取accessToken >>>>>> {}", accessToken);
|
|
|
+
|
|
|
+ // // 请求二维码
|
|
|
+ // log.info("查询二维码参数 >>>>>> {}", params);
|
|
|
+ // QRcodeWithParamsResp resp = WxMpMsgManageApi.createQRCode(accessToken, params);
|
|
|
+ // log.info("返回的二维码数据 >>>>>> {}", JSON.toJSONString(resp));
|
|
|
+ // return resp;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 生产带参数的二维码
|
|
|
+ @PostMapping("/qrcodewithparams")
|
|
|
+ @ApiOperation(value = "生成带参数的二维码", response = QRcodeWithParamsResp.class)
|
|
|
+ public QRcodeWithParamsResp createQRCode(@RequestBody WechatQrCodeDTO params) {
|
|
|
+ // ip白名单限制
|
|
|
+ ipWhite.validatorIpWhite();
|
|
|
+
|
|
|
+ log.info("/sys/healthy/wechat/msg/qrcodewithparams:params >>>>>> {}", JSON.toJSONString(params));
|
|
|
+
|
|
|
+ // 请求二维码
|
|
|
+ QRcodeWithParamsResp resp = WxMpMsgManageApi.createQRCode(params.getAccessToken(), params.getQrcodeParams());
|
|
|
+ log.info("返回的二维码数据 >>>>>> {}", JSON.toJSONString(resp));
|
|
|
+ return resp;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证消息事件token,配置服务地址
|
|
|
+ @GetMapping("/passivemsg")
|
|
|
+ @ApiOperation(value = "被动回复消息验证", response = String.class)
|
|
|
+ public String passiveMsgToken(HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ String echostr = null;
|
|
|
+ try {
|
|
|
+ String signature = request.getParameter("signature");
|
|
|
+ if (StrUtil.isNotBlank(signature)) {
|
|
|
+ String timestamp = request.getParameter("timestamp");
|
|
|
+ String nonce = request.getParameter("nonce");
|
|
|
+ echostr = request.getParameter("echostr");
|
|
|
+ log.info("/sys/healthy/wechat/msg/passivemsg:params >>>>>> signature={}, echostr={}, timestamp={}, nonce={}", signature, echostr, timestamp, nonce);
|
|
|
+ if (WxVerificationUtils.checkSignature(token, signature, timestamp, nonce)) {
|
|
|
+ log.info("验证通过");
|
|
|
+ return echostr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("校验异常>>>>>> {}", e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ log.info("验证失败");
|
|
|
+ return "error";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取消息事件并回复消息
|
|
|
+ @PostMapping(value = "/passivemsg", produces = MediaType.APPLICATION_XML_VALUE)
|
|
|
+ @ApiOperation(value = "被动回复消息", response = String.class)
|
|
|
+ public String passiveMsg(HttpServletRequest request, HttpServletResponse response, @RequestBody String passiveReplyMsg) {
|
|
|
+ log.info("/sys/healthy/wechat/msg/passivemsg:passiveReplyMsg >>>>>> {}", passiveReplyMsg);
|
|
|
+
|
|
|
+ String msgSignature = request.getParameter("msg_signature");
|
|
|
+ String timestamp = request.getParameter("timestamp");
|
|
|
+ String nonce = request.getParameter("nonce");
|
|
|
+ log.info("url参数>>>>>> msgSignature={}, timestamp={}, nonce={}", msgSignature, timestamp, nonce);
|
|
|
+
|
|
|
+ // 数据解密
|
|
|
+ if (StrUtil.isNotBlank(encodingAesKey)) {
|
|
|
+ try {
|
|
|
+ passiveReplyMsg = AesUtils.decryptMsg(token, sysProjectConfig.getAppid(), encodingAesKey, passiveReplyMsg, msgSignature, timestamp, nonce);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("消息解密异常>>>>>> ", e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("解密后数据>>>>>>> {}", passiveReplyMsg);
|
|
|
+ // 数据字符串转对象
|
|
|
+ ReceiveEventFullModel receiveEventFullModel = (ReceiveEventFullModel) XmlUtils.convertXmlStrToObject(ReceiveEventFullModel.class, passiveReplyMsg);
|
|
|
+ log.info("字符串参数转对象>>>>>> {}", JSON.toJSONString(receiveEventFullModel));
|
|
|
+
|
|
|
+ String resp = null;
|
|
|
+
|
|
|
+ // 请求处理事件,并返回消息数据
|
|
|
+ try {
|
|
|
+ log.info("请求处理被动消息>>>>>> eventDealUrl={} : receiveEventFullModel={}", eventDealUrl, JSON.toJSONString(receiveEventFullModel));
|
|
|
+ // String replyMsgData = HttpUtil.post(eventDealUrl, JSON.toJSONString(receiveEventFullModel)); // 直接返回字符串有乱码问题
|
|
|
+ String replyMsgData = this.loopPostHttp(eventDealUrl, JSON.toJSONString(receiveEventFullModel), 0); // 直接返回字符串有乱码问题
|
|
|
+ log.info("接受处理过的被动消息<<<<<< receiveEventFullModel={}", JSON.toJSONString(replyMsgData));
|
|
|
+ Result<String> msgData = JSONObject.parseObject(replyMsgData, new TypeReference<Result<String>>(){});
|
|
|
+ resp = msgData.getData();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("请求处理事件异常");
|
|
|
+ e.printStackTrace();
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ log.info("返回数据>>>>>> resp={}", JSON.toJSONString(resp));
|
|
|
+
|
|
|
+ if (StrUtil.isBlank(resp)) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("返回数据>>>>>> resp={}", JSON.toJSONString(resp));
|
|
|
+
|
|
|
+ // 推送数据加密
|
|
|
+ if (StrUtil.isNotBlank(encodingAesKey)) {
|
|
|
+ try {
|
|
|
+ resp = AesUtils.encryptMsg(token, sysProjectConfig.getAppid(), encodingAesKey, resp);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("消息加密异常>>>>>> ", e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return resp;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 调用失败则暂停5秒重新请求,最多重调5次
|
|
|
+ private String loopPostHttp(String url, String body, Integer loopNum) {
|
|
|
+ try {
|
|
|
+ return HttpRequest.post(url).body(body).execute().body();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("POST调用异常: {} ", url);
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ // 最多循环5次
|
|
|
+ if (loopNum < 5) {
|
|
|
+ // 先暂停
|
|
|
+ log.info("休眠1000ms");
|
|
|
+ try {
|
|
|
+ Thread.sleep(1000);
|
|
|
+ } catch (InterruptedException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+ // 出现异常再次调用
|
|
|
+ return loopPostHttp(url, body, loopNum + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 拉取微信用户列表
|
|
|
+ @PostMapping("/pull/userInfo")
|
|
|
+ @ApiOperation(value = "拉取公众号关注用户信息", response = Void.class)
|
|
|
+ public void pullLUserInfo() {
|
|
|
+ // ip白名单限制
|
|
|
+ ipWhite.validatorIpWhite();
|
|
|
+
|
|
|
+ // 获取accessToken
|
|
|
+ String accessToken = "";
|
|
|
+ if ("his".equals(sysProjectConfig.getAccess())) { //调用his获取
|
|
|
+ log.info("从第三方获取acessToken >>>>>>>");
|
|
|
+ Result<HisAccessTokenModel> resp = HisApiHelper.getAccessToken(sysProjectConfig);
|
|
|
+
|
|
|
+ if (resp.getCode() != 0) {
|
|
|
+ log.error("----获取AccessToken失败----");
|
|
|
+ }
|
|
|
+ accessToken = resp.getData().getAccToken();
|
|
|
+ } else { //调用微信获取
|
|
|
+ log.info("直接从微信获取acessToken >>>>>>>");
|
|
|
+ WxApiConfig wxApiConfig = new WxApiConfig();
|
|
|
+ wxApiConfig.setAppid(sysProjectConfig.getAppid());
|
|
|
+ wxApiConfig.setSecret(sysProjectConfig.getSecret());
|
|
|
+ accessToken = thirdWeixinAccessTokenService.getAccessToken(wxApiConfig);
|
|
|
+ }
|
|
|
+ log.info("获取accessToken >>>>>> {}", accessToken);
|
|
|
+
|
|
|
+ queryOpenidList(accessToken, null); // TODO 指定要拉取的nextopenid
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询openid列表,并根据openid列表查询用户信息
|
|
|
+ private void queryOpenidList(String accessToken, String nextOpenid) {
|
|
|
+
|
|
|
+ UserOpenidListModel userOpenidListModel = new UserOpenidListModel();
|
|
|
+ userOpenidListModel.setAccess_token(accessToken);
|
|
|
+ if (StrUtil.isNotBlank(nextOpenid)) {
|
|
|
+ userOpenidListModel.setNext_openid(nextOpenid);
|
|
|
+ }
|
|
|
+ log.info("查询用户openid参数 >>>>>>");
|
|
|
+ UserOpenidListResp resp = null;
|
|
|
+ try {
|
|
|
+ resp = WxMpUserManageApi.listUserOpenid(userOpenidListModel);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 重新获取token再执行一次,以防因为token过期导致的问题
|
|
|
+ if ("his".equals(sysProjectConfig.getAccess())) { //调用his获取
|
|
|
+ log.info("从第三方获取acessToken >>>>>>>");
|
|
|
+ Result<HisAccessTokenModel> tokenResult = HisApiHelper.getAccessToken(sysProjectConfig);
|
|
|
+
|
|
|
+ if (tokenResult.getCode() != 0) {
|
|
|
+ log.error("----获取AccessToken失败----");
|
|
|
+ }
|
|
|
+ accessToken = tokenResult.getData().getAccToken();
|
|
|
+ } else { //调用微信获取
|
|
|
+ log.info("直接从微信获取acessToken >>>>>>>");
|
|
|
+ WxApiConfig wxApiConfig = new WxApiConfig();
|
|
|
+ wxApiConfig.setAppid(sysProjectConfig.getAppid());
|
|
|
+ wxApiConfig.setSecret(sysProjectConfig.getSecret());
|
|
|
+ accessToken = thirdWeixinAccessTokenService.getAccessToken(wxApiConfig);
|
|
|
+ }
|
|
|
+ log.info("重新获取accessToken >>>>>> {}", accessToken);
|
|
|
+
|
|
|
+ userOpenidListModel.setAccess_token(accessToken);
|
|
|
+ resp = WxMpUserManageApi.listUserOpenid(userOpenidListModel);
|
|
|
+ }
|
|
|
+ if (null == resp || null == resp.getData() || CollUtil.isEmpty(resp.getData().getOpenid())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("返回用户openid列表及最后openid数据 <<<<<< {} : {}", resp.getData().getOpenid().size(), resp.getNext_openid());
|
|
|
+
|
|
|
+ // 根据openid获取用户信息
|
|
|
+ queryUserInfo(accessToken, resp.getData().getOpenid());
|
|
|
+
|
|
|
+ queryOpenidList(accessToken, resp.getNext_openid());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据openid列表查询用户信息
|
|
|
+ private void queryUserInfo(String accessToken, List<String> openids) {
|
|
|
+ if (CollUtil.isEmpty(openids)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ int maxNum = Math.round(openids.size() / 100); // 最大循环次数
|
|
|
+ for (int i = 0; i < maxNum; i++) {
|
|
|
+ List<UserBasicInfoReqModel> userBasicInfoReqModels = new ArrayList<>();
|
|
|
+
|
|
|
+ int start = i * 100; // 每次循环的起始数据
|
|
|
+ int length = i == Math.round(openids.size() / 100) ? Math.round(openids.size() % 100) : 100; // 每次循环的数据个数,默认100,最后一次循环特殊处理
|
|
|
+ for (int j = start; j < (start + length); j++) {
|
|
|
+ UserBasicInfoReqModel userBasicInfoReqModel = new UserBasicInfoReqModel();
|
|
|
+ userBasicInfoReqModel.setOpenid(openids.get(j));
|
|
|
+ userBasicInfoReqModel.setLang("zh_CN");
|
|
|
+ userBasicInfoReqModels.add(userBasicInfoReqModel);
|
|
|
+ }
|
|
|
+
|
|
|
+ UserBasicInfoBatchReqModel userBasicInfoBatchReqModel = new UserBasicInfoBatchReqModel();
|
|
|
+ userBasicInfoBatchReqModel.setAccess_token(accessToken);
|
|
|
+ userBasicInfoBatchReqModel.setUser_list(userBasicInfoReqModels);
|
|
|
+ log.info("查询用户信息 >>>>>>");
|
|
|
+ UserBasicInfoBatchResp resp = null;
|
|
|
+ try {
|
|
|
+ resp = WxMpUserManageApi.batchGetUserInfo(userBasicInfoBatchReqModel);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 重新获取token再执行一次,以防因为token过期导致的问题
|
|
|
+ if ("his".equals(sysProjectConfig.getAccess())) { //调用his获取
|
|
|
+ log.info("从第三方获取acessToken >>>>>>>");
|
|
|
+ Result<HisAccessTokenModel> tokenResult = HisApiHelper.getAccessToken(sysProjectConfig);
|
|
|
+
|
|
|
+ if (tokenResult.getCode() != 0) {
|
|
|
+ log.error("----获取AccessToken失败----");
|
|
|
+ }
|
|
|
+ accessToken = tokenResult.getData().getAccToken();
|
|
|
+ } else { //调用微信获取
|
|
|
+ log.info("直接从微信获取acessToken >>>>>>>");
|
|
|
+ WxApiConfig wxApiConfig = new WxApiConfig();
|
|
|
+ wxApiConfig.setAppid(sysProjectConfig.getAppid());
|
|
|
+ wxApiConfig.setSecret(sysProjectConfig.getSecret());
|
|
|
+ accessToken = thirdWeixinAccessTokenService.getAccessToken(wxApiConfig);
|
|
|
+ }
|
|
|
+ log.info("重新获取accessToken >>>>>> {}", accessToken);
|
|
|
+
|
|
|
+ userBasicInfoBatchReqModel.setAccess_token(accessToken);
|
|
|
+ resp = WxMpUserManageApi.batchGetUserInfo(userBasicInfoBatchReqModel);
|
|
|
+ }
|
|
|
+ if (null == resp || CollectionUtil.isEmpty(resp.getUser_info_list())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ log.info("返回用户信息列表 <<<<<< {}", resp.getUser_info_list().size());
|
|
|
+
|
|
|
+ List<Map<String, String>> requestParams = new ArrayList<>();
|
|
|
+ resp.getUser_info_list().forEach(user -> {
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ map.put("openId", user.getOpenid());
|
|
|
+ map.put("unionId", user.getUnionid());
|
|
|
+ map.put("isSync", "N");
|
|
|
+ requestParams.add(map);
|
|
|
+ });
|
|
|
+
|
|
|
+ // TODO 调用health接口保存用户信息(openid与unionid)
|
|
|
+ try {
|
|
|
+ log.info("保存用户信息>>>>>> {}", JSON.toJSONString(requestParams));
|
|
|
+ HttpUtil.post("http://172.18.84.102:8080/api/wbmd3h/sys/healthy/wechat/saveWechatUserInfoBatch", JSON.toJSONString(requestParams));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("请求处理事件异常");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 注意:递归会导致栈溢出,可以改为while/for循环方式
|
|
|
+ @Deprecated
|
|
|
+ @PostMapping("/pull/userInfo/save")
|
|
|
+ @ApiOperation(value = "测试拉取微信用户及海鹚用户数据")
|
|
|
+ public void saveUserInfoBatch() {
|
|
|
+ // ip白名单限制
|
|
|
+ // ipWhite.validatorIpWhite();
|
|
|
+
|
|
|
+ // TODO 据观察,前960页没有数据,可以直接跳过
|
|
|
+ queryWechatUserInfo(960);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void queryWechatUserInfo(Integer page) {
|
|
|
+ // 调用health接口保存用户信息(openid与unionid)
|
|
|
+ List<Map<String, String>> data = this.queryWeixinUser(page, 0);
|
|
|
+ if (CollectionUtil.isEmpty(data)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Map<String, Object>> list = new ArrayList<>();
|
|
|
+ data.forEach(i -> {
|
|
|
+ String id = i.get("id");
|
|
|
+ String openId = i.get("openId");
|
|
|
+ String unionId = i.get("unionId");
|
|
|
+ if (StrUtil.isBlank(unionId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("unionId >>>>>> {}", unionId);
|
|
|
+ PatBindModel resp = HisApiHelper.getPatBind(sysProjectConfig, unionId);
|
|
|
+ if (resp.getCode() != 0 || CollUtil.isEmpty(resp.getData())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (PatInfoModel patInfo : resp.getData()) {
|
|
|
+ Map<String, Object> entity = new HashMap<>();
|
|
|
+ entity.put("wxUserId", id);
|
|
|
+ entity.put("wxOpenId", openId);
|
|
|
+ entity.put("wxUnionId", unionId);
|
|
|
+
|
|
|
+ entity.put("birthday", patInfo.getBirthday());
|
|
|
+ entity.put("patientId", patInfo.getPatientId());
|
|
|
+ entity.put("patientName", patInfo.getPatientName());
|
|
|
+ entity.put("patientMobile", patInfo.getPatientMobile());
|
|
|
+ entity.put("patientSex", patInfo.getPatientSex());
|
|
|
+ entity.put("idNo", patInfo.getIdNo());
|
|
|
+ entity.put("idType", patInfo.getIdType());
|
|
|
+ entity.put("patHisNo", patInfo.getPatHisNo());
|
|
|
+ entity.put("patCardNo", patInfo.getPatCardNo());
|
|
|
+ entity.put("patCardType", patInfo.getPatCardType());
|
|
|
+ entity.put("patCardTypeName", patInfo.getPatCardTypeName());
|
|
|
+ entity.put("isDefault", patInfo.getIsDefault());
|
|
|
+ entity.put("relationName", patInfo.getRelationName());
|
|
|
+ entity.put("relationType", patInfo.getRelationType());
|
|
|
+ entity.put("patientType", patInfo.getPatientType());
|
|
|
+ entity.put("patientTypeName", patInfo.getPatientTypeName());
|
|
|
+ entity.put("healthCardFlag", patInfo.getHealthCardFlag());
|
|
|
+ entity.put("extFields", patInfo.getExtFields());
|
|
|
+
|
|
|
+ list.add(entity);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ saveWeixinUser(list, 0);
|
|
|
+ } else {
|
|
|
+ page = page + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ queryWechatUserInfo(page); // 更新状态会使下一页查询的结果出现问题,所以只有当本页没有需要保存的数据更新才查询下一页,否则继续查询当前页,防止数据遗漏
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询需要同步的用户,出现异常再次调用
|
|
|
+ private List<Map<String, String>> queryWeixinUser(Integer page, Integer loopNum) {
|
|
|
+ // 调用health接口保存用户信息(openid与unionid)
|
|
|
+ List<Map<String, String>> data = null;
|
|
|
+ try {
|
|
|
+ Map<String, Integer> pageParams = new HashMap<>();
|
|
|
+ pageParams.put("page", page);
|
|
|
+ pageParams.put("rows", 100);
|
|
|
+
|
|
|
+ log.info("查询微信用户信息>>>>>> {}", JSON.toJSONString(pageParams));
|
|
|
+ String resp = HttpUtil.post("http://172.18.84.102:8080/api/wbmd3h/sys/healthy/wechat/queryWechatUserInfo", JSON.toJSONString(pageParams));
|
|
|
+ log.info("查询微信用户信息<<<<<< {}", resp);
|
|
|
+ data = JSONObject.parseObject(resp, new TypeReference<List<Map<String, String>>>(){});
|
|
|
+ if (CollUtil.isEmpty(data)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("请求处理事件异常");
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ // 最多循环5次
|
|
|
+ if (loopNum < 5) {
|
|
|
+ // 先暂停
|
|
|
+ log.info("休眠5000ms");
|
|
|
+ try {
|
|
|
+ Thread.sleep(5000);
|
|
|
+ } catch (InterruptedException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+ // 出现异常再次调用
|
|
|
+ data = queryWeixinUser(page, loopNum + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存需要同步的用户,出现异常再次调用
|
|
|
+ private void saveWeixinUser(List<Map<String, Object>> list, Integer loopNum) {
|
|
|
+ try {
|
|
|
+ log.info("保存用户信息>>>>>> {}", JSON.toJSONString(list));
|
|
|
+ HttpUtil.post("http://172.18.84.102:8080/api/wbmd3h/sys/healthy/wechat/saveUserInfoBatch", JSON.toJSONString(list));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("请求处理事件异常");
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ // 最多循环5次
|
|
|
+ if (loopNum < 5) {
|
|
|
+ // 先暂停
|
|
|
+ log.info("休眠5000ms");
|
|
|
+ try {
|
|
|
+ Thread.sleep(5000);
|
|
|
+ } catch (InterruptedException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+ // 出现异常再次调用
|
|
|
+ saveWeixinUser(list, loopNum + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @PostMapping("/pull/userInfo/saveBatch")
|
|
|
+ @ApiOperation(value = "测试拉取微信用户及海鹚用户数据")
|
|
|
+ public void syncSaveUserInfoBatch() {
|
|
|
+ // ip白名单限制
|
|
|
+ // ipWhite.validatorIpWhite();
|
|
|
+
|
|
|
+ int page = 0;
|
|
|
+ while (true) {
|
|
|
+ if (page == -1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ page = queryWechatUserInfo2(page);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer queryWechatUserInfo2(int page) {
|
|
|
+ // 调用health接口保存用户信息(openid与unionid)
|
|
|
+ List<Map<String, String>> data = this.queryWeixinUser(page, 0);
|
|
|
+ if (CollectionUtil.isEmpty(data)) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> wxUserList = new ArrayList<>(); // 用于更新已同步状态
|
|
|
+ List<Map<String, Object>> list = new ArrayList<>(); // 保存同步数据
|
|
|
+ data.forEach(i -> {
|
|
|
+ String id = i.get("id");
|
|
|
+
|
|
|
+ wxUserList.add(id);
|
|
|
+
|
|
|
+ String openId = i.get("openId");
|
|
|
+ String unionId = i.get("unionId");
|
|
|
+
|
|
|
+ if (StrUtil.isBlank(unionId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("unionId >>>>>> {}", unionId);
|
|
|
+ PatBindModel resp = HisApiHelper.getPatBind(sysProjectConfig, unionId);
|
|
|
+ if (resp.getCode() != 0 || CollUtil.isEmpty(resp.getData())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (PatInfoModel patInfo : resp.getData()) {
|
|
|
+ Map<String, Object> entity = new HashMap<>();
|
|
|
+ entity.put("wxUserId", id);
|
|
|
+ entity.put("wxOpenId", openId);
|
|
|
+ entity.put("wxUnionId", unionId);
|
|
|
+
|
|
|
+ entity.put("birthday", patInfo.getBirthday());
|
|
|
+ entity.put("patientId", patInfo.getPatientId());
|
|
|
+ entity.put("patientName", patInfo.getPatientName());
|
|
|
+ entity.put("patientMobile", patInfo.getPatientMobile());
|
|
|
+ entity.put("patientSex", patInfo.getPatientSex());
|
|
|
+ entity.put("idNo", patInfo.getIdNo());
|
|
|
+ entity.put("idType", patInfo.getIdType());
|
|
|
+ entity.put("patHisNo", patInfo.getPatHisNo());
|
|
|
+ entity.put("patCardNo", patInfo.getPatCardNo());
|
|
|
+ entity.put("patCardType", patInfo.getPatCardType());
|
|
|
+ entity.put("patCardTypeName", patInfo.getPatCardTypeName());
|
|
|
+ entity.put("isDefault", patInfo.getIsDefault());
|
|
|
+ entity.put("relationName", patInfo.getRelationName());
|
|
|
+ entity.put("relationType", patInfo.getRelationType());
|
|
|
+ entity.put("patientType", patInfo.getPatientType());
|
|
|
+ entity.put("patientTypeName", patInfo.getPatientTypeName());
|
|
|
+ entity.put("healthCardFlag", patInfo.getHealthCardFlag());
|
|
|
+ entity.put("extFields", patInfo.getExtFields());
|
|
|
+
|
|
|
+ list.add(entity);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ saveWeixinUser2(wxUserList, list, 0);
|
|
|
+ } else {
|
|
|
+ page = page + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return page; // 更新状态会使下一页查询的结果出现问题,所以只有当本页没有需要保存的数据更新才查询下一页,否则继续查询当前页,防止数据遗漏
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存需要同步的用户,出现异常再次调用
|
|
|
+ private void saveWeixinUser2(List<String> wxUserList, List<Map<String, Object>> list, Integer loopNum) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("updateList", wxUserList);
|
|
|
+ map.put("saveList", list);
|
|
|
+ log.info("保存用户信息>>>>>> {}", JSON.toJSONString(map));
|
|
|
+ HttpUtil.post("http://172.18.84.102:8080/api/wbmd3h/sys/healthy/wechat/saveUserInfoBatch2", JSON.toJSONString(map));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("请求处理事件异常");
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ // 最多循环5次
|
|
|
+ if (loopNum < 5) {
|
|
|
+ // 先暂停
|
|
|
+ log.info("休眠5000ms");
|
|
|
+ try {
|
|
|
+ Thread.sleep(5000);
|
|
|
+ } catch (InterruptedException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+ // 出现异常再次调用
|
|
|
+ saveWeixinUser2(wxUserList, list, loopNum + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|