import React, { useState, useEffect } from "react"; 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 PROJ_RULES = [ "项目启动超期", "关键节点超期", "项目人员异常", "从业告知异常", "现场勘查异常", "过程控制/归档异常", ]; /** 统计卡片样式主题 */ const CARD_THEMES = [ { bg: "#fee2e2", color: "#dc2626" }, { bg: "#fef3c7", color: "#d97706" }, { bg: "#dbeafe", color: "#2563eb" }, { bg: "#d1fae5", color: "#059669" }, ]; const RiskCenter = (props) => { const [form] = Form.useForm(); const [processForm] = Form.useForm(); const [processRecord, setProcessRecord] = useState(null); const [processModalOpen, setProcessModalOpen] = useState(false); const { riskCenter, queryRiskOverviewAction, queryRiskPageAction } = props; const { overviewStats = [], riskPageList = [], riskPageTotal = 0, riskPageLoading } = riskCenter || {}; useEffect(() => { queryRiskOverviewAction(); handleSearch(); }, []); const handleSearch = () => { queryRiskPageAction(router.query); }; 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 = [ { title: "预警编号", dataIndex: "id", width: 160, }, { title: "预警大类", dataIndex: "category", width: 100, render: (val) => { const cfg = RISK_TYPE_MAP[val]; return cfg ? {cfg.label} : val || "--"; }, }, { title: "预警子类", dataIndex: "subtype", width: 140, }, { title: "风险对象", dataIndex: "riskObject", width: 200, }, { title: "来源字段", dataIndex: "sourceFields", width: 280, render: (sources) => (
{(sources || []).map((s, i) => ( {s} ))}
), }, { title: "触发内容", dataIndex: "content", width: 320, }, { title: "处理阶段", dataIndex: "stage", width: 100, render: (stage) => { const cfg = STAGE_MAP[stage]; return cfg ? {cfg.label} : "--"; }, }, { title: "机构端状态", dataIndex: "orgStatus", width: 110, render: (status) => { const cfg = ORG_STATUS_MAP[status]; return cfg ? {cfg.label} : "--"; }, }, { title: "监管操作", width: 100, fixed: "right", render: (_, record) => ( ), }, ]; return (
{/* 统计卡片 */}
{overviewStats.map((stat, idx) => { const theme = CARD_THEMES[idx % CARD_THEMES.length]; return (
{stat.label}
{stat.value}
{stat.hint}
{stat.label.charAt(0)}
); })}
{/* 项目预警规则提示 */}
项目预警规则: {PROJ_RULES.map((rule) => ( {rule} ))}
{/* 搜索表单 */} , , , , ]} onReset={handleReset} onFinish={(values) => { router.query = { ...values, current: 1, size: 10 }; handleSearch(); }} /> {/* 工具条 */}
资质预警沿用资质保持监控结果;项目预警由项目计划、人员、从业告知、现场记录和审核归档数据触发。
{/* 数据表格 */} `共 ${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={ } width={760} destroyOnHidden >
风险预警中心统一办理监管处置:确认来源、选择处置方式、发送机构消息、等待机构反馈、复核并闭环。
)} {/* 机构反馈复核弹窗(待复核 / 已闭环) */} {processRecord && (processRecord.stage === "待复核" || processRecord.stage === "已闭环") && ( { setProcessModalOpen(false); setProcessRecord(null); }} footer={ } width={760} destroyOnHidden >
机构端提交的说明和附件进入本环节复核,监管人员可通过、退回补正或办结。
)} ); }; export default Connect( [NS_RISK_CENTER], true, )(AntdTableFuncControl(RiskCenter));