Jelajahi Sumber

fix: 添加统一信用代码,工商注册号校验函数

- credit_code_verify
- reg_number_verify
许家凯 2 tahun lalu
induk
melakukan
2354463036

+ 225 - 0
src/main/java/com/winhc/bigdata/udf/JudgmentDocumentScore.java

@@ -0,0 +1,225 @@
+package com.winhc.bigdata.udf;
+
+import com.aliyun.odps.udf.UDF;
+import com.aliyun.odps.utils.StringUtils;
+import com.winhc.bigdata.utils.BigDecimalUtil;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
+import java.util.regex.Pattern;
+
+import static com.winhc.bigdata.utils.BigDecimalUtil.mul;
+import static com.winhc.bigdata.utils.BigDecimalUtil.subtract;
+
+/**
+ * @author: XuJiakai
+ * 2022/8/9 11:25
+ * <p>
+ * judgment_document_score
+ */
+public class JudgmentDocumentScore extends UDF {
+
+
+    public Double evaluate(Long court_level
+            , String new_case_stage
+            , String judge_name
+            , String doc_type
+            , String judge_date
+            , Double der
+    ) {
+
+        String courtLevels = null;
+        if (court_level != null) {
+            if (court_level == 0) {
+                courtLevels = "最高";
+            } else if (court_level == 1) {
+                courtLevels = "高级";
+            } else if (court_level == 2) {
+                courtLevels = "中级";
+            } else if (court_level == 3) {
+                courtLevels = "基层";
+            }
+        }
+
+        String judicialProcedure = null;
+        if (StringUtils.isNotBlank(new_case_stage)) {
+            if (new_case_stage.contains("一审")) {
+                judicialProcedure = "一审";
+            } else if (new_case_stage.contains("二审")) {
+                judicialProcedure = "二审";
+            } else if (new_case_stage.contains("再审审查")) {
+                judicialProcedure = "再审审查";
+            } else if (new_case_stage.contains("再审")) {
+                judicialProcedure = "再审";
+            }
+        }
+        return getJudgmentDocumentScore(courtLevels, judicialProcedure, judge_name, doc_type, judge_date, der);
+    }
+
+
+    /**
+     * @param courtLevels          法院层级:高院、中院……
+     * @param judicialProcedure    审级:一审、二审……
+     * @param judicialOrganization 审判决组织:独任制、三人合议庭、五人合议庭、七人合议庭
+     * @param documentType         文书类型:判决书、裁定书、决定、通知书、令
+     * @param judgmentDate         审判时间
+     * @return
+     */
+    public static Double getJudgmentDocumentScore(String courtLevels
+            , String judicialProcedure
+            , String judicialOrganization
+            , String documentType
+            , String judgmentDate
+            , Double der
+    ) {
+        double score = 0d;
+        if (StringUtils.isNotBlank(courtLevels)) {
+            switch (courtLevels) {
+                case "基层":
+                    score += 1;
+                    break;
+                case "中级":
+                    score += 2;
+                    break;
+                case "高级":
+                    score += 3;
+                    break;
+                case "最高":
+                    score += 4;
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (StringUtils.isNotBlank(judicialProcedure)) {
+            switch (judicialProcedure) {
+                case "再审审查":
+                    score += 2.0;
+                    break;
+                case "一审":
+                    score += 1;
+                    break;
+                case "二审":
+                    score += 2.5;
+                    break;
+                case "再审":
+                    score += 2.1;
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (StringUtils.isNotBlank(judicialOrganization)) {
+            if (!judicialOrganizationPattern.matcher(judicialOrganization).matches()) {
+                try {
+                    String[] split = judicialOrganization.split("\n");
+                    if (split.length == 1) {
+                        judicialOrganization = "独任制";
+                    } else if (split.length == 3) {
+                        judicialOrganization = "三人合议庭";
+                    } else if (split.length == 5) {
+                        judicialOrganization = "五人合议庭";
+                    } else if (split.length == 7) {
+                        judicialOrganization = "七人合议庭";
+                    } else {
+                        judicialOrganization = "独任制";
+                    }
+                } catch (Exception e) {
+                    judicialOrganization = "独任制";
+                }
+            }
+            switch (judicialOrganization) {
+                case "独任制":
+                    score += 1;
+                    break;
+                case "三人合议庭":
+                    score += 2;
+                    break;
+                case "五人合议庭":
+                    score += 2.1;
+                    break;
+                case "七人合议庭":
+                    score += 2.2;
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (StringUtils.isNotBlank(documentType)) {
+            switch (documentType) {
+                case "决定书":
+                case "令":
+                case "通知书":
+                    score += 1;
+                    break;
+                case "调解书":
+                    score += 2;
+                    break;
+                case "裁定书":
+                    score += 3;
+                    break;
+                case "判决书":
+                    score += 4;
+                    break;
+                default:
+                    break;
+            }
+        }
+        score = mul(score, subtract(1d, der)) + mul(getJudgmentDateScore(judgmentDate), der);
+        return score;
+    }
+
+    private static final Pattern judicialOrganizationPattern = Pattern.compile("^(独任制)|([三五七]人合议庭)$");
+
+    private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    private static final Double i = (double) (LocalDate.now().getYear() - 30);
+
+    private static double getJudgmentDateScore(String judgmentDate) {
+        if (StringUtils.isEmpty(judgmentDate)) {
+            return 0d;
+        }
+        if (judgmentDate.contains(" ")) {
+            judgmentDate = judgmentDate.split(" ")[0];
+        }
+        try {
+            TemporalAccessor parse = dtf.parse(judgmentDate);
+            LocalDate from = LocalDate.from(parse);
+            int year = from.getYear();
+            int dayOfYear = from.getDayOfYear();
+            int year_days = from.isLeapYear() ? 366 : 365;
+            double ys = BigDecimalUtil.add(year, BigDecimalUtil.div(dayOfYear, year_days, 8));
+
+            if (ys < i - 1.5) {
+                ys = 1 / (i - ys);
+            } else if (ys >= i + 0.75) {
+                ys = ys - i;
+            } else {
+                ys = 0.75;
+            }
+
+            return Math.log(ys + 1.1d) * 4;
+        } catch (Exception e) {
+            return 0d;
+        }
+    }
+
+
+    public static void main(String[] args) {
+
+        Double ys = 1992.85;
+
+        if (ys < i - 1.5) {
+            ys = 1 / (i - ys);
+        } else if (ys >= i + 0.75) {
+            ys = ys - i;
+        } else {
+            ys = 0.75;
+        }
+        Double d = Math.log(ys + 1.1d) * 4;
+        System.out.println(d);
+
+    }
+
+}

+ 16 - 0
src/main/java/com/winhc/bigdata/udf/company/CompanyScoreWeightCalc.java

@@ -0,0 +1,16 @@
+package com.winhc.bigdata.udf.company;
+
+import com.aliyun.odps.udf.UDF;
+import com.winhc.bigdata.utils.CompanyUtils;
+
+/**
+ * @author: XuJiakai
+ * 2022/6/7 11:00
+ * company_score_weight_calc
+ */
+public class CompanyScoreWeightCalc extends UDF {
+    public Double evaluate(String reg_status, String cname, String reg_capital_amount, String company_type) {
+        return CompanyUtils.companyScoreWeight(reg_status, cname, reg_capital_amount, company_type);
+    }
+
+}

+ 1 - 1
src/main/java/com/winhc/bigdata/udf/company/CreditCodeVerify.java

@@ -12,7 +12,7 @@ public class CreditCodeVerify extends UDF {
      * @param val
      * @return true 合法
      */
-    public boolean evaluate(String val) {
+    public Boolean evaluate(String val) {
         return StringUtils.isNotBlank(val) && val.length() == 18 && val.charAt(0) == '9';
     }
 }

+ 1 - 1
src/main/java/com/winhc/bigdata/udf/company/RegNumberVerify.java

@@ -22,7 +22,7 @@ public class RegNumberVerify extends UDF {
      * @param val
      * @return true 合法
      */
-    public boolean evaluate(String val) {
+    public Boolean evaluate(String val) {
         return StringUtils.isNotBlank(val) && val.length() == 15 && isNumber(val.substring(0, 6));
     }
 }

+ 113 - 0
src/main/java/com/winhc/bigdata/utils/BigDecimalUtil.java

@@ -0,0 +1,113 @@
+package com.winhc.bigdata.utils;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: XuJiakai
+ * @Date: 2020/9/2 17:57
+ * @Description:
+ */
+public class BigDecimalUtil {
+    // 进行加法运算
+    public static double add(String v1, String v2) {
+
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.add(b2).doubleValue();
+    }
+
+    public static double add(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.add(b2).doubleValue();
+    }
+
+    // 进行减法运算
+    public static double subtract(String v1, String v2) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.subtract(b2).doubleValue();
+    }
+
+    public static double subtract(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.subtract(b2).doubleValue();
+    }
+
+    // 进行乘法运算
+    public static double mul(String d1, String d2) {
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        return b1.multiply(b2).doubleValue();
+    }
+
+    public static double mul(double d1, double d2) {
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        return b1.multiply(b2).doubleValue();
+    }
+
+    // 进行除法运算
+    public static double div(String d1, String d2, int len) {
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        if (b2.doubleValue() == 0) {
+            return 0;
+        }
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    public static double div(double d1, double d2, int len) {
+        if (d2 == 0) {
+            return 0;
+        }
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    public static double div(long d1, long d2, int len) {
+        if (d2 == 0) {
+            return 0;
+        }
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    // 进行四舍五入操作-len 小数点后保留几位
+    public static double round(double d, int len) {
+        BigDecimal b1 = new BigDecimal(d);
+        BigDecimal b2 = new BigDecimal(1);
+        // 任何一个数字除以1都是原数字
+        // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+
+    /**
+     * 进行四舍五入操作 -并保留指定位数
+     *
+     * @param @param  d1		处理数据
+     * @param @param  d2		如果为1 则自己保留多少位,100为除以100之后的结果再保留位数
+     * @param @param  len  小数点保留位数
+     * @param @return 参数
+     * @return String    返回类型
+     * @throws
+     * @Title: round
+     * @Description:
+     */
+    public static double round(String d1, String d2, int len) {
+        BigDecimal b1 = new BigDecimal(d1);
+        BigDecimal b2 = new BigDecimal(d2);
+        // 任何一个数字除以1都是原数字
+        // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
+        double res = b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return res;
+    }
+
+    public static Long double2Long(Double d) {
+        return Math.round(d);
+    }
+}

+ 15 - 0
src/main/java/com/winhc/bigdata/utils/CompanyUtils.java

@@ -54,6 +54,21 @@ public class CompanyUtils {
         return pattern.matcher(s).replaceAll("");
     }
 
+    public static Double companyScoreWeight(String reg_status, String cname, String reg_capital_amount, String company_type) {
+        if (cname == null || cleanup(cname).replaceAll("[0-9]", "").length() == 1)
+            return 0.01D;
+        if (cleanup(cname).replaceAll("[0-9]", "").length() <= 3)
+            return 0.3D;
+        if (reg_status == null || reg_status.contains("销") || reg_status.contains("消"))
+            return 1D;
+        Double amount = reg_capital_amount == null ? 0L : Double.parseDouble(reg_capital_amount);
+
+        Double w = Math.log(amount / 10000000 + 1) + 1;
+        if ("1".equals(company_type))
+            w = w + 3;
+        return w;
+    }
+
     public static JSONObject getCompanyName(String name) {
         if (StringUtils.isEmpty(name)) return null;
         else {