BakMember.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package com.chkj.pdata.task;
  2. import com.chkj.pdata.entity.AccessToken;
  3. import com.chkj.pdata.entity.MemReturnFromWeixin;
  4. import com.chkj.pdata.util.DBUtils;
  5. import com.chkj.pdata.util.FileUtil;
  6. import com.chkj.pdata.util.HttpRequestUtils;
  7. import com.fasterxml.jackson.core.JsonProcessingException;
  8. import com.fasterxml.jackson.databind.ObjectMapper;
  9. import org.springframework.http.ResponseEntity;
  10. import java.sql.Connection;
  11. import java.sql.PreparedStatement;
  12. import java.sql.ResultSet;
  13. import java.sql.SQLException;
  14. import java.util.HashMap;
  15. import java.util.LinkedList;
  16. import java.util.List;
  17. import java.util.Map;
  18. public class BakMember {
  19. final String BaseURL = "https://open.wecard.qq.com/cgi-bin/";
  20. FileUtil myWriter = new FileUtil();
  21. /**
  22. * 成员备份任务
  23. */
  24. public void member_bak_task() {
  25. Map<String, Object> map;
  26. List<String> card_numbers = new LinkedList<>();
  27. // 查询没有推送的记录
  28. String selectSql = "SELECT `学工号` as card_number_cy FROM `成员列表` WHERE `手机(完整手机号仅限超级管理员导出)` LIKE '%**%'" +
  29. " OR `证件号码(完整证件号码仅限超级管理员导出)` LIKE '%******%' LIMIT 1000";
  30. // String selectSql = "SELECT `学工号` as card_number_cy FROM `成员列表` WHERE `更新手机和身份证状态`=0 LIMIT 1000";
  31. // 返回查询的成员列表
  32. map = DBUtils.getAll(selectSql);
  33. ResultSet rs = (ResultSet) map.get("rs");
  34. PreparedStatement stmt = (PreparedStatement) map.get("stmt");
  35. Connection conn = (Connection) map.get("conn");
  36. try {
  37. while (rs.next()) {
  38. card_numbers.add(rs.getString("card_number_cy"));
  39. }
  40. if (card_numbers.size() > 0) {
  41. // 获取 access_token
  42. String access_token = getAccessToken();
  43. if (!"".equals(access_token)) {
  44. // 推送成员信息
  45. pullChengyuan(card_numbers, access_token);
  46. } else {
  47. myWriter.writeToFile("查询【成员列表】获取 access_token 失败!", "abnormal");
  48. }
  49. } else {
  50. System.out.println("1");
  51. // myWriter.writeToFile("没有要更新的 手机 和 身份证 的记录!", "bak");
  52. }
  53. } catch (SQLException e) {
  54. e.printStackTrace();
  55. } catch (JsonProcessingException e) {
  56. throw new RuntimeException(e);
  57. } finally {
  58. DBUtils.closeResultSet(rs);
  59. DBUtils.closeStatement(stmt);
  60. DBUtils.closeConnection(conn);
  61. }
  62. }
  63. /**
  64. * 获取 access_token
  65. *
  66. * @return 返回 access_token
  67. * @throws JsonProcessingException 异常
  68. */
  69. public String getAccessToken() throws JsonProcessingException {
  70. // 获取 access_token 接口
  71. final String URL = BaseURL + "oauth2/token";
  72. // 查询参数
  73. Map<String, String> queryParams = new HashMap<>();
  74. // 请求参数
  75. Map<String, String> requestBody = new HashMap<>();
  76. requestBody.put("app_key", "505888BB58CE4DF0");
  77. requestBody.put("app_secret", "6102F58C83240854331AF196861E6E5F");
  78. requestBody.put("grant_type", "client_credentials");
  79. requestBody.put("scope", "base");
  80. requestBody.put("ocode", "1015730314");
  81. // 携带参数访问接口
  82. ResponseEntity<String> stringResponseEntity = HttpRequestUtils.httpPost(URL, requestBody, queryParams);
  83. // 判断是否返回null
  84. if (stringResponseEntity == null) {
  85. return "";
  86. }
  87. // String token_type = "";
  88. String access_token;
  89. // String ocode = null;
  90. // int expires_in = 0;
  91. String body = stringResponseEntity.getBody();
  92. String code = stringResponseEntity.getStatusCode().toString();
  93. ObjectMapper objectMapper = new ObjectMapper(); // 创建ObjectMapper对象
  94. AccessToken accessToken = objectMapper.readValue(body, AccessToken.class); // 将JSON字符串转换成User对象
  95. if (code.contains("200") && code.contains("OK")) {
  96. // token_type = accessToken.getToken_type();
  97. access_token = accessToken.getAccess_token();
  98. // ocode = accessToken.getOcode();
  99. // expires_in = accessToken.getExpires_in();
  100. } else {
  101. access_token = "";
  102. myWriter.writeToFile("错误状态码," + code.split(" ")[0], "");
  103. myWriter.writeToFile("错误信息," + body, "");
  104. }
  105. // 返回access_token
  106. return access_token;
  107. }
  108. /**
  109. * 拉取成员
  110. *
  111. * @param card_numbers 成员列表
  112. * @param access_token access_token
  113. */
  114. private void pullChengyuan(List<String> card_numbers, String access_token) {
  115. // 查询参数
  116. Map<String, String> queryParams = new HashMap<>();
  117. // 请求参数
  118. Map<String, List<String>> requestBody = new HashMap<>();
  119. requestBody.put("card_numbers", card_numbers);
  120. // 创建用户接口
  121. final String URL = BaseURL + "user/get-user-by-card-numbers?access_token=" + access_token;
  122. // 调用批量获取成员接口
  123. ResponseEntity<String> stringResponseEntity = HttpRequestUtils.httpPost(URL, requestBody, queryParams);
  124. // 判断是否返回null
  125. if (stringResponseEntity == null) {
  126. return;
  127. }
  128. // 获取响应体
  129. String body = stringResponseEntity.getBody();
  130. // 获取响应码
  131. String code = stringResponseEntity.getStatusCode().toString();
  132. // 判断响应码是否是成功
  133. if (code.contains("200") && code.contains("OK")) {
  134. try {
  135. ObjectMapper objectMapper = new ObjectMapper(); // 创建ObjectMapper对象
  136. MemReturnFromWeixin memReturnFromWeixin = objectMapper.readValue(body, MemReturnFromWeixin.class);
  137. // 如果用户信息列表数组长度不等于0,说明有该成员信息
  138. if (memReturnFromWeixin.getUserlist().length != 0) {
  139. for (int i = 0; i < memReturnFromWeixin.getUserlist().length; i++) {
  140. String objectString = memReturnFromWeixin.getUserlist()[i].toString();
  141. String[] arr = objectString.substring(1, objectString.length() - 1).split(", ");
  142. String card_number = "", name = "", id_card = "", telephone = "";
  143. for (String s : arr) {
  144. String[] split = s.split("=");
  145. if (split[0].equals("card_number")) {
  146. if (split.length > 1)
  147. card_number = split[1];
  148. }
  149. if (split[0].equals("name")) {
  150. if (split.length > 1)
  151. name = split[1];
  152. }
  153. if (split[0].equals("id_card")) {
  154. if (split.length > 1)
  155. id_card = split[1];
  156. }
  157. if (split[0].equals("telephone")) {
  158. if (split.length > 1)
  159. telephone = split[1];
  160. }
  161. }
  162. if (card_number.isEmpty() || name.isEmpty()) {
  163. System.out.println("学工号 或 姓名 为空!");
  164. } else {
  165. String condition = "";
  166. if (!"".equals(id_card))
  167. condition += "`证件号码(完整证件号码仅限超级管理员导出)`='" + id_card + "',";
  168. if (!"".equals(telephone))
  169. condition += "`手机(完整手机号仅限超级管理员导出)`='" + telephone + "',";
  170. condition += "`更新手机和身份证状态`=" + 1 + ",";
  171. String update_sql = "UPDATE `成员列表` SET " + condition.substring(0, condition.length() - 1)
  172. + " WHERE `学工号` like '%" + card_number + "%' AND `姓名` like '%" + name + "%'";
  173. int num = DBUtils.update(update_sql);
  174. if (num > 0) {
  175. myWriter.writeToFile(card_number + " " + name + "身份证和手机 更新成功!", "bak");
  176. } else {
  177. myWriter.writeToFile(card_number + " " + name + "身份证和手机 更新失败!", "bak");
  178. }
  179. }
  180. }
  181. }
  182. } catch (JsonProcessingException e) {
  183. System.out.println(e.getMessage());
  184. }
  185. }
  186. }
  187. }