From 2dee8705ddf9863f08daf101aae6113d6899f1ad Mon Sep 17 00:00:00 2001 From: tangjie <122778500@qq.com> Date: Thu, 16 Jul 2026 14:18:40 +0800 Subject: [PATCH] feat --- jjb.config.js | 2 +- src/api/riskCenter/index.js | 6 + src/api/staffCertificate/index.js | 6 + src/enumerate/constant/index.js | 39 ++- .../PersonnelInfo/Certificate/index.js | 278 ++++++++++++--- .../MonitorManage/QualMonitor/index.js | 2 +- .../MonitorManage/RiskCenter/index.js | 325 ++++++++++-------- 7 files changed, 458 insertions(+), 200 deletions(-) diff --git a/jjb.config.js b/jjb.config.js index af85a59..f19867d 100644 --- a/jjb.config.js +++ b/jjb.config.js @@ -11,7 +11,7 @@ module.exports = { // 本地联调 safetyEval-service(context-path: /safetyEval,默认端口 8095) // 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095 //API_HOST: "https://gbs-gateway.qhdsafety.com", - //API_HOST: "http://192.168.0.150",太浅 + //API_HOST: "http://192.168.0.150", //太浅 API_HOST: "http://192.168.0.152", }, production: { diff --git a/src/api/riskCenter/index.js b/src/api/riskCenter/index.js index def9c5b..6813af0 100644 --- a/src/api/riskCenter/index.js +++ b/src/api/riskCenter/index.js @@ -5,3 +5,9 @@ export const queryRiskOverviewAction = declareRequest( "Get > /safetyEval/regulator/risk-center/overview", "overviewStats: [] | res.data.stats || [] & processGuide: '' | res.data.processGuide || ''", ); + +export const queryRiskPageAction = declareRequest( + "riskPageLoading", + "Get > /safetyEval/regulator/risk-center/page", + "riskPageList: [] | res.data || [] & riskPageTotal: 0 | res.total || 0", +); diff --git a/src/api/staffCertificate/index.js b/src/api/staffCertificate/index.js index 3010268..3764abf 100644 --- a/src/api/staffCertificate/index.js +++ b/src/api/staffCertificate/index.js @@ -28,6 +28,12 @@ export const staffCertificateRemove = declareRequest( "Post > @/safetyEval/org-personnel-cert/delete", ); +export const queryIndustryProfessionalStandards = declareRequest( + "staffCertificateLoading", + "Get > /safetyEval/industry-professional-standards", + "professionalStandardsList: [] | res.data || []", +); + /** StaffViewModal 直接调用的辅助函数 — 获取人员下所有证书列表 */ export async function fetchStaffCertListByPersonnelId(personnelId) { try { diff --git a/src/enumerate/constant/index.js b/src/enumerate/constant/index.js index 6a0c050..a775319 100644 --- a/src/enumerate/constant/index.js +++ b/src/enumerate/constant/index.js @@ -131,4 +131,41 @@ export const CERT_TYPE_MAP = { registered_safety_engineer: "注册安全工程师", senior_engineer: "高工", evaluator: "评价师", -}; \ No newline at end of file +}; + +/** 风险预警中心 — 预警大类映射 */ +export const RISK_TYPE_MAP = { + "资质预警": { label: "资质预警", color: "error" }, + "项目预警": { label: "项目预警", color: "warning" }, +}; + +/** 风险预警中心 — 处理阶段映射 */ +export const STAGE_MAP = { + "未处理": { label: "未处理", color: "error" }, + "已发机构": { label: "已发机构", color: "warning" }, + "待复核": { label: "待复核", color: "processing" }, + "已闭环": { label: "已闭环", color: "success" }, +}; + +/** 风险预警中心 — 机构端状态映射 */ +export const ORG_STATUS_MAP = { + "未发送": { label: "未发送", color: "error" }, + "机构未读": { label: "机构未读", color: "warning" }, + "已提交材料": { label: "已提交材料", color: "processing" }, + "处理中": { label: "处理中", color: "processing" }, + "已提交说明": { label: "已提交说明", color: "processing" }, + "整改完成": { label: "整改完成", color: "success" }, +}; + +/** 风险预警中心 — 预警子类选项 */ +export const RISK_SUBTYPE_OPTIONS = [ + { label: "资质条件保持异常", value: "资质条件保持异常" }, + { label: "人员比例异常", value: "人员比例异常" }, + { label: "属地材料待核验", value: "属地材料待核验" }, + { label: "项目启动超期", value: "项目启动超期" }, + { label: "关键节点超期", value: "关键节点超期" }, + { label: "项目人员异常", value: "项目人员异常" }, + { label: "从业告知异常", value: "从业告知异常" }, + { label: "现场勘查异常", value: "现场勘查异常" }, + { label: "过程控制/归档异常", value: "过程控制/归档异常" }, +]; \ No newline at end of file diff --git a/src/pages/Container/EnterpriseInfo/PersonnelInfo/Certificate/index.js b/src/pages/Container/EnterpriseInfo/PersonnelInfo/Certificate/index.js index 10592e4..406c164 100644 --- a/src/pages/Container/EnterpriseInfo/PersonnelInfo/Certificate/index.js +++ b/src/pages/Container/EnterpriseInfo/PersonnelInfo/Certificate/index.js @@ -1,6 +1,16 @@ import { Connect } from "@cqsjjb/jjb-dva-runtime"; -import { Button, DatePicker, Descriptions, Form, Input, message, Modal, Select, Table, Upload } from "antd"; -import { UploadOutlined } from "@ant-design/icons"; +import { + Button, + DatePicker, + Descriptions, + Form, + Input, + message, + Modal, + Select, + Table, + Upload, +} from "antd"; import { useEffect, useState } from "react"; import dayjs from "dayjs"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; @@ -14,13 +24,18 @@ import CertPreviewImg from "~/components/CertPreviewImg"; import AttachmentUpload from "~/components/AttachmentUpload"; import { dateRangeRule } from "~/utils/validators"; import { CERT_TYPE_OPTIONS, CERT_TYPE_MAP } from "~/enumerate/constant"; +import { QUALIFICATION_INDUSTRY_OPTIONS, QUALIFICATION_INDUSTRY_OPTIONS_MAP } from "~/enumerate/enterpriseOptions"; const { router } = tools; function StaffCertificatePage(props) { - const urlParams = Object.fromEntries(new URLSearchParams(window.location.search)); + const urlParams = Object.fromEntries( + new URLSearchParams(window.location.search), + ); const staffId = urlParams.staffId; - const staffName = urlParams.staffName ? decodeURIComponent(urlParams.staffName) : ""; + const staffName = urlParams.staffName + ? decodeURIComponent(urlParams.staffName) + : ""; const [addModalOpen, setAddModalOpen] = useState(false); const [viewModalOpen, setViewModalOpen] = useState(false); const [currentId, setCurrentId] = useState(""); @@ -41,10 +56,6 @@ function StaffCertificatePage(props) { props.staffCertificateList({ ...router.query, personnelId: staffId }); }; - const goBack = () => { - window.location.href = window.location.pathname.replace(/\/Certificate.*$/, "/List"); - }; - const onDelete = (id) => { Modal.confirm({ title: "提示", @@ -67,7 +78,15 @@ function StaffCertificatePage(props) { previous title={`人员证书 - ${staffName || ""}`} extra={ - { setCurrentId(""); setAddModalOpen(true); }}>新增证书 + { + setCurrentId(""); + setAddModalOpen(true); + }} + > + 新增证书 + } > - + , - + , - + , - + , ]} onReset={(values) => { @@ -116,8 +155,12 @@ function StaffCertificatePage(props) { CERT_TYPE_MAP[v] || v }, + { title: "证照名称", dataIndex: "certName", ellipsis: true }, + { + title: "证书类型", + dataIndex: "certTypeCode", + render: (v) => CERT_TYPE_MAP[v] || v, + }, { title: "证书类别", dataIndex: "certCategoryName" }, { title: "证书作业类别", dataIndex: "operationCategoryName" }, { title: "证书编号", dataIndex: "certNo" }, @@ -126,13 +169,34 @@ function StaffCertificatePage(props) { width: 200, render: (_, record) => ( - { setCurrentId(record.id); setViewModalOpen(true); }}> + { + setCurrentId(record.id); + setViewModalOpen(true); + }} + > 查看 - { setCurrentId(record.id); setAddModalOpen(true); }}> + { + setCurrentId(record.id); + setAddModalOpen(true); + }} + > 编辑 - onDelete(record.id)}>删除 + onDelete(record.id)} + > + 删除 + ), }, @@ -162,6 +226,9 @@ function StaffCertificatePage(props) { staffCertificateAdd={props.staffCertificateAdd} staffCertificateEdit={props.staffCertificateEdit} staffCertificateInfo={props.staffCertificateInfo} + queryIndustryProfessionalStandards={ + props.queryIndustryProfessionalStandards + } onCancel={() => { setAddModalOpen(false); setCurrentId(""); @@ -185,18 +252,48 @@ function StaffCertificatePage(props) { } function CertModal({ - open, staffId, currentId, staffCertificateAdd, staffCertificateEdit, staffCertificateInfo, onCancel, onSuccess, + open, + staffId, + currentId, + staffCertificateAdd, + staffCertificateEdit, + staffCertificateInfo, + queryIndustryProfessionalStandards, + onCancel, + onSuccess, }) { const [form] = Form.useForm(); const [submitting, setSubmitting] = useState(false); const [detailLoading, setDetailLoading] = useState(false); const [uploadFileList, setUploadFileList] = useState([]); + const [professionalCapabilityOptions, setProfessionalCapabilityOptions] = + useState([]); + + const loadProfessionalCapabilities = async (industryCode) => { + if (!industryCode) { + setProfessionalCapabilityOptions([]); + form.setFieldsValue({ professionalCapabilityId: undefined }); + return; + } + const res = await queryIndustryProfessionalStandards({ + industryCode, + pageSize: 999, + }); + const list = res?.data || []; + setProfessionalCapabilityOptions( + list.map((item) => ({ + value: item.id, + label: item.professionalCapabilityName, + })), + ); + }; useEffect(() => { if (!open) return; if (!currentId) { form.resetFields(); setUploadFileList([]); + setProfessionalCapabilityOptions([]); return; } let cancelled = false; @@ -227,23 +324,31 @@ function CertModal({ url: f.url, })); } else if (data.certAttachmentUrl) { - fileList = data.certAttachmentUrl.split(",").filter(Boolean).map((url, i) => ({ - uid: `-${i}`, - name: url.split("/").pop() || `证书附件${i + 1}`, - status: "done", - url, - })); + fileList = data.certAttachmentUrl + .split(",") + .filter(Boolean) + .map((url, i) => ({ + uid: `-${i}`, + name: url.split("/").pop() || `证书附件${i + 1}`, + status: "done", + url, + })); } data.certAttachmentUrl = fileList; setUploadFileList(fileList); form.setFieldsValue(data); + if (data.businessScope) { + loadProfessionalCapabilities(data.businessScope); + } } catch (err) { console.warn("[StaffCertificate] load detail failed:", err); } finally { if (!cancelled) setDetailLoading(false); } })(); - return () => { cancelled = true; }; + return () => { + cancelled = true; + }; }, [open, currentId]); const handleCancel = () => { @@ -258,11 +363,20 @@ function CertModal({ const payload = { ...values, personnelId: staffId, - validStartDate: values.validDate?.[0] ? dayjs(values.validDate[0]).format("YYYY-MM-DD") : undefined, - validEndDate: values.validDate?.[1] ? dayjs(values.validDate[1]).format("YYYY-MM-DD") : undefined, - reviewDate: values.reviewDate ? dayjs(values.reviewDate).format("YYYY-MM-DD") : undefined, + validStartDate: values.validDate?.[0] + ? dayjs(values.validDate[0]).format("YYYY-MM-DD") + : undefined, + validEndDate: values.validDate?.[1] + ? dayjs(values.validDate[1]).format("YYYY-MM-DD") + : undefined, + reviewDate: values.reviewDate + ? dayjs(values.reviewDate).format("YYYY-MM-DD") + : undefined, certAttachmentUrl: Array.isArray(values.certAttachmentUrl) - ? values.certAttachmentUrl.map((f) => f.url || f.response?.url).filter(Boolean).join(",") + ? values.certAttachmentUrl + .map((f) => f.url || f.response?.url) + .filter(Boolean) + .join(",") : "", }; delete payload.validDate; @@ -275,7 +389,6 @@ function CertModal({ handleCancel(); onSuccess(); } else { - } } finally { setSubmitting(false); @@ -294,6 +407,22 @@ function CertModal({ onOk={form.submit} > + + + + + + @@ -338,6 +470,7 @@ function CertModal({ > + - + - + - - ); @@ -398,11 +542,14 @@ function ViewModal({ open, currentId, staffCertificateInfo, onCancel }) { if (Array.isArray(data.certImgFiles)) { data.certDisplayFiles = data.certImgFiles; } else if (data.certAttachmentUrl) { - data.certDisplayFiles = data.certAttachmentUrl.split(",").filter(Boolean).map((url, i) => ({ - uid: `-${i}`, - fileName: url.split("/").pop() || `证书附件${i + 1}`, - url, - })); + data.certDisplayFiles = data.certAttachmentUrl + .split(",") + .filter(Boolean) + .map((url, i) => ({ + uid: `-${i}`, + fileName: url.split("/").pop() || `证书附件${i + 1}`, + url, + })); } else { data.certDisplayFiles = []; } @@ -413,7 +560,9 @@ function ViewModal({ open, currentId, staffCertificateInfo, onCancel }) { if (!cancelled) setDetailLoading(false); } })(); - return () => { cancelled = true; }; + return () => { + cancelled = true; + }; }, [open, currentId]); return ( @@ -428,21 +577,44 @@ function ViewModal({ open, currentId, staffCertificateInfo, onCancel }) { onCancel={onCancel} > + {QUALIFICATION_INDUSTRY_OPTIONS_MAP[info.businessScope] } + {info.professionalCapabilityName } {info.certName} - {CERT_TYPE_MAP[info.certTypeCode] || info.certTypeCode} - {info.certCategoryCode} - {info.certCategoryName} - {info.operationCategoryCode} - {info.operationCategoryName} + + {CERT_TYPE_MAP[info.certTypeCode] || info.certTypeCode} + + + {info.certCategoryCode} + + + {info.certCategoryName} + + + {info.operationCategoryCode} + + + {info.operationCategoryName} + {info.certNo} {info.issueOrg} - {info.validStartDate} - {info.validEndDate} - {info.reviewDate} - + + {info.validStartDate} + + + {info.validEndDate} + + + {info.reviewDate} + + + + ); } -export default Connect([NS_STAFF_CERTIFICATE], true)(AntdTableFuncControl(StaffCertificatePage)); +export default Connect( + [NS_STAFF_CERTIFICATE], + true, +)(AntdTableFuncControl(StaffCertificatePage)); diff --git a/src/pages/Container/MonitorManage/QualMonitor/index.js b/src/pages/Container/MonitorManage/QualMonitor/index.js index 0deb97a..01d81eb 100644 --- a/src/pages/Container/MonitorManage/QualMonitor/index.js +++ b/src/pages/Container/MonitorManage/QualMonitor/index.js @@ -182,7 +182,7 @@ const QualMonitor = (props) => { {name} - 统一社会信用代码:{record.creditCode} | 注册地:{record.districtName || "—"} + 统一社会信用代码:{record.orgInfoCreditCode} | 注册地:{record.districtName || "—"} ), diff --git a/src/pages/Container/MonitorManage/RiskCenter/index.js b/src/pages/Container/MonitorManage/RiskCenter/index.js index 628c007..e1e0829 100644 --- a/src/pages/Container/MonitorManage/RiskCenter/index.js +++ b/src/pages/Container/MonitorManage/RiskCenter/index.js @@ -1,52 +1,24 @@ import React, { useState, useEffect } from "react"; -import { Button, Form, Table, Tag } from "antd"; +import dayjs from "dayjs"; +import { Button, Form, Table, Tag, Modal, Select, DatePicker, Input, Space, message } from "antd"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import SearchForm from "@cqsjjb/jjb-react-admin-component/SearchForm"; import ControlWrapper from "@cqsjjb/jjb-react-admin-component/ControlWrapper"; import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd"; import { tools } from "@cqsjjb/jjb-common-lib"; +import AttachmentUpload from "~/components/AttachmentUpload"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { NS_RISK_CENTER } from "~/enumerate/namespace"; +import { + RISK_TYPE_MAP, + STAGE_MAP, + ORG_STATUS_MAP, + RISK_SUBTYPE_OPTIONS, +} from "~/enumerate/constant"; import "./index.less"; const { router } = tools; -/** 预警大类配置 */ -const RISK_TYPE_MAP = { - qual: { label: "资质预警", color: "error" }, - proj: { label: "项目预警", color: "warning" }, -}; - -/** 处理阶段配置 */ -const STAGE_MAP = { - untreated: { label: "未处理", color: "error" }, - sent: { label: "已发机构", color: "warning" }, - review: { label: "待复核", color: "processing" }, - closed: { label: "已闭环", color: "success" }, -}; - -/** 机构端状态配置 */ -const ORG_STATUS_MAP = { - unsent: { label: "未发送", color: "error" }, - unread: { label: "机构未读", color: "warning" }, - processing: { label: "处理中", color: "processing" }, - submitted: { label: "已提交材料", color: "processing" }, - done: { label: "整改完成", color: "success" }, -}; - -/** 预警子类选项 */ -const RISK_SUBTYPE_OPTIONS = [ - { label: "资质条件保持异常", value: "qual_condition" }, - { label: "人员比例异常", value: "qual_person_rate" }, - { label: "属地材料待核验", value: "qual_area" }, - { label: "项目启动超期", value: "proj_start" }, - { label: "关键节点超期", value: "proj_node" }, - { label: "项目人员异常", value: "proj_person" }, - { label: "从业告知异常", value: "proj_notify" }, - { label: "现场勘查异常", value: "proj_site" }, - { label: "过程控制/归档异常", value: "proj_archive" }, -]; - /** 项目预警规则提示 */ const PROJ_RULES = [ "项目启动超期", @@ -57,80 +29,6 @@ const PROJ_RULES = [ "过程控制/归档异常", ]; -/** mock 数据 */ -const MOCK_DATA = [ - { - id: "W-QUAL-2026-012", - type: "qual", - subtype: "qual_condition", - target: "重庆渝安风险评估中心", - sources: ["财务材料.固定资产", "场所核验.建筑面积", "人员库.专职人数"], - content: "固定资产、场所面积、档案室面积和专职人员数量不满足保持条件。", - stage: "untreated", - orgStatus: "unsent", - }, - { - id: "W-QUAL-2026-011", - type: "qual", - subtype: "qual_person_rate", - target: "重庆恒安安全评价有限公司", - sources: ["人员库.职称等级", "人员库.注册安全工程师"], - content: "高级职称比例 26%,合计比例 59%,低于资质保持条件。", - stage: "sent", - orgStatus: "unread", - }, - { - id: "W-QUAL-2026-013", - type: "qual", - subtype: "qual_area", - target: "北京中安评价中心重庆分公司", - sources: ["本市社保.缴纳人数", "场所核验.租赁合同"], - content: "机构已提交本地场所和人员说明,等待监管复核。", - stage: "review", - orgStatus: "submitted", - }, - { - id: "W-PROJ-2026-021", - type: "proj", - subtype: "proj_start", - target: "华安化工年度安全现状评价", - sources: ["客户信息.评价到期日", "项目库.新建时间"], - content: "评价周期已到期 14 天,系统内尚未建立新一轮评价项目。", - stage: "untreated", - orgStatus: "unsent", - }, - { - id: "W-PROJ-2026-018", - type: "proj", - subtype: "proj_node", - target: "安环检测年度安全现状评价", - sources: ["项目计划.节点期限", "流程记录.当前节点"], - content: "项目停留在过程控制环节 12 天,已超过计划完成时间。", - stage: "sent", - orgStatus: "processing", - }, - { - id: "W-PROJ-2026-015", - type: "proj", - subtype: "proj_person", - target: "鼎信建设安全验收评价", - sources: ["项目组.项目负责人", "人员库.在职状态"], - content: "项目负责人已提交离职申请,项目尚未完成负责人变更。", - stage: "review", - orgStatus: "submitted", - }, - { - id: "W-PROJ-2026-009", - type: "proj", - subtype: "proj_site", - target: "华安化工园区安全预评价", - sources: ["现场勘查.签到签退", "项目组.参与人员"], - content: "现场勘查仅有签到记录,无签退记录和现场照片。", - stage: "closed", - orgStatus: "done", - }, -]; - /** 统计卡片样式主题 */ const CARD_THEMES = [ { bg: "#fee2e2", color: "#dc2626" }, @@ -141,21 +39,67 @@ const CARD_THEMES = [ const RiskCenter = (props) => { const [form] = Form.useForm(); - const [data] = useState(MOCK_DATA); + const [processForm] = Form.useForm(); + const [processRecord, setProcessRecord] = useState(null); + const [processModalOpen, setProcessModalOpen] = useState(false); - const { riskCenter, queryRiskOverviewAction } = props; - const { overviewStats = [], riskOverviewLoading } = riskCenter || {}; + const { riskCenter, queryRiskOverviewAction, queryRiskPageAction } = props; + const { overviewStats = [], riskPageList = [], riskPageTotal = 0, riskPageLoading } = riskCenter || {}; useEffect(() => { queryRiskOverviewAction(); + handleSearch(); }, []); const handleSearch = () => { - // 接口搜索 + queryRiskPageAction(router.query); }; - const handleReset = () => { + const handleReset = (values) => { form.resetFields(); + router.query = { ...values, current: 1, size: 10 }; + handleSearch(); + }; + + const handlePageChange = (page, size) => { + router.query = { ...router.query, current: page, size }; + handleSearch() + }; + + /** 处理按钮 — 打开对应阶段的处理弹窗 */ + const handleProcess = (record) => { + setProcessRecord(record); + if (record.stage === "未处理" || record.stage === "已发机构") { + processForm.setFieldsValue({ + relatedId: record.id, + institution: record.riskObject, + deadline: dayjs().add(15, "day"), + opinion: "请核查来源字段与上传材料,形成监管处置记录。", + }); + } + setProcessModalOpen(true); + }; + + /** 提交预警处置 */ + const handleProcessSubmit = () => { + message.success("处理结果已提交"); + setProcessModalOpen(false); + setProcessRecord(null); + processForm.resetFields(); + }; + + /** 退回补正 */ + const handleReturn = () => { + message.success("已退回机构补正"); + setProcessModalOpen(false); + setProcessRecord(null); + }; + + /** 复核通过并闭环 */ + const handleClose = () => { + message.success("预警已复核闭环"); + setProcessModalOpen(false); + setProcessRecord(null); }; const columns = [ @@ -166,30 +110,26 @@ const RiskCenter = (props) => { }, { title: "预警大类", - dataIndex: "type", + dataIndex: "category", width: 100, - render: (type) => { - const cfg = RISK_TYPE_MAP[type]; - return cfg ? {cfg.label} : "--"; + render: (val) => { + const cfg = RISK_TYPE_MAP[val]; + return cfg ? {cfg.label} : val || "--"; }, }, { title: "预警子类", dataIndex: "subtype", width: 140, - render: (subtype) => { - const opt = RISK_SUBTYPE_OPTIONS.find((o) => o.value === subtype); - return opt?.label || "--"; - }, }, { title: "风险对象", - dataIndex: "target", + dataIndex: "riskObject", width: 200, }, { title: "来源字段", - dataIndex: "sources", + dataIndex: "sourceFields", width: 280, render: (sources) => ( @@ -228,8 +168,8 @@ const RiskCenter = (props) => { title: "监管操作", width: 100, fixed: "right", - render: () => ( - + render: (_, record) => ( + handleProcess(record)}> 处理 ), @@ -283,15 +223,15 @@ const RiskCenter = (props) => { allowClear /> , - + , @@ -311,16 +251,19 @@ const RiskCenter = (props) => { allowClear style={{ width: "100%" }} options={[ - { label: "未处理", value: "untreated" }, - { label: "已发机构", value: "sent" }, - { label: "待复核", value: "review" }, - { label: "已闭环", value: "closed" }, + { label: "未处理", value: "未处理" }, + { label: "已发机构", value: "已发机构" }, + { label: "待复核", value: "待复核" }, + { label: "已闭环", value: "已闭环" }, ]} /> , ]} onReset={handleReset} - onFinish={handleSearch} + onFinish={(values) => { + router.query = { ...values, current: 1, size: 10 }; + handleSearch(); + }} /> {/* 工具条 */} @@ -341,20 +284,114 @@ const RiskCenter = (props) => { `共 ${total} 条`, - current: router.query.current || 1, - pageSize: router.query.size || 10, - onChange: (page, size) => { - router.query = { ...router.query, current: page, size }; - }, + showTotal: (t) => `共 ${t} 条`, + current: Number(router.query.current) || 1, + pageSize: Number(router.query.size) || 10, + onChange: handlePageChange, }} /> + + {/* 风险预警处置弹窗(未处理 / 已发机构) */} + {processRecord && (processRecord.stage === "未处理" || processRecord.stage === "已发机构") && ( + { setProcessModalOpen(false); setProcessRecord(null); }} + footer={ + + { setProcessModalOpen(false); setProcessRecord(null); }}>关闭 + 提交 + + } + width={760} + destroyOnClose + > + + 风险预警中心统一办理监管处置:确认来源、选择处置方式、发送机构消息、等待机构反馈、复核并闭环。 + + + + + + + + + + + + + + + + + + + + + )} + + {/* 机构反馈复核弹窗(待复核 / 已闭环) */} + {processRecord && (processRecord.stage === "待复核" || processRecord.stage === "已闭环") && ( + { setProcessModalOpen(false); setProcessRecord(null); }} + footer={ + + { setProcessModalOpen(false); setProcessRecord(null); }}>关闭 + 退回补正 + 复核通过并闭环 + + } + width={760} + destroyOnClose + > + + 机构端提交的说明和附件进入本环节复核,监管人员可通过、退回补正或办结。 + + + + + + + )} );