风险预警中心

dev
huwei 2026-07-15 14:56:04 +08:00
parent 7a2639438f
commit e8777e9f7c
18 changed files with 1998 additions and 52 deletions

View File

@ -73,10 +73,10 @@ paths:
type: string type: string
enum: enum:
- 证书过期 - 证书过期
- 证书临期
- 社保异常 - 社保异常
- 人员离职
- 信息变更 - 信息变更
- 项目超期
- 账号限制
- name: sourceModule - name: sourceModule
in: query in: query
description: 来源模块 description: 来源模块
@ -153,21 +153,20 @@ paths:
type: string type: string
enum: enum:
- 证书过期 - 证书过期
- 证书临期
- 社保异常 - 社保异常
- 人员离职
- 信息变更 - 信息变更
- 项目超期
- 账号限制
- $ref: '#/components/parameters/levelParam' - $ref: '#/components/parameters/levelParam'
- name: filterKind - name: processStatus
in: query in: query
description: Tab 筛选 description: 处理状态
schema: schema:
type: string type: string
enum: enum:
- all - 未处理
- urgent - 处理中
- unread - 已处理
default: all
- $ref: '#/components/parameters/currentParam' - $ref: '#/components/parameters/currentParam'
- $ref: '#/components/parameters/sizeParam' - $ref: '#/components/parameters/sizeParam'
responses: responses:
@ -457,10 +456,10 @@ components:
description: 预警类型 description: 预警类型
enum: enum:
- 证书过期 - 证书过期
- 证书临期
- 社保异常 - 社保异常
- 人员离职
- 信息变更 - 信息变更
- 项目超期
- 账号限制
level: level:
type: string type: string
description: 等级编码 description: 等级编码

View File

@ -69,7 +69,7 @@
| 字段 | 类型 | 说明 | | 字段 | 类型 | 说明 |
|------|------|------| |------|------|------|
| id | String | 预警编号,如 W-2026-008 | | id | String | 预警编号,如 W-2026-008 |
| warningType | String | 证书过期 / 社保异常 / 信息变更 / 项目超期 / 账号限制 | | warningType | String | 证书过期 / 证书临期 / 社保异常 / 人员离职 / 信息变更 |
| level | String | urgent / important / normal | | level | String | urgent / important / normal |
| levelName | String | 紧急 / 重要 / 一般 | | levelName | String | 紧急 / 重要 / 一般 |
| sourceModule | String | 来源模块名称 | | sourceModule | String | 来源模块名称 |
@ -117,7 +117,7 @@
| 参数 | 必填 | 默认 | 说明 | | 参数 | 必填 | 默认 | 说明 |
|------|------|------|------| |------|------|------|------|
| level | 否 | urgent | 等级urgent / important / normal | | level | 否 | urgent | 等级urgent / important / normal |
| warningType | 否 | — | 证书过期、社保异常、信息变更、项目超期、账号限制 | | warningType | 否 | — | 证书过期、证书临期、社保异常、人员离职、信息变更 |
| sourceModule | 否 | — | 来源模块,如 评价师信息管理 | | sourceModule | 否 | — | 来源模块,如 评价师信息管理 |
| keyword | 否 | — | 标题/预警编号/预警内容关键字 | | keyword | 否 | — | 标题/预警编号/预警内容关键字 |
| onlyUntreated | 否 | true | 仅未处理(未处理/待确认/处理中) | | onlyUntreated | 否 | true | 仅未处理(未处理/待确认/处理中) |
@ -169,25 +169,18 @@ GET /safetyEval/regulator/risk-center/high-priority-alerts?level=important&limit
| 参数 | 必填 | 说明 | | 参数 | 必填 | 说明 |
|------|------|------| |------|------|------|
| keyword | 否 | 机构/人员/项目/预警编号 | | keyword | 否 | 机构/人员/项目/预警编号 |
| warningType | 否 | 证书过期、社保异常、信息变更、项目超期、账号限制 | | warningType | 否 | 证书过期、证书临期、社保异常、人员离职、信息变更 |
| level | 否 | urgent / important / normal | | level | 否 | urgent / important / normal |
| filterKind | 否 | Tab 筛选:`all`(默认)/ `urgent` / `unread` | | processStatus | 否 | 未处理、处理中、已处理 |
| current | 否 | 当前页 | | current | 否 | 当前页 |
| size | 否 | 每页条数 | | size | 否 | 每页条数 |
**Tab 对应关系**(原型页右上角):
| Tab | filterKind |
|-----|------------|
| 全部消息 | all 或不传 |
| 紧急 | urgent |
| 未读/未处理 | unread |
**请求示例** **请求示例**
``` ```
GET /safetyEval/regulator/risk-center/page?filterKind=urgent&current=1&size=10 GET /safetyEval/regulator/risk-center/page?level=urgent&current=1&size=10
GET /safetyEval/regulator/risk-center/page?keyword=张建国&warningType=证书过期 GET /safetyEval/regulator/risk-center/page?keyword=张建国&warningType=证书过期
GET /safetyEval/regulator/risk-center/page?processStatus=未处理&current=1&size=10
``` ```
**响应示例** **响应示例**

View File

@ -10,6 +10,9 @@ import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskHandleCmd; import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskHandleCmd;
import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskMessagePageQuery; import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskMessagePageQuery;
import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskPriorityAlertQuery; import org.qinan.safetyeval.client.dto.regulator.RegulatorRiskPriorityAlertQuery;
import org.qinan.safetyeval.client.enums.regulator.RegulatorRiskLevelEnum;
import org.qinan.safetyeval.client.enums.regulator.RegulatorRiskProcessStatusEnum;
import org.qinan.safetyeval.client.enums.regulator.RegulatorRiskWarningTypeEnum;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -45,12 +48,12 @@ public class RegulatorRiskCenterController {
messages.add(message("W-2026-005", "信息变更", "normal", "备案变更管理", messages.add(message("W-2026-005", "信息变更", "normal", "备案变更管理",
Arrays.asList("注册地址", "变更材料"), Arrays.asList("注册地址", "变更材料"),
"恒安安全评价注册地址变更材料超过 5 个工作日未确认。", "待确认", "qual-change")); "恒安安全评价注册地址变更材料超过 5 个工作日未确认。", "待确认", "qual-change"));
messages.add(message("W-2026-004", "项目超期", "important", "项目过程控制", messages.add(message("W-2026-004", "人员离职", "important", "评价师信息管理",
Arrays.asList("项目名称", "计划完成日期"), Arrays.asList("人员姓名", "离职日期"),
"某化工项目安全评价报告超过计划节点 7 天未完成。", "未处理", "qual-monitor")); "某安全评价师已离职但仍在机构备案名单中。", "未处理", "evaluator"));
messages.add(message("W-2026-003", "账号限制", "normal", "机构账号管理", messages.add(message("W-2026-003", "人员离职", "normal", "评价师信息管理",
Arrays.asList("机构名称", "账号状态"), Arrays.asList("人员姓名", "离职日期"),
"渝安风险评估中心账号处于禁用状态,仍有新业务备案尝试。", "待确认", "institution-account")); "某安全评价师已提交离职申请,资质系统未更新。", "待确认", "evaluator"));
messages.add(message("W-2026-002", "证书过期", "urgent", "评价师信息管理", messages.add(message("W-2026-002", "证书过期", "urgent", "评价师信息管理",
Arrays.asList("人员姓名", "证书类型", "有效期至"), Arrays.asList("人员姓名", "证书类型", "有效期至"),
"李明华注册安全工程师证书已过期。", "已闭环", "evaluator")); "李明华注册安全工程师证书已过期。", "已闭环", "evaluator"));
@ -200,17 +203,25 @@ public class RegulatorRiskCenterController {
if (StringUtils.hasText(query.getLevel()) && !query.getLevel().equals(item.getLevel())) { if (StringUtils.hasText(query.getLevel()) && !query.getLevel().equals(item.getLevel())) {
return false; return false;
} }
if (StringUtils.hasText(query.getFilterKind()) && !"all".equals(query.getFilterKind())) { if (StringUtils.hasText(query.getProcessStatus()) && !matchProcessStatus(query.getProcessStatus(), item.getStatus())) {
if ("urgent".equals(query.getFilterKind()) && !"urgent".equals(item.getLevel())) { return false;
return false;
}
if ("unread".equals(query.getFilterKind()) && !isUntreated(item.getStatus())) {
return false;
}
} }
return true; return true;
} }
private boolean matchProcessStatus(String queryStatus, String itemStatus) {
if (RegulatorRiskProcessStatusEnum.UNPROCESSED.getName().equals(queryStatus)) {
return Arrays.asList("未处理", "待确认").contains(itemStatus);
}
if (RegulatorRiskProcessStatusEnum.PROCESSING.getName().equals(queryStatus)) {
return "处理中".equals(itemStatus);
}
if (RegulatorRiskProcessStatusEnum.PROCESSED.getName().equals(queryStatus)) {
return Arrays.asList("已闭环", "已发函", "已提醒", "已处置").contains(itemStatus);
}
return false;
}
private String resolveStatus(RegulatorRiskHandleCmd cmd) { private String resolveStatus(RegulatorRiskHandleCmd cmd) {
if (StringUtils.hasText(cmd.getStatus())) { if (StringUtils.hasText(cmd.getStatus())) {
return cmd.getStatus(); return cmd.getStatus();

View File

@ -15,12 +15,12 @@ public class RegulatorRiskMessagePageQuery extends BasePageQuery {
@ApiModelProperty("关键词:机构/人员/项目/预警编号") @ApiModelProperty("关键词:机构/人员/项目/预警编号")
private String keyword; private String keyword;
@ApiModelProperty("预警类型:证书过期/社保异常/信息变更/项目超期/账号限制") @ApiModelProperty(value = "预警类型", allowableValues = "证书过期,证书临期,社保异常,人员离职,信息变更")
private String warningType; private String warningType;
@ApiModelProperty("等级urgent/important/normal") @ApiModelProperty(value = "预警等级", allowableValues = "urgent,important,normal")
private String level; private String level;
@ApiModelProperty("Tab筛选all/urgent/unread") @ApiModelProperty(value = "处理状态", allowableValues = "未处理,处理中,已处理")
private String filterKind; private String processStatus;
} }

View File

@ -9,10 +9,10 @@ import lombok.Data;
@Data @Data
public class RegulatorRiskPriorityAlertQuery { public class RegulatorRiskPriorityAlertQuery {
@ApiModelProperty("等级urgent/important/normal默认 urgent") @ApiModelProperty(value = "等级urgent/important/normal默认 urgent", allowableValues = "urgent,important,normal")
private String level = "urgent"; private String level = "urgent";
@ApiModelProperty("预警类型:证书过期/社保异常/信息变更/项目超期/账号限制") @ApiModelProperty(value = "预警类型", allowableValues = "证书过期,证书临期,社保异常,人员离职,信息变更")
private String warningType; private String warningType;
@ApiModelProperty("来源模块") @ApiModelProperty("来源模块")

View File

@ -0,0 +1,42 @@
package org.qinan.safetyeval.client.enums.regulator;
import java.util.Objects;
/**
* -
*/
public enum RegulatorRiskLevelEnum {
URGENT("urgent", "紧急"),
IMPORTANT("important", "重要"),
NORMAL("normal", "一般"),
;
private final String code;
private final String name;
RegulatorRiskLevelEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public static RegulatorRiskLevelEnum ofCode(String code) {
if (code == null) {
return null;
}
for (RegulatorRiskLevelEnum item : values()) {
if (Objects.equals(item.code, code)) {
return item;
}
}
return null;
}
}

View File

@ -0,0 +1,36 @@
package org.qinan.safetyeval.client.enums.regulator;
import java.util.Objects;
/**
* -
*/
public enum RegulatorRiskProcessStatusEnum {
UNPROCESSED("未处理"),
PROCESSING("处理中"),
PROCESSED("已处理"),
;
private final String name;
RegulatorRiskProcessStatusEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static RegulatorRiskProcessStatusEnum ofName(String name) {
if (name == null) {
return null;
}
for (RegulatorRiskProcessStatusEnum item : values()) {
if (Objects.equals(item.name, name)) {
return item;
}
}
return null;
}
}

View File

@ -0,0 +1,38 @@
package org.qinan.safetyeval.client.enums.regulator;
import java.util.Objects;
/**
* -
*/
public enum RegulatorRiskWarningTypeEnum {
CERT_EXPIRED("证书过期"),
CERT_EXPIRING("证书临期"),
SOCIAL_INSURANCE_ABNORMAL("社保异常"),
EMPLOYEE_RESIGNED("人员离职"),
INFO_CHANGED("信息变更"),
;
private final String name;
RegulatorRiskWarningTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static RegulatorRiskWarningTypeEnum ofName(String name) {
if (name == null) {
return null;
}
for (RegulatorRiskWarningTypeEnum item : values()) {
if (Objects.equals(item.name, name)) {
return item;
}
}
return null;
}
}

View File

@ -1,4 +1,4 @@
spring: spring:
web: web:
resources: resources:
cache: cache:

View File

@ -1,4 +1,4 @@
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.2 Frontend_Env[production] Build_Date[2026/7/14 16:52:04] App_Identifier[safetyEval-h5]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><meta charset="UTF-8" name="referrer" content="strict-origin-when-cross-origin"/><title>大屏</title><script>(function () { <!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.2 Frontend_Env[production] Build_Date[2026/7/15 11:35:53] App_Identifier[safetyEval-h5]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><meta charset="UTF-8" name="referrer" content="strict-origin-when-cross-origin"/><title>大屏</title><script>(function () {
const APP_ENV = { const APP_ENV = {
antd: { antd: {
'ant-prefix': 'micro-temp', 'ant-prefix': 'micro-temp',
@ -126,4 +126,4 @@
} }
mergeParams(); mergeParams();
})(); })();
})();</script><script defer="defer" src="/safetyEval-h5/static/js/548.ac3036a0ff72bbda.js"></script><script defer="defer" src="/safetyEval-h5/static/js/551.40cd16b83ccef834.js"></script><script defer="defer" src="/safetyEval-h5/static/js/485.cc16547839dceff2.js"></script><script defer="defer" src="/safetyEval-h5/static/js/main.acbe16f096b75fe9.js"></script><link href="/safetyEval-h5/static/css/main.82ee4667fd2973b4.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto;"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.2 Frontend_Env[production] Build_Date[2026/7/14 16:52:04] App_Identifier[safetyEval-h5] Frontend_Branch[dev] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body><script src="https://cesium.com/downloads/cesiumjs/releases/1.91/Build/Cesium/Cesium.js"></script><link href="https://cesium.com/downloads/cesiumjs/releases/1.91/Build/Cesium/Widgets/widgets.css" rel="stylesheet"></html> })();</script><script defer="defer" src="/safetyEval-h5/static/js/548.ac3036a0ff72bbda.js"></script><script defer="defer" src="/safetyEval-h5/static/js/551.40cd16b83ccef834.js"></script><script defer="defer" src="/safetyEval-h5/static/js/485.cc16547839dceff2.js"></script><script defer="defer" src="/safetyEval-h5/static/js/main.f98503f3c068bbb9.js"></script><link href="/safetyEval-h5/static/css/main.82ee4667fd2973b4.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto;"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.2 Frontend_Env[production] Build_Date[2026/7/15 11:35:53] App_Identifier[safetyEval-h5] Frontend_Branch[dev_1.0.1] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body><script src="https://cesium.com/downloads/cesiumjs/releases/1.91/Build/Cesium/Cesium.js"></script><link href="https://cesium.com/downloads/cesiumjs/releases/1.91/Build/Cesium/Widgets/widgets.css" rel="stylesheet"></html>

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/14 17:06:09] App_Identifier[safetyEval]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () { <!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/15 10:50:52] App_Identifier[safetyEval]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
const APP_ENV = { const APP_ENV = {
antd: { antd: {
'ant-prefix': 'micro-temp', 'ant-prefix': 'micro-temp',
@ -89,4 +89,4 @@
}, },
} }
}</script><script defer="defer" src="/safetyEval/static/js/323.fd0657fd2fffbe7a.js"></script><script defer="defer" src="/safetyEval/static/js/121.ae75e71830bf4ae0.js"></script><script defer="defer" src="/safetyEval/static/js/289.ab5c99a14babc2d4.js"></script><script defer="defer" src="/safetyEval/static/js/main.5a03dc1748bb1352.js"></script><link href="/safetyEval/static/css/main.1d4eeef67f56f89e.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/14 17:06:09] App_Identifier[safetyEval] Frontend_Branch[dev] Backend_Branch[dev]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html> }</script><script defer="defer" src="/safetyEval/static/js/323.fd0657fd2fffbe7a.js"></script><script defer="defer" src="/safetyEval/static/js/121.ae75e71830bf4ae0.js"></script><script defer="defer" src="/safetyEval/static/js/289.ab5c99a14babc2d4.js"></script><script defer="defer" src="/safetyEval/static/js/main.1b45652ffb1e8f5c.js"></script><link href="/safetyEval/static/css/main.d4bcd75c2815b66b.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/15 10:50:52] App_Identifier[safetyEval] Frontend_Branch[dev_1.0.1] Backend_Branch[dev]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>

View File

@ -1693,7 +1693,7 @@
color: #1e293b; color: #1e293b;
} }
.qual-monitor .org-info .org-name { .qual-monitor .org-info .org-name {
font-weight: 500; font-weight: 600;
} }
.qual-monitor .org-info .org-meta { .qual-monitor .org-info .org-meta {
font-size: 0.72rem; font-size: 0.72rem;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long