import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { Button, DatePicker, Descriptions, Form, Image, Input, message, Modal, Select, Table, } from "antd"; import AttachmentUpload from "~/components/AttachmentUpload"; import { PlusOutlined } from "@ant-design/icons"; import { useEffect, useState } from "react"; 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 TableAction from "@cqsjjb/jjb-react-admin-component/TableAction"; import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd"; import { tools } from "@cqsjjb/jjb-common-lib"; import { NS_ORG_QUALIFICATION_CERT } from "~/enumerate/namespace"; import { QUALIFICATION_INDUSTRY_OPTIONS } from "~/enumerate/enterpriseOptions"; import { toDayjs } from "~/utils/dateFormat"; import { dateRangeRule } from "~/utils/validators"; const { router } = tools; const { TextArea } = Input; const { RangePicker } = DatePicker; /** certImageUrl(逗号分隔URL)↔ 文件列表({ url }[]) */ function parseCertImageUrl(str) { if (!str) return []; return String(str).split(",").filter(Boolean).map((url, i) => ({ url: url.trim(), name: `证书图片${i + 1}.jpg`, })); } function stringifyCertImageUrl(files) { if (!files?.length) return undefined; return files.map((f) => f.url || f.response?.data?.url).filter(Boolean).join(","); } function QualificationCertPage(props) { const [addModalOpen, setAddModalOpen] = useState(false); const [viewModalOpen, setViewModalOpen] = useState(false); const [currentId, setCurrentId] = useState(""); const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [dataSource, setDataSource] = useState([]); const [total, setTotal] = useState(0); const getData = async () => { setLoading(true); try { const params = { ...router.query, current: router.query.current || 1, pageSize: router.query.pageSize || 10, }; const res = await props.orgQualificationCertList(params); if (res?.success !== false) { setDataSource(res?.data || []); setTotal(res?.total || 0); } } catch (err) { console.warn("[QualificationCert] list failed:", err); } finally { setLoading(false); } }; const handleReset = (values) => { router.query = { ...values, validStartDate: undefined, validEndDate: undefined, current: 1, pageSize: 10 }; getData(); }; useEffect(() => { const params = { ...router.query }; if (params.validStartDate && params.validEndDate) { params.validDate = [toDayjs(params.validStartDate), toDayjs(params.validEndDate)]; } form.setFieldsValue(params); getData(); }, []); const onDelete = (id) => { Modal.confirm({ title: "提示", content: "数据将会删除,您是否确认删除?", okText: "是", cancelText: "否", onOk: async () => { const res = await props.orgQualificationCertRemove({ data: id }); if (res?.success !== false) { message.success("删除成功"); getData(); } }, }); }; const onToggleStatus = (record) => { const enabled = record.enableFlag === 1; Modal.confirm({ title: "提示", content: enabled ? "是否停用该证书?" : "是否启用该证书?", okText: "是", cancelText: "否", onOk: async () => { const action = enabled ? props.orgQualificationCertDisable : props.orgQualificationCertEnable; const res = await action({ data: record.id }); if (res?.success !== false) { message.success("操作成功"); await getData(); } else { message.error(res?.message || "操作失败"); } }, }); }; return ( 安全评价资质证书管理
机构需将自身拥有的安全评价资质证书信息录入系统,包括资质等级、发证机关、发证日期、有效期等。
} extra={ } > , , ]} onReset={handleReset} onFinish={(values) => { if (values.validDate) { values.validStartDate = values.validDate?.[0]?.format("YYYY-MM-DD"); values.validEndDate = values.validDate?.[1]?.format("YYYY-MM-DD"); delete values.validDate; } router.query = { ...values, current: 1, pageSize: 10, }; getData(); }} /> `${record.validStartDate ?? ""} ~ ${record.validEndDate ?? ""}`, }, { title: "证书编号", dataIndex: "certNo" }, { title: "状态", width: 80, render: (_, record) => record.enableFlag === 1 ? "启用" : "禁用", }, { title: "照片", width: 100, render: (_, record) => record.certImageUrl ? ( ) : ( ), }, { title: "操作", width: 200, fixed: "right", render: (_, record) => ( ), }, ]} dataSource={dataSource} scroll={{ y: props.scrollY , x: 1400}} loading={loading} pagination={{ total, showSizeChanger: true, showQuickJumper: true, showTotal: (t) => `共 ${t} 条`, current: router.query.current || 1, pageSize: router.query.pageSize || 10, onChange: (page, pageSize) => { router.query = { ...router.query, current: page, pageSize }; getData(); }, }} /> {addModalOpen && ( { setAddModalOpen(false); setCurrentId(""); }} onSuccess={getData} /> )} {viewModalOpen && ( { setViewModalOpen(false); setCurrentId(""); }} /> )} ); } function CertFormModal({ open, currentId, requestAdd, requestEdit, requestDetails, onCancel, onSuccess, }) { const [form] = Form.useForm(); const [submitting, setSubmitting] = useState(false); const [detailLoading, setDetailLoading] = useState(false); useEffect(() => { if (!open) return; if (!currentId) { form.resetFields(); return; } let cancelled = false; (async () => { setDetailLoading(true); try { const res = await requestDetails({ id: currentId }); if (cancelled || !res?.data) return; const data = { ...res.data }; data.issueDate = toDayjs(data.issueDate); data.validDate = [toDayjs(data.validStartDate), toDayjs(data.validEndDate)]; data.certImageUrl = data.certImageUrl; form.setFieldsValue(data); } catch (err) { console.warn("[QualificationCert] load detail failed:", err); } finally { if (!cancelled) setDetailLoading(false); } })(); return () => { cancelled = true; }; }, [open, currentId]); const handleCancel = () => { form.resetFields(); onCancel(); }; const handleSubmit = async (values) => { try { setSubmitting(true); values.validStartDate = values.validDate?.[0]; values.validEndDate = values.validDate?.[1]; values.certImageUrl = values.certImageUrl?.map((item) => item.url).join(","); if (currentId) values.id = currentId; const request = currentId ? requestEdit : requestAdd; const res = await request(values); if (res?.success !== false) { message.success(currentId ? "编辑成功" : "添加成功"); handleCancel(); onSuccess(); } } finally { setSubmitting(false); } }; return (
严谨在本互联网非涉密平台处理、传输国家秘密和工作秘密,请确认扫描、传输的文件资料不涉及国家秘密和工作秘密