|
|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
import React, { useState } from "react";
|
|
|
|
|
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";
|
|
|
|
|
@ -6,175 +6,191 @@ 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 MOCK_LIST = [
|
|
|
|
|
{
|
|
|
|
|
id: 1, institution: "重庆安评技术研究院有限公司", date: "2026-07-22", time: "09:30",
|
|
|
|
|
address: "机构办公场所及档案室", team: "王立军等4人", status: "pending",
|
|
|
|
|
application: "安全评价机构资质延续", department: "重庆市应急管理局",
|
|
|
|
|
materials: "12 / 14", noticeNo: "SC-2026-018",
|
|
|
|
|
materialsReq: "机构资质申请材料原件、人员档案、社保材料、办公场所和档案室证明、设备清单、过程控制制度及项目档案等资料。",
|
|
|
|
|
contact: "李科长", contactPhone: "023-6751****",
|
|
|
|
|
conclusion: "", resultFile: "", opinion: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 2, institution: "重庆恒安安全评价有限公司", date: "2026-07-19", time: "14:00",
|
|
|
|
|
address: "机构会议室", team: "赵强等3人", status: "pending",
|
|
|
|
|
application: "新增业务范围申请", department: "重庆市应急管理局",
|
|
|
|
|
materials: "8 / 10", noticeNo: "SC-2026-021",
|
|
|
|
|
materialsReq: "新申请业务范围的技术人员证书、装备清单、能力证明等材料。",
|
|
|
|
|
contact: "李科长", contactPhone: "023-6751****",
|
|
|
|
|
conclusion: "", resultFile: "", opinion: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 3, institution: "重庆渝安风险评估中心", date: "2025-11-18", time: "14:00",
|
|
|
|
|
address: "机构会议室", team: "李建军等3人", status: "done",
|
|
|
|
|
application: "安全生产评价机构资质备案", department: "重庆市应急管理局",
|
|
|
|
|
materials: "14 / 14", noticeNo: "SC-2025-031",
|
|
|
|
|
materialsReq: "—",
|
|
|
|
|
contact: "—", contactPhone: "—",
|
|
|
|
|
conclusion: "审查通过", resultFile: "现场审查结果报告.pdf", opinion: "整改项2项均已闭环,审查结论:通过",
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const APPLICATION_OPTIONS = [
|
|
|
|
|
{ label: "资质延续申请 SQ-2026-018", value: "SQ-2026-018" },
|
|
|
|
|
{ label: "新增业务范围申请 SQ-2026-021", value: "SQ-2026-021" },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const INSTITUTION_OPTIONS = [
|
|
|
|
|
"重庆安评技术研究院有限公司",
|
|
|
|
|
"重庆恒安安全评价有限公司",
|
|
|
|
|
"重庆渝安风险评估中心",
|
|
|
|
|
];
|
|
|
|
|
const { router } = tools;
|
|
|
|
|
|
|
|
|
|
const SiteReviewNotice = (props) => {
|
|
|
|
|
const [searchForm] = Form.useForm();
|
|
|
|
|
const [noticeForm] = Form.useForm();
|
|
|
|
|
const [resultForm] = Form.useForm();
|
|
|
|
|
const [dataSource, setDataSource] = useState(MOCK_LIST);
|
|
|
|
|
const [noticeModalOpen, setNoticeModalOpen] = useState(false);
|
|
|
|
|
const [resultModalOpen, setResultModalOpen] = useState(false);
|
|
|
|
|
const [currentEditId, setCurrentEditId] = useState(null);
|
|
|
|
|
const [currentResultRow, setCurrentResultRow] = useState(null);
|
|
|
|
|
const [viewMode, setViewMode] = useState(false); // true=保存查看, false=下发
|
|
|
|
|
|
|
|
|
|
const stats = {
|
|
|
|
|
total: dataSource.length,
|
|
|
|
|
pending: dataSource.filter((d) => d.status === "pending").length,
|
|
|
|
|
done: dataSource.filter((d) => d.status === "done").length,
|
|
|
|
|
const {
|
|
|
|
|
qualReview,
|
|
|
|
|
queryQualOnSiteReviewPage,
|
|
|
|
|
queryQualOnSiteReviewStatistics,
|
|
|
|
|
addQualOnSiteReview,
|
|
|
|
|
updateQualOnSiteReview,
|
|
|
|
|
uploadQualOnSiteReviewResult,
|
|
|
|
|
fetchQualOnSiteReviewDetail,
|
|
|
|
|
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 handleSearch = (values) => {
|
|
|
|
|
const { institution, status, date } = values || {};
|
|
|
|
|
setDataSource(MOCK_LIST.filter((item) => {
|
|
|
|
|
if (institution && !item.institution.includes(institution)) return false;
|
|
|
|
|
if (status && item.status !== status) return false;
|
|
|
|
|
return true;
|
|
|
|
|
}));
|
|
|
|
|
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 = () => {
|
|
|
|
|
searchForm.resetFields();
|
|
|
|
|
setDataSource(MOCK_LIST);
|
|
|
|
|
const handleReset = (values) => {
|
|
|
|
|
router.query = { ...values, current: 1, size: 10 };
|
|
|
|
|
handleSearch();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 下发通知
|
|
|
|
|
const handleOpenNoticeModal = () => {
|
|
|
|
|
setViewMode(false);
|
|
|
|
|
setCurrentEditId(null);
|
|
|
|
|
noticeForm.resetFields();
|
|
|
|
|
setNoticeModalOpen(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 保存查看
|
|
|
|
|
const handleViewNotice = (record) => {
|
|
|
|
|
setViewMode(true);
|
|
|
|
|
noticeForm.setFieldsValue({
|
|
|
|
|
application: record.application,
|
|
|
|
|
institution: record.institution,
|
|
|
|
|
date: record.date ? dayjs(record.date) : null,
|
|
|
|
|
time: record.time,
|
|
|
|
|
address: record.address,
|
|
|
|
|
team: record.team,
|
|
|
|
|
materials: record.materialsReq,
|
|
|
|
|
contact: record.contact,
|
|
|
|
|
contactPhone: record.contactPhone,
|
|
|
|
|
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 newNotice = {
|
|
|
|
|
id: dataSource.length + 1,
|
|
|
|
|
institution: values.institution,
|
|
|
|
|
date: values.date ? values.date.format("YYYY-MM-DD") : "2026-07-25",
|
|
|
|
|
time: values.time || "09:30",
|
|
|
|
|
address: values.address || "",
|
|
|
|
|
team: values.team || "",
|
|
|
|
|
status: "pending",
|
|
|
|
|
application: values.application || "",
|
|
|
|
|
department: "重庆市应急管理局",
|
|
|
|
|
materials: "—",
|
|
|
|
|
noticeNo: `SC-2026-${String(dataSource.length + 20).padStart(3, "0")}`,
|
|
|
|
|
materialsReq: values.materials || "",
|
|
|
|
|
contact: values.contact || "",
|
|
|
|
|
contactPhone: values.contactPhone || "",
|
|
|
|
|
const payload = {
|
|
|
|
|
...values,
|
|
|
|
|
reviewDateStart: values.reviewDateStart.format("YYYY-MM-DD HH:mm:ss"),
|
|
|
|
|
status: "AGENCY_PENDING_CONFIRMATION",
|
|
|
|
|
};
|
|
|
|
|
setDataSource((prev) => [newNotice, ...prev]);
|
|
|
|
|
setNoticeModalOpen(false);
|
|
|
|
|
message.success("现场审查通知已下发机构端");
|
|
|
|
|
|
|
|
|
|
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.institution,
|
|
|
|
|
date: record.date,
|
|
|
|
|
conclusion: record.conclusion || undefined,
|
|
|
|
|
leader: record.team ? record.team.split("等")[0] : "王立军",
|
|
|
|
|
opinion: record.opinion || "",
|
|
|
|
|
institution: record.unitName,
|
|
|
|
|
reviewDateStart: record.reviewDateStart,
|
|
|
|
|
reviewLeader: record.reviewLeader || "",
|
|
|
|
|
reviewOpinion: record.reviewOpinion || "",
|
|
|
|
|
});
|
|
|
|
|
setResultModalOpen(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleSubmitResult = () => {
|
|
|
|
|
resultForm.validateFields().then((values) => {
|
|
|
|
|
setDataSource((prev) =>
|
|
|
|
|
prev.map((item) =>
|
|
|
|
|
item.id === currentResultRow?.id
|
|
|
|
|
? { ...item, status: "done", conclusion: values.conclusion, opinion: values.opinion }
|
|
|
|
|
: item
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
setResultModalOpen(false);
|
|
|
|
|
message.success("审查结果已保存并上传");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: "institution", ellipsis: true },
|
|
|
|
|
{ title: "机构名称", dataIndex: "unitName", ellipsis: true },
|
|
|
|
|
{
|
|
|
|
|
title: "现场审查时间", dataIndex: "date", width: 180,
|
|
|
|
|
render: (date, record) => `${date} ${record.time}`,
|
|
|
|
|
title: "现场审查时间", dataIndex: "reviewDateStart", width: 180,
|
|
|
|
|
render: (val) => val ? dayjs(val).format("YYYY-MM-DD HH:mm") : "-",
|
|
|
|
|
},
|
|
|
|
|
{ title: "审查地点", dataIndex: "address", width: 200, ellipsis: true },
|
|
|
|
|
{ title: "审查组", dataIndex: "team", width: 140 },
|
|
|
|
|
{ title: "审查地点", dataIndex: "reviewLocation", width: 200, ellipsis: true },
|
|
|
|
|
{ title: "审查组成员", dataIndex: "reviewMembers", width: 140, ellipsis: true },
|
|
|
|
|
{
|
|
|
|
|
title: "状态", dataIndex: "status", width: 100,
|
|
|
|
|
render: (status) =>
|
|
|
|
|
status === "done" ? <Tag color="success">已完成</Tag> : <Tag color="processing">待开展审查</Tag>,
|
|
|
|
|
title: "状态", dataIndex: "status", width: 120,
|
|
|
|
|
render: (status) => {
|
|
|
|
|
const cfg = ON_SITE_REVIEW_STATUS_MAP[status];
|
|
|
|
|
return cfg ? <Tag color={cfg.color}>{cfg.label}</Tag> : (status || "-");
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "操作", width: 220, fixed: "right",
|
|
|
|
|
render: (_, record) => (
|
|
|
|
|
<TableAction>
|
|
|
|
|
<Button type="link" size="small" onClick={() => handleViewNotice(record)}>
|
|
|
|
|
<Button type="link" size="small" onClick={() => handleEditNotice(record)}>
|
|
|
|
|
修改
|
|
|
|
|
</Button>
|
|
|
|
|
<Button type="link" size="small" onClick={() => handleOpenResultModal(record)}>
|
|
|
|
|
@ -200,20 +216,20 @@ const SiteReviewNotice = (props) => {
|
|
|
|
|
|
|
|
|
|
<Row gutter={16} style={{ marginBottom: 16 }}>
|
|
|
|
|
<Col span={8}>
|
|
|
|
|
<Card size="small">
|
|
|
|
|
<Statistic title="通知总数" value={stats.total} suffix="条" />
|
|
|
|
|
<div style={{ fontSize: 12, color: "#999", marginTop: 4 }}>本年度累计</div>
|
|
|
|
|
<Card size="small" loading={siteReviewStatisticsLoading}>
|
|
|
|
|
<Statistic title="通知总数" value={qualOnSiteReviewStats.totalCount ?? "-"} suffix="条" />
|
|
|
|
|
<div style={{ fontSize: 12, color: "#999", marginTop: 4 }}>{qualOnSiteReviewStats.annualCumulativeCount ?? 0} 条本年度累计</div>
|
|
|
|
|
</Card>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={8}>
|
|
|
|
|
<Card size="small">
|
|
|
|
|
<Statistic title="待开展审查" value={stats.pending} valueStyle={{ color: "#2563eb" }} suffix="条" />
|
|
|
|
|
<Card size="small" loading={siteReviewStatisticsLoading}>
|
|
|
|
|
<Statistic title="待开展审查" value={qualOnSiteReviewStats.pendingReviewNextThirtyDaysCount ?? ""} valueStyle={{ color: "#2563eb" }} suffix="条" />
|
|
|
|
|
<div style={{ fontSize: 12, color: "#999", marginTop: 4 }}>未来30日内</div>
|
|
|
|
|
</Card>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={8}>
|
|
|
|
|
<Card size="small">
|
|
|
|
|
<Statistic title="已完成" value={stats.done} valueStyle={{ color: "#059669" }} suffix="条" />
|
|
|
|
|
<Card size="small" loading={siteReviewStatisticsLoading}>
|
|
|
|
|
<Statistic title="已完成" value={qualOnSiteReviewStats.completedArchivedCount ?? "-"} valueStyle={{ color: "#059669" }} suffix="条" />
|
|
|
|
|
<div style={{ fontSize: 12, color: "#999", marginTop: 4 }}>审查结果已归档</div>
|
|
|
|
|
</Card>
|
|
|
|
|
</Col>
|
|
|
|
|
@ -221,22 +237,23 @@ const SiteReviewNotice = (props) => {
|
|
|
|
|
|
|
|
|
|
<SearchForm
|
|
|
|
|
form={searchForm}
|
|
|
|
|
loading={false}
|
|
|
|
|
loading={siteReviewNoticeLoading}
|
|
|
|
|
formLine={[
|
|
|
|
|
<Form.Item key="institution" name="institution">
|
|
|
|
|
<Form.Item key="unitName" name="unitName">
|
|
|
|
|
<ControlWrapper.Input label="机构名称" placeholder="请输入机构名称" allowClear />
|
|
|
|
|
</Form.Item>,
|
|
|
|
|
<Form.Item key="status" name="status">
|
|
|
|
|
<ControlWrapper.Select label="审查状态" placeholder="全部" allowClear style={{ width: "100%" }}>
|
|
|
|
|
<Select.Option value="pending">待开展审查</Select.Option>
|
|
|
|
|
<Select.Option value="done">已完成</Select.Option>
|
|
|
|
|
{Object.entries(ON_SITE_REVIEW_STATUS_MAP).map(([value, cfg]) => (
|
|
|
|
|
<Select.Option key={value} value={value}>{cfg.label}</Select.Option>
|
|
|
|
|
))}
|
|
|
|
|
</ControlWrapper.Select>
|
|
|
|
|
</Form.Item>,
|
|
|
|
|
<Form.Item key="date" name="date">
|
|
|
|
|
<ControlWrapper.DatePicker label="审查日期" placeholder="请选择" />
|
|
|
|
|
<Form.Item key="dateRange" name="dateRange">
|
|
|
|
|
<ControlWrapper.DatePicker.RangePicker label="审查日期" placeholder={["开始日期", "结束日期"]} />
|
|
|
|
|
</Form.Item>,
|
|
|
|
|
]}
|
|
|
|
|
onFinish={handleSearch}
|
|
|
|
|
onFinish={handleSearchSubmit}
|
|
|
|
|
onReset={handleReset}
|
|
|
|
|
style={{ marginBottom: 16 }}
|
|
|
|
|
/>
|
|
|
|
|
@ -244,79 +261,84 @@ const SiteReviewNotice = (props) => {
|
|
|
|
|
<Table
|
|
|
|
|
rowKey="id"
|
|
|
|
|
columns={columns}
|
|
|
|
|
dataSource={dataSource}
|
|
|
|
|
loading={false}
|
|
|
|
|
dataSource={qualOnSiteReviewList}
|
|
|
|
|
loading={siteReviewNoticeLoading}
|
|
|
|
|
scroll={{ y: props.scrollY, x: 1200 }}
|
|
|
|
|
pagination={{
|
|
|
|
|
total: dataSource.length,
|
|
|
|
|
total: qualOnSiteReviewTotal,
|
|
|
|
|
showSizeChanger: true,
|
|
|
|
|
showQuickJumper: true,
|
|
|
|
|
showTotal: (total) => `共 ${total} 条`,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
current: Number(router.query.current) || 1,
|
|
|
|
|
pageSize: Number(router.query.size) || 10,
|
|
|
|
|
onChange: (page, pageSize) => {
|
|
|
|
|
router.query = { ...router.query, current: page, size: pageSize };
|
|
|
|
|
handleSearch();
|
|
|
|
|
},
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
{/* 下发现场审查通知 / 保存查看 弹窗 */}
|
|
|
|
|
{/* 下发现场审查通知 弹窗 */}
|
|
|
|
|
<Modal
|
|
|
|
|
title={viewMode ? "保存查看现场审查通知" : "下发现场审查通知"}
|
|
|
|
|
title={currentEditId ? "修改现场审查通知" : "下发现场审查通知"}
|
|
|
|
|
open={noticeModalOpen}
|
|
|
|
|
onCancel={() => setNoticeModalOpen(false)}
|
|
|
|
|
onOk={viewMode ? () => setNoticeModalOpen(false) : handleSubmitNotice}
|
|
|
|
|
okText={viewMode ? "关闭" : "确认下发"}
|
|
|
|
|
onOk={handleSubmitNotice}
|
|
|
|
|
okText={currentEditId ? "保存修改" : "确认下发"}
|
|
|
|
|
confirmLoading={siteReviewSaveLoading}
|
|
|
|
|
width={760}
|
|
|
|
|
destroyOnHidden
|
|
|
|
|
>
|
|
|
|
|
<Form form={noticeForm} layout="vertical">
|
|
|
|
|
<Row gutter={16}>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="application" label="关联资质申请" rules={viewMode ? [] : [{ required: true, message: "请选择" }]}>
|
|
|
|
|
<Select placeholder="请选择" disabled={viewMode} options={APPLICATION_OPTIONS} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="institution" label="受审查机构" rules={viewMode ? [] : [{ required: true, message: "请选择" }]}>
|
|
|
|
|
<Select placeholder="请选择" disabled={viewMode}>
|
|
|
|
|
{INSTITUTION_OPTIONS.map((name) => (
|
|
|
|
|
<Select.Option key={name} value={name}>{name}</Select.Option>
|
|
|
|
|
<Form.Item name="orgId" label="受审查机构" rules={[{ required: true, message: "请选择" }]}>
|
|
|
|
|
<Select placeholder="请选择" showSearch optionFilterProp="label">
|
|
|
|
|
{(orgSelectList || []).map((item) => (
|
|
|
|
|
<Select.Option key={item.id} value={item.id} label={item.unitName}>
|
|
|
|
|
{item.unitName}
|
|
|
|
|
</Select.Option>
|
|
|
|
|
))}
|
|
|
|
|
</Select>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="reviewDateStart" label="现场审查开始时间" rules={[{ required: true, message: "请选择" }]}>
|
|
|
|
|
<DatePicker style={{ width: "100%" }} showTime />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
<Row gutter={16}>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="date" label="现场审查日期" rules={viewMode ? [] : [{ required: true, message: "请选择" }]}>
|
|
|
|
|
<DatePicker style={{ width: "100%" }} disabled={viewMode} />
|
|
|
|
|
<Form.Item name="reviewLocation" label="审查地点" rules={[{ required: true, message: "请输入" }]}>
|
|
|
|
|
<Input placeholder="机构办公场所、档案室及设备存放场所" maxLength={200} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="time" label="开始时间">
|
|
|
|
|
<Input placeholder="09:30" disabled={viewMode} />
|
|
|
|
|
{/* <Col span={12}>
|
|
|
|
|
<Form.Item name="reviewLeader" label="审查组长">
|
|
|
|
|
<Input placeholder="请输入" maxLength={50} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Col> */}
|
|
|
|
|
</Row>
|
|
|
|
|
<Form.Item name="address" label="审查地点" rules={viewMode ? [] : [{ required: true, message: "请输入" }]}>
|
|
|
|
|
<Input placeholder="机构办公场所、档案室及设备存放场所" disabled={viewMode} />
|
|
|
|
|
<Form.Item name="reviewMembers" label="审查组成员名单" rules={[{ required: true, message: "请输入" }]}>
|
|
|
|
|
<Input placeholder="请输入审查组成员名单" maxLength={100} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
<Form.Item name="team" label="审查组成员" rules={viewMode ? [] : [{ required: true, message: "请输入" }]}>
|
|
|
|
|
<Input placeholder="王立军(组长)、赵强、刘洋、陈国庆" disabled={viewMode} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
<Form.Item name="materials" label="材料准备要求">
|
|
|
|
|
<Form.Item name="materialRequirements" label="材料准备要求">
|
|
|
|
|
<Input.TextArea
|
|
|
|
|
rows={4}
|
|
|
|
|
placeholder="请准备机构资质申请材料原件、人员档案、社保材料、办公场所和档案室证明、设备清单、过程控制制度及项目档案等资料。"
|
|
|
|
|
disabled={viewMode}
|
|
|
|
|
maxLength={500}
|
|
|
|
|
/>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
<Row gutter={16}>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="contact" label="监管联系人">
|
|
|
|
|
<Input placeholder="李科长" disabled={viewMode} />
|
|
|
|
|
<Form.Item name="supervisorContact" label="监管联系人">
|
|
|
|
|
<Input placeholder="请输入监管联系人" maxLength={50} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="contactPhone" label="联系电话">
|
|
|
|
|
<Input placeholder="023-6751****" disabled={viewMode} />
|
|
|
|
|
<Form.Item name="contactPhone" label="联系电话" rules={[{ pattern: /^(\d{3,4}-?\d{7,8}|\d{11})$/, message: "请输入正确的联系电话" }]}>
|
|
|
|
|
<Input placeholder="请输入联系电话" maxLength={20} />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
@ -330,6 +352,7 @@ const SiteReviewNotice = (props) => {
|
|
|
|
|
onCancel={() => setResultModalOpen(false)}
|
|
|
|
|
onOk={handleSubmitResult}
|
|
|
|
|
okText="保存审查结果"
|
|
|
|
|
confirmLoading={siteReviewResultLoading}
|
|
|
|
|
width={760}
|
|
|
|
|
destroyOnHidden
|
|
|
|
|
>
|
|
|
|
|
@ -344,35 +367,35 @@ const SiteReviewNotice = (props) => {
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="date" label="现场审查日期">
|
|
|
|
|
<Form.Item name="reviewDateStart" label="现场审查日期">
|
|
|
|
|
<Input disabled />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
<Row gutter={16}>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="conclusion" label="审查结论" rules={[{ required: true, message: "请选择" }]}>
|
|
|
|
|
<Form.Item name="reviewResult" label="审查结论" rules={[{ required: true, message: "请选择" }]}>
|
|
|
|
|
<Select placeholder="请选择">
|
|
|
|
|
<Select.Option value="审查通过">审查通过</Select.Option>
|
|
|
|
|
<Select.Option value="补正材料后通过">补正材料后通过</Select.Option>
|
|
|
|
|
<Select.Option value="不通过">不通过</Select.Option>
|
|
|
|
|
<Select.Option value={true}>审查通过</Select.Option>
|
|
|
|
|
<Select.Option value={true}>补正材料后通过</Select.Option>
|
|
|
|
|
<Select.Option value={false}>不通过</Select.Option>
|
|
|
|
|
</Select>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="leader" label="审查组长">
|
|
|
|
|
<Input placeholder="王立军" />
|
|
|
|
|
<Form.Item name="reviewLeader" label="审查组长">
|
|
|
|
|
<Input placeholder="请输入" />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
<AttachmentUpload
|
|
|
|
|
name="resultFile"
|
|
|
|
|
name="fileList"
|
|
|
|
|
label="审查结果文件"
|
|
|
|
|
accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png"
|
|
|
|
|
maxCount={1}
|
|
|
|
|
accept=".pdf,.doc,.docx,.jpg,.jpeg,.png"
|
|
|
|
|
maxCount={10}
|
|
|
|
|
extra="支持上传审查记录、审查意见或现场审查结果文件,限定pdf和图片,最多10个。"
|
|
|
|
|
/>
|
|
|
|
|
<Form.Item name="opinion" label="审查意见">
|
|
|
|
|
<Form.Item name="reviewOpinion" label="审查意见">
|
|
|
|
|
<Input.TextArea rows={4} placeholder="填写现场审查发现、整改要求和结论依据" />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Form>
|
|
|
|
|
|