dev_1.2
tangjie 2026-07-21 13:33:42 +08:00
parent 13ce708425
commit 305208d91b
5 changed files with 250 additions and 191 deletions

View File

@ -11,7 +11,7 @@ module.exports = {
// 本地联调 safetyEval-servicecontext-path: /safetyEval默认端口 8095 // 本地联调 safetyEval-servicecontext-path: /safetyEval默认端口 8095
// 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095 // 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095
API_HOST: "https://gbs-gateway.qhdsafety.com", API_HOST: "https://gbs-gateway.qhdsafety.com",
//API_HOST: "http://192.168.0.150", //太浅 //API_HOST: "http://192.168.0.150", //太浅
//API_HOST: "http://192.168.0.152", //API_HOST: "http://192.168.0.152",
}, },
production: { production: {

View File

@ -83,18 +83,43 @@ export const queryQualMonitoringPageStatistics = declareRequest(
"monitorStats: {} | res.data || {}", "monitorStats: {} | res.data || {}",
); );
export const querySiteReviewNoticePage = declareRequest( // ─── 资质现场核查 ───
export const queryQualOnSiteReviewPage = declareRequest(
"siteReviewNoticeLoading", "siteReviewNoticeLoading",
"Get > /safetyEval/site-review-notice/page", "Get > /safetyEval/qual-on-site-review/monitor/page",
'siteReviewNoticeList: [] | res.data?.records || [] & siteReviewNoticeTotal: 0 | res.data?.total || 0', 'qualOnSiteReviewList: [] | res.data || [] & qualOnSiteReviewTotal: 0 | res.total || 0',
); );
export const siteReviewNoticeSave = declareRequest( export const queryQualOnSiteReviewStatistics = declareRequest(
"siteReviewNoticeSaveLoading", "siteReviewStatisticsLoading",
"Post > @/safetyEval/site-review-notice/save", "Get > /safetyEval/qual-on-site-review/monitor/page/statistics",
'qualOnSiteReviewStats: {} | res.data || {}',
); );
export const siteReviewResultSave = declareRequest( export const fetchQualOnSiteReviewDetail = declareRequest(
"siteReviewResultSaveLoading", "siteReviewDetailLoading",
"Post > @/safetyEval/site-review-result/save", "Get > /safetyEval/qual-on-site-review/{id}",
'qualOnSiteReviewDetail: {} | res.data || {}',
);
export const addQualOnSiteReview = declareRequest(
"siteReviewSaveLoading",
"Post > @/safetyEval/qual-on-site-review",
);
export const updateQualOnSiteReview = declareRequest(
"siteReviewSaveLoading",
"Put > @/safetyEval/qual-on-site-review",
);
export const uploadQualOnSiteReviewResult = declareRequest(
"siteReviewResultLoading",
"Post > @/safetyEval/qual-on-site-review/result-upload",
);
export const queryOrgSelectList = declareRequest(
"orgSelectLoading",
"Get > /safetyEval/org-info/select/list",
'orgSelectList: [] | res.data || []',
); );

View File

@ -67,6 +67,14 @@ export const QUAL_MONITOR_STATUS_MAP = {
person_rate: { label: "人员比例预警", color: "warning" }, person_rate: { label: "人员比例预警", color: "warning" },
}; };
/** 资质现场核查状态 */
export const ON_SITE_REVIEW_STATUS_MAP = {
AGENCY_PENDING_CONFIRMATION: { label: "机构待确认", color: "processing" },
AGENCY_CONFIRMED: { label: "机构已确认", color: "blue" },
REVIEW_PASSED: { label: "核查通过", color: "success" },
REVIEW_FAILED: { label: "核查不通过", color: "error" },
};
/** 性别 */ /** 性别 */
export const GENDER_OPTIONS = [ export const GENDER_OPTIONS = [
{ label: "男", value: 1 }, { label: "男", value: 1 },

View File

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

View File

@ -19,7 +19,7 @@ import "./index.less";
const App = (props) => { const App = (props) => {
const { onCancel, safetyEvalBusiness } = props; const { onCancel, safetyEvalBusiness } = props;
const {createDocLoading }=safetyEvalBusiness; const { createDocLoading } = safetyEvalBusiness;
const [expandedMap, setExpandedMap] = useState({}); const [expandedMap, setExpandedMap] = useState({});
const [fileId, setFileId] = useState(props.fileId); const [fileId, setFileId] = useState(props.fileId);
const [templateMap, setTemplateMap] = useState([]); const [templateMap, setTemplateMap] = useState([]);
@ -59,6 +59,7 @@ const App = (props) => {
mount: document.getElementById("app-sbsb"), mount: document.getElementById("app-sbsb"),
fileId: fileId, fileId: fileId,
token: sessionStorage.getItem("token"), token: sessionStorage.getItem("token"),
}); });
await instance.ready(); await instance.ready();
sdkRef.current = instance; sdkRef.current = instance;
@ -217,13 +218,15 @@ const App = (props) => {
loading={createDocLoading} loading={createDocLoading}
size="small" size="small"
onClick={() => { onClick={() => {
props.createWpsDoc({docxUrl:url}).then((res) => { props
const fileId = res?.data?.fileId; .createWpsDoc({ docxUrl: url })
if(!fileId){ .then((res) => {
return; const fileId = res?.data?.fileId;
} if (!fileId) {
setFileId(fileId); return;
}); }
setFileId(fileId);
});
}} }}
> >
应用 应用