diff --git a/.gitignore b/.gitignore index 97ca288..6b5df63 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules # production +/prototype /dist /demo /.trae/ diff --git a/src/enumerate/constant/index.js b/src/enumerate/constant/index.js index f077757..08de1bb 100644 --- a/src/enumerate/constant/index.js +++ b/src/enumerate/constant/index.js @@ -2,4 +2,51 @@ * 全局常量定义 */ -export {}; +/** 证书状态 */ +export const CERT_STATUS_MAP = { + normal: { label: "正常", color: "success" }, + expiring: { label: "即将到期", color: "warning" }, + expired: { label: "已过期", color: "error" }, +}; + +/** 核验状态 */ +export const VERIFY_STATUS_MAP = { + pending: { label: "待确认", color: "warning" }, + passed: { label: "确认通过", color: "success" }, + rejected: { label: "打回", color: "error" }, +}; + +/** 审核状态 */ +export const REVIEW_STATUS_MAP = { + pending: { label: "待审核", color: "warning" }, + reviewing: { label: "审核中", color: "processing" }, + rejected: { label: "打回", color: "error" }, +}; + +/** 专家核验状态 */ +export const EXPERT_STATUS_MAP = { + pending: { label: "待核验", color: "blue" }, + arranging: { label: "待安排", color: "warning" }, + passed: { label: "已核验", color: "success" }, + +}; + +/** 公示状态 */ +export const PUBLICITY_STATUS_MAP = { + pending: { label: "待公示", color: "warning" }, + published: { label: "已公示", color: "success" }, +}; + +/** 变更状态 */ +export const CHANGE_STATUS_MAP = { + stuck: { label: "停滞中", color: "error" }, + pending: { label: "待审核", color: "warning" }, + approved: { label: "已审核", color: "success" }, +}; + +/** 专家等级 */ +export const EXPERT_LEVEL_MAP = { + 1: "一级", + 2: "二级", + 3: "三级", +}; diff --git a/src/main.js b/src/main.js index 5f6a7ba..c79a518 100644 --- a/src/main.js +++ b/src/main.js @@ -6,8 +6,7 @@ import { getFileUrlFromServer } from "zy-react-library/utils"; import "dayjs/locale/zh-cn"; import "../blessed_by_buddha"; -require("antd/dist/reset.css"); -require("zy-react-library/css/common.less"); + dayjs.locale("zh-cn"); setJJBCommonAntdMessage(message); diff --git a/src/pages/Container/QualificationReview/ExpertVerification/index.js b/src/pages/Container/QualificationReview/ExpertVerification/index.js new file mode 100644 index 0000000..b470a1e --- /dev/null +++ b/src/pages/Container/QualificationReview/ExpertVerification/index.js @@ -0,0 +1,213 @@ +import React, { useState, useEffect } from "react"; +import { Button, Form, Select, Space, Table, Tag } 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 { VERIFY_STATUS_MAP } from "~/enumerate/constant"; + + + +// 静态模拟数据 +const MOCK_DATA = [ + { + id: 1, + orgName: "重庆安评技术研究院有限公司", + orgType: "本地机构", + certNo: "API-2026-001", + businessScope: "化工, 石油加工", + confirmStatus: "pending", + }, + { + id: 2, + orgName: "北京中安评价中心(重庆分公司)", + orgType: "异地机构", + certNo: "API-2026-015", + businessScope: "矿山", + confirmStatus: "passed", + }, + { + id: 3, + orgName: "重庆华安评价有限公司", + orgType: "异地机构", + certNo: "API-2025-088", + businessScope: "石油加工", + confirmStatus: "pending", + }, + { + id: 4, + orgName: "重庆安评科技有限公司", + orgType: "本地机构", + certNo: "API-2024-056", + businessScope: "化工", + confirmStatus: "rejected", + }, + { + id: 5, + orgName: "重庆恒安安全评价有限公司", + orgType: "本地机构", + certNo: "API-2025-032", + businessScope: "矿山, 石油加工", + confirmStatus: "passed", + }, +]; + +const {router} = tools; + +const ExpertVerification = (props) => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + + const handleSearch = () => { + setLoading(true); + console.log(router.query); + setTimeout(() => setLoading(false), 500); + }; + + const handleReset = (values) => { + setLoading(true); + router.query={ + ...router.query, + ...values, + current: 1, + pageSize: 10, + } + handleSearch(); + }; + + useEffect(() => { + form.setFieldsValue(router.query); + }, []); + + const columns = [ + { + title: "序号", + dataIndex: "id", + width: 60, + fixed: "left", + render: (text, record, index) => index + 1, + }, + { title: "机构名称", dataIndex: "orgName", width: 220, ellipsis: true }, + { title: "机构类型", dataIndex: "orgType", width: 100 }, + { title: "证书编号", dataIndex: "certNo", width: 140, ellipsis: true }, + { title: "安全评价业务范围", dataIndex: "businessScope", width: 180, ellipsis: true }, + { + title: "确认状态", + dataIndex: "confirmStatus", + width: 100, + render: (status) => { + const config = VERIFY_STATUS_MAP[status]; + return config ? {config.label} : status; + }, + }, + { + title: "操作", + width: 140, + fixed: "right", + render: (_, record) => ( + + + {record.confirmStatus === "pending" && ( + + )} + + ), + }, + ]; + + return ( + + + + + , + + + 本地机构 + 异地机构 + + , + + + 石油加工 + 化工 + 矿山 + + , + + + 待确认 + 确认通过 + 打回 + + , + ]} + onReset={handleReset} + onFinish={(values) => { + router.query={ + ...router.query, + ...values, + current: 1, + pageSize: 10, + } + handleSearch(); + }} + /> + + `共 ${total} 条`, + current: router.query.current, + pageSize: router.query.pageSize, + onChange: (page, pageSize) => { + + router.query={ + ...router.query, + current: page, + pageSize, + }; + handleSearch(); + }, + }} + /> + + ); +}; + +export default AntdTableFuncControl(ExpertVerification); diff --git a/src/pages/Container/QualificationReview/FilingDetail/index.js b/src/pages/Container/QualificationReview/FilingDetail/index.js new file mode 100644 index 0000000..df479e5 --- /dev/null +++ b/src/pages/Container/QualificationReview/FilingDetail/index.js @@ -0,0 +1,34 @@ +import React, { useMemo } from "react"; +import { Tag, Space } from "antd"; +import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; +import { REVIEW_STATUS_MAP } from "~/enumerate/constant"; +import { MOCK_DETAIL } from "../mockData"; +import FilingTabs from "../FilingTabs"; + +function parseQueryId(location) { + const search = location?.search || window.location.search || ""; + return new URLSearchParams(search).get("id"); +} + +const FilingDetail = (props) => { + const id = useMemo(() => parseQueryId(props.location), [props.location?.search]); + const detail = MOCK_DETAIL; + const statusConfig = REVIEW_STATUS_MAP[detail.reviewStatus]; + + return ( + + 备案申请详情 + {statusConfig && {statusConfig.label}} + + } + history={props.history} + previous + > + + + ); +}; + +export default FilingDetail; diff --git a/src/pages/Container/QualificationReview/FilingTabs/index.js b/src/pages/Container/QualificationReview/FilingTabs/index.js new file mode 100644 index 0000000..8c517c8 --- /dev/null +++ b/src/pages/Container/QualificationReview/FilingTabs/index.js @@ -0,0 +1,255 @@ +import React, { useState } from "react"; +import { Button, Descriptions, Table, Tag, Tabs, Select, Modal, Space } from "antd"; +import { + MOCK_MATERIALS, + MOCK_PERSONNEL, + MOCK_EQUIPMENT, + MOCK_EQUIP_DETAIL, + MOCK_PERSONNEL_DETAIL, + MOCK_CERTIFICATES, + CALIBRATION_MAP, +} from "../mockData"; + +/** + * 共享组件:资质备案 5 个标签页(详情 / 审核共用) + * @param {Object} props + * @param {Object} props.detail - 备案详情数据 + * @param {boolean} [props.isReview=false] - 审核模式(开启后材料上传显示"上传附件"+"符合性"列) + * @param {Object} [props.compliance={}] - 审核模式下的符合性状态 + * @param {Function} [props.onComplianceChange] - 符合性变动回调 + * @param {Function} [props.onPersonnelView] - 查看人员详情回调(覆盖默认弹窗) + * @param {Function} [props.onEquipView] - 查看设备详情回调 (record) => void(覆盖默认弹窗) + */ +const FilingTabs = ({ + detail, + isReview = false, + compliance = {}, + onComplianceChange, + onPersonnelView, + onEquipView, +}) => { + const [personnelVisible, setPersonnelVisible] = useState(false); + const [equipVisible, setEquipVisible] = useState(false); + const [selectedEquip, setSelectedEquip] = useState(null); + + const baseCols = [ + { title: "序号", width: 60, render: (_, __, i) => i + 1 }, + { title: "材料名称", dataIndex: "name" }, + ]; + + const materialCols = isReview + ? [ + ...baseCols, + { title: "上传附件", dataIndex: "attachment", width: 120 }, + { title: "格式", dataIndex: "format", width: 80 }, + { title: "状态", dataIndex: "status", width: 100, render: () => 已上传 }, + { title: "符合性", width: 100, + render: (_, record) => ( + + ), + }, + ] + : [ + ...baseCols, + { title: "格式", dataIndex: "format", width: 80 }, + { title: "状态", dataIndex: "status", width: 100, render: () => 已上传 }, + { title: "操作", width: 80, render: () => }, + ]; + + const items = [ + { + key: "info", + label: "1.备案基本信息", + children: ( + + {detail.scopeName} + {detail.filingRegion} + {detail.orgName} + {detail.orgType} + {detail.creditCode} + {detail.officeAddress} + {detail.registerAddress} + {detail.certNo} + {detail.website} + {detail.legalPerson} / {detail.legalPhone} + {detail.contactPerson} / {detail.contactPhone} + {detail.fixedAssets} + {detail.officeArea} + {detail.archiveArea} + {detail.evaluatorCount} + {detail.registerEngineerCount} + {detail.description} + + ), + }, + { + key: "materials", + label: "2.备案材料上传", + children: ( +
+ ), + }, + { + key: "promise", + label: "3.法定代表人承诺书", + children: ( +
+

申请单位法定代表人承诺书

+

本人{detail.legalPerson}是{detail.orgName}法定代表人,现代表我单位承诺如下:

+

一、我单位自愿申请安全评价机构资质。本人已经认真学习、了解并掌握《安全生产法》《行政许可法》《行政处罚法》及《安全评价检测检验机构管理办法》等法律法规的相关规定,知悉开展安全评价工作的法律责任、义务、权力和风险。

+

二、本人承诺本单位满足《安全评价检测检验机构管理办法》所规定的资质条件要求,本人及单位三年内无重大违法失信行为,申请资质所提交的有关材料真实、合法、有效,并对其真实性、合法性承担相应法律责任,接受并配合有关部门对本单位开展的专业能力审查。

+

三、如能获准资质,本单位将严格按照法律法规、规章标准的要求开展安全评价活动,遵守执业准则和职业道德,并对作出的安全评价报告结果承担法律责任,自觉接受应急管理部门、煤矿安全监督管理部门等行政执法部门的监督检查。

+

法定代表人:{detail.legalPerson}(已签名)

+

(单位盖章)

+

2026年06月25日

+
+ ), + }, + { + key: "personnel", + label: "4.备案人员管理", + children: ( +
i + 1 }, + { title: "人员姓名", dataIndex: "name", width: 100 }, + { title: "类型", dataIndex: "type", width: 100 }, + { title: "职务", dataIndex: "position", width: 120 }, + { title: "职称", dataIndex: "title", width: 100 }, + { title: "专业能力", dataIndex: "ability" }, + { title: "操作", width: 80, + render: () => ( + + ), + }, + ]} + /> + ), + }, + { + key: "equipment", + label: "5.装备清单", + children: ( +
i + 1 }, + { title: "装备名称", dataIndex: "name", width: 140 }, + { title: "规格型号", dataIndex: "model", width: 120 }, + { title: "生产厂家", dataIndex: "manufacturer", width: 140 }, + { title: "计量检定情况", dataIndex: "calibration", width: 120, + render: (s) => { + const cfg = CALIBRATION_MAP[s]; + return cfg ? {cfg.label} : s; + }, + }, + { title: "操作", width: 80, + render: (_, record) => ( + + ), + }, + ]} + /> + ), + }, + ]; + + return ( + <> + + + {/* 人员详细信息弹窗 */} + setPersonnelVisible(false)} + width={720} + footer={(originNode, { CancelBtn }) => } + > + + {MOCK_PERSONNEL_DETAIL.name} + {MOCK_PERSONNEL_DETAIL.gender} + {MOCK_PERSONNEL_DETAIL.qualScope} + {MOCK_PERSONNEL_DETAIL.birthDate} + {MOCK_PERSONNEL_DETAIL.officeAddress} + {MOCK_PERSONNEL_DETAIL.major} + {MOCK_PERSONNEL_DETAIL.certLevel} + {MOCK_PERSONNEL_DETAIL.email} + {MOCK_PERSONNEL_DETAIL.personnelType} + {MOCK_PERSONNEL_DETAIL.idCard} + {MOCK_PERSONNEL_DETAIL.currentAddress} + {MOCK_PERSONNEL_DETAIL.education} + {MOCK_PERSONNEL_DETAIL.graduateSchool} + {MOCK_PERSONNEL_DETAIL.position} + + + {MOCK_PERSONNEL_DETAIL.isRegisterEngineer} + + + {MOCK_PERSONNEL_DETAIL.publications} + {MOCK_PERSONNEL_DETAIL.selfDeclaration} + {MOCK_PERSONNEL_DETAIL.workExperience} + + 专业能力证明.pdf + + + +

证照信息

+
}, + ]} + /> + + + {/* 设备详细信息弹窗 */} + setEquipVisible(false)} + width={600} + footer={} + > + {selectedEquip && ( + + {MOCK_EQUIP_DETAIL.name} + {MOCK_EQUIP_DETAIL.model} + {MOCK_EQUIP_DETAIL.category} + {MOCK_EQUIP_DETAIL.type} + {MOCK_EQUIP_DETAIL.manufacturer} + {MOCK_EQUIP_DETAIL.calibrationType} + {MOCK_EQUIP_DETAIL.flowDesc} + {MOCK_EQUIP_DETAIL.maxFlow} + {MOCK_EQUIP_DETAIL.minFlow} + {MOCK_EQUIP_DETAIL.dualChannel} + {MOCK_EQUIP_DETAIL.calibInitValue} + {MOCK_EQUIP_DETAIL.calibUnit} + + {CALIBRATION_MAP[MOCK_EQUIP_DETAIL.status]?.label} + + + )} + + + ); +}; + +export default FilingTabs; diff --git a/src/pages/Container/QualificationReview/QualChange/index.js b/src/pages/Container/QualificationReview/QualChange/index.js new file mode 100644 index 0000000..bbc7b95 --- /dev/null +++ b/src/pages/Container/QualificationReview/QualChange/index.js @@ -0,0 +1,184 @@ +import React, { useState, useEffect } from "react"; +import { Button, Form, Select, Space, Table, Tag } 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 { CHANGE_STATUS_MAP } from "~/enumerate/constant"; + +const MOCK_DATA = [ + { + id: 1, + orgName: "重庆安评技术研究院有限公司", + orgType: "本地机构", + filingNo: "BA-2026-001", + businessScope: "化工", + changeItem: "法定代表人变更", + changeStatus: "pending", + }, + { + id: 2, + orgName: "重庆恒安安全评价有限公司", + orgType: "本地机构", + filingNo: "BA-2025-032", + businessScope: "化工, 建筑施工", + changeItem: "注册地址变更", + changeStatus: "stuck", + }, + { + id: 3, + orgName: "北京中安评价中心(重庆分公司)", + orgType: "异地机构", + filingNo: "BA-2026-015", + businessScope: "矿山", + changeItem: "业务范围变更", + changeStatus: "approved", + }, +]; + +const { router } = tools; + +const QualChange = (props) => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + + const handleSearch = () => { + setLoading(true); + setTimeout(() => setLoading(false), 500); + }; + + const handleReset = (values) => { + router.query = { + ...router.query, + ...values, + current: 1, + pageSize: 10, + }; + handleSearch(); + }; + + useEffect(() => { + form.setFieldsValue(router.query); + }, []); + + const columns = [ + { + title: "序号", + dataIndex: "id", + width: 60, + fixed: "left", + render: (text, record, index) => index + 1, + }, + { title: "机构名称", dataIndex: "orgName", width: 220, ellipsis: true }, + { title: "机构类型", dataIndex: "orgType", width: 100 }, + { title: "备案编号", dataIndex: "filingNo", width: 140, ellipsis: true }, + { title: "安全评价业务范围", dataIndex: "businessScope", width: 180, ellipsis: true }, + { title: "变更项", dataIndex: "changeItem", width: 140, ellipsis: true }, + { + title: "变更状态", + dataIndex: "changeStatus", + width: 100, + render: (status) => { + const config = CHANGE_STATUS_MAP[status]; + return config ? {config.label} : status; + }, + }, + { + title: "操作", + width: 140, + fixed: "right", + render: (_, record) => ( + + + {record.changeStatus !== "approved" && ( + + )} + + ), + }, + ]; + + return ( + + + + , + + + , + + + 石油加工 + 化工 + 矿山 + 建筑施工 + + , + + + 停滞中 + 待审核 + 已审核 + + , + ]} + onReset={handleReset} + onFinish={(values) => { + router.query = { + ...router.query, + ...values, + current: 1, + pageSize: 10, + }; + handleSearch(); + }} + /> + +
`共 ${total} 条`, + current: router.query.current, + pageSize: router.query.pageSize, + onChange: (page, pageSize) => { + router.query = { + ...router.query, + current: page, + pageSize, + }; + handleSearch(); + }, + }} + /> + + ); +}; + +export default AntdTableFuncControl(QualChange); diff --git a/src/pages/Container/QualificationReview/QualConfirm/index.js b/src/pages/Container/QualificationReview/QualConfirm/index.js new file mode 100644 index 0000000..63cb4dc --- /dev/null +++ b/src/pages/Container/QualificationReview/QualConfirm/index.js @@ -0,0 +1,188 @@ +import React, { useState, useEffect } from "react"; +import { Button, Form, Select, Space, Table, Tag } 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 { VERIFY_STATUS_MAP } from "~/enumerate/constant"; + +const MOCK_DATA = [ + { + id: 1, + orgName: "重庆恒安安全评价有限公司", + orgType: "本地机构", + certNo: "API-2025-032", + businessScope: "化工, 建筑施工", + confirmStatus: "pending", + }, + { + id: 2, + orgName: "重庆安环检测技术有限公司", + orgType: "本地机构", + certNo: "API-2025-028", + businessScope: "矿山", + confirmStatus: "passed", + }, + { + id: 3, + orgName: "上海安信评价中心(重庆办)", + orgType: "异地机构", + certNo: "API-2025-045", + businessScope: "石油加工", + confirmStatus: "rejected", + }, +]; + +const { router } = tools; + +const QualConfirm = (props) => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + + const handleSearch = () => { + setLoading(true); + setTimeout(() => setLoading(false), 500); + }; + + const handleReset = (values) => { + router.query = { + ...router.query, + ...values, + current: 1, + pageSize: 10, + }; + handleSearch(); + }; + + useEffect(() => { + form.setFieldsValue(router.query); + }, []); + + const columns = [ + { + title: "序号", + dataIndex: "id", + width: 60, + fixed: "left", + render: (text, record, index) => index + 1, + }, + { title: "机构名称", dataIndex: "orgName", width: 220, ellipsis: true }, + { title: "机构类型", dataIndex: "orgType", width: 100 }, + { title: "证书编号", dataIndex: "certNo", width: 140, ellipsis: true }, + { title: "安全评价业务范围", dataIndex: "businessScope", width: 180, ellipsis: true }, + { + title: "确认状态", + dataIndex: "confirmStatus", + width: 100, + render: (status) => { + const config = VERIFY_STATUS_MAP[status]; + return config ? {config.label} : status; + }, + }, + { + title: "操作", + width: 140, + fixed: "right", + render: (_, record) => ( + + + {record.confirmStatus !== "passed" && ( + + )} + + ), + }, + ]; + + return ( + + + + , + + + 本地机构 + 异地机构 + + , + + + 石油加工 + 化工 + 矿山 + 建筑施工 + + , + + + 待确认 + 确认通过 + 打回 + + , + ]} + onReset={handleReset} + onFinish={(values) => { + router.query = { + ...router.query, + ...values, + current: 1, + pageSize: 10, + }; + handleSearch(); + }} + /> + +
`共 ${total} 条`, + current: router.query.current, + pageSize: router.query.pageSize, + onChange: (page, pageSize) => { + router.query = { + ...router.query, + current: page, + pageSize, + }; + handleSearch(); + }, + }} + /> + + ); +}; + +export default AntdTableFuncControl(QualConfirm); diff --git a/src/pages/Container/QualificationReview/QualConfirmForm/indes.less b/src/pages/Container/QualificationReview/QualConfirmForm/indes.less new file mode 100644 index 0000000..35948f9 --- /dev/null +++ b/src/pages/Container/QualificationReview/QualConfirmForm/indes.less @@ -0,0 +1,101 @@ +.qual-confirm-form { + .summary-card { + background: #fff; + border: 1px solid #d9d9d9; + border-radius: 6px; + padding: 0.75rem 1rem; + margin-bottom: 0.75rem; + } + + .summary-card-title { + font-size: 0.85rem; + font-weight: 600; + margin-bottom: 0.5rem; + } + + .summary-card-grid { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 0.5rem; + } + + .summary-label { + font-size: 0.72rem; + color: rgba(0, 0, 0, 0.45); + } + + .summary-value { + font-size: 0.88rem; + font-weight: 500; + margin-top: 0.15rem; + } + + .analysis-card { + background: #f8fafc; + border: 1px solid #d9d9d9; + border-radius: 6px; + padding: 0.75rem 1rem; + margin-bottom: 0.75rem; + } + + .analysis-grid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 0.5rem; + } + + .analysis-item { + background: #fff; + border: 1px solid #d9d9d9; + border-radius: 6px; + padding: 0.5rem; + text-align: center; + } + + .analysis-number { + font-size: 1.1rem; + font-weight: 700; + margin: 0.15rem 0; + + &.green { + color: #52c41a; + } + } + + .analysis-warning { + margin-top: 0.5rem; + padding: 0.4rem 0.6rem; + background: #fffbeb; + border: 1px solid #fde68a; + border-radius: 6px; + font-size: 0.78rem; + color: rgba(0, 0, 0, 0.45); + } + + .opinion-card { + background: #fff; + border: 1px solid #d9d9d9; + border-radius: 6px; + padding: 0.75rem 1rem; + margin-bottom: 0.75rem; + } + + .opinion-grid { + display: grid; + gap: 0.5rem; + } + + .opinion-label { + font-size: 0.8rem; + margin-bottom: 4px; + } + + .footer-bar { + display: flex; + justify-content: flex-end; + align-items: center; + padding-top: 0.75rem; + border-top: 1px solid #d9d9d9; + gap: 0.5rem; + } +} diff --git a/src/pages/Container/QualificationReview/QualConfirmForm/index.js b/src/pages/Container/QualificationReview/QualConfirmForm/index.js new file mode 100644 index 0000000..80f507d --- /dev/null +++ b/src/pages/Container/QualificationReview/QualConfirmForm/index.js @@ -0,0 +1,129 @@ +import React, { useState } from "react"; +import { Button, Select, Tag, Space, Input } from "antd"; +import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; +import { MOCK_DETAIL, MOCK_MATERIALS, MOCK_PERSONNEL } from "../mockData"; +import "./indes.less"; + +const { TextArea } = Input; + +const LIST_PATH = "./../"; + +const QualConfirmForm = (props) => { + const [result, setResult] = useState(undefined); + const [opinion, setOpinion] = useState(""); + const detail = MOCK_DETAIL; + + const totalCount = MOCK_MATERIALS.length; + const qualifiedCount = 8; // mock 符合数 + const isPersonnelMet = MOCK_PERSONNEL.length >= 25; + + const handleSubmit = () => { + console.log("确认提交:", { result, opinion }); + // TODO: 调用接口 + }; + + return ( + + 资质备案确认 + 待确认 + + } + history={props.history} + previous + > +
+ {/* 基本信息 */} +
+
基本信息
+
+
+
机构名称
+
{detail.orgName}
+
+
+
证书编号
+
{detail.certNo}
+
+
+
业务范围
+
{detail.scopeName}
+
+
+
提交时间
+
2026-06-20
+
+
+
+ + {/* 分析结果 */} +
+
分析结果
+
+
+
备案材料核验
+
{totalCount}/{totalCount}
+
全部已上传
+
+
+
材料符合性
+
{qualifiedCount}/{totalCount}
+
符合要求
+
+
+
人员配备
+
+ {MOCK_PERSONNEL.length}/25 +
+
{isPersonnelMet ? "满足要求" : "不满足要求"}
+
+
+ {!isPersonnelMet && ( +
+ 当前备案人员{MOCK_PERSONNEL.length}人,需满足专职技术人员不少于25人的要求,建议机构补充人员后再确认。 +
+ )} +
+ + + + {/* 确认意见 */} +
+
确认意见
+
+
+
确认结果
+ +
+
+
确认意见
+