瀏覽代碼

推送逻辑进行了修改。

soft5566 1 年之前
父節點
當前提交
b445be49a4

+ 93 - 0
ignore/ignoreAdd.txt

@@ -0,0 +1,93 @@
+p02012
+p02020
+p02010
+p04002
+p09001
+p05006
+p01013
+p07003
+p01018
+p06004
+p01016
+p01035
+p02028
+p02030
+p02031
+p04012
+p04014
+p04015
+p04017
+p02002
+p02006
+p02008
+p02009
+p02013
+p02014
+p02017
+p02024
+p02025
+p02001
+p02019
+p02023
+p04003
+p04008
+p04009
+p04005
+p04010
+p09004
+p09005
+p05003
+p05004
+p05007
+p05008
+p05011
+p05002
+p01004
+p01008
+p01014
+p01002
+p07007
+p07004
+p06001
+00007
+p07012
+p02007
+p07001
+p06002
+p05010
+p04062
+p02027
+32005
+p01010
+p07008
+p06003
+p02015
+p02022
+p02018
+p04001
+p05001
+p05005
+p01001
+p01009
+p01003
+p07023
+p02026
+p05014
+p07005
+p04007
+p05009
+p05012
+p02003
+p04006
+p01007
+p04011
+p06005
+p07002
+p02109
+p04067
+p01011
+p02029
+p07006
+p01017
+p04085
+p08045

+ 5 - 0
ignore/ignoreUpdate.txt

@@ -0,0 +1,5 @@
+P07061
+P07062
+P07063
+p04085
+p08045

+ 419 - 298
src/main/java/com/chkj/pdata/task/PushMember.java

@@ -1,5 +1,6 @@
 package com.chkj.pdata.task;
 
+import com.chkj.pdata.entity.MemAddReturn;
 import com.chkj.pdata.entity.MemReturnFromWeixin;
 import com.chkj.pdata.entity.MemberEntity;
 import com.chkj.pdata.util.DBUtils;
@@ -7,6 +8,7 @@ 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 com.google.gson.Gson;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.http.HttpEntity;
@@ -31,36 +33,92 @@ public class PushMember {
      * 推送成员任务
      */
     public void pushMember_task() {
+        String strGte2020 = " AND ((m_identity_type=1 AND CAST(SUBSTRING(m_card_number, 1, 4) AS UNSIGNED) >= 2020) OR m_identity_type=2) " +
+                " AND m_college IS NOT NULL " +
+                " AND m_id_card NOT LIKE '0000%' " +
+                " AND m_class IS NOT NULL ";
         // 推送任务
+        String action = "新增 --> ";
         try {
+            // AND m_card_number NOT IN ('P07061','P07062','P07063')
+            String sadd = myWriter.readFromFile("add");
+            String cds = "";
+            if (!"".equals(sadd)) {
+                cds = " AND m_card_number NOT IN (" + sadd + ") ";
+            }
+            cds += strGte2020;
+            // 查询没有推送的记录
+            String selectSql = "SELECT * FROM member WHERE m_status = 0 " + cds + " LIMIT 100";
             // 获取没有推送的记录
-            List<MemberEntity> members = getMembers();
+            List<MemberEntity> members = getMembers(selectSql);
+            if (members.size() > 0) {
+                // 获取 access_token
+                String access_token = bakMember.getAccessToken();
+
+                if (!"".equals(access_token)) {
+                    // 推送成员信息
+                    pushMember(members, access_token, action);
+                } else {
+                    if (!myWriter.containsStringInFile("none", "推送新增【member】获取 access_token 失败!", action)) {
+                        myWriter.writeToFile("推送新增【member】获取 access_token 失败!", "abnormal");
+                    }
+                }
+            } else {
+                if (!myWriter.containsStringInFile("none", "没有要推送新增的记录", action)) {
+                    myWriter.writeToFile("没有要推送新增的记录!", "none");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            if (!myWriter.containsStringInFile("none", action + e.getMessage(), action)) {
+                myWriter.writeToFile(action + e.getMessage(), "abnormal");
+            }
+        }
+
+        action = "更新 --> ";
+        // 推送修改任务
+        try {
+            // AND m_card_number NOT IN ('P07061','P07062','P07063')
+            String supdate = myWriter.readFromFile("update");
+            String cds = "";
+            if (!"".equals(supdate)) {
+                cds = " AND m_card_number NOT IN (" + supdate + ") ";
+            }
+            cds += strGte2020;
+            // 查询没有推送的记录
+            String selectSql = "SELECT * FROM member WHERE (m_update_at > m_status_time OR m_status_time IS NULL) " + cds + " LIMIT 100";
+//            String selectSql = "SELECT * FROM member WHERE m_grade = '2023' and m_status !=7 and m_building is not NULL and m_in_out_school=1 LIMIT 100";
+            // 获取有修改的记录
+            List<MemberEntity> members = getMembers(selectSql);
             if (members.size() > 0) {
                 // 获取 access_token
                 String access_token = bakMember.getAccessToken();
 
                 if (!"".equals(access_token)) {
                     // 推送成员信息
-                    pushMember(members, access_token);
+                    pushMember(members, access_token, action);
                 } else {
-                    myWriter.writeToFile("推送【member】获取 access_token 失败!", "abnormal");
+                    if (!myWriter.containsStringInFile("abnormal", "推送更新【member】获取 access_token 失败!", action)) {
+                        myWriter.writeToFile("推送更新【member】获取 access_token 失败!", "abnormal");
+                    }
                 }
             } else {
-                if (!myWriter.readFromFile("none")) myWriter.writeToFile("没有要推送的记录!", "none");
+                if (!myWriter.containsStringInFile("none", "没有要推送更新的记录", action)) {
+                    myWriter.writeToFile("没有要推送更新的记录!", "none");
+                }
             }
         } catch (JsonProcessingException e) {
-            myWriter.writeToFile(e.getMessage(), "abnormal");
+            if (!myWriter.containsStringInFile("none", action + e.getMessage(), action)) {
+                myWriter.writeToFile(action + e.getMessage(), "abnormal");
+            }
         }
     }
 
     /**
-     * 查询表,找出没有推送的记录
+     * 查询表,找出没有推送的记录  或  有修改的记录
      *
      * @return 成员记录集
      */
-    private List<MemberEntity> getMembers() {
-        // 查询没有推送的记录
-        String selectSql = "SELECT * FROM member where m_status = 0 limit 100";
+    private List<MemberEntity> getMembers(String selectSql) {
         // 返回查询的成员列表
         return DBUtils.queryAll(selectSql);
     }
@@ -121,9 +179,13 @@ public class PushMember {
             ResponseEntity<String> response = restTemplate.postForEntity(URL + "?access_token=" + access_token, request, String.class);
 //            System.out.println(response.getBody());
             // 写入日志文件
-            myWriter.writeToFile(response.toString(), "delMember");
+            if (!myWriter.containsStringInFile("abnormal", response.toString(), "")) {
+                myWriter.writeToFile(response.toString(), "delMember");
+            }
         } catch (JsonProcessingException e) {
-            myWriter.writeToFile(e.getMessage(), "abnormal");
+            if (!myWriter.containsStringInFile("abnormal", e.getMessage(), "")) {
+                myWriter.writeToFile(e.getMessage(), "abnormal");
+            }
         }
     }
 
@@ -134,341 +196,390 @@ public class PushMember {
      * @param access_token access_token
      * @throws JsonProcessingException 异常
      */
-    private void pushMember(List<MemberEntity> members, String access_token) throws JsonProcessingException {
+    private void pushMember(List<MemberEntity> members, String access_token, String action) throws JsonProcessingException {
         // 创建用户接口
         final String URL = BaseURL + "user/manage/create?access_token=" + access_token;
         // 循环每个成员,检查成员是否存在
         for (MemberEntity member : members) {
+            System.out.println(member.getMcardNumber());
             // 学工号 或 姓名 为空,则不处理
             if (member.getMcardNumber() == null || member.getMname() == null || member.getMidCard() == null) {
-                setLocalTable("该【学工号】或【姓名】或【身份证号】为空", member);
+                setLocalTable(action + "该【学工号】或【姓名】或【身份证号】为空", member);
                 continue;
             }
 
             if (member.getMcardNumber().equals(member.getMidCard())) {
-                setLocalTable("【姓名】和【身份证号】相同", member);
+                setLocalTable(action + "【姓名】和【身份证号】相同", 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("微校不存在,");
+//            StringBuilder sb = new StringBuilder();
+//            sb.append(action).append("该成员");
+//            boolean bool = checkMember(member, access_token, "card_number") && checkMember(member, access_token, "id_card");
+//            if (bool) {
+//                sb.append("【学工号】或【身份证号】");
+//            }
+//            sb.append("微校不存在,");
+//            if (bool) {
+//                if (!myWriter.containsStringInFile("abnormal", sb + member.getMcardNumber(), action)) {
+//                    myWriter.writeToFile(sb + member.getMcardNumber(), "abnormal");
+//                }
+//            } else { // 存在该成员
+//                // 标记为1已存在
+//                int updateCount = updateLocalTable(1, member);
+//                if (updateCount > 0) {
+//                    myWriter.writeToFile(action + "成员已存在,m_status已标记为1,m_status_time为标记时间,以后不再推送," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+//                } else {
+//                    myWriter.writeToFile(action + "成员已存在,m_status 和 m_status_time标记失败," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+//                }
+//            }
 
-            // 不存在该成员,则推送
-            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());
-                        }
+            // 查询参数
+            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 if (Character.isLetter(cardNumber.charAt(0))) {
-                    // 如果是字母开头的,教职工(外聘等),【工号】作为【学工号】
-                    requestBody.put("card_number", member.getMcardNumber());
                 } else {
-                    // 既不是数字开头,也不是字母开头,记录到日志,待人工处理
-                    setLocalTable("该学工号特殊,需要人工进行判别,此处跳过", member);
-                    continue;
+                    // 教职工,【工号】作为【学工号】
+                    requestBody.put("card_number", member.getMcardNumber());
                 }
-                // 编号 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);
-                // 系的名称(学校数据库推送的数据中没有系,但对应微校的是专业,所有忽略)
+            } else if (Character.isLetter(cardNumber.charAt(0))) {
+                // 如果是字母开头的,教职工(外聘等),【工号】作为【学工号】
+                requestBody.put("card_number", member.getMcardNumber());
+            } else {
+                // 既不是数字开头,也不是字母开头,记录到日志,待人工处理
+                setLocalTable(action + "该学工号特殊,需要人工进行判别,此处跳过", 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);
+            // 班级
+            if (member.getMclass() != null) requestBody.put("class", member.getMclass());
+            // 身份类型
+            String identityType = member.getMidentityType();
+            if (identityType != null) {
+                if ("1".equals(identityType)) {
+                    if ("1".equals(member.getMinOutSchool())) {
+                        requestBody.put("identity_type", "学生");
+                    } else if ("0".equals(member.getMinOutSchool())) {
+                        requestBody.put("identity_type", "校友");
+                    } else {
+                        setLocalTable(action + "是否毕业:既不是1,也不是0,需要人工进行判别,此处跳过", member);
                         continue;
                     }
+                } else if ("2".equals(identityType)) {
+                    if ("1".equals(member.getMinOutSchool())) {
+                        requestBody.put("identity_type", "教职工");
+                    } else if ("0".equals(member.getMinOutSchool())) {
+                        requestBody.put("identity_type", "临时人员");
+                    } else {
+                        setLocalTable(action + "是否离职:既不是1,也不是0,需要人工进行判别,此处跳过", member);
+                        continue;
+                    }
+                } else {
+                    // 1是学生,2是教职工:既不是1,也不是2,记录到日志,待人工处理
+                    setLocalTable(action + "该身份既不是1,也不是2,需要人工进行判别,此处跳过", member);
+                    continue;
+                }
+            } else {
+                // null,记录到日志,待人工处理
+                setLocalTable(action + "该身份为【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);
+                    setLocalTable(action + "该学生在校/离校【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);
-                            // 标记为4已离职
-                            int updateCount = updateLocalTable(4, member);
-                            if (updateCount > 0) {
-                                myWriter.writeToFile("该教职工【已离职】,m_status已标记为4,m_status_time为标记时间,以后不再推送," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
-                            } else {
-                                myWriter.writeToFile("该教职工【已离职】,m_status 和 m_status_time标记失败," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
-                            }
-                            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 (college != null) org.append("/").append(college);
+                else {
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该学生学院【null】,需要人工进行判别,此处跳过", member);
+                    continue;
+                }
+                // 年级,非空加上年级
+                if (member.getMgrade() != null) org.append("/").append(member.getMgrade());
+                else {
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该学生年级【null】,需要人工进行判别,此处跳过", member);
+                    continue;
                 }
-                // 身份名称
-                if (member.getMidentityTitle() != null) {
-                    requestBody.put("identity_title", member.getMidentityTitle());
+                // 专业,非空加上专业
+                if (member.getMmajor() != null) {
+                    org.append("/").append(member.getMmajor());
+                    requestBody.put("profession", member.getMmajor());
                 } 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", "专科生");
-                        }
-                    }
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该学生专业【null】,需要人工进行判别,此处跳过", member);
+                    continue;
                 }
-                // 证件类型
-                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);
-                    }
+                // 班级,非空加上班级
+                if (member.getMclass() != null) org.append("/").append(member.getMclass());
+                else {
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该学生班级【null】,需要人工进行判别,此处跳过", member);
+                    continue;
+                }
+                // 设置组织结构
+                requestBody.put("organization", org.toString());
+            } else {  // 教职工
+                if (member.getMinOutSchool() != null) {
+                    // 非 null, 1在职 0离线
+                    org.append("1".equals(member.getMinOutSchool()) ? "/教职工" : "/教职工/离职员工");
+//                    if ("1".equals(member.getMinOutSchool())) {
+//                        org.append("/教职工");
+//                    } else {
+//                        // 0,记录到日志,待人工处理
+//                        // setLocalTable("该教职工【已离职】,需要人工进行判别,此处跳过", member);
+//                        // 标记为4已离职
+//                        int updateCount = updateLocalTable(4, member);
+//                        if (updateCount > 0) {
+//                            myWriter.writeToFile(action + "该教职工【已离职】,m_status已标记为4,m_status_time为标记时间,以后不再推送," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+//                        } else {
+//                            myWriter.writeToFile(action + "该教职工【已离职】,m_status 和 m_status_time标记失败," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+//                        }
+//                        continue;
+//                    }
                 } else {
-                    // 非法证件号,记录到日志,待人工处理
-                    setLocalTable("该证件号【null】,需要人工进行判别,此处跳过", member);
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该教职工在职/离职字段为【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", "女");
-                    }
+                // 学院,非null 就加上学院,否则
+                if (college != null) {
+                    org.append("/").append(college);
+//                    if ("1".equals(member.getMinOutSchool())) {
+//                        org.append("/").append(college);
+//                    }
                 } else {
-                    // 根据身份证号判别性别
-                    char genderCode = idCard.charAt(16); //获取第17位字符,下标从0开始
-                    if (genderCode % 2 == 0) {
-                        requestBody.put("gender", "女");
-                    } else {
-                        requestBody.put("gender", "男");
+                    // null,记录到日志,待人工处理
+                    setLocalTable(action + "该教职工学院【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 (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());
+            }
+            // 证件类型
+            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(action + "该证件号非法,需要人工进行判别,此处跳过", member);
+                    continue;
+                } else {
+                    requestBody.put("id_card", idCard);
+                }
+            } else {
+                // 非法证件号,记录到日志,待人工处理
+                setLocalTable(action + "该证件号【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 {
-                    if (building != null) {
-                        if (building.toLowerCase().startsWith("m")) {
-                            build = Integer.parseInt(building.substring(1));
-                            requestBody.put("campus", "墨轩湖校区");
+                    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;
+            String build_str = "";
+            if (member.getMcampus() != null) {
+                requestBody.put("campus", member.getMcampus());
+            } else {
+                if (building != null) {
+                    if (building.toLowerCase().startsWith("m")) {
+                        build = Integer.parseInt(building.replaceAll("[^0-9]", ""));
+                        requestBody.put("campus", "墨轩湖校区");
+                    } else {
+                        if (building.toLowerCase().startsWith("jg") || building.toLowerCase().startsWith("zjl")) {
+                            build_str = building;
                         } else {
-                            build = Integer.parseInt(building);
-                            requestBody.put("campus", "黄家湖校区");
+                            build_str = String.valueOf(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", "南昌交通学院");
+            }
+            // 工作单位、宿舍号
+            // 如果是学生,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("栋");
+                // 宿舍号 = 楼栋 + 宿舍
+                StringBuilder drom = new StringBuilder();
+                if (building != null) {
+                    if (!build_str.equals("")) {
+                        drom.append(build_str).append("-");
+                    } else {
+                        drom.append(build).append("栋");
+                    }
                     if (member.getMdormNumber() != null) drom.append(member.getMdormNumber());
-                    if (!"".contentEquals(drom)) {
+                    if (!"".contentEquals(drom.toString())) {
                         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 {  // 教职工
+                // 工作单位
+                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() + "|" + member.getMname() + "|" + member.getMmajor() + "|" + member.getMidCard(), "ok");
-                        } else {
-                            myWriter.writeToFile("成员推送成功," + cardNumber + "|" + member.getMname() + "|" + member.getMmajor() + "|" + member.getMidCard(), "ok");
-                        }
-                    } else {
-                        myWriter.writeToFile("成员推送失败," + member.getMcardNumber() + "|" + member.getMidCard(), "");
-                    }
+            }
+            // 入学年份
+            if (member.getMregisterYear() != null) {
+                requestBody.put("register_year", member.getMregisterYear());
+            }
+            if (action.equals("更新 --> ")) {
+                // 只需要更新编号
+                requestBody.put("serial_number", member.getMcardNumber());
+            }
+            // ===============================================================================
+            // 调用创建用户接口,执行推送
+            ResponseEntity<String> stringResponseEntity = HttpRequestUtils.httpPost(URL, requestBody, queryParams);
+            // 判断是否返回null
+            if (stringResponseEntity == null) {
+                return;
+            }
+            // 获取响应体
+            String body = stringResponseEntity.getBody();
+            Gson gson = new Gson();
+            MemAddReturn bodyObject = gson.fromJson(body, MemAddReturn.class);
+            // 获取响应码
+            String code = stringResponseEntity.getStatusCode().toString();
+            // 判断响应码是否是成功
+            if (bodyObject.getErrcode() == 0 && bodyObject.getErrmsg().equals("success")) {
+                int status;
+                if (action.equals("更新 --> ")) {
+                    status = 7;
                 } else {
-                    myWriter.writeToFile("错误状态码," + code.split(" ")[0], "");
-                    myWriter.writeToFile("错误信息," + body, "");
+                    status = 2;
                 }
-            } else { // 存在该成员
-                // 标记为1已存在
-                int updateCount = updateLocalTable(1, member);
+                // 标记为已推送
+                int updateCount = updateLocalTable(status, member);
                 if (updateCount > 0) {
-                    myWriter.writeToFile("成员已存在,m_status已标记为1,m_status_time为标记时间,以后不再推送," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+//                        if (cardNumber.length() == 14 && Integer.parseInt(cardNumber.substring(0, 4)) >= 2021) {
+//                            myWriter.writeToFile(action + "成员推送成功," + member.getMidCard() + "|" + member.getMname() + "|" + requestBody.get("organization") + "|" + member.getMidCard(), "ok");
+//                        } else {
+                    myWriter.writeToFile(action + "成员推送成功," + cardNumber + "|" + member.getMname() + "|" + requestBody.get("organization") + "|" + member.getMidCard(), "ok");
+//                        }
                 } else {
-                    myWriter.writeToFile("成员已存在,m_status 和 m_status_time标记失败," + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "");
+                    myWriter.writeToFile(action + "成员推送失败," + member.getMcardNumber() + "|" + member.getMidCard(), "");
                 }
+            } else {
+                myWriter.writeToFile(action + "错误状态码," + code.split(" ")[0], "");
+                myWriter.writeToFile(action + "错误信息," + body, "");
             }
         }
     }
@@ -584,15 +695,25 @@ public class PushMember {
         // 不能标记为3,因为经过测试后台数据不是一次到位,比如有的card_number到了,但是学院没有到,造成以后都没有推送
         if ("超级管理员".equals(member.getMname()) || member.getMcardNumber().toLowerCase().contains("admin")) {
             int updateCount = updateLocalTable(6, member);
-            if (updateCount > 0)
-                myWriter.writeToFile(cause + ",m_status已标记为6,m_status_time为标记时间,人工处理后再推送,"
-                        + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "abnormal");
-            else
-                myWriter.writeToFile(cause + ",m_status已标记为6 和 m_status_time为标记时间 失败,"
-                        + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard(), "abnormal");
+            if (updateCount > 0) {
+                String tempStr = ",m_status已标记为6,m_status_time为标记时间,人工处理后再推送,"
+                        + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard();
+                if (!myWriter.containsStringInFile("abnormal", tempStr, cause)) {
+                    myWriter.writeToFile(cause + tempStr, "abnormal");
+                }
+            } else {
+                String tempStr = ",m_status已标记为6 和 m_status_time为标记时间 失败,"
+                        + member.getMcardNumber() + "|" + member.getMname() + "|" + member.getMidCard();
+                if (!myWriter.containsStringInFile("abnormal", tempStr, cause)) {
+                    myWriter.writeToFile(cause + tempStr, "abnormal");
+                }
+            }
         } else {
-            myWriter.writeToFile(cause + ",m_status暂时不需要标记,," + member.getMcardNumber()
-                    + "|" + member.getMname() + "|" + member.getMidCard(), "abnormal");
+            String tempStr = ",m_status暂时不需要标记,," + member.getMcardNumber() + "|" +
+                    member.getMname() + "|" + member.getMidCard();
+            if (!myWriter.containsStringInFile("abnormal", tempStr, cause)) {
+                myWriter.writeToFile(cause + tempStr, "abnormal");
+            }
         }
     }
 }

+ 63 - 7
src/main/java/com/chkj/pdata/util/FileUtil.java

@@ -1,8 +1,6 @@
 package com.chkj.pdata.util;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
+import java.io.*;
 
 public class FileUtil {
     private final static String ps = File.separator;
@@ -66,7 +64,44 @@ public class FileUtil {
         }
     }
 
-    public boolean readFromFile(String tipClass) {
+    public String readFromFile(String param) {
+        String basePath = getPath();
+        String ps = File.separator;
+        String filename = null;
+        if ("update".equals(param)) {
+            filename = basePath + "ignore" + ps + "ignoreUpdate.txt";  // 忽略的学工号(cardNumber)
+        } else if ("add".equals(param)) {
+            filename = basePath + "ignore" + ps + "ignoreAdd.txt";  // 忽略的学工号(cardNumber)
+        }
+        if (filename == null) {
+            return "";
+        }
+
+        // 判断文件是否存在
+        File file = new File(filename);
+        StringBuilder returnCardNumber = new StringBuilder();
+        if (file.exists() && file.isFile()) {
+            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    if (!"".equals(line.trim())) {
+                        returnCardNumber.append("'").append(line.trim()).append("',");
+                    }
+                }
+            } catch (IOException e) {
+                writeToFile(e.getMessage(), "abnormal");
+            }
+
+            if (!returnCardNumber.isEmpty()) {
+                returnCardNumber.setLength(returnCardNumber.length() - 1);
+                return returnCardNumber.toString();
+            }
+        }
+
+        return "";
+    }
+
+    public boolean containsStringInFile(String tipClass, String targetString, String action) {
         String basePath = getPath();
         // 获取当前日期时间
         DateTime dateTime = new DateTime();
@@ -74,9 +109,30 @@ public class FileUtil {
         String ps = File.separator;
         String filename = basePath + "logs" + ps;
         //  定义当天日志文件
-        if ("none".equals(tipClass)) filename += dt.substring(0, 10) + "-none-log.csv";  // 目前没有推送信息日志,会打印时间、提示,不需要人工处理
+        if ("none".equals(tipClass)) {
+            filename += dt.substring(0, 10) + "-none-log.csv";
+        } else if ("abnormal".equals(tipClass)) {
+            filename += dt.substring(0, 10) + "-abnormal-log.csv";
+        } else if ("ok".equals(tipClass)) {
+            filename += dt.substring(0, 10) + "-ok-log.csv";
+        } else {
+            filename += dt.substring(0, 10) + "-log.csv";
+        }
 
-        // 判断文件是否存在
-        return new File(filename).exists();
+        File file = new File(filename);
+        if (file.exists() && file.isFile()) {
+            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    if (line.contains(targetString)) {
+                        return true;
+                    }
+                }
+            } catch (IOException e) {
+                writeToFile(action + e.getMessage(), "abnormal");
+            }
+        }
+
+        return false;
     }
 }