ソースを参照

feat:账款剩余三个动态

zhangwei 3 年 前
コミット
e1eff3c23e

+ 29 - 0
src/main/java/com/winhc/repal/cloud/DataMiddlewareService.java

@@ -1,13 +1,21 @@
 package com.winhc.repal.cloud;
 
 import com.winhc.common.base.ApiDataResult;
+import com.winhc.common.model.base.VOPage;
 import com.winhc.repal.cloud.dto.GetCompanyRiskNumDTO;
 import com.winhc.repal.cloud.dto.GetFinanceDynamicNumDTO;
+import com.winhc.repal.cloud.dto.QueryESFinanceDynamicDTO;
+import com.winhc.repal.cloud.dto.QueryV8DynamicDTO;
 import com.winhc.repal.cloud.vo.CompanyRiskNumVO;
 import com.winhc.repal.cloud.vo.FinanceDynamicNumVO;
+import com.winhc.repal.cloud.vo.FinanceDynamicVO;
+import com.winhc.repal.cloud.vo.V8DynamicVO;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -45,4 +53,25 @@ public interface DataMiddlewareService {
      */
     @PostMapping("/risk/companyList")
     ApiDataResult<List<CompanyRiskNumVO>> getCompanyRiskNumList(@RequestBody GetCompanyRiskNumDTO dto);
+
+    /**
+     * 分页查询v8索引
+     * @param dto
+     * @param pageNum
+     * @param pagSize
+     * @return
+     */
+    @GetMapping("/dynamic/v8/page")
+    ApiDataResult<VOPage<V8DynamicVO>> pageDynamic(QueryV8DynamicDTO dto,
+                                                   @RequestParam(defaultValue = "1") Integer pageNum,
+                                                   @RequestParam(defaultValue = "10") Integer pagSize);
+
+    /**
+     * 查找财产线索动态
+     * @param dto
+     * @return
+     */
+    @PostMapping("/dynamic/finance/v8/page")
+    @ApiOperation("企业财产线索动态 分页")
+    ApiDataResult<VOPage<FinanceDynamicVO>> pageFinanceDynamic(@RequestBody QueryESFinanceDynamicDTO dto);
 }

+ 58 - 0
src/main/java/com/winhc/repal/cloud/dto/QueryESFinanceDynamicDTO.java

@@ -0,0 +1,58 @@
+package com.winhc.repal.cloud.dto;
+
+import com.winhc.common.model.base.DTOPage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @description: 查询财产线索动态
+ * @author: Anakin
+ * @date 2020.12.17 16:09
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+@ApiModel(description = "查询财产线索动态 DTO")
+public class QueryESFinanceDynamicDTO extends DTOPage {
+    @ApiModelProperty("企业名称列表|企业CID列表")
+    private List<String> keyWords;
+    @ApiModelProperty("财产流向,0 -> 流入 1 -> 流出")
+    private String flowType;
+    @ApiModelProperty("风险等级,1->低级 2->中级 3->高级")
+    private String infoRiskLevel;
+    @ApiModelProperty("线索类型" +
+            "1  -> 新增破产公告\n" +
+            "2  -> 注册资本上升\n" +
+            "3  -> 新增招标信息\n" +
+            "4  -> 软件著作权\n" +
+            "5  -> 作品著作权\n" +
+            "6  -> 有恢复执行案件即将开庭\n" +
+            "7  -> 失信信息移除\n" +
+            "8  -> 出质了持有股权\n" +
+            "9  -> 有新的融资\n" +
+            "10 -> 新增了股东\n" +
+            "11 -> 股东退出\n" +
+            "12 -> 购买了新的土地\n" +
+            "13 -> 抵押了公司土地\n" +
+            "14 -> 资产被抵押\n" +
+            "15 -> 新增专利信息\n" +
+            "16 -> 新增商标信息\n" +
+            "17 -> 被执行人信息移除\n" +
+            "18 -> 限制高消费移除\n" +
+            "19 -> 有恢复执行案件\n" +
+            "20 -> 新增胜诉案件")
+    private String type;
+    @ApiModelProperty("开始时间")
+    private String dateFrom;
+    @ApiModelProperty("结束时间")
+    private String dateEnd;
+    @ApiModelProperty("入库开始时间")
+    private String createDateFrom;
+    @ApiModelProperty("入库结束时间")
+    private String createDateEnd;
+}

+ 32 - 0
src/main/java/com/winhc/repal/cloud/dto/QueryV8DynamicDTO.java

@@ -0,0 +1,32 @@
+package com.winhc.repal.cloud.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @description: 查询动态数据
+ * @author: Anakin
+ * @date 2021.7.13 10:28
+ */
+@Data
+@ApiModel(description = "查询动态数据")
+public class QueryV8DynamicDTO {
+    @ApiModelProperty("实体名称")
+    private List<String> entityNames;
+    @ApiModelProperty("实体ID")
+    private List<String> entityIds;
+    @ApiModelProperty("风险等级 0,利好;1,提示;2,警示;3,高风险")
+    private String riskLevel;
+    @ApiModelProperty("动态类型")
+    private List<String> infoTypes;
+    @ApiModelProperty("开始日期 yyyy-MM-dd")
+    private String startDate;
+    @ApiModelProperty("结束日期 yyyy-MM-dd")
+    private String endDate;
+    @ApiModelProperty("动态入库日期 yyyy-MM-dd")
+    private String updateTime;
+
+}

+ 25 - 0
src/main/java/com/winhc/repal/cloud/vo/AssociationEntityInfo.java

@@ -0,0 +1,25 @@
+package com.winhc.repal.cloud.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description: 动态信息 实体对象
+ * @author: Anakin
+ * @date 2021.8.2 19:25
+ */
+@Data
+@ApiModel(description = "关联实体")
+public class AssociationEntityInfo {
+    @ApiModelProperty("实体ID")
+    private String keyno;
+    @ApiModelProperty("实体名称")
+    private String name;
+    @ApiModelProperty(value = "风险等级", example = "利好(0),提示(1),警示(2),高风险(3)")
+    private String riskLevel;
+    @ApiModelProperty(value = "实体角色", example = "做为被告/被上诉人")
+    private String rtaInfo;
+    @ApiModelProperty("是否为当前查询的公司")
+    private boolean hit = false;
+}

+ 94 - 0
src/main/java/com/winhc/repal/cloud/vo/DynamicDataBO.java

@@ -0,0 +1,94 @@
+package com.winhc.repal.cloud.vo;
+
+import cn.hutool.core.collection.CollUtil;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @description: 动态数据对象
+ * @author: Anakin
+ * @date 2021.8.3 15:25
+ */
+@Data
+@ApiModel(description = "动态数据对象")
+public class DynamicDataBO {
+    private Object K;
+    private Object V;
+    private List<DynamicItemBO> L;
+
+    public DynamicDataBO(Object k, Object v) {
+        this.K = k;
+        this.V = v;
+    }
+
+    public DynamicDataBO(List<DynamicItemBO> l) {
+        this.L = l;
+    }
+
+    public DynamicDataBO(Object k, List<DynamicItemBO> l) {
+        this.K = k;
+        this.L = l;
+    }
+
+    public DynamicDataBO(Object k, DynamicItemBO... item) {
+        this.K = k;
+        this.L = CollUtil.newArrayList(item);
+    }
+
+    public DynamicDataBO(){}
+
+    public DynamicDataBO(Object k, Object v, List<DynamicItemBO> l) {
+        K = k;
+        V = v;
+        L = l;
+    }
+
+    /**
+     * [
+     *        {
+     * 		"K": "公告类型",-------------------------------------------- 公告类型:法院公告
+     * 		"V": "法院公告"
+     *    },
+     *    {
+     * 		"K": "案号",
+     * 		"V": "JTY(2019)"
+     *    },
+     *    {
+     * 		"K": "当事人",
+     * 		"L": [------------------------------------------------------- L中内容为拼接一行内容
+     *            {
+     * 				"I": "dkk9895667kk17nk78gh",------------------------- V为显示字段,I不为空则V高亮,根据ID长短跳转企业、自然人
+     * 				"V": "华为技术有限公司"
+     *            },
+     *            {
+     * 				"V":","
+     *            },
+     *            {
+     * 				"I": "dkk8989090",
+     * 				"V": "乐视控股(北京)有限公司"
+     *            }
+     * 		]
+     *    },
+     *    {
+     * 		"L": [
+     *            {
+     * 				"V": "从"
+     *            },
+     *            {
+     * 				"I": "dkk9895667kk17nk78gh",
+     * 				"V": "华为技术有限公司"
+     *            },
+     *            {
+     * 				"V": "变为"
+     *            },
+     *            {
+     * 				"I": "dkk8989090",
+     * 				"V": "乐视控股(北京)有限公司"
+     *            }
+     * 		]
+     *    }
+     * ]
+     */
+}

+ 40 - 0
src/main/java/com/winhc/repal/cloud/vo/DynamicItemBO.java

@@ -0,0 +1,40 @@
+package com.winhc.repal.cloud.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @description: 动态JSON节点类
+ * @author: Anakin
+ * @date 2021.8.4 14:02
+ */
+@Data
+public class DynamicItemBO {
+    private Object I;
+    private Object V;
+
+    public DynamicItemBO(Object i, Object v) {
+        this.I = i;
+        this.V = v;
+    }
+
+    public DynamicItemBO(Object v) {
+        this.V = v;
+    }
+
+    public DynamicItemBO(){}
+
+    /**
+     * 连接两个节点
+     * @param bf
+     * @param sym
+     * @param af
+     * @return
+     */
+    public static List<DynamicItemBO> connect(List<DynamicItemBO> bf, String sym, List<DynamicItemBO> af) {
+        bf.add(new DynamicItemBO(sym));
+        bf.addAll(af);
+        return bf;
+    }
+}

+ 77 - 0
src/main/java/com/winhc/repal/cloud/vo/FinanceDynamicVO.java

@@ -0,0 +1,77 @@
+package com.winhc.repal.cloud.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description: 财产线索动态 VO
+ * @author: Anakin
+ * @date 2020.12.17 17:01
+ */
+@Data
+@ApiModel(description = "财产线索动态 VO")
+public class FinanceDynamicVO {
+    @ApiModelProperty("ES主键")
+    private String id;
+    @ApiModelProperty("业务ID")
+    private String bizId;
+    @ApiModelProperty("企业CID")
+    private String cid;
+    @ApiModelProperty("企业名称")
+    private String cname;
+    @ApiModelProperty("财产流向,0 -> 流入 1 -> 流出")
+    private String flowType;
+    @ApiModelProperty("风险等级,1->低级 2->中级 3->高级")
+    private String infoRiskLevel;
+    @ApiModelProperty("维度类型 " +
+            "1 ->  BANKRUPTCY_OPEN_CASE//HBase\n" +
+            "2 ->  COMPANY//HBase\n" +
+            "3 ->  COMPANY_BID_LIST//HBase\n" +
+            "4 ->  COMPANY_COPYRIGHT_REG_LIST//HBase\n" +
+            "5 ->  COMPANY_COPYRIGHT_WORKS_LIST//HBase\n" +
+            "6 ->  COMPANY_COURT_OPEN_ANNOUNCEMENT_LIST//HBase\n" +
+            "7 ->  COMPANY_DISHONEST_INFO//HBase\n" +
+            "8 ->  COMPANY_EQUITY_INFO_LIST//HBase\n" +
+            "9 ->  COMPANY_FINANCE//HBase\n" +
+            "10->  COMPANY_HOLDER//HBase\n" +
+            "11->  COMPANY_LAND_ANNOUNCEMENT//HBase\n" +
+            "12->  COMPANY_LAND_MORTGAGE//HBase\n" +
+            "13->  COMPANY_MORTGAGE_INFO//HBase\n" +
+            "14->  COMPANY_PATENT_LIST//HBase\n" +
+            "15->  COMPANY_TM//HBase\n" +
+            "16->  COMPANY_ZXR_LIST//HBase\n" +
+            "17->  COMPANY_ZXR_RESTRICT//HBase\n" +
+            "18->  WENSHU_DETAIL//ES\n" +
+            "18->  WENSHU_DETAIL//ES")
+    private String dimensionType;
+    @ApiModelProperty("线索类型" +
+            "1  -> 新增破产公告\n" +
+            "2  -> 注册资本上升\n" +
+            "3  -> 新增招标信息\n" +
+            "4  -> 软件著作权\n" +
+            "5  -> 作品著作权\n" +
+            "6  -> 有恢复执行案件即将开庭\n" +
+            "7  -> 失信信息移除\n" +
+            "8  -> 出质了持有股权\n" +
+            "9  -> 有新的融资\n" +
+            "10 -> 新增了股东\n" +
+            "11 -> 股东退出\n" +
+            "12 -> 购买了新的土地\n" +
+            "13 -> 抵押了公司土地\n" +
+            "14 -> 资产被抵押\n" +
+            "15 -> 新增专利信息\n" +
+            "16 -> 新增商标信息\n" +
+            "17 -> 被执行人信息移除\n" +
+            "18 -> 限制高消费移除\n" +
+            "19 -> 有恢复执行案件\n" +
+            "20 -> 新增胜诉案件" +
+            "21 -> 接受了他人土地抵押")
+    private String type;
+    @ApiModelProperty("变更时间")
+    private String changeTime;
+    @ApiModelProperty("创建时间")
+    private String createTime;
+    @ApiModelProperty("线索详情")
+    private Object detail;
+}

+ 41 - 0
src/main/java/com/winhc/repal/cloud/vo/V8DynamicVO.java

@@ -0,0 +1,41 @@
+package com.winhc.repal.cloud.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @description: v8动态信息
+ * @author: Anakin
+ * @date 2021.8.2 10:40
+ */
+@Data
+@ApiModel(description = "v8 动态信息")
+public class V8DynamicVO {
+    @ApiModelProperty("ID")
+    private String id;
+    @ApiModelProperty("实体对象列表")
+    private List<AssociationEntityInfo> associationEntityInfo;
+    @ApiModelProperty("业务变更时间 yyyy-MM-dd")
+    private String bizTime;
+    @ApiModelProperty("0 非历史, 1 历史")
+    private String deleted;
+    @ApiModelProperty("动态CODE")
+    private String dynamicCode;
+    @ApiModelProperty("动态内容")
+    private String dynamicInfo;
+    @ApiModelProperty("动态JSON内容")
+    private List<DynamicDataBO> dynamicJSON;
+    @ApiModelProperty("动态时间 yyyy-MM-dd")
+    private String dynamicTime;
+    @ApiModelProperty("详情Key")
+    private String rowkey;
+    @ApiModelProperty("动态类型")
+    private String tn;
+    @ApiModelProperty("动态类型")
+    private String infoType;
+    @ApiModelProperty("风险等级 利好(0),提示(1),警示(2),高风险(3)")
+    private String riskLevel;
+}

+ 4 - 7
src/main/java/com/winhc/repal/enums/Dict.java

@@ -2,6 +2,10 @@ package com.winhc.repal.enums;
 
 import cn.hutool.core.util.ObjectUtil;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @description: 字典数据
  *
@@ -50,13 +54,6 @@ public class Dict {
         }
     }
 
-    public enum RemindEnum {
-        /**
-         * 智能提醒类型
-         */
-        逾期提醒,账款评级,财产线索,风险预警;
-    }
-
     public enum custTypeEnum {
         客户(1),供应商(2);
         public Integer code;

+ 131 - 0
src/main/java/com/winhc/repal/enums/DynamicEnum.java

@@ -0,0 +1,131 @@
+package com.winhc.repal.enums;
+
+import java.util.Objects;
+
+/**
+ * @description: 动态类型
+ * @author: Anakin
+ * @date 2021.8.2 10:12
+ */
+public enum DynamicEnum {
+    //经营异常新增
+    经营异常("company_abnormal_info", "301901", "1","company_abnormal_info","JingYingYiChangDet"),
+    经营异常_移除("company_abnormal_info", "301902", "1","","JingYingYiChangDet"),
+    法院公告("company_court_announcement","302001", "2","company_court_announcement_list","KaiTingGongGaoDet"),
+    开庭公告("company_court_open_announcement","302101", "3","company_court_open_announcement_list",""),
+    立案信息("company_court_register","302201", "4","company_court_register_list","LiAnXinXiDet"),
+    环保处罚("company_env_punishment","302401", "5","","HuanBaoChuFaDet"),
+    严重违法("company_illegal_info","302501", "6","company_illegal_info","YanZhongWeiFaXingWeiDet"),
+    行政处罚("company_punishment_info","302601", "7","","XingZhengChuFaDet"),
+    行政处罚_信用中国("company_punishment_info","302601", "7","","XingZhengChuFaDet"),
+    送达公告("company_send_announcement","302701", "8","","SongDaGongGaoDet"),
+    税收违法("company_tax_contravention","302801", "9","company_tax_contravention","ShuiShouWeiFaDet"),
+    司法拍卖("auction_tracking","302901", "10","company_judicial_sale_combine_list","PaiMaiXiangQing"),
+    欠税公告("company_own_tax","303001", "11","company_own_tax","QianShuiGongGaoDet"),
+    询价评估结果("zxr_evaluate_results","304501", "12","","XunJiaPingGuDet"),
+    破产信息("bankruptcy_open_case","303101", "13","bankruptcy_open_case","PoChanChongZhengDet"),
+    简易注销("company_brief_cancel_announcement","303201", "14","company_brief_cancel_announcement","JianYiZhuXiao"),
+    失信被执行人("company_dishonest_info","303301", "15","company_dishonest_info","ShiXinQingKuangDet"),
+    公示催告("company_public_announcement","303401", "16","","GongShiCuiGaoDet"),
+    被执行人("company_zxr","303501", "17","company_zxr_list","BeiZhiXingRenDet"),
+    终本案件("company_zxr_final_case","303601", "18","company_zxr_final_case","ZhongBenAnJianDet"),
+    限制高消费("company_zxr_restrict","303701", "19","company_zxr_restrict","JYXianZhiGaoXiaoFeiDet"),
+    限制出境("restrictions_on_exit","303801", "20","","XianZhiChuJingDet"),
+    股权出质("company_equity_info","303901", "21","company_equity_info","GuQuanChuZhiDet"),
+    股权质押("company_equity_pledge_holder","304001", "22","","GuQuanZhiYaDet"),
+    股权冻结("company_judicial_assistance","304101", "23","","GuQuanDongJieDet"),
+    土地抵押("company_land_mortgage","304201", "24","company_land_mortgage","TuDiDiYaDet"),
+    动产抵押("company_mortgage_info","304301", "25","company_mortgage_info","DongChanDiYaDet"),
+    裁判文书("company_lawsuit","304401", "26","wenshu_detail_combine","JYWenShuDet"),
+
+    抽查检查("company_check_info","201101", "27","","ChouChaJianChaDet"),
+    双随机抽查("company_double_random_check_info","201201", "28","","ShuangSuiJiChouChaDet"),
+    融资信息("company_finance","201301", "29","","RongZhiXinXi"),
+    行政许可("company_license","201401", "30","","XingZhenXuKeDet"),
+    行政许可_信用中国("company_license_creditchina","201401", "30","","XingZhenXuKeDet"),
+    购地信息("company_land_announcement","201501", "31","","GouDiXinXiDet"),
+    地块公示("company_land_publicity","201601", "32","","TuDiXinXiDet"),
+    土地转让("company_land_transfer","201701", "33","company_land_transfer","TuDiZhuanRangDet"),
+    知识产权("intellectual","201801", "34","",""),
+//    公司名称("intellectual","101001"),
+    股东变更("company_holder","101101","42","company_holder","GuDongBianGengDet")
+    ;
+    private String tn;
+    private String code;
+    private String infoType;
+    private String opportunity;
+    private String routing;
+
+    DynamicEnum(String tn, String code, String infoType, String opportunity, String routing) {
+        this.code = code;
+        this.tn = tn;
+        this.infoType = infoType;
+        this.opportunity = opportunity;
+        this.routing = routing;
+    }
+
+    public static DynamicEnum getEnum(String code) {
+        for (DynamicEnum en : DynamicEnum.values()) {
+            if (Objects.equals(en.getCode(), code)) {
+                return en;
+            }
+        }
+        return null;
+    }
+
+    public static String getDescByTn(String tn) {
+        for (DynamicEnum en : DynamicEnum.values()) {
+            if (Objects.equals(en.getTn(), tn)) {
+                return en.name();
+            }
+        }
+        return null;
+    }
+
+    public static String getOpportunityByTn(String tn) {
+        for (DynamicEnum en : DynamicEnum.values()) {
+            if (Objects.equals(en.getTn(), tn)) {
+                return en.getOpportunity();
+            }
+        }
+        return null;
+    }
+
+    public static String getInfoTypeByTn(String tn) {
+        for (DynamicEnum en : DynamicEnum.values()) {
+            if (Objects.equals(en.getTn(), tn)) {
+                return en.getInfoType();
+            }
+        }
+        return null;
+    }
+
+    public static String getRoutingByTn(String tn) {
+        for (DynamicEnum en : DynamicEnum.values()) {
+            if (Objects.equals(en.getTn(), tn)) {
+                return en.getRouting();
+            }
+        }
+        return null;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getTn() {
+        return tn;
+    }
+
+    public String getInfoType() {
+        return infoType;
+    }
+
+    public String getOpportunity() {
+        return opportunity;
+    }
+
+    public String getRouting() {
+        return routing;
+    }
+}

+ 45 - 0
src/main/java/com/winhc/repal/enums/FinanceDynamicTypeEnum.java

@@ -0,0 +1,45 @@
+package com.winhc.repal.enums;
+
+/**
+ * @author Aaron
+ * @date 2020/12/19 9:47
+ * @description
+ */
+public enum FinanceDynamicTypeEnum {
+    /**
+     * 财产动态类型
+     */
+    新增破产公告("1","新增破产公告"),注册资本上升("2","注册资本上升"),新增招标信息("3","新增招标信息"),
+    软件著作权("4","新增软件著作权"),作品著作权("5","新增作品著作权"),有恢复执行案件即将开庭("6","有恢复执行案件即将开庭"),
+    失信信息移除("7","失信信息移除"),出质了持有股权("8","出质了持有股权"),有新的融资("9","有新的融资"),
+    新增了股东("10","新增了股东"),股东退出("11","股东退出"),购买了新的土地("12","购买了新的土地"),
+    抵押了公司土地("13","抵押了公司土地"),资产被抵押("14","资产被抵押"),新增专利信息("15","新增专利信息"),
+    新增商标信息("16","新增商标信息"),被执行人信息移除("17","被执行人信息移除"),限制高消费移除("18","限制高消费移除"),
+    有恢复执行案件("19","有恢复执行案件"),新增胜诉案件("20","新增胜诉案件"),接受了他人土地抵押("21","接受了他人土地抵押"),
+    有资产即将被司法拍卖("22","有资产即将被司法拍卖");
+
+    private String code;
+    private String desc;
+
+    FinanceDynamicTypeEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static String getDescByCode(String code) {
+        for (FinanceDynamicTypeEnum e : FinanceDynamicTypeEnum.values()) {
+            if (e.getCode().equals(code)) {
+                return e.getDesc();
+            }
+        }
+        return null;
+    }
+}

+ 28 - 0
src/main/java/com/winhc/repal/service/CompanyService.java

@@ -0,0 +1,28 @@
+package com.winhc.repal.service;
+
+import com.winhc.common.model.base.VOPage;
+import com.winhc.repal.cloud.dto.QueryESFinanceDynamicDTO;
+import com.winhc.repal.cloud.dto.QueryV8DynamicDTO;
+import com.winhc.repal.cloud.vo.FinanceDynamicVO;
+import com.winhc.repal.cloud.vo.V8DynamicVO;
+
+/**
+ * @Description: CompanyService
+ * @Author: xda
+ * @Date: 2020/12/15  16:57
+ */
+public interface CompanyService {
+    /**
+     * 查询企业动态
+     * @param dto
+     * @return
+     */
+    VOPage<V8DynamicVO> queryDynamic(QueryV8DynamicDTO dto, Integer pageNum, Integer pageSize);
+
+    /**
+     * 分页查询财产动态
+     * @param dto
+     * @return
+     */
+    VOPage<FinanceDynamicVO> pageFinanceDynamic(QueryESFinanceDynamicDTO dto);
+}

+ 53 - 0
src/main/java/com/winhc/repal/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,53 @@
+package com.winhc.repal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.winhc.common.base.ApiDataResult;
+import com.winhc.common.model.base.VOPage;
+import com.winhc.repal.cloud.DataMiddlewareService;
+import com.winhc.repal.cloud.dto.QueryESFinanceDynamicDTO;
+import com.winhc.repal.cloud.dto.QueryV8DynamicDTO;
+import com.winhc.repal.cloud.vo.FinanceDynamicVO;
+import com.winhc.repal.cloud.vo.V8DynamicVO;
+import com.winhc.repal.service.CompanyService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * @Description: CompanyServiceImpl
+ * @Author: xda
+ * @Date: 2020/12/15  16:58
+ */
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    public static final Logger LOGGER = LoggerFactory.getLogger(CompanyServiceImpl.class);
+
+    @Autowired
+    private DataMiddlewareService dataMiddlewareService;
+
+
+    @Override
+    public VOPage<V8DynamicVO> queryDynamic(QueryV8DynamicDTO dto, Integer pageNum, Integer pageSize) {
+        ApiDataResult<VOPage<V8DynamicVO>> apiDataResult = dataMiddlewareService.pageDynamic(dto,pageNum,pageSize);
+        if(Objects.isNull(apiDataResult)){
+            LOGGER.error("未查到对应公司的动态:[{}]", JSON.toJSONString(dto));
+            return new VOPage<>();
+        }
+        return apiDataResult.getData();
+    }
+
+
+    @Override
+    public VOPage<FinanceDynamicVO> pageFinanceDynamic(QueryESFinanceDynamicDTO dto) {
+        ApiDataResult<VOPage<FinanceDynamicVO>> apiDataResult = dataMiddlewareService.pageFinanceDynamic(dto);
+        if (Objects.isNull(apiDataResult)) {
+            LOGGER.error("未查到对应公司的动态:[{}]", JSON.toJSONString(dto));
+            return new VOPage<>();
+        }
+        return apiDataResult.getData();
+    }
+}

+ 6 - 6
src/main/java/com/winhc/repal/service/impl/RepalRemindHistoryServiceImpl.java

@@ -58,16 +58,16 @@ public class RepalRemindHistoryServiceImpl extends ServiceImpl<RepalRemindHistor
             return result;
         }
         unReadCounts.forEach(countVO -> {
-            if (Dict.RemindEnum.风险预警.name().equals(countVO.getRemindType())) {
+            if (RemindEnum.风险预警.name().equals(countVO.getRemindType())) {
                 result.setUnreadRiskCount(countVO.getCount());
             }
-            if (Dict.RemindEnum.财产线索.name().equals(countVO.getRemindType())) {
+            if (RemindEnum.财产线索.name().equals(countVO.getRemindType())) {
                 result.setUnreadFinanceCount(countVO.getCount());
             }
-            if (Dict.RemindEnum.账款评级.name().equals(countVO.getRemindType())) {
+            if (RemindEnum.账款评级.name().equals(countVO.getRemindType())) {
                 result.setUnreadRankCount(countVO.getCount());
             }
-            if (Dict.RemindEnum.逾期提醒.name().equals(countVO.getRemindType())) {
+            if (RemindEnum.逾期提醒.name().equals(countVO.getRemindType())) {
                 result.setUnreadOverdueCount(countVO.getCount());
             }
         });
@@ -86,7 +86,7 @@ public class RepalRemindHistoryServiceImpl extends ServiceImpl<RepalRemindHistor
         }
         OverdueEnum overdueEnum = getDaysBetween(endDate);
         LambdaQueryWrapper<RepalRemindDefinition> qw = Wrappers.lambdaQuery(RepalRemindDefinition.class);
-        qw.eq(RepalRemindDefinition::getRemindType, Dict.RemindEnum.账款评级.name());
+        qw.eq(RepalRemindDefinition::getRemindType, RemindEnum.账款评级.name());
         if (RepalBillStatusEnum.PROGRESSING.getCode().equals(repalBill.getRepalBillStatus())
                 || !RepalBillStageEnum.NON_PROSECUTE.getCode().equals(repalBill.getRepalBillStage())) {
             qw.eq(RepalRemindDefinition::getOpportunity, diagnosis.getDiagnosisGrade());
@@ -118,7 +118,7 @@ public class RepalRemindHistoryServiceImpl extends ServiceImpl<RepalRemindHistor
                             changeStr1,
                             overdueEnum.name()))
                     .setFunctionList(accountRemindDefinition.getFunctionList())
-                    .setRemindType(Dict.RemindEnum.账款评级.name())
+                    .setRemindType(RemindEnum.账款评级.name())
                     .setReadStatus(ReadStatusEnum.未读.getCode());
             save(accountRemindHistory);
 //            //推送

+ 403 - 0
src/main/java/com/winhc/repal/task/SmartRemindTask.java

@@ -0,0 +1,403 @@
+package com.winhc.repal.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.winhc.common.model.base.VOPage;
+import com.winhc.repal.cloud.dto.QueryESFinanceDynamicDTO;
+import com.winhc.repal.cloud.dto.QueryV8DynamicDTO;
+import com.winhc.repal.cloud.vo.FinanceDynamicVO;
+import com.winhc.repal.cloud.vo.V8DynamicVO;
+import com.winhc.repal.entity.RepalBill;
+import com.winhc.repal.entity.RepalRemindDefinition;
+import com.winhc.repal.entity.RepalRemindHistory;
+import com.winhc.repal.enums.*;
+import com.winhc.repal.service.*;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * @author Aaron
+ * @date 2020/12/17 10:59
+ * @description 智能提醒定时调度
+ */
+@Component
+@Slf4j
+public class SmartRemindTask {
+    private static final int PAGE_SIZE = 100;
+    private static final String MESSAGE_PRIFIX = "msg_prifix_";
+    @Autowired
+    private RepalBillService accountBillService;
+    @Autowired
+    private RepalRemindDefinitionService accountRemindDefinitionService;
+    @Autowired
+    private RepalRemindHistoryService accountRemindHistoryService;
+    @Autowired
+    private CompanyService companyService;
+    @Autowired
+    private RepalBillDiagnosisService diagnosisService;
+//    @Autowired
+//    private MessageNoticeService messageNoticeService;
+//    @Autowired
+//    private RedisUtil redisUtil;
+//    @Autowired
+//    private AccountRemindSettingService accountRemindSettingService;
+
+    private static final HashMap<String,String> RISK_MAP = new HashMap<>(32);
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    private static final DateTimeFormatter DATE_TIME_FINANCE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 初始化风险预警map,填入需要预警的动态类型
+     */
+    @PostConstruct
+    private void initRiskMap(){
+        RISK_MAP.put(DynamicEnum.失信被执行人.getTn(),DynamicEnum.失信被执行人.name());
+        RISK_MAP.put(DynamicEnum.被执行人.getTn(),DynamicEnum.被执行人.name());
+        RISK_MAP.put(DynamicEnum.司法拍卖.getTn(),DynamicEnum.司法拍卖.name());
+        RISK_MAP.put(DynamicEnum.简易注销.getTn(),DynamicEnum.简易注销.name());
+        RISK_MAP.put(DynamicEnum.严重违法.getTn(),DynamicEnum.严重违法.name());
+        RISK_MAP.put(DynamicEnum.裁判文书.getTn(),DynamicEnum.裁判文书.name());
+        RISK_MAP.put(DynamicEnum.法院公告.getTn(),DynamicEnum.法院公告.name());
+        RISK_MAP.put(DynamicEnum.开庭公告.getTn(),DynamicEnum.开庭公告.name());
+        RISK_MAP.put(DynamicEnum.土地抵押.getTn(),DynamicEnum.土地抵押.name());
+        RISK_MAP.put(DynamicEnum.动产抵押.getTn(),DynamicEnum.动产抵押.name());
+        RISK_MAP.put(DynamicEnum.土地转让.getTn(),DynamicEnum.土地转让.name());
+        RISK_MAP.put(DynamicEnum.股权出质.getTn(),DynamicEnum.股权出质.name());
+        RISK_MAP.put(DynamicEnum.欠税公告.getTn(),DynamicEnum.欠税公告.name());
+        RISK_MAP.put(DynamicEnum.税收违法.getTn(),DynamicEnum.税收违法.name());
+        RISK_MAP.put(DynamicEnum.经营异常.getTn(),DynamicEnum.经营异常.name());
+        RISK_MAP.put(DynamicEnum.股东变更.getTn(), DynamicEnum.股东变更.name());
+        RISK_MAP.put(DynamicEnum.立案信息.getTn(),DynamicEnum.立案信息.name());
+        RISK_MAP.put(DynamicEnum.破产信息.getTn(),DynamicEnum.破产信息.name());
+        RISK_MAP.put(DynamicEnum.终本案件.getTn(),DynamicEnum.终本案件.name());
+        RISK_MAP.put(DynamicEnum.限制高消费.getTn(),DynamicEnum.限制高消费.name());
+    }
+
+    /**
+     * 每日早上10点跑动态(涉及到发短信和push,不能放在半夜)
+     * 更新逾期状态
+     * 检查账款公司是否有新的动态,若有,自动刷新评级
+     * 新动态时间为今天-2(入库时间为昨天,动态时间为前天)
+     */
+    //@Scheduled(cron = "0 0 10 * * ?")
+    @XxlJob("checkTrend")
+    public void checkTrend(){
+        LocalDate now = LocalDate.now();
+        LambdaQueryWrapper<RepalBill> qw = Wrappers.lambdaQuery(RepalBill.class);
+        qw.ne(RepalBill::getRepalBillStatus,RepalBillStatusEnum.SUCCESS.getCode());
+        qw.ne(RepalBill::getUserId,0);
+        qw.eq(RepalBill::getDeleted,Dict.DeletedStatusEnunm.否.getCode());
+        IPage<RepalBill> countAccountBill =accountBillService.page(new Page<>(1,1),qw);
+        long pageNum = (countAccountBill.getTotal()+PAGE_SIZE-1) / PAGE_SIZE;
+        for(long i = 1;i<= pageNum ; i++){
+            IPage<RepalBill> result = accountBillService.page(new Page<>(i,PAGE_SIZE),qw);
+            List<RepalBill> billList = result.getRecords();
+            //更新逾期状态
+            billList.forEach(e->{
+                //todo 过滤没开通标准版和高级版的账款
+//                AccountRemindSettingVO accountRemindSetting = accountRemindSettingService.find(e.getUserId());
+                AtomicReference<Boolean> needRefreshGrade = new AtomicReference<>(Boolean.FALSE);
+                AtomicReference<RepalRemindHistory> lastestRemind = new AtomicReference<>(null);
+                LocalDate endDate = e.getEndDate();
+                //顺带更新逾期状态
+                if((endDate !=null && endDate.isBefore(now) || endDate !=null && endDate.isEqual(now))
+                        && RepalBillStatusEnum.PROGRESSING.getCode().equals(e.getRepalBillStatus())){
+                    e.setRepalBillStatus(RepalBillStatusEnum.OVERDUE.getCode());
+                    accountBillService.updateById(e);
+                }
+                //更新逾期提醒
+                OverdueEnum overdueEnum = getDaysBetween(endDate);
+                try {
+                    if (!OverdueEnum.其他.equals(overdueEnum)) {
+                        LambdaQueryWrapper<RepalRemindDefinition> definitionQueryWrapper = Wrappers.lambdaQuery(RepalRemindDefinition.class);
+                        definitionQueryWrapper.eq(RepalRemindDefinition::getRemindType, RemindEnum.逾期提醒.name());
+                        definitionQueryWrapper.eq(RepalRemindDefinition::getOpportunity, overdueEnum.getCode());
+                        definitionQueryWrapper.eq(RepalRemindDefinition::getRepalBillStatus, e.getRepalBillStatus());
+                        definitionQueryWrapper.eq(RepalRemindDefinition::getRepalBillStage, e.getRepalBillStage() == null ? 1 : e.getRepalBillStage());
+                        RepalRemindDefinition accountRemindDefinition = accountRemindDefinitionService.getOne(definitionQueryWrapper, false);
+                        if (accountRemindDefinition != null) {
+                            //检查是否已经有相应的逾期提醒了
+                            LambdaQueryWrapper<RepalRemindHistory> remindHistoryQueryWrapper = Wrappers.lambdaQuery(RepalRemindHistory.class);
+                            remindHistoryQueryWrapper.eq(RepalRemindHistory::getRemindTitle, overdueEnum.name());
+                            remindHistoryQueryWrapper.eq(RepalRemindHistory::getRepalBillId, e.getId());
+                            RepalRemindHistory accountRemindHistory = accountRemindHistoryService.getOne(remindHistoryQueryWrapper, false);
+                            if (accountRemindHistory == null) {
+                                RepalRemindHistory newRemind = new RepalRemindHistory();
+                                newRemind.setUserId(e.getUserId());
+                                newRemind.setRepalBookId(e.getRepalBookId());
+                                newRemind.setRepalBillId(e.getId());
+                                newRemind.setTrendId(e.getDiagnosisId() == null ? "" : e.getDiagnosisId() + "");
+                                newRemind.setTrendContent(e.getEndDate().atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli() + "");
+                                newRemind.setRemindTime(LocalDateTime.now());
+                                newRemind.setCompanyName(e.getCustomerName());
+                                newRemind.setRemindTitle(overdueEnum.name());
+                                newRemind.setRemindContent(accountRemindDefinition.getRemindContent());
+                                newRemind.setFunctionList(accountRemindDefinition.getFunctionList());
+                                newRemind.setRemindType(RemindEnum.逾期提醒.name());
+                                newRemind.setReadStatus(ReadStatusEnum.未读.getCode());
+                                accountRemindHistoryService.save(newRemind);
+                                lastestRemind.set(newRemind);
+//                                //提醒
+//                                if(Dict.REMIND_SETTING_ENUM.需要提醒.getCode().equals(accountRemindSetting.getOverdue())) {
+//                                    Map<String, String> paraMap = new HashMap<>();
+//                                    paraMap.put("company", e.getAccountBillTitle());
+//                                    paraMap.put("status", overdueEnum.name());
+//                                    paraMap.put("wizardId", e.getId().toString());
+//                                    paraMap.put("accountBookId",e.getAccountBookId().toString());
+//                                    messageNoticeService.sendPushmsg(e.getUserId(), Dict.MsgNameEnum.逾期APP提醒, paraMap);
+//                                    messageNoticeService.sendSms(e.getUserId(), Dict.MsgNameEnum.逾期短信提醒, paraMap);
+//                                }
+                            }
+                        }
+                    }
+                }catch (Exception ee){
+                    log.error("逾期提醒出错",ee);
+                }
+                //财产线索
+                Arrays.stream(FinanceDynamicTypeEnum.values()).forEach(financeDynamicTypeEnum -> {
+                    try{
+                        //匹配提醒措施,匹配到再去查动态
+                        LambdaQueryWrapper<RepalRemindDefinition> financeQw = Wrappers.lambdaQuery(RepalRemindDefinition.class);
+                        financeQw.eq(RepalRemindDefinition::getRemindType, RemindEnum.财产线索.name());
+                        financeQw.eq(RepalRemindDefinition::getOpportunity, financeDynamicTypeEnum.getCode());
+                        financeQw.eq(RepalRemindDefinition::getRepalBillStatus, e.getRepalBillStatus());
+                        financeQw.eq(RepalRemindDefinition::getRepalBillStatus, e.getRepalBillStage() == null ? 1 :e.getRepalBillStage());
+                        RepalRemindDefinition accountRemindDefinition = accountRemindDefinitionService.getOne(financeQw, false);
+                        if (accountRemindDefinition != null) {
+                            //取前一天入库的一周内的动态
+                            QueryESFinanceDynamicDTO requestDto = new QueryESFinanceDynamicDTO();
+                            requestDto.setPageNum("1");
+                            requestDto.setPageSize("20");
+                            requestDto.setKeyWords(Collections.singletonList(e.getCustomerName()))
+                                    .setType(financeDynamicTypeEnum.getCode())
+                                    .setCreateDateFrom(now.minusDays(1).atTime(0,0,0).format(DATE_TIME_FINANCE))
+                                    .setCreateDateEnd(now.minusDays(1).atTime(23,59,59).format(DATE_TIME_FINANCE))
+                                    .setDateFrom(now.minusDays(30).atTime(0,0,0).format(DATE_TIME_FINANCE))
+                                    .setDateEnd(now.minusDays(1).atTime(23,59,59).format(DATE_TIME_FINANCE));
+                            VOPage<FinanceDynamicVO> dynamics = companyService.pageFinanceDynamic(requestDto);
+                            if(dynamics!=null && CollUtil.isNotEmpty(dynamics.getDataList())){
+                                dynamics.getDataList().forEach(financeDynamicVO -> {
+                                    //新增动态提醒
+                                    RepalRemindHistory accountRemindHistory = new RepalRemindHistory();
+                                    accountRemindHistory.setUserId(e.getUserId())
+                                            .setRepalBookId(e.getRepalBookId())
+                                            .setRepalBillId(e.getId())
+                                            .setTrendId(financeDynamicVO.getId())
+                                            .setTrendContent(JSON.toJSONString(financeDynamicVO.getDetail()))
+                                            .setTrentType(financeDynamicTypeEnum.getCode())
+                                            .setRemindTime(LocalDateTime.now())
+                                            .setCompanyName(e.getCustomerName())
+                                            .setRemindTitle(financeDynamicTypeEnum.getDesc())
+                                            .setRemindContent(StrUtil.format(accountRemindDefinition.getRemindContent(),
+                                                    e.getCustomerName()))
+                                            .setFunctionList(accountRemindDefinition.getFunctionList())
+                                            .setRemindType(RemindEnum.财产线索.name())
+                                            .setReadStatus(ReadStatusEnum.未读.getCode())
+                                            .setBizId(financeDynamicVO.getBizId())
+                                            .setIsNew(1)
+                                            .setDimensionType(financeDynamicVO.getDimensionType());
+                                    accountRemindHistoryService.save(accountRemindHistory);
+                                    needRefreshGrade.set(Boolean.TRUE);
+                                    lastestRemind.set(accountRemindHistory);
+//                                            //推送
+//                                            String redisKey = MESSAGE_PRIFIX+e.getUserId()+"_"+financeDynamicTypeEnum.getCode();
+//                                            if(Dict.REMIND_SETTING_ENUM.需要提醒.getCode().equals(accountRemindSetting.getFinance()) && redisUtil.get(redisKey) == null) {
+//                                                Map<String, String> paraMap = new HashMap<>();
+//                                                paraMap.put("company", company);
+//                                                paraMap.put("change", financeDynamicTypeEnum.getDesc());
+//                                                paraMap.put("wizardId", e.getId().toString());
+//                                                paraMap.put("accountBookId",e.getAccountBookId().toString());
+//                                                messageNoticeService.sendPushmsg(e.getUserId(), Dict.MsgNameEnum.财产线索APP提醒, paraMap);
+//                                                messageNoticeService.sendSms(e.getUserId(), Dict.MsgNameEnum.财产线索短信提醒, paraMap);
+//                                                redisUtil.setEx(redisKey, "done", calTTL(), TimeUnit.MILLISECONDS);
+//                                            }
+                                });
+                            }
+                        }
+                    }catch (Exception ee){
+                        log.error("财产线索提醒出错",ee);
+                    }
+                });
+                //风险预警
+                RISK_MAP.keySet().forEach(type -> {
+                    try {
+                        //匹配提醒措施,匹配到再去查动态
+                        LambdaQueryWrapper<RepalRemindDefinition> definitionQw = Wrappers.lambdaQuery(RepalRemindDefinition.class);
+                        definitionQw.eq(RepalRemindDefinition::getRemindType, RemindEnum.风险预警.name());
+                        definitionQw.eq(RepalRemindDefinition::getOpportunity, DynamicEnum.getOpportunityByTn(type));
+                        definitionQw.eq(RepalRemindDefinition::getRepalBillStatus, e.getRepalBillStatus());
+                        definitionQw.eq(RepalRemindDefinition::getRepalBillStage, e.getRepalBillStage() == null ? 1 : e.getRepalBillStage());
+                        RepalRemindDefinition accountRemindDefinition = accountRemindDefinitionService.getOne(definitionQw, false);
+                        if (accountRemindDefinition != null) {
+                            QueryV8DynamicDTO dynamicDto = new QueryV8DynamicDTO();
+                            dynamicDto.setEntityNames(Collections.singletonList(e.getCustomerName()));
+                            dynamicDto.setUpdateTime(now.minusDays(1).format(DATE_TIME_FORMATTER));
+                            dynamicDto.setStartDate(now.minusDays(30).format(DATE_TIME_FORMATTER));
+                            dynamicDto.setEndDate(now.minusDays(1).format(DATE_TIME_FORMATTER));
+                            dynamicDto.setInfoTypes(Collections.singletonList(DynamicEnum.getInfoTypeByTn(type)));
+                            if (type.equals(DynamicEnum.裁判文书.getTn())
+                                    || type.equals(DynamicEnum.法院公告.getTn())
+                                    || type.equals(DynamicEnum.开庭公告.getTn())
+                                    || type.equals(DynamicEnum.土地抵押.getTn())
+                                    || type.equals(DynamicEnum.动产抵押.getTn())
+                                    || type.equals(DynamicEnum.土地转让.getTn())
+                                    || type.equals(DynamicEnum.股权出质.getTn())) {
+                                dynamicDto.setRiskLevel("3");
+                            }
+                            VOPage<V8DynamicVO> esDynamics = companyService.queryDynamic(dynamicDto,1,10);
+                            if (esDynamics != null && CollUtil.isNotEmpty(esDynamics.getDataList())) {
+                                esDynamics.getDataList().forEach(esDynamic -> {
+                                    //新增动态提醒
+                                    String titleString = RISK_MAP.get(type);
+                                    RepalRemindHistory accountRemindHistory = new RepalRemindHistory();
+                                    accountRemindHistory.setUserId(e.getUserId())
+                                            .setRepalBookId(e.getRepalBookId())
+                                            .setRepalBillId(e.getId())
+                                            .setTrendId(esDynamic.getId())
+                                            .setTrendContent(esDynamic.getDynamicInfo())
+                                            .setTrentType(esDynamic.getTn())
+                                            .setRemindTime(LocalDateTime.now())
+                                            .setCompanyName(e.getCustomerName())
+                                            .setRemindTitle(titleString)
+                                            .setRemindContent(StrUtil.format(accountRemindDefinition.getRemindContent(),
+                                                    e.getCustomerName()))
+                                            .setFunctionList(accountRemindDefinition.getFunctionList())
+                                            .setRemindType(RemindEnum.风险预警.name())
+                                            .setReadStatus(ReadStatusEnum.未读.getCode())
+                                            .setBizId(esDynamic.getRowkey())
+                                            .setInfoType(esDynamic.getInfoType())
+                                            .setDynamicId(esDynamic.getId())
+                                            .setIsNew(1)
+                                            .setNewTrendContent(JSON.toJSONString(esDynamic.getDynamicJSON()));
+                                    accountRemindHistoryService.save(accountRemindHistory);
+                                    needRefreshGrade.set(Boolean.TRUE);
+                                    lastestRemind.set(accountRemindHistory);
+//                                            //推送
+//                                            String redisKey = MESSAGE_PRIFIX + e.getUserId() + "_" + type;
+//                                            if (Dict.REMIND_SETTING_ENUM.需要提醒.getCode().equals(accountRemindSetting.getRisk()) &&
+//                                                    redisUtil.get(redisKey) == null) {
+//                                                Map<String, String> paraMap = new HashMap<>();
+//                                                paraMap.put("company", company);
+//                                                paraMap.put("change", "新增"+RISK_MAP.get(type));
+//                                                paraMap.put("wizardId", e.getId().toString());
+//                                                paraMap.put("accountBookId",e.getAccountBookId().toString());
+//                                                messageNoticeService.sendPushmsg(e.getUserId(), Dict.MsgNameEnum.风险提醒APP提醒, paraMap);
+//                                                messageNoticeService.sendSms(e.getUserId(), Dict.MsgNameEnum.风险提醒短信提醒, paraMap);
+//                                                redisUtil.setEx(redisKey, "done", calTTL(), TimeUnit.MILLISECONDS);
+//                                            }
+                                });
+                            }
+                        }
+                    }catch (Exception ee){
+                        log.error("风险提醒出错",ee);
+                    }
+                });
+                //更新账款的最新动态信息
+                if(ObjectUtil.isNotNull(lastestRemind.get())){
+                    RepalRemindHistory latest = lastestRemind.get();
+                    //掐头去尾压进accountbill.remindInfo中
+                    Map<String,Object> remindMap = new HashMap<>();
+                    remindMap.put("remindType",latest.getRemindType());
+                    remindMap.put("remindTitle",latest.getRemindTitle());
+                    remindMap.put("id",latest.getId().toString());
+                    remindMap.put("remindTime",latest.getRemindTime());
+                    String remindContent = latest.getRemindContent();
+                    if(remindContent.length() > 100){
+                        remindContent = remindContent.substring(0,100);
+                    }
+                    remindMap.put("remindContent",remindContent);
+                    e.setRemindInfo(JSON.toJSONString(remindMap));
+                    accountBillService.updateById(e);
+                }
+                //有新动态则自动刷新评级
+                if(needRefreshGrade.get()){
+                    diagnosisService.addRepalBillDiagnosis(e.getUserId(),e.getId(),e.getReceivable(), Collections.singletonList(e.getCustomerName()));
+                }
+                //一个月无最新变化,刷新评级并推送消息
+                if(
+//                        Dict.REMIND_SETTING_ENUM.需要提醒.getCode().equals(accountRemindSetting.getRank()) &&
+                                (now.toEpochDay() - e.getDiagnosisDatetime().toLocalDate().toEpochDay() >= 30)){
+                    diagnosisService.addRepalBillDiagnosis(e.getUserId(),e.getId(),e.getReceivable(),Collections.singletonList(e.getCustomerName()));
+//                    Map<String, String> paraMap = new HashMap<>();
+//                    paraMap.put("company", e.getAccountBillTitle());
+//                    paraMap.put("wizardId", e.getId().toString());
+//                    paraMap.put("accountBookId",e.getAccountBookId().toString());
+//                    messageNoticeService.sendPushmsg(e.getUserId(), Dict.MsgNameEnum.评级无变动APP提醒, paraMap);
+                }
+            });
+        }
+        log.info("完成每日智能提醒调度");
+    }
+
+    /**
+     * 正常时间流逝的逾期提醒
+     * @param endDate
+     * @return
+     */
+    private OverdueEnum getDaysBetween(LocalDate endDate){
+        if(endDate == null){
+            return OverdueEnum.其他;
+        }
+        long delta = LocalDate.now().toEpochDay() - endDate.toEpochDay();
+        OverdueEnum overdueEnum = OverdueEnum.其他;
+        if(delta <= 0 && delta >=-7){
+            overdueEnum = OverdueEnum.即将逾期;
+        }else if(delta > 0 && delta <90){
+            overdueEnum = OverdueEnum.已逾期;
+        }else if(delta >=90 && delta<180){
+            overdueEnum = OverdueEnum.已逾期三个月;
+        }else if(delta >=180 && delta<365){
+            overdueEnum = OverdueEnum.已逾期半年;
+        }else if(delta >=365 && delta<365*3){
+            overdueEnum = OverdueEnum.已逾期一年;
+        }else if(delta >= 365*3){
+            overdueEnum = OverdueEnum.已逾期三年;
+        }
+        return overdueEnum;
+    }
+
+    /**
+     * 计算当天剩余的毫秒时间
+     * @return
+     */
+    private Long calTTL(){
+        LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        return ChronoUnit.MILLIS.between(LocalDateTime.now(),midnight);
+    }
+
+    @XxlJob("updateAccountBillStatus")
+    public void updateAccountBillStatus() {
+        log.info("updateAccountBillStatus");
+        LambdaUpdateWrapper<RepalBill> updateWrapper = Wrappers.lambdaUpdate(RepalBill.class)
+                .eq(RepalBill::getRepalBillStatus, RepalBillStatusEnum.PROGRESSING.getCode())
+                .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode())
+                .le(RepalBill::getEndDate, LocalDate.now()).set(RepalBill::getRepalBillStatus, RepalBillStatusEnum.OVERDUE.getCode());
+        accountBillService.update(updateWrapper);
+        log.info("update is ok");
+    }
+
+
+}