From a661185f5e3a151a0bb81838f94d1964b2c55d9b Mon Sep 17 00:00:00 2001 From: wxc <191104855@qq.com> Date: Thu, 14 Nov 2024 13:47:25 +0800 Subject: [PATCH] =?UTF-8?q?fit:=20=E4=B8=AA=E4=BA=BA=E6=9E=81=E7=AB=AF?= =?UTF-8?q?=E8=B5=8B=E5=88=86=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RiskClueController.java | 55 ++++++++++++ .../mapper/RiskModelTaskClueMapper.java | 8 ++ .../mapper/RiskScoreRuleMapper.java | 8 ++ .../pojo/entity/RiskModelTaskClue.java | 85 ++++++++++++++++++ .../pojo/entity/RiskScoreRule.java | 56 ++++++++++++ .../param/RiskModelTaskClueQueryParam.java | 29 ++++++ .../biutag/supervision/pojo/vo/MenuTree.java | 2 +- .../service/RiskModelTaskClueService.java | 11 +++ .../service/RiskScoreRuleService.java | 50 +++++++++++ ...系风险赋分及预警处置机制.doc | Bin 0 -> 84480 bytes 10 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/biutag/supervision/controller/sensitivePerception/RiskClueController.java create mode 100644 src/main/java/com/biutag/supervision/mapper/RiskModelTaskClueMapper.java create mode 100644 src/main/java/com/biutag/supervision/mapper/RiskScoreRuleMapper.java create mode 100644 src/main/java/com/biutag/supervision/pojo/entity/RiskModelTaskClue.java create mode 100644 src/main/java/com/biutag/supervision/pojo/entity/RiskScoreRule.java create mode 100644 src/main/java/com/biutag/supervision/pojo/param/RiskModelTaskClueQueryParam.java create mode 100644 src/main/java/com/biutag/supervision/service/RiskModelTaskClueService.java create mode 100644 src/main/java/com/biutag/supervision/service/RiskScoreRuleService.java create mode 100644 src/main/resources/static/templates/【工作机制】个人极端暴力风险数字督察灵敏感知体系风险赋分及预警处置机制.doc diff --git a/src/main/java/com/biutag/supervision/controller/sensitivePerception/RiskClueController.java b/src/main/java/com/biutag/supervision/controller/sensitivePerception/RiskClueController.java new file mode 100644 index 0000000..f80d0ec --- /dev/null +++ b/src/main/java/com/biutag/supervision/controller/sensitivePerception/RiskClueController.java @@ -0,0 +1,55 @@ +package com.biutag.supervision.controller.sensitivePerception; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.biutag.supervision.pojo.Result; +import com.biutag.supervision.pojo.entity.Model; +import com.biutag.supervision.pojo.entity.RiskModelTaskClue; +import com.biutag.supervision.pojo.param.RiskModelTaskClueQueryParam; +import com.biutag.supervision.service.ModelService; +import com.biutag.supervision.service.RiskModelTaskClueService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author wxc + * @date 2024/11/14 + */ +@RequiredArgsConstructor +@RequestMapping("risk/clues") +@RestController +public class RiskClueController { + + private final RiskModelTaskClueService riskModelTaskClueService; + + private final ModelService modelService; + + @GetMapping + public Result> page(RiskModelTaskClueQueryParam param) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (Objects.nonNull(param.getRiskScoreRuleId()) && !param.getRiskScoreRuleId().isEmpty()) { + List models = modelService.list(new LambdaQueryWrapper().in(Model::getRiskScoreRuleId, param.getRiskScoreRuleId())); + if (models.isEmpty()) { + return Result.success(new Page().setRecords(new ArrayList<>()).setTotal(0)); + } + queryWrapper.in(RiskModelTaskClue::getModelId, models.stream().map(Model::getId).collect(Collectors.toSet())); + } + if (Objects.nonNull(param.getEventTime()) && param.getEventTime().size() == 2) { + queryWrapper.between(RiskModelTaskClue::getEventTime, param.getEventTime().get(0), param.getEventTime().get(1)); + } + queryWrapper.like(StrUtil.isNotBlank(param.getName()), RiskModelTaskClue::getName, param.getName()) + .like(StrUtil.isNotBlank(param.getIdCode()), RiskModelTaskClue::getIdCode, param.getIdCode()) + .like(StrUtil.isNotBlank(param.getThingDesc()), RiskModelTaskClue::getThingDesc, param.getThingDesc()); + queryWrapper.orderByDesc(RiskModelTaskClue::getCreateTime); + return Result.success(riskModelTaskClueService.page(Page.of(param.getCurrent(), param.getSize()), queryWrapper)); + } + +} diff --git a/src/main/java/com/biutag/supervision/mapper/RiskModelTaskClueMapper.java b/src/main/java/com/biutag/supervision/mapper/RiskModelTaskClueMapper.java new file mode 100644 index 0000000..7d91b05 --- /dev/null +++ b/src/main/java/com/biutag/supervision/mapper/RiskModelTaskClueMapper.java @@ -0,0 +1,8 @@ +package com.biutag.supervision.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervision.pojo.entity.RiskModelTaskClue; + +public interface RiskModelTaskClueMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/mapper/RiskScoreRuleMapper.java b/src/main/java/com/biutag/supervision/mapper/RiskScoreRuleMapper.java new file mode 100644 index 0000000..3ddb5c3 --- /dev/null +++ b/src/main/java/com/biutag/supervision/mapper/RiskScoreRuleMapper.java @@ -0,0 +1,8 @@ +package com.biutag.supervision.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervision.pojo.entity.RiskScoreRule; + +public interface RiskScoreRuleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/entity/RiskModelTaskClue.java b/src/main/java/com/biutag/supervision/pojo/entity/RiskModelTaskClue.java new file mode 100644 index 0000000..3dbdd7c --- /dev/null +++ b/src/main/java/com/biutag/supervision/pojo/entity/RiskModelTaskClue.java @@ -0,0 +1,85 @@ +package com.biutag.supervision.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Setter +@Getter +public class RiskModelTaskClue { + + // 主键 + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + // 模型id + @TableField("model_id") + private Integer modelId; + + // 姓名 + @TableField("name") + private String name; + + // 证件号码 + @TableField("id_code") + private String idCode; + + // 预警内容 + @TableField("thing_desc") + private String thingDesc; + + // 状态 默认 0-未分发 1-已分发 2-已处理 + @TableField("distribution_state") + private Boolean distributionState; + + // 任务ID + @TableField("task_id") + private Integer taskId; + + // 问题id + @TableField("negative_id") + private String negativeId; + + // 原始id + @TableField("source_id") + private String sourceId; + + // 案件id,“,”分割 + @TableField("case_ids") + private String caseIds; + + // 风险原因 + @TableField("risk_reason") + private String riskReason; + + // 数据详情 JSON + @TableField("data") + private String data; + + // 分数 + @TableField("score") + private Integer score; + + // 发生时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("event_time") + private LocalDateTime eventTime; + + // 创建时间 + @TableField("create_time") + private LocalDateTime createTime; + + // 修改时间 + @TableField("update_time") + private LocalDateTime updateTime; + + // 逻辑删除键0-未删1已删 + @TableField("del") + private Boolean del; + +} \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/entity/RiskScoreRule.java b/src/main/java/com/biutag/supervision/pojo/entity/RiskScoreRule.java new file mode 100644 index 0000000..289254f --- /dev/null +++ b/src/main/java/com/biutag/supervision/pojo/entity/RiskScoreRule.java @@ -0,0 +1,56 @@ +package com.biutag.supervision.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Setter +@Getter +public class RiskScoreRule { + + // + @TableId(type = IdType.AUTO) + private Integer id; + + // + @TableField("pid") + private Integer pid; + + // 风险因素 + @TableField("risk_name") + private String riskName; + + // 分值 + @TableField("score") + private String score; + + // 规则描述 + @TableField("rule_desc") + private String ruleDesc; + + // 权重 + @TableField("weight") + private Integer weight; + + // 状态 + @TableField("status") + private Boolean status; + + // 更新时间 + @TableField("update_time") + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm") + private LocalDateTime updateTime; + + // 创建时间 + @TableField("create_time") + private LocalDateTime createTime; + + private Integer sortId; + +} \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/param/RiskModelTaskClueQueryParam.java b/src/main/java/com/biutag/supervision/pojo/param/RiskModelTaskClueQueryParam.java new file mode 100644 index 0000000..4c16034 --- /dev/null +++ b/src/main/java/com/biutag/supervision/pojo/param/RiskModelTaskClueQueryParam.java @@ -0,0 +1,29 @@ +package com.biutag.supervision.pojo.param; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author wxc + * @date 2024/11/14 + */ +@Setter +@Getter +public class RiskModelTaskClueQueryParam extends BasePage { + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private List eventTime = new ArrayList<>(); + + private String name; + + private String idCode; + + private String thingDesc; + + private List riskScoreRuleId = new ArrayList<>(); +} diff --git a/src/main/java/com/biutag/supervision/pojo/vo/MenuTree.java b/src/main/java/com/biutag/supervision/pojo/vo/MenuTree.java index ffb622b..9df8593 100644 --- a/src/main/java/com/biutag/supervision/pojo/vo/MenuTree.java +++ b/src/main/java/com/biutag/supervision/pojo/vo/MenuTree.java @@ -46,7 +46,7 @@ public class MenuTree { // 是否打开新页面 默认为false private Boolean openNewPage; - @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; private List children; diff --git a/src/main/java/com/biutag/supervision/service/RiskModelTaskClueService.java b/src/main/java/com/biutag/supervision/service/RiskModelTaskClueService.java new file mode 100644 index 0000000..6922335 --- /dev/null +++ b/src/main/java/com/biutag/supervision/service/RiskModelTaskClueService.java @@ -0,0 +1,11 @@ +package com.biutag.supervision.service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervision.pojo.entity.RiskModelTaskClue; +import com.biutag.supervision.mapper.RiskModelTaskClueMapper; +import org.springframework.stereotype.Service; + +@Service +public class RiskModelTaskClueService extends ServiceImpl { + +} diff --git a/src/main/java/com/biutag/supervision/service/RiskScoreRuleService.java b/src/main/java/com/biutag/supervision/service/RiskScoreRuleService.java new file mode 100644 index 0000000..a8fb130 --- /dev/null +++ b/src/main/java/com/biutag/supervision/service/RiskScoreRuleService.java @@ -0,0 +1,50 @@ +package com.biutag.supervision.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervision.constants.AppConstants; +import com.biutag.supervision.mapper.RiskScoreRuleMapper; +import com.biutag.supervision.pojo.entity.RiskScoreRule; +import com.biutag.supervision.pojo.vo.RiskScoreRuleTree; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class RiskScoreRuleService extends ServiceImpl { + + public List buildTree() { + List scoreRules = list(new LambdaQueryWrapper().orderByAsc(RiskScoreRule::getSortId)); + Map> childMap = new HashMap<>(); + List tree = new ArrayList<>(); + for (RiskScoreRule rule: scoreRules) { + RiskScoreRuleTree node = new RiskScoreRuleTree(); + BeanUtils.copyProperties(rule, node); + List children = childMap.computeIfAbsent(node.getPid(), k -> new ArrayList<>()); + children.add(node); + Integer pid = node.getPid(); + if (AppConstants.TREE_ROOT_ID.equals(pid)) { + tree.add(node); + } + } + for (RiskScoreRuleTree node : tree) { + buildTreeRecursive(node, childMap); + } + return tree; + } + + private static RiskScoreRuleTree buildTreeRecursive(RiskScoreRuleTree node, Map> childMap) { + List children = childMap.get(node.getId()); + if (children != null) { + node.getChildren().addAll(children.stream() + .map(childNode -> buildTreeRecursive(childNode, childMap)) + .toList()); + } + return node; + } + +} diff --git a/src/main/resources/static/templates/【工作机制】个人极端暴力风险数字督察灵敏感知体系风险赋分及预警处置机制.doc b/src/main/resources/static/templates/【工作机制】个人极端暴力风险数字督察灵敏感知体系风险赋分及预警处置机制.doc new file mode 100644 index 0000000000000000000000000000000000000000..851ede3cda099b3869f5a037d0aae77dc46392d2 GIT binary patch literal 84480 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 literal 0 HcmV?d00001