|
|
@@ -0,0 +1,587 @@
|
|
|
+package com.chkj.pdata.task;
|
|
|
+
|
|
|
+import com.chkj.pdata.entity.MemReturnFromWeixin;
|
|
|
+import com.chkj.pdata.entity.MemberEntity;
|
|
|
+import com.chkj.pdata.util.DBUtils;
|
|
|
+import com.chkj.pdata.util.FileUtil;
|
|
|
+import com.chkj.pdata.util.HttpRequestUtils;
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import org.json.JSONArray;
|
|
|
+import org.json.JSONObject;
|
|
|
+import org.springframework.http.HttpEntity;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
+
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.FileReader;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+public class PushMember {
|
|
|
+
|
|
|
+ final String BaseURL = "https://open.wecard.qq.com/cgi-bin/";
|
|
|
+
|
|
|
+ FileUtil myWriter = new FileUtil();
|
|
|
+ BakMember bakMember = new BakMember();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推送成员任务
|
|
|
+ */
|
|
|
+ public void pushMember_task() {
|
|
|
+ // 推送任务
|
|
|
+ try {
|
|
|
+ // 获取没有推送的记录
|
|
|
+ List<MemberEntity> members = getMembers();
|
|
|
+ if (members.size() > 0) {
|
|
|
+ // 获取 access_token
|
|
|
+ String access_token = bakMember.getAccessToken();
|
|
|
+
|
|
|
+ if (!"".equals(access_token)) {
|
|
|
+ // 推送成员信息
|
|
|
+ pushMember(members, access_token);
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("推送【member】获取 access_token 失败!", "abnormal");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!myWriter.readFromFile("none"))
|
|
|
+ myWriter.writeToFile("没有要推送的记录!", "none");
|
|
|
+ }
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ myWriter.writeToFile(e.getMessage(), "abnormal");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询表,找出没有推送的记录
|
|
|
+ *
|
|
|
+ * @return 成员记录集
|
|
|
+ */
|
|
|
+ private List<MemberEntity> getMembers() {
|
|
|
+ // 查询没有推送的记录
|
|
|
+ String selectSql = "SELECT * FROM member where m_status = 0 limit 100";
|
|
|
+ // 返回查询的成员列表
|
|
|
+ return DBUtils.queryAll(selectSql);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取csv文件,获取card_number
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<String> readCsv() {
|
|
|
+ // 读取文件
|
|
|
+ String csvFile = "2023-06-28-ok-log.csv";
|
|
|
+ String line;
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ BufferedReader br = null;
|
|
|
+ try {
|
|
|
+ br = new BufferedReader(new FileReader(csvFile));
|
|
|
+ br.readLine();
|
|
|
+ while ((line = br.readLine()) != null) {
|
|
|
+ list.add(line.split(",")[2]);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (br != null) {
|
|
|
+ try {
|
|
|
+ br.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除用户信息
|
|
|
+ */
|
|
|
+ public void delMembers() {
|
|
|
+ try {
|
|
|
+ // 批量删除成员接口
|
|
|
+ final String URL = BaseURL + "user/manage/batch-delete";
|
|
|
+ // 获取 access_token
|
|
|
+ String access_token = bakMember.getAccessToken();
|
|
|
+
|
|
|
+ // 获取card_numbers
|
|
|
+ List<String> cardNumbers = readCsv();
|
|
|
+
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
|
|
|
+ headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
|
|
|
+ JSONArray jsonArray = new JSONArray(cardNumbers);
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ jsonObject.put("card_numbers", jsonArray);
|
|
|
+ HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), headers);
|
|
|
+ ResponseEntity<String> response = restTemplate.postForEntity(URL + "?access_token=" + access_token, request, String.class);
|
|
|
+ System.out.println(response.getBody());
|
|
|
+ // 写入日志文件
|
|
|
+ myWriter.writeToFile(response.toString(), "delMember");
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ myWriter.writeToFile(e.getMessage(), "abnormal");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推送用户信息
|
|
|
+ *
|
|
|
+ * @param members 成员列表
|
|
|
+ * @param access_token access_token
|
|
|
+ * @throws JsonProcessingException 异常
|
|
|
+ */
|
|
|
+ private void pushMember(List<MemberEntity> members, String access_token) throws JsonProcessingException {
|
|
|
+ // 创建用户接口
|
|
|
+ final String URL = BaseURL + "user/manage/create?access_token=" + access_token;
|
|
|
+ // 用户信息主动推送同步
|
|
|
+// final String URL = BaseURL + "user/manage/sync-user-info?access_token" + access_token;
|
|
|
+ // 循环每个成员,检查成员是否存在
|
|
|
+ for (MemberEntity member : members) {
|
|
|
+ // 学工号 或 姓名 为空,则不处理
|
|
|
+ if (member.getMcardNumber() == null || member.getMname() == null || member.getMidCard() == null) {
|
|
|
+ setLocalTable("该【学工号】或【姓名】或【身份证号】为空", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (member.getMcardNumber().equals(member.getMidCard())) {
|
|
|
+ setLocalTable("【姓名】和【身份证号】相同", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append("该成员");
|
|
|
+ boolean bool = checkMember(member, access_token, "card_number") && checkMember(member, access_token, "id_card");
|
|
|
+ if (bool) {
|
|
|
+ sb.append("【学工号】或【身份证号】");
|
|
|
+ }
|
|
|
+ sb.append("微校不存在,");
|
|
|
+
|
|
|
+ // 不存在该成员,则推送
|
|
|
+ if (bool) {
|
|
|
+ myWriter.writeToFile(sb + member.getMcardNumber(), "abnormal");
|
|
|
+ // 查询参数
|
|
|
+ Map<String, String> queryParams = new HashMap<>();
|
|
|
+ // 请求参数
|
|
|
+ Map<String, String> requestBody = new HashMap<>();
|
|
|
+ // 学工号
|
|
|
+ String cardNumber = member.getMcardNumber();
|
|
|
+ // 如果是数字开头的
|
|
|
+ if (Character.isDigit(cardNumber.charAt(0))) {
|
|
|
+ // 如果是学生,14位学号,取前4位,则为年份,2021级之后学工号用身份证号填充
|
|
|
+ if (cardNumber.length() == 14) {
|
|
|
+ if (Integer.parseInt(cardNumber.substring(0, 4)) >= 2021) {
|
|
|
+ // 2021级及之后的学生,用【身份证号】作为【学工号】
|
|
|
+ requestBody.put("card_number", member.getMidCard());
|
|
|
+ } else {
|
|
|
+ // 2021级之前的学生,用【学号】为【学工号】
|
|
|
+ requestBody.put("card_number", member.getMcardNumber());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 教职工,【工号】作为【学工号】
|
|
|
+ requestBody.put("card_number", member.getMcardNumber());
|
|
|
+ }
|
|
|
+ } else if (Character.isLetter(cardNumber.charAt(0))) {
|
|
|
+ // 如果是字母开头的,教职工(外聘等),【工号】作为【学工号】
|
|
|
+ requestBody.put("card_number", member.getMcardNumber());
|
|
|
+ } else {
|
|
|
+ // 既不是数字开头,也不是字母开头,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学工号特殊,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 编号 serial_number
|
|
|
+ requestBody.put("serial_number", requestBody.get("card_number"));
|
|
|
+ // 姓名
|
|
|
+ requestBody.put("name", member.getMname());
|
|
|
+ // 年级
|
|
|
+ if (member.getMgrade() != null) requestBody.put("grade", member.getMgrade());
|
|
|
+ // 学院名称
|
|
|
+ String college = member.getMcollege();
|
|
|
+ if (college != null) requestBody.put("college", college);
|
|
|
+ // 系的名称(学校数据库推送的数据中没有系,但对应微校的是专业,所有忽略)
|
|
|
+// if (member.getMprofession() != null) {
|
|
|
+// requestBody.put("profession", member.getMprofession());
|
|
|
+// }
|
|
|
+ // 班级
|
|
|
+ if (member.getMclass() != null) requestBody.put("class", member.getMclass());
|
|
|
+ // 身份类型
|
|
|
+ String identityType = member.getMidentityType();
|
|
|
+ if (identityType != null) {
|
|
|
+ if ("1".equals(identityType)) requestBody.put("identity_type", "学生");
|
|
|
+ else if ("2".equals(identityType)) requestBody.put("identity_type", "教职工");
|
|
|
+ else {
|
|
|
+ // 既不是1,也不是2,记录到日志,待人工处理
|
|
|
+ setLocalTable("该身份既不是1,也不是2,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该身份为【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 组织架构:根据身份类型判断如下
|
|
|
+ // 1 学生:南昌交通学院/学生/学院/年级/专业/班级
|
|
|
+ // 2 教职工:南昌交通学院/教职工/所在部门
|
|
|
+ StringBuilder org = new StringBuilder();
|
|
|
+ org.append("南昌交通学院");
|
|
|
+ if ("1".equals(identityType)) { // 学生
|
|
|
+ if (member.getMinOutSchool() != null)
|
|
|
+ // 非 null, 1在校 0毕业
|
|
|
+ org.append("1".equals(member.getMinOutSchool()) ? "/学生" : "/校友");
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生在校/离校【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 学院,非空加上学院
|
|
|
+ if (college != null) org.append("/").append(college);
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生学院【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 年级,非空加上年级
|
|
|
+ if (member.getMgrade() != null) org.append("/").append(member.getMgrade());
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生年级【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 专业,非空加上专业
|
|
|
+ if (member.getMmajor() != null) {
|
|
|
+ org.append("/").append(member.getMmajor());
|
|
|
+ requestBody.put("profession", member.getMmajor());
|
|
|
+ } else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生专业【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 班级,非空加上班级
|
|
|
+ if (member.getMclass() != null) org.append("/").append(member.getMclass());
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生班级【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 设置组织结构
|
|
|
+ requestBody.put("organization", org.toString());
|
|
|
+ } else { // 教职工
|
|
|
+ if (member.getMinOutSchool() != null)
|
|
|
+ // 非 null, 1在职 0离线
|
|
|
+ if ("1".equals(member.getMinOutSchool())) org.append("/教职工");
|
|
|
+ else {
|
|
|
+ // 0,记录到日志,待人工处理
|
|
|
+ setLocalTable("该教职工【已离职】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该教职工在职/离职为【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 学院,非null 就加上学院,否则
|
|
|
+ if (college != null) org.append("/").append(college);
|
|
|
+ else {
|
|
|
+ // null,记录到日志,待人工处理
|
|
|
+ setLocalTable("该学生学院【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 设置组织结构
|
|
|
+ requestBody.put("organization", org.toString());
|
|
|
+ }
|
|
|
+ // 身份名称
|
|
|
+ if (member.getMidentityTitle() != null) {
|
|
|
+ requestBody.put("identity_title", member.getMidentityTitle());
|
|
|
+ } else {
|
|
|
+ // 班级以“(专)”结尾
|
|
|
+ if (member.getMclass() != null) if (member.getMclass().endsWith("(专)")) {
|
|
|
+ requestBody.put("school_period", "专科生");
|
|
|
+ } else if (member.getMeducational() != null) { // 学制,4-5年的是大专以上,也就是大学,其他不推此字段
|
|
|
+ if (Integer.parseInt(member.getMeducational()) >= 4) {
|
|
|
+ requestBody.put("school_period", "本科生");
|
|
|
+ } else if (Integer.parseInt(member.getMeducational()) <= 3) {
|
|
|
+ requestBody.put("school_period", "专科生");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 证件类型
|
|
|
+ if ("身份证".equals(member.getMcardType())) requestBody.put("card_type", "1");
|
|
|
+ else requestBody.put("card_type", member.getMcardType());
|
|
|
+ // 证件号
|
|
|
+ String idCard = member.getMidCard();
|
|
|
+ if (idCard != null) {
|
|
|
+ if (idCard.startsWith("0000000") || idCard.trim().length() != 18) {
|
|
|
+ // 非法证件号,记录到日志,待人工处理
|
|
|
+ setLocalTable("该证件号非法,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ requestBody.put("id_card", idCard);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 非法证件号,记录到日志,待人工处理
|
|
|
+ setLocalTable("该证件号【null】,需要人工进行判别,此处跳过", member);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 性别,1男 2女
|
|
|
+ String gender = member.getMgender();
|
|
|
+ if (gender != null) {
|
|
|
+ if ("1".equals(gender)) {
|
|
|
+ requestBody.put("gender", "男");
|
|
|
+ } else if ("2".equals(gender)) {
|
|
|
+ requestBody.put("gender", "女");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 根据身份证号判别性别
|
|
|
+ char genderCode = idCard.charAt(16); //获取第17位字符,下标从0开始
|
|
|
+ if (genderCode % 2 == 0) {
|
|
|
+ requestBody.put("gender", "女");
|
|
|
+ } else {
|
|
|
+ requestBody.put("gender", "男");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 国家
|
|
|
+ if (member.getMcountry() != null) requestBody.put("country", member.getMcountry());
|
|
|
+ else requestBody.put("country", "CHN");
|
|
|
+ // 员工正常
|
|
|
+ // requestBody.put("staff_status", "正常");
|
|
|
+ // 手机号不推送
|
|
|
+ // requestBody.put("telephone", members.get(0).getMtelephone());
|
|
|
+ // 校区
|
|
|
+ String building = member.getMbuilding();
|
|
|
+ int build = 0;
|
|
|
+ if (member.getMcampus() != null) {
|
|
|
+ requestBody.put("campus", member.getMcampus());
|
|
|
+ } else {
|
|
|
+ if (building != null) {
|
|
|
+ if (building.toLowerCase().startsWith("m")) {
|
|
|
+ build = Integer.parseInt(building.substring(1));
|
|
|
+ requestBody.put("campus", "墨轩湖校区");
|
|
|
+ } else {
|
|
|
+ build = Integer.parseInt(building);
|
|
|
+ requestBody.put("campus", "黄家湖校区");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 工作单位、宿舍号
|
|
|
+ // 如果是学生,14位学号也是学生
|
|
|
+ if ("1".equals(identityType) || (Character.isDigit(cardNumber.charAt(0)) && cardNumber.length() == 14)) { // 学生
|
|
|
+ // 工作单位
|
|
|
+ if (member.getMemployer() != null) requestBody.put("employer", member.getMemployer());
|
|
|
+ else requestBody.put("employer", "南昌交通学院");
|
|
|
+
|
|
|
+ // 宿舍号 = 楼栋 + 宿舍
|
|
|
+ StringBuilder drom = new StringBuilder();
|
|
|
+ if (building != null) drom.append(build).append("栋");
|
|
|
+ if (member.getMdormNumber() != null) drom.append(member.getMdormNumber());
|
|
|
+ if (!"".contentEquals(drom)) {
|
|
|
+ requestBody.put("dorm_number", drom.toString());
|
|
|
+ }
|
|
|
+ } else { // 教职工
|
|
|
+ // 工作单位
|
|
|
+ if (member.getMemployer() != null) requestBody.put("employer", member.getMemployer());
|
|
|
+ else requestBody.put("employer", college);
|
|
|
+ }
|
|
|
+ // 备注
|
|
|
+ StringBuilder remark = new StringBuilder();
|
|
|
+ remark.append(member.getMcardNumber());
|
|
|
+ if (member.getMremark() != null) remark.append("|").append(member.getMremark());
|
|
|
+ requestBody.put("remark", remark.toString());
|
|
|
+ // 物理芯片号
|
|
|
+ if (member.getMphysicalChipNumber() != null)
|
|
|
+ requestBody.put("physical_chip_number", member.getMphysicalChipNumber());
|
|
|
+ // 物理卡号
|
|
|
+ if (member.getMphysicalCardNumber() != null) {
|
|
|
+ requestBody.put("physical_card_number", member.getMphysicalCardNumber());
|
|
|
+ requestBody.put("physical_card_status", "正常");
|
|
|
+ }
|
|
|
+ // 邮箱
|
|
|
+ if (member.getMemail() != null) requestBody.put("email", member.getMemail());
|
|
|
+ // 有效时间
|
|
|
+ if (member.getMexpireAt() != null) requestBody.put("expire_at", String.valueOf(member.getMexpireAt()));
|
|
|
+ // qq
|
|
|
+ if (member.getMqq() != null) requestBody.put("qq", member.getMqq());
|
|
|
+ // 名族
|
|
|
+ if (member.getMnation() != null) requestBody.put("nation", member.getMnation());
|
|
|
+ // 户籍
|
|
|
+ if (member.getMoriginPlace() != null) requestBody.put("origin_place", member.getMoriginPlace());
|
|
|
+ // 毕业院校
|
|
|
+ if (member.getMgraduatedSchool() != null)
|
|
|
+ requestBody.put("graduated_school", member.getMgraduatedSchool());
|
|
|
+ // 住址
|
|
|
+ if (member.getMaddress() != null) requestBody.put("address", member.getMaddress());
|
|
|
+ // 学段
|
|
|
+ if (member.getMschoolPeriod() != null) {
|
|
|
+ requestBody.put("school_period", member.getMschoolPeriod());
|
|
|
+ } else {
|
|
|
+ // 学制,3-5年的是大专以上,也就是大学,其他不推此字段
|
|
|
+ if (member.getMeducational() != null) {
|
|
|
+ if (Integer.parseInt(member.getMeducational()) >= 3) {
|
|
|
+ requestBody.put("school_period", "大学");
|
|
|
+// } else {
|
|
|
+// requestBody.put("school_period", "高职");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 入学年份
|
|
|
+ if (member.getMregisterYear() != null) requestBody.put("register_year", member.getMregisterYear());
|
|
|
+ // ===============================================================================
|
|
|
+ // 调用创建用户接口,执行推送
|
|
|
+ ResponseEntity<String> stringResponseEntity = HttpRequestUtils.httpPost(URL, requestBody, queryParams);
|
|
|
+ System.out.println(stringResponseEntity);
|
|
|
+ // 判断是否返回null
|
|
|
+ if (stringResponseEntity == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 获取响应体
|
|
|
+ String body = stringResponseEntity.getBody();
|
|
|
+ // 获取响应码
|
|
|
+ String code = stringResponseEntity.getStatusCode().toString();
|
|
|
+ // 判断响应码是否是成功
|
|
|
+ if (code.contains("200") && code.contains("OK")) {
|
|
|
+ // 标记为2已推送
|
|
|
+ int updateCount = updateLocalTable(2, member);
|
|
|
+ if (updateCount > 0) {
|
|
|
+ if (cardNumber.length() == 14 && Integer.parseInt(cardNumber.substring(0, 4)) >= 2021) {
|
|
|
+ myWriter.writeToFile("成员推送成功," + member.getMidCard(), "ok");
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("成员推送成功," + cardNumber, "ok");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("成员推送失败," + member.getMcardNumber() + "|" + member.getMidCard(), "");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("错误状态码," + code.split(" ")[0], "");
|
|
|
+ myWriter.writeToFile("错误信息," + body, "");
|
|
|
+ }
|
|
|
+ } else { // 存在该成员
|
|
|
+ // 标记为1已存在
|
|
|
+ int updateCount = updateLocalTable(1, member);
|
|
|
+ if (updateCount > 0) {
|
|
|
+ myWriter.writeToFile("成员已存在,m_status已标记为1,m_status_time为标记时间,以后不再推送," + member.getMcardNumber() + "|"
|
|
|
+ + member.getMname() + "|" + member.getMidCard(), "");
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("成员已存在,m_status 和 m_status_time标记失败," + member.getMcardNumber() + "|"
|
|
|
+ + member.getMname() + "|" + member.getMidCard(), "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新本地数据表
|
|
|
+ *
|
|
|
+ * @param status 状态
|
|
|
+ * @param member 成员
|
|
|
+ * @return 返回值
|
|
|
+ */
|
|
|
+ private int updateLocalTable(int status, MemberEntity member) {
|
|
|
+ // m_status:0未确认,1已存在,2已推送 3有异常
|
|
|
+ String updateSql = "update member set m_status = " + status + ", m_status_time = now() " + " where m_id = " + member.getMid() + " and m_card_number = '" + member.getMcardNumber() + "'";
|
|
|
+ return DBUtils.update(updateSql);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查用户是否存在,存在返回true,不存在false
|
|
|
+ *
|
|
|
+ * @param member 成员列表
|
|
|
+ * @param access_token access_token
|
|
|
+ * @return 成员存在true 不存在false
|
|
|
+ * @throws JsonProcessingException 异常
|
|
|
+ */
|
|
|
+ private boolean checkMember(MemberEntity member, String access_token, String idNumber) throws JsonProcessingException {
|
|
|
+ // 搜索成员接口
|
|
|
+ final String URL = BaseURL + "user/search?access_token=" + access_token;
|
|
|
+ String card_number;
|
|
|
+ if ("card_number".equals(idNumber)) { // 学工号是学号
|
|
|
+ card_number = member.getMcardNumber();
|
|
|
+ } else { // 学工号是身份证号
|
|
|
+ card_number = member.getMidCard();
|
|
|
+ }
|
|
|
+ // 以下是查询是否存在该成员
|
|
|
+ // 查询参数
|
|
|
+ Map<String, String> queryParams = new HashMap<>();
|
|
|
+ // 请求参数
|
|
|
+ Map<String, String> requestBody = new HashMap<>();
|
|
|
+ requestBody.put("keywords", card_number);
|
|
|
+ // 执行查询
|
|
|
+ ResponseEntity<String> stringResponseEntity = HttpRequestUtils.httpPost(URL, requestBody, queryParams);
|
|
|
+ // 判断是否返回null
|
|
|
+ if (stringResponseEntity == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取响应体
|
|
|
+ String body = stringResponseEntity.getBody();
|
|
|
+ // 获取状态码部分
|
|
|
+ String code = stringResponseEntity.getStatusCode().toString();
|
|
|
+ if (code.contains("200") && code.contains("OK")) {
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper(); // 创建ObjectMapper对象
|
|
|
+ MemReturnFromWeixin memReturnFromWeixin = objectMapper.readValue(body, MemReturnFromWeixin.class);
|
|
|
+ // 如果用户信息列表数组是空数组或者数组长度等于0,说明没有该成员信息
|
|
|
+ if ("[]".equals(Arrays.toString(memReturnFromWeixin.getUserlist())) || memReturnFromWeixin.getUserlist().length == 0) {
|
|
|
+ // 微信没有该成员学工号或者身份证号
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ String string = Arrays.toString(memReturnFromWeixin.getUserlist());
|
|
|
+ // 去除字符串中的特殊字符
|
|
|
+ String cleanString = string.replaceAll("[{}\\[\\]\"]", "");
|
|
|
+
|
|
|
+ // 使用逗号分隔字符串,获取键值对数组
|
|
|
+ String[] keyValuePairs = cleanString.split(",");
|
|
|
+
|
|
|
+ // 遍历键值对数组,提取card_type的值和qq的值
|
|
|
+// String cardNumber = "";
|
|
|
+ String identityType = "";
|
|
|
+ String idCard = "";
|
|
|
+ for (String pair : keyValuePairs) {
|
|
|
+ String[] keyValue = pair.split("=");
|
|
|
+ if (keyValue.length == 2) {
|
|
|
+ String key = keyValue[0].trim();
|
|
|
+ String value = keyValue[1].trim();
|
|
|
+
|
|
|
+ if (key.equals("identity_type")) {
|
|
|
+ identityType = value;
|
|
|
+ } else if (key.equals("id_card")) {
|
|
|
+ idCard = value;
|
|
|
+// } else if (key.equals("card_number")) {
|
|
|
+// cardNumber = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 身份1学生 2教职工、身份证号id_card,如果二个都相等,则认为微校存在此用户成员,否则认为没有
|
|
|
+ if (identityType.equals(member.getMidentityType()) && idCard.equals(member.getMidCard())) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ // 微校没有有该成员
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ myWriter.writeToFile("错误状态码," + code.split(" ")[0], "");
|
|
|
+ myWriter.writeToFile("错误信息," + body, "");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推送异常公共函数
|
|
|
+ *
|
|
|
+ * @param member 成员
|
|
|
+ */
|
|
|
+ private void setLocalTable(String cause, MemberEntity member) {
|
|
|
+ // 不能标记为3,因为经过测试后台数据不是一次到位,比如有的card_number到了,但是学院没有到,造成以后都没有推送
|
|
|
+ myWriter.writeToFile(cause + ",m_status暂时不需要标记,," + member.getMcardNumber() + "|"
|
|
|
+ + member.getMname() + "|" + member.getMidCard(), "abnormal");
|
|
|
+// int updateCount = updateLocalTable(3, member);
|
|
|
+// if (updateCount > 0)
|
|
|
+// myWriter.writeToFile(cause + ",m_status已标记为3,m_status_time为标记时间,人工处理后再推送," + member.getMcardNumber() + "|"
|
|
|
+// + member.getMname() + "|" + member.getMidCard(), "abnormal");
|
|
|
+// else myWriter.writeToFile(cause + ",m_status 和 m_status_time 标记失败," + member.getMcardNumber() + "|"
|
|
|
+// + member.getMname() + "|" + member.getMidCard(), "abnormal");
|
|
|
+ }
|
|
|
+}
|