Jelajahi Sumber

优化健康状态记录

ximinghao 3 bulan lalu
induk
melakukan
ee030eab5b

+ 1 - 0
src/main/java/com/skyversation/xjcy/Timer.java

@@ -47,6 +47,7 @@ public class Timer {
     }
 
     @Scheduled(cron = "0 5 0 * * ?")
+    @PostConstruct
     public void checkEnterpriseHealth(){
         LocalDate now = LocalDate.now();
         LocalDateTime actuallyTime = now.minusDays(1).atTime(23,59,59,9999);

+ 12 - 0
src/main/java/com/skyversation/xjcy/bean/EnterpriseHealth.java

@@ -52,6 +52,16 @@ public class EnterpriseHealth {
      */
     private String cEnterpriseCode;
 
+    /**
+     * 应展示时间开始点
+     */
+    private LocalDateTime cShowTimeStart;
+
+    /**
+     * 应展示时间结束点
+     */
+    private LocalDateTime cShowTimeEnd;
+
     /**
      * 转换为JSONObject
      * @return JSONObject
@@ -65,6 +75,8 @@ public class EnterpriseHealth {
         json.put("c_health_start_time", this.cHealthStartTime.format(FORMATTER));
         json.put("c_health_end_time", this.cHealthEndTime.format(FORMATTER));
         json.put("c_enterprise_code", this.cEnterpriseCode);
+        json.put("c_show_start", this.cShowTimeStart.format(FORMATTER));
+        json.put("c_show_end", this.cShowTimeEnd.format(FORMATTER));
         json.put("title", this.cTitle);
         json.put("content", this.cDescribe);
         return json;

+ 66 - 44
src/main/java/com/skyversation/xjcy/computer/EnterpriseHealthComputer.java

@@ -32,72 +32,72 @@ public class EnterpriseHealthComputer {
         /**
          * 清算注销 - 企业已处于注销流程,请核查经营情况
          */
-        LIQUIDATION(10, "清算注销", "企业已处于注销流程,请核查经营情况"),
+        LIQUIDATION(10, "清算注销", "企业已处于注销流程,请核查经营情况", "day"),
 
         /**
          * 严重失信 - 企业列入严重违法失信名单,暂停政策申请
          */
-        SERIOUS_DISHONESTY(11, "严重失信", "企业列入严重违法失信名单,暂停政策申请"),
+        SERIOUS_DISHONESTY(11, "严重失信", "企业列入严重违法失信名单,暂停政策申请", "day"),
 
         /**
          * 股权出质 - 股权已全额出质,关注经营稳定性
          */
-        EQUITY_PLEDGE(12, "股权出质", "股权已全额出质,关注经营稳定性"),
+        EQUITY_PLEDGE(12, "股权出质", "股权已全额出质,关注经营稳定性", "day"),
 
         /**
          * 终本案件 - 存在大额未履行终本案件,注意法律风险
          */
-        FINAL_CASE(13, "终本案件", "存在大额未履行终本案件,注意法律风险"),
+        FINAL_CASE(13, "终本案件", "存在大额未履行终本案件,注意法律风险", "day"),
 
         /**
          * 税收跳水 - 税收断崖式下跌,需核实经营情况
          */
-        TAX_DIVE(14, "税收跳水", "税收断崖式下跌,需核实经营情况"),
+        TAX_DIVE(14, "税收跳水", "税收断崖式下跌,需核实经营情况", "season"),
 
         /**
          * 能耗异常 - 能耗接近零,疑似停产或外迁
          */
-        ENERGY_ABNORMAL(15, "能耗异常", "能耗接近零,疑似停产或外迁"),
+        ENERGY_ABNORMAL(15, "能耗异常", "能耗接近零,疑似停产或外迁", "season"),
 
         /**
          * 租约到期 - 租约即将到期未续签,提前跟进招商
          */
-        LEASE_EXPIRY(16, "租约到期", "租约即将到期未续签,提前跟进招商"),
+        LEASE_EXPIRY(16, "租约到期", "租约即将到期未续签,提前跟进招商", "day"),
 
         /**
          * 纳税逾期 - 多次逾期申报,提醒企业及时纳税
          */
-        TAX_OVERDUE(17, "纳税逾期", "多次逾期申报,提醒企业及时纳税"),
+        TAX_OVERDUE(17, "纳税逾期", "多次逾期申报,提醒企业及时纳税", "day"),
 
         /**
          * 税收上升 - 税收稳步提升,潜力优秀
          */
-        TAX_RISE(20, "税收上升", "税收稳步提升,潜力优秀"),
+        TAX_RISE(20, "税收上升", "税收稳步提升,潜力优秀", "season"),
 
         /**
          * 产值上升 - 产值稳步提升,潜力优秀
          */
-        OUTPUT_RISE(21, "产值上升", "产值稳步提升,潜力优秀"),
+        OUTPUT_RISE(21, "产值上升", "产值稳步提升,潜力优秀", "season"),
 
         /**
          * 升规成功 - 企业新晋规上,建议重点服务
          */
-        UPGRADE_SUCCESS(22, "升规成功", "企业新晋规上,建议重点服务"),
+        UPGRADE_SUCCESS(22, "升规成功", "企业新晋规上,建议重点服务", "month"),
 
         /**
          * 专利爆发 - 知识产权快速积累,创新力强
          */
-        PATENT_EXPLOSION(23, "专利爆发", "知识产权快速积累,创新力强"),
+        PATENT_EXPLOSION(23, "专利爆发", "知识产权快速积累,创新力强", "season"),
 
         /**
          * 500强投资 - 背靠500强,扩张潜力大
          */
-        TOP500_INVESTMENT(24, "500强投", "背靠500强,扩张潜力大"),
+        TOP500_INVESTMENT(24, "500强投", "背靠500强,扩张潜力大", "day"),
 
         /**
          * 产业新星 - 重点产业新落地,建议跟踪服务
          */
-        INDUSTRIAL_RISING_STAR(25, "产业新星", "重点产业新落地,建议跟踪服务");
+        INDUSTRIAL_RISING_STAR(25, "产业新星", "重点产业新落地,建议跟踪服务", "day");
 
         @Getter
         final int value;
@@ -105,11 +105,14 @@ public class EnterpriseHealthComputer {
         final String defaultName;
         @Getter
         final String defaultDescribe;
+        @Getter
+        final String showTime;
 
-        HealthType(int value, String defaultName, String defaultDescribe) {
+        HealthType(int value, String defaultName, String defaultDescribe, String showTime) {
             this.value = value;
             this.defaultName = defaultName;
             this.defaultDescribe = defaultDescribe;
+            this.showTime = showTime;
         }
     }
 
@@ -280,7 +283,7 @@ public class EnterpriseHealthComputer {
                         Collectors.toMap(
                                 enterpriseEconomic -> YearMonth.parse(enterpriseEconomic.getCYearMonth(), economicYearMonthFormat),
                                 Function.identity(),
-                                (a,b)->a
+                                (a, b) -> a
                         )
                 ));
     }
@@ -314,16 +317,16 @@ public class EnterpriseHealthComputer {
             List<List<EnterpriseEconomic>> seasonEconomic = getEconomicBySeasonList(enterprise, seasons);
             List<List<EnterpriseEconomic>> previousYearSeasonEconomic = getEconomicBySeasonList(enterprise, previousYearSeasons);
             //去年数据必须完整,避免因数据缺失异常标记
-            if (previousYearSeasonEconomic.stream().anyMatch(list->list.contains(null))) {
+            if (previousYearSeasonEconomic.stream().anyMatch(list -> list.contains(null))) {
                 continue;
             }
             //较新四个季度的税收统计
             BigDecimal riseRate = checkAllRiseAndGetRiseRate(seasonEconomic, previousYearSeasonEconomic);
             if (riseRate == null) continue;
             //当总额上升率超过20%时提交记录
-            if (riseRate.compareTo(BigDecimal.valueOf(12,1)) >= 0) {
+            if (riseRate.compareTo(BigDecimal.valueOf(12, 1)) >= 0) {
                 putResult(enterprise,
-                        HealthType.TAX_RISE.getDefaultName()+simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
+                        HealthType.TAX_RISE.getDefaultName() + simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
                         HealthType.TAX_RISE.getDefaultDescribe(),
                         HealthType.TAX_RISE,
                         time, seasons.get(0).getStartTime(), seasons.get(seasons.size() - 1).getEndTime());
@@ -346,7 +349,7 @@ public class EnterpriseHealthComputer {
             List<List<EnterpriseEconomic>> seasonEconomic = getEconomicBySeasonList(enterprise, seasons);
             List<List<EnterpriseEconomic>> previousYearSeasonEconomic = getEconomicBySeasonList(enterprise, previousYearSeasons);
             //去年数据必须完整,避免因数据缺失异常标记
-            if (previousYearSeasonEconomic.stream().anyMatch(list->list.contains(null))) {
+            if (previousYearSeasonEconomic.stream().anyMatch(list -> list.contains(null))) {
                 continue;
             }
             //计算上升率
@@ -355,9 +358,9 @@ public class EnterpriseHealthComputer {
                 continue;
             }
             //当总额上升率超过20%时提交记录
-            if (riseRate.compareTo(BigDecimal.valueOf(12,1)) >= 0) {
+            if (riseRate.compareTo(BigDecimal.valueOf(12, 1)) >= 0) {
                 putResult(enterprise,
-                        HealthType.OUTPUT_RISE.getDefaultName()+simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
+                        HealthType.OUTPUT_RISE.getDefaultName() + simpleDecimalFormat.format(riseRate.subtract(BigDecimal.ONE)),
                         HealthType.OUTPUT_RISE.getDefaultDescribe(),
                         HealthType.OUTPUT_RISE,
                         time, seasons.get(0).getStartTime(), seasons.get(seasons.size() - 1).getEndTime());
@@ -375,10 +378,10 @@ public class EnterpriseHealthComputer {
         Season season = getLastSeason(time);
         Season previousYearSeason = season.minusSeasons(4);
         for (Enterprise enterprise : enterprises) {
-            List<EnterpriseEconomic> seasonEconomic = getEconomicBySeason(enterprise,season);
-            List<EnterpriseEconomic> previousYearSeasonEconomic = getEconomicBySeason(enterprise,previousYearSeason);
+            List<EnterpriseEconomic> seasonEconomic = getEconomicBySeason(enterprise, season);
+            List<EnterpriseEconomic> previousYearSeasonEconomic = getEconomicBySeason(enterprise, previousYearSeason);
             //今年数据必须完整,避免因数据缺失异常标记
-            if (seasonEconomic.stream().anyMatch(Objects::isNull)){
+            if (seasonEconomic.stream().anyMatch(Objects::isNull)) {
                 continue;
             }
             BigDecimal seasonTax = seasonEconomic.stream()
@@ -393,8 +396,8 @@ public class EnterpriseHealthComputer {
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             if (seasonTax.compareTo(previousYearSeasonTax) < 0) {
                 BigDecimal divide = seasonTax.divide(previousYearSeasonTax, RoundingMode.HALF_UP);
-                if (divide.compareTo(BigDecimal.valueOf(7,1))<0){
-                    putResult(enterprise,HealthType.TAX_DIVE,time,season.getStartTime(),season.getEndTime());
+                if (divide.compareTo(BigDecimal.valueOf(7, 1)) < 0) {
+                    putResult(enterprise, HealthType.TAX_DIVE, time, season.getStartTime(), season.getEndTime());
                 }
             }
 
@@ -411,18 +414,18 @@ public class EnterpriseHealthComputer {
         LocalDate nowDate = time.toLocalDate();
         for (Enterprise enterprise : enterprises) {
             String enterpriseCode = enterprise.getCUnifiedSocialCreditCode();
-            if (enterpriseCode==null || enterpriseCode.isEmpty()) continue;
-            List<LeaseDetail> leases =enterpriseLeases.get(enterpriseCode);
-            if (leases==null) continue;
+            if (enterpriseCode == null || enterpriseCode.isEmpty()) continue;
+            List<LeaseDetail> leases = enterpriseLeases.get(enterpriseCode);
+            if (leases == null) continue;
             boolean leasesAlmostOutDate = leases.stream()
                     .filter(Objects::nonNull)
                     .filter(leaseDetail -> !leaseDetail.getStartDate().isAfter(nowDate))
                     .map(LeaseDetail::getCEndDate)
                     .filter(Objects::nonNull)
-                    .filter(t-> !t.isBefore(nowDate))
-                    .anyMatch(t-> Duration.between(nowDate.atStartOfDay(),t.atStartOfDay()).toDays()<30);
+                    .filter(t -> !t.isBefore(nowDate))
+                    .anyMatch(t -> Duration.between(nowDate.atStartOfDay(), t.atStartOfDay()).toDays() < 30);
             if (leasesAlmostOutDate) {
-                putResult(enterprise,HealthType.LEASE_EXPIRY,time,nowDate.atStartOfDay(),nowDate.plusDays(1).atStartOfDay());
+                putResult(enterprise, HealthType.LEASE_EXPIRY, time, nowDate.atStartOfDay(), nowDate.plusDays(1).atStartOfDay());
             }
         }
     }
@@ -442,8 +445,27 @@ public class EnterpriseHealthComputer {
      */
     private void putResult(Enterprise enterprise, String title, String describe, HealthType type, LocalDateTime computeTime,
                            LocalDateTime healthStart, LocalDateTime healthEnd) {
+        LocalDateTime showTimeStart = computeTime.plusDays(1).toLocalDate().atStartOfDay();
+        LocalDateTime showTimeEnd;
+        switch (type.showTime) {
+            case "day": {
+                showTimeEnd = showTimeStart.plusDays(1);
+                break;
+            }
+            case "month": {
+                showTimeEnd = showTimeStart.plusMonths(1);
+                break;
+            }
+            case "season": {
+                showTimeEnd = showTimeStart.plusMonths(3);
+                break;
+            }
+            default: {
+                showTimeEnd = showTimeStart.plusMonths(1);
+            }
+        }
         EnterpriseHealth result = new EnterpriseHealth(title, describe, type.value, computeTime,
-                healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode());
+                healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode(),showTimeStart,showTimeEnd);
         results.add(result);
     }
 
@@ -458,9 +480,7 @@ public class EnterpriseHealthComputer {
      */
     private void putResult(Enterprise enterprise, HealthType type, LocalDateTime computeTime,
                            LocalDateTime healthStart, LocalDateTime healthEnd) {
-        EnterpriseHealth result = new EnterpriseHealth(type.defaultName, type.defaultDescribe, type.value, computeTime,
-                healthStart, healthEnd, enterprise.getCUnifiedSocialCreditCode());
-        results.add(result);
+        putResult(enterprise, type.getDefaultName(), type.getDefaultDescribe(), type, computeTime, healthStart, healthEnd);
     }
 
     /**
@@ -468,10 +488,10 @@ public class EnterpriseHealthComputer {
      * 按季节分组,每个季节包含该季节内各个月份的经济数据列表
      *
      * @param enterprise 企业对象,包含企业基本信息
-     * @param seasons 季节列表,每个季节包含对应的年月信息
+     * @param seasons    季节列表,每个季节包含对应的年月信息
      * @return 按季节分组的企业经济数据二维列表
-     *         外层列表对应每个季节,内层列表对应该季节各个月份的经济数据
-     *         如果某个月份没有数据,对应位置可能为null
+     * 外层列表对应每个季节,内层列表对应该季节各个月份的经济数据
+     * 如果某个月份没有数据,对应位置可能为null
      */
     private List<List<EnterpriseEconomic>> getEconomicBySeasonList(Enterprise enterprise, List<Season> seasons) {
         List<List<EnterpriseEconomic>> seasonEconomic = new ArrayList<>();
@@ -579,6 +599,7 @@ public class EnterpriseHealthComputer {
 
     /**
      * 分别计算输入1和输入2的合计值并做除法
+     *
      * @return 除法的结果,当输入2为0时返回空
      */
     private static BigDecimal sumAndDivide(List<BigDecimal> valueList1, List<BigDecimal> valueList2) {
@@ -601,23 +622,24 @@ public class EnterpriseHealthComputer {
 
     /**
      * 计算输入的连续两年的数据每个季节都同比上升,在这个基础上计算上升率
+     *
      * @return
      */
     private static BigDecimal checkAllRiseAndGetRiseRate(List<List<EnterpriseEconomic>> seasonEconomic, List<List<EnterpriseEconomic>> previousYearSeasonEconomic) {
         List<BigDecimal> seasonTax = seasonEconomic.stream().map(
-                l->l.stream()
+                l -> l.stream()
                         .filter(Objects::nonNull)
                         .map(EnterpriseEconomic::getCApprovedTax)
                         .filter(Objects::nonNull)
-                        .reduce(BigDecimal.ZERO,BigDecimal::add)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add)
         ).collect(Collectors.toList());
         //较旧四个季度的税收统计
         List<BigDecimal> previousYearSeasonTax = previousYearSeasonEconomic.stream().map(
-                l->l.stream()
+                l -> l.stream()
                         .filter(Objects::nonNull)
                         .map(EnterpriseEconomic::getCApprovedTax)
                         .filter(Objects::nonNull)
-                        .reduce(BigDecimal.ZERO,BigDecimal::add)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add)
         ).collect(Collectors.toList());
         //检查所有季度是否同比上升
         if (!isAllUpper(seasonTax, previousYearSeasonTax)) {