import React, { useState, useEffect } from "react"; import dayjs from "dayjs"; import { Form, Table, Button, Modal, Input, Select, DatePicker, Card, Row, Col, Statistic, message, 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 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_QUAL_REVIEW } from "~/enumerate/namespace"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { ON_SITE_REVIEW_STATUS_MAP } from "~/enumerate/constant"; import AttachmentUpload from "~/components/AttachmentUpload"; const { router } = tools; const SiteReviewNotice = (props) => { const [searchForm] = Form.useForm(); const [noticeForm] = Form.useForm(); const [resultForm] = Form.useForm(); const [noticeModalOpen, setNoticeModalOpen] = useState(false); const [resultModalOpen, setResultModalOpen] = useState(false); const [currentEditId, setCurrentEditId] = useState(null); const [currentResultRow, setCurrentResultRow] = useState(null); const { qualReview, queryQualOnSiteReviewPage, queryQualOnSiteReviewStatistics, addQualOnSiteReview, updateQualOnSiteReview, uploadQualOnSiteReviewResult, fetchQualOnSiteReviewDetail, fetchQualOnSiteReviewResultDetail, queryOrgSelectList, resetModelState, } = props; const { qualOnSiteReviewList = [], qualOnSiteReviewTotal = 0, qualOnSiteReviewStats = {}, orgSelectList = [], siteReviewNoticeLoading, siteReviewStatisticsLoading, siteReviewSaveLoading, siteReviewResultLoading, } = qualReview || {}; useEffect(() => { queryQualOnSiteReviewStatistics(); queryOrgSelectList(); searchForm.setFieldsValue(router.query); handleSearch(); }, []); useEffect(() => { if (!noticeModalOpen) { resetModelState(NS_QUAL_REVIEW, { siteReviewSaveLoading: false }); } }, [noticeModalOpen]); useEffect(() => { if (!resultModalOpen) { resetModelState(NS_QUAL_REVIEW, { siteReviewResultLoading: false }); } }, [resultModalOpen]); const handleSearch = () => { queryQualOnSiteReviewPage({ ...router.query, }); }; const handleSearchSubmit = (values) => { const { dateRange, ...rest } = values; router.query = { ...router.query, ...rest, ...(dateRange && dateRange[0] && { reviewDateStartBegin: dateRange[0].format("YYYY-MM-DD") }), ...(dateRange && dateRange[1] && { reviewDateStartEnd: dateRange[1].format("YYYY-MM-DD") }), current: 1, size: 10, }; handleSearch(); }; const handleReset = (values) => { router.query = { ...values, current: 1, size: 10 , reviewDateStartBegin: undefined, reviewDateStartEnd: undefined }; handleSearch(); }; const handleOpenNoticeModal = () => { setCurrentEditId(null); noticeForm.resetFields(); setNoticeModalOpen(true); }; const handleEditNotice = (record) => { setCurrentEditId(record.id); fetchQualOnSiteReviewDetail({ id: record.id }).then((res) => { if (res?.success !== false) { const detail = res.data; noticeForm.setFieldsValue({ orgId: detail.orgId, reviewDateStart: detail.reviewDateStart ? dayjs(detail.reviewDateStart) : null, reviewLocation: detail.reviewLocation, reviewMembers: detail.reviewMembers, reviewLeader: detail.reviewLeader, materialRequirements: detail.materialRequirements, supervisorContact: detail.supervisorContact, contactPhone: detail.contactPhone, }); } }); setNoticeModalOpen(true); }; const handleSubmitNotice = () => { noticeForm.validateFields().then((values) => { const payload = { ...values, reviewDateStart: values.reviewDateStart.format("YYYY-MM-DD HH:mm:ss"), status: "AGENCY_PENDING_CONFIRMATION", }; const action = currentEditId ? updateQualOnSiteReview({ ...payload, id: currentEditId }) : addQualOnSiteReview(payload); action.then((res) => { if (res?.success !== false) { setNoticeModalOpen(false); message.success(currentEditId ? "现场审查通知已修改" : "现场审查通知已下发机构端"); queryQualOnSiteReviewStatistics(); handleSearch(); } }); }).catch(() => {}); }; const handleOpenResultModal = (record) => { setCurrentResultRow(record); resultForm.resetFields(); resultForm.setFieldsValue({ institution: record.unitName, reviewDateStart: record.reviewDateStart, }); fetchQualOnSiteReviewResultDetail({ id: record.id }).then((res) => { if (res?.success !== false && res?.data) { const detail = res.data; resultForm.setFieldsValue({ reviewLeader: detail.reviewLeader || "", reviewResult: detail.reviewResult, reviewOpinion: detail.reviewOpinion || "", fileList: (detail.fileList || []).map((item) => ({ url: item.url, uid: item.id, status: "done", name: item.name, })), }); } }); setResultModalOpen(true); }; const handleSubmitResult = () => { resultForm.validateFields().then((values) => { const payload = { id: currentResultRow.id, ...values, }; uploadQualOnSiteReviewResult(payload).then((res) => { if (res?.success !== false) { setResultModalOpen(false); message.success("审查结果已保存并上传"); queryQualOnSiteReviewStatistics(); handleSearch(); } }); }).catch(() => {}); }; const columns = [ { title: "机构名称", dataIndex: "unitName", ellipsis: true }, { title: "现场审查时间", dataIndex: "reviewDateStart", }, { title: "审查地点", dataIndex: "reviewLocation", ellipsis: true }, { title: "审查组成员", dataIndex: "reviewMembers", ellipsis: true }, { title: "状态", dataIndex: "status", render: (status) => { const cfg = ON_SITE_REVIEW_STATUS_MAP[status]; return cfg ? {cfg.label} : (status || "-"); }, }, { title: "操作", width: 220, fixed: "right", render: (_, record) => ( handleEditNotice(record)}> 修改 handleOpenResultModal(record)}> 审查结果上传 ), }, ]; return ( 下发现场审查通知 } > {qualOnSiteReviewStats.annualCumulativeCount ?? 0} 条本年度累计 未来30日内 审查结果已归档 , {Object.entries(ON_SITE_REVIEW_STATUS_MAP).map(([value, cfg]) => ( {cfg.label} ))} , , ]} onFinish={handleSearchSubmit} onReset={handleReset} style={{ marginBottom: 16 }} /> `共 ${total} 条`, current: Number(router.query.current) || 1, pageSize: Number(router.query.size) || 10, onChange: (page, pageSize) => { router.query = { ...router.query, current: page, size: pageSize }; handleSearch(); }, }} /> {/* 下发现场审查通知 弹窗 */} setNoticeModalOpen(false)} onOk={handleSubmitNotice} okText={currentEditId ? "保存修改" : "确认下发"} confirmLoading={siteReviewSaveLoading} width={760} destroyOnHidden > {(orgSelectList || []).map((item) => ( {item.unitName} ))} {/* */} {/* 审查结果上传弹窗 */} setResultModalOpen(false)} onOk={handleSubmitResult} okText="保存审查结果" confirmLoading={siteReviewResultLoading} width={760} destroyOnHidden > 上传现场审查结果文件,并保存审查结论和意见。 审查通过 不通过 ); }; export default Connect([NS_QUAL_REVIEW], true)(AntdTableFuncControl(SiteReviewNotice));