受限空间

master
LiuJiaNan 2026-03-31 15:15:59 +08:00
parent 779091006f
commit a8537e42d1
31 changed files with 893 additions and 19 deletions

View File

@ -32,7 +32,7 @@
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-to-print": "^3.3.0", "react-to-print": "^3.3.0",
"zy-react-library": "1.2.6" "zy-react-library": "^1.2.13"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^5.4.1", "@antfu/eslint-config": "^5.4.1",

View File

@ -5,6 +5,14 @@
`/eightwork/container/enterprise/hotWork/archive/list` `/eightwork/container/enterprise/hotWork/archive/list`
- 动火作业/关闭管理 - 动火作业/关闭管理
`/eightwork/container/enterprise/hotWork/forceClose/list` `/eightwork/container/enterprise/hotWork/forceClose/list`
- 有限空间作业/台账管理
`/eightwork/container/enterprise/confinedSpaceWork/ledger/list`
- 有限空间作业/作业管理
`/eightwork/container/enterprise/confinedSpaceWork/homework/list`
- 有限空间作业/归档管理
`/eightwork/container/enterprise/confinedSpaceWork/archive/list`
- 有限空间作业/关闭管理
`/eightwork/container/enterprise/confinedSpaceWork/forceClose/list`
### 相关方端 ### 相关方端
@ -12,8 +20,14 @@
`/eightwork/container/stakeholder/hotWork/homework/list` `/eightwork/container/stakeholder/hotWork/homework/list`
- 动火作业/归档管理 - 动火作业/归档管理
`/eightwork/container/stakeholder/hotWork/archive/list` `/eightwork/container/stakeholder/hotWork/archive/list`
- 有限空间作业/作业管理
`/eightwork/container/stakeholder/confinedSpaceWork/homework/list`
- 有限空间作业/归档管理
`/eightwork/container/stakeholder/confinedSpaceWork/archive/list`
### 监管端 ### 监管端
- 动火作业 - 动火作业
`/eightwork/container/supervision/hotWork/list` `/eightwork/container/supervision/hotWork/list`
- 有限空间作业
`/eightwork/container/supervision/confinedSpaceWork/list`

View File

@ -0,0 +1,22 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const confinedSpaceWorkLedgerList = declareRequest(
"confinedSpaceWorkLedgerLoading",
`Post > @/eightwork/confinedSpace/list`,
);
export const confinedSpaceWorkLedgerAdd = declareRequest(
"confinedSpaceWorkLedgerLoading",
`Post > @/eightwork/confinedSpace/save`,
);
export const confinedSpaceWorkLedgerUpdate = declareRequest(
"confinedSpaceWorkLedgerLoading",
`Put > @/eightwork/confinedSpace/edit`,
);
export const confinedSpaceWorkLedgerInfo = declareRequest(
"confinedSpaceWorkLedgerLoading",
`Get > /eightwork/confinedSpace/{id}`,
);
export const confinedSpaceWorkLedgerDelete = declareRequest(
"confinedSpaceWorkLedgerLoading",
`Delete > @/eightwork/confinedSpace/{id}`,
);

View File

@ -21,6 +21,6 @@ export const STATUS_ENUM = [
{ name: "归档", bianma: "999" }, { name: "归档", bianma: "999" },
]; ];
export const WORK_TYPE_ENUM = [ export const WORK_TYPE_ENUM = [
{ name: "相关方", bianma: "1" }, { name: "相关方作业", bianma: "1" },
{ name: "内部", bianma: "2" }, { name: "内部作业", bianma: "2" },
]; ];

View File

@ -6,3 +6,4 @@ import { defineNamespace } from "@cqsjjb/jjb-dva-runtime";
export const NS_GLOBAL = defineNamespace("global"); export const NS_GLOBAL = defineNamespace("global");
export const NS_EIGHTWORK = defineNamespace("eightwork"); export const NS_EIGHTWORK = defineNamespace("eightwork");
export const NS_CONFINED_SPACE_WORK_LEDGER = defineNamespace("confinedSpaceWorkLedger");

View File

@ -0,0 +1,7 @@
import ListPage from "../../Homework/List";
function List(props) {
return (<ListPage status="999" {...props} />);
}
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "../../Homework/View";
function View(props) {
return (<ViewPage {...props} />);
}
export default View;

View File

@ -0,0 +1,5 @@
function Archive(props) {
return props.children;
}
export default Archive;

View File

@ -0,0 +1,7 @@
import ListPage from "../../Homework/List";
function List(props) {
return (<ListPage status="998" {...props} />);
}
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "../../Homework/View";
function View(props) {
return (<ViewPage {...props} />);
}
export default View;

View File

@ -0,0 +1,5 @@
function ForceClose(props) {
return props.children;
}
export default ForceClose;

View File

@ -0,0 +1,161 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Space } from "antd";
import { useState } from "react";
import Page from "zy-react-library/components/Page";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import FlowModal from "~/components/FlowModal";
import ForceTerminationModal from "~/components/ForceTerminationModal";
import { STATUS_ENUM, WORK_TYPE_ENUM } from "~/enumerate/constant";
import { NS_EIGHTWORK } from "~/enumerate/namespace";
import "@xyflow/react/dist/style.css";
function List(props) {
// status 默认不传是作业管理999 是归档管理998 是强制关闭管理
// entrance 默认不传是企业端stakeholder 是相关方端supervision 是监督端
const [form] = Search.useForm();
const query = useGetUrlQuery();
const [forceTerminationModalOpen, setForceTerminationModalOpen] = useState(false);
const [flowModalOpen, setFlowModalOpen] = useState(false);
const [currentId, setCurrentId] = useState("");
const { tableProps, getData } = useTable(props["eightworkList"], {
form,
params: { eqWorkType: "confinedspace_work", corpinfoId: query.corpinfoId },
transform: formData => ({
geCreateTime: formData.createTime?.[0],
leCreateTime: formData.createTime?.[1],
eqStatus: props.status || formData.eqStatus,
}),
});
return (
<Page isShowAllAction={false}>
<Search
options={[
{ name: "eqCheckNo", label: "编号" },
{ name: "likeCreateName", label: "申请人" },
{ name: "createTime", label: "申请时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{
name: "eqStatus",
label: "审核状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: STATUS_ENUM,
hidden: props.status,
},
{ name: "eqXgfFlag", label: "作业类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: WORK_TYPE_ENUM },
{ name: "todo", label: "有限空间名称" },
{ name: "inDepartmentId", label: "申请单位", render: <DepartmentSelectTree multiple /> },
{
name: "todo",
label: "服务单位",
render: <DepartmentSelectTree searchType="inType" params={{ enterpriseType: [1, 2] }} />,
hidden: !(props.entrance === "stakeholder"),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "服务单位", dataIndex: "todo", hidden: !(props.entrance === "stakeholder") },
{ title: "编号", dataIndex: "checkNo" },
{
title: "作业类型",
dataIndex: "xgfFlag",
render: (_, record) => getLabelName({ list: WORK_TYPE_ENUM, status: record.xgfFlag }),
},
{ title: "申请人", dataIndex: ["info", "applyUser"] },
{ title: "申请单位", dataIndex: ["info", "applyUnit"] },
{ title: "申请时间", dataIndex: ["info", "applyTime"] },
// { title: "作业人", dataIndex: ["info", "step_1", "actUserName"] },
// { title: "作业单位", dataIndex: ["info", "step_1", "actUserDepartmentName"] },
{
title: "作业时间",
dataIndex: ["info", "workStartTime"],
render: (_, record) => `${record.info.workStartTime || ""}-${record.info.workEndTime || ""}`,
},
{ title: "作业内容", dataIndex: ["info", "workContent"] },
{ title: "有限空间名称", dataIndex: ["info", "limitedSpaceNameAndCode"] },
{
title: "审核状态",
dataIndex: "status",
render: (_, record) => getLabelName({ list: STATUS_ENUM, status: record.status }),
},
{ title: "强制关闭原因", dataIndex: "todo", hidden: !(props.status === 998) },
{
title: "操作",
fixed: "right",
width: 250,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
setCurrentId(record.workId);
setFlowModalOpen(true);
}}
>
流程图
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./view?id=${record.id}&workId=${record.workId}`);
}}
>
审批表详情
</Button>
{(!props.status && !props.entrance && ![998, 999].includes(record.status)) && (
<Button
type="link"
danger
onClick={() => {
setCurrentId(record.id);
setForceTerminationModalOpen(true);
}}
>
强制结束
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{
forceTerminationModalOpen && (
<ForceTerminationModal
id={currentId}
onCancel={() => {
setForceTerminationModalOpen(false);
setCurrentId("");
}}
getData={getData}
/>
)
}
{
flowModalOpen && (
<FlowModal
id={currentId}
onCancel={() => {
setFlowModalOpen(false);
setCurrentId("");
}}
/>
)
}
</Page>
);
}
export default Connect([NS_EIGHTWORK], true)(List);

View File

@ -0,0 +1,237 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Divider, Image } from "antd";
import { useEffect, useRef, useState } from "react";
import { useReactToPrint } from "react-to-print";
import Page from "zy-react-library/components/Page";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { getFileUrl } from "zy-react-library/utils";
import { NS_EIGHTWORK } from "~/enumerate/namespace";
import "~/css/index.less";
function View(props) {
const query = useGetUrlQuery();
const contentRef = useRef(null);
const handlePrint = useReactToPrint({
contentRef,
pageStyle: `@page {
size: landscape;
margin: 0mm;
}
@media print {
body {
margin: 10px;
padding: 10px;
}
}
`,
documentTitle: "",
});
const [info, setInfo] = useState({});
const [safetyMeasures, setSafetyMeasures] = useState([]);
const [otherSafetyMeasures, setOtherSafetyMeasures] = useState([]);
// const [delayedMonitoringRecord, setDelayedMonitoringRecord] = useState([]);
const [gasMonitoringRecord, setGasMonitoringRecord] = useState([]);
const getData = async () => {
const { data: basicInfo } = await props["eightworkInfo"]({ id: query.id });
setInfo(basicInfo);
const { data: supplementaryInfo } = await props["eightworkSupplementaryInfo"]({ eqWorkId: query.workId, pageSize: 999, pageIndex: 1 });
// setDelayedMonitoringRecord(supplementaryInfo.filter(item => item.type === "delay"));
setGasMonitoringRecord(supplementaryInfo.filter(item => item.type === "gas"));
const { data: measuresLogs } = await props["eightworkMeasuresLogs"]({ workId: query.workId });
setSafetyMeasures(measuresLogs.filter(item => item.type === 1));
setOtherSafetyMeasures(measuresLogs.filter(item => item.type === 2));
};
useEffect(() => {
getData();
}, []);
return (
<Page
headerTitle="审批表详情"
contentPadding="0 20px 20px 20px"
extraActionButtons={(
<Button type="primary" onClick={handlePrint}>打印</Button>
)}
>
<div className="work_ticket_details" ref={contentRef}>
<table>
<thead>
<tr>
<td colSpan={6} style={{ border: "none" }}>
<Divider orientation="left">有限空间作业许可证</Divider>
</td>
</tr>
<tr>
<td colSpan={6} style={{ border: "none" }} className="right">
<span>编号</span>
<span>{info.checkNo}</span>
</td>
</tr>
</thead>
<tbody>
{props.entrance === "stakeholder" && (
<tr>
<td className="title">服务单位</td>
<td colSpan={5}>{info.xx}</td>
</tr>
)}
<tr>
<td className="title">申请单位</td>
<td colSpan={2}>{info?.info?.applyUnit}</td>
<td className="title">作业单位</td>
<td colSpan={2}>{info?.info?.workUserDepartmentName}</td>
</tr>
<tr>
<td className="title">有限空间名称及编号</td>
<td colSpan={2}>{info?.info?.limitedSpaceNameAndCode}</td>
<td className="title">作业内容</td>
<td colSpan={2}>{info?.info?.workContent}</td>
</tr>
<tr>
<td className="title">主要介质</td>
<td colSpan={2}>{info?.info?.chooseLimitedSpace?.mediumInfo}</td>
<td className="title" rowSpan={2}>应急装备</td>
<td rowSpan={2} colSpan={2}>{info?.info?.emergencyEquipment}</td>
</tr>
<tr>
<td className="title">主要危险因素</td>
<td colSpan={2}>{info?.info?.chooseLimitedSpace?.hazards}</td>
</tr>
<tr>
<td className="title">隔绝安全措施</td>
<td colSpan={5}>{info?.info?.isNeedWork === 1 ? "是" : "否"}</td>
</tr>
<tr>
<td colSpan={6}>
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", padding: "0 50px" }}>
<div>
<span style={{ padding: "0 10px" }}>作业负责人</span>
<span>{info?.info?.workChargeUserName}</span>
</div>
<div>
<span style={{ padding: "0 10px" }}>监护人</span>
<span>{info?.info?.workGuardianUserName}</span>
</div>
<div>
<span style={{ padding: "0 10px" }}>作业人</span>
<span>{info?.info?.workUserName}</span>
</div>
</div>
</td>
</tr>
{/* <tr> */}
{/* <td className="title">预计作业时间</td> */}
{/* <td colSpan={5}>{info?.info?.xx}</td> */}
{/* </tr> */}
<tr>
<td colSpan={6} style={{ border: "none", padding: 0 }}>
<table>
<tbody>
<tr>
<td className="center title" style={{ width: 80 }}>序号</td>
<td className="center title" style={{ width: "auto" }}>主要安全措施</td>
<td className="center title" style={{ width: 100 }}>是否涉及</td>
<td className="center title" style={{ width: 100 }}>确认人</td>
</tr>
{safetyMeasures.map((item, index) => (
<tr key={index}>
<td className="center">{index + 1}</td>
<td>{item.content}</td>
<td className="center">符合</td>
<td className="center">
{item.signPath && <Image src={getFileUrl() + item.signPath} width={50} height={50} />}
</td>
</tr>
))}
</tbody>
</table>
</td>
</tr>
<tr>
<td colSpan={6} style={{ border: "none", padding: 0 }}>
<table>
<tbody>
<tr>
<td className="center title" style={{ width: 80 }}>序号</td>
<td className="center title" style={{ width: "auto" }}>其它安全措施</td>
<td className="center title" style={{ width: 100 }}>确认人</td>
</tr>
{otherSafetyMeasures.map((item, index) => (
<tr key={index}>
<td className="center">{index + 1}</td>
<td>{item.content}</td>
<td className="center">
{item.signPath ? <Image src={getFileUrl() + item.signPath} width={50} height={50} /> : item.createName}
</td>
</tr>
))}
</tbody>
</table>
</td>
</tr>
{gasMonitoringRecord.length > 0 && (
<tr>
<td colSpan={6} style={{ border: "none", padding: 0 }}>
<table>
<tbody>
<tr>
<td className="center title">作业前分析项目</td>
<td className="center title">有毒有害物质含量</td>
<td className="center title">可燃气含量</td>
<td className="center title">氧气量</td>
<td className="center title">取样时间</td>
<td className="center title">取样位置</td>
<td className="center title">取样人</td>
</tr>
{gasMonitoringRecord.map((item, index) => (
<tr key={index}>
{index === 0 && <td className="center title" rowSpan={gasMonitoringRecord.length}>作业前数据</td>}
<td className="center">{item?.details?.toxicSubstanceContent}</td>
<td className="center">{item?.details?.combustibleGasContent}</td>
<td className="center">{item?.details?.oxygeAmount}</td>
<td className="center">{item?.details?.samplingTime}</td>
<td className="center">{item?.details?.samplingLocation}</td>
<td className="center">
{item?.details?.signImagePath && <Image src={getFileUrl() + item?.details?.signImagePath} width={50} height={50} />}
</td>
</tr>
))}
</tbody>
</table>
</td>
</tr>
)}
<tr>
<td className="title">作业单位负责人意见</td>
<td className="right" style={{ width: 200 }}>
<div>
{info?.info?.step_14?.signPath && <Image src={getFileUrl() + info?.info?.step_14?.signPath} width={50} height={50} />}
</div>
<div>{info?.info?.step_14?.signTime}</div>
</td>
<td className="title">管理单位发包部门意见</td>
<td className="right" style={{ width: 200 }}>
<div>
{info?.info?.step_15?.signPath && <Image src={getFileUrl() + info?.info?.step_15?.signPath} width={50} height={50} />}
</div>
<div>{info?.info?.step_15?.signTime}</div>
</td>
<td className="title">管理单位安监部门意见</td>
<td className="right" style={{ width: 200 }}>
<div>
{info?.info?.step_16?.signPath && <Image src={getFileUrl() + info?.info?.step_16?.signPath} width={50} height={50} />}
</div>
<div>{info?.info?.step_16?.signTime}</div>
</td>
</tr>
</tbody>
</table>
</div>
</Page>
);
}
export default Connect([NS_EIGHTWORK], true)(View);

View File

@ -0,0 +1,5 @@
function Homework(props) {
return props.children;
}
export default Homework;

View File

@ -0,0 +1,320 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, message, Modal, Space } from "antd";
import { useEffect, useRef, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import Page from "zy-react-library/components/Page";
import PreviewPdf from "zy-react-library/components/PreviewPdf";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import Table from "zy-react-library/components/Table";
import Upload from "zy-react-library/components/Upload";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useDownloadFile from "zy-react-library/hooks/useDownloadFile";
import useTable from "zy-react-library/hooks/useTable";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { addingPrefixToFile, getFileName, getFileSuffix } from "zy-react-library/utils";
import { NS_CONFINED_SPACE_WORK_LEDGER } from "~/enumerate/namespace";
function List(props) {
const [currentId, setCurrentId] = useState("");
const [viewModalVisible, setViewModalVisible] = useState(false);
const [addModalVisible, setAddModalVisible] = useState(false);
const [form] = Search.useForm();
const { tableProps, getData } = useTable(props["confinedSpaceWorkLedgerList"], {
form,
});
const onDelete = (id) => {
Modal.confirm({
title: "删除确认",
content: "确定要删除吗?",
onOk: async () => {
const { success } = await props["confinedSpaceWorkLedgerDelete"]({ id });
if (success) {
message.success("删除成功");
getData();
}
},
});
};
return (
<Page isShowAllAction={false}>
<Search
options={[
{ name: "likeName", label: "有限空间名称" },
{ name: "likeCode", label: "有限空间编号" },
{ name: "eqType", label: "类型", render: (<DictionarySelect dictValue="finiteSpaceType" />) },
{ name: "eqRiskLevel", label: "风险等级", render: (<DictionarySelect dictValue="riskGrade" />) },
]}
form={form}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
icon={(<AddIcon />)}
onClick={() => {
setAddModalVisible(true);
}}
>
新增
</Button>
</Space>
)}
columns={[
{ title: "有限空间名称", dataIndex: "name" },
{ title: "有限空间编号", dataIndex: "code" },
{ title: "类型", dataIndex: "typeName" },
{ title: "位置及范围", dataIndex: "positionAndRange" },
{ title: "主要介质", dataIndex: "mediumInfo" },
{ title: "主要危险及有害因素", dataIndex: "hazards" },
{ title: "风险等级", dataIndex: "riskLevelName" },
{ title: "最大作业人数", dataIndex: "maximumNumber" },
{
title: "操作",
width: 200,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
setCurrentId(record.id);
setViewModalVisible(true);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
setAddModalVisible(true);
setCurrentId(record.id);
}}
>
编辑
</Button>
<Button
type="link"
danger
onClick={() => {
onDelete(record.id);
}}
>
删除
</Button>
</Space>
),
},
]}
{...tableProps}
/>
{viewModalVisible && (
<ViewModal
id={currentId}
onCancel={() => {
setViewModalVisible(false);
setCurrentId("");
}}
/>
)}
{addModalVisible && (
<AddModal
id={currentId}
getData={getData}
onCancel={() => {
setAddModalVisible(false);
setCurrentId("");
}}
/>
)}
</Page>
);
}
const ViewModalComponent = (props) => {
const [info, setInfo] = useState({});
const { downloadFile } = useDownloadFile();
const getData = async () => {
const { data } = await props["confinedSpaceWorkLedgerInfo"]({ id: props.id });
setInfo(data);
};
useEffect(() => {
getData();
}, []);
return (
<Modal
open
title="查看"
onCancel={props.onCancel}
maskClosable={false}
width={600}
footer={[
<Button key="cancel" onClick={props.onCancel}>关闭</Button>,
]}
loading={props.confinedSpaceWorkLedger.confinedSpaceWorkLedgerLoading}
>
<Descriptions
column={1}
bordered
styles={{ label: { width: 200 } }}
items={[
{ label: "有限空间名称及编号", children: `${info.name} ${info.code}` },
{ label: "有限空间类型", children: info.typeName },
{ label: "位置及范围", children: info.positionAndRange },
{ label: "主要介质", children: info.mediumInfo },
{ label: "主要危险及有害因素", children: info.hazards },
{ label: "风险等级", children: info.riskLevelName },
{ label: "防护要求", children: info.protectionRequirements },
{ label: "隔绝安全措施", children: info.separateSafetyMeasures },
{ label: "最大作业人数", children: info.maximumNumber },
{
label: "是否有应急指导书",
children: info.isEmergencyBook === 1
? getFileSuffix(info.emergencyBookFile) === "pdf"
? <PreviewPdf name={getFileName(info.emergencyBookFile)} url={info.emergencyBookFile} />
: (
<Space>
<span>{getFileName(info.emergencyBookFile)}</span>
<Button
type="primary"
size="small"
onClick={() => downloadFile({ url: info.emergencyBookFile })}
>
下载
</Button>
</Space>
)
: "否",
},
]}
/>
</Modal>
);
};
const AddModalComponent = (props) => {
const [form] = FormBuilder.useForm();
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const { loading: deleteFileLoading, deleteFile } = useDeleteFile();
const infoRef = useRef({});
const getData = async () => {
const { data } = await props["confinedSpaceWorkLedgerInfo"]({ id: props.id });
form.setFieldsValue({
...data,
emergencyBookFile: addingPrefixToFile([{ filePath: data.emergencyBookFile }]),
});
infoRef.current = data;
};
useEffect(() => {
props.id && getData();
}, []);
const onSubmit = async (values) => {
await deleteFile({ files: values.deleteEmergencyBookFile });
const { filePath } = await uploadFile({ files: values.emergencyBookFile, params: { type: UPLOAD_FILE_TYPE_ENUM[407] } });
const { success } = await props[props.id ? "confinedSpaceWorkLedgerUpdate" : "confinedSpaceWorkLedgerAdd"]({
...infoRef.current,
...values,
emergencyBookFile: filePath,
});
if (success) {
message.success(`${props.id ? "编辑" : "新增"}成功`);
props.onCancel();
props.getData();
}
};
return (
<Modal
open
title={props.id ? "编辑" : "新增"}
onCancel={props.onCancel}
onOk={form.submit}
maskClosable={false}
width={800}
confirmLoading={props.confinedSpaceWorkLedger.confinedSpaceWorkLedgerLoading || uploadFileLoading || deleteFileLoading}
>
<FormBuilder
loading={props.confinedSpaceWorkLedger.confinedSpaceWorkLedgerLoading || uploadFileLoading || deleteFileLoading}
options={[
{ name: "name", label: "有限空间名称" },
{ name: "code", label: "有限空间编号" },
{
name: "type",
label: "有限空间类型",
render: (
<DictionarySelect
dictValue="finiteSpaceType"
onGetLabel={label => form.setFieldValue("typeName", label)}
/>
),
},
{ name: "typeName", label: "有限空间类型名称", onlyForLabel: true },
{ name: "positionAndRange", label: "位置及范围" },
{ name: "mediumInfo", label: "主要介质" },
{ name: "hazards", label: "主要危险及有害因素" },
{
name: "riskLevel",
label: "风险等级",
render: (
<DictionarySelect
dictValue="riskGrade"
onGetLabel={label => form.setFieldValue("riskLevelName", label)}
/>
),
},
{ name: "riskLevelName", label: "风险等级名称", onlyForLabel: true },
{ name: "protectionRequirements", label: "防护要求" },
{ name: "separateSafetyMeasures", label: "隔绝安全措施" },
{ name: "maximumNumber", label: "最大作业人数", render: FORM_ITEM_RENDER_ENUM.NUMBER },
{
name: "isEmergencyBook",
label: "是否有应急指导书",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
{
name: "emergencyBookFile",
label: "应急指导书",
render: (
<Upload
maxCount={1}
fileType="document"
accept=".pdf,.doc,.docx"
onGetRemoveFile={file => form.setFieldValue("deleteEmergencyBookFile", [...(form.getFieldValue("deleteEmergencyBookFile") || []), file])}
/>
),
dependencies: ["isEmergencyBook"],
hidden: formValues => !(formValues.isEmergencyBook === 1),
},
{ name: "deleteEmergencyBookFile", label: "删除的应急指导书", onlyForLabel: true },
]}
form={form}
span={24}
labelCol={{ span: 10 }}
showActionButtons={false}
onFinish={onSubmit}
/>
</Modal>
);
};
const ViewModal = Connect([NS_CONFINED_SPACE_WORK_LEDGER], true)(ViewModalComponent);
const AddModal = Connect([NS_CONFINED_SPACE_WORK_LEDGER], true)(AddModalComponent);
export default Connect([NS_CONFINED_SPACE_WORK_LEDGER], true)(List);

View File

@ -0,0 +1,5 @@
function Ledger(props) {
return props.children;
}
export default Ledger;

View File

@ -0,0 +1,5 @@
function ConfinedSpaceWork(props) {
return props.children;
}
export default ConfinedSpaceWork;

View File

@ -101,7 +101,7 @@ function List(props) {
{ {
title: "作业时间", title: "作业时间",
dataIndex: ["info", "workStartTime"], dataIndex: ["info", "workStartTime"],
render: (_, record) => `${record.info.workStartTime}${record.info.workEndTime}`, render: (_, record) => `${record.info.workStartTime || ""}-${record.info.workEndTime || ""}`,
}, },
{ title: "作业内容", dataIndex: ["info", "workContent"] }, { title: "作业内容", dataIndex: ["info", "workContent"] },
{ {

View File

@ -6,7 +6,7 @@ import Page from "zy-react-library/components/Page";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { getFileUrl } from "zy-react-library/utils"; import { getFileUrl } from "zy-react-library/utils";
import { NS_EIGHTWORK } from "~/enumerate/namespace"; import { NS_EIGHTWORK } from "~/enumerate/namespace";
import "./index.less"; import "~/css/index.less";
function View(props) { function View(props) {
const query = useGetUrlQuery(); const query = useGetUrlQuery();
@ -30,17 +30,16 @@ function View(props) {
const [info, setInfo] = useState({}); const [info, setInfo] = useState({});
const [safetyMeasures, setSafetyMeasures] = useState([]); const [safetyMeasures, setSafetyMeasures] = useState([]);
const [otherSafetyMeasures, setOtherSafetyMeasures] = useState([]); const [otherSafetyMeasures, setOtherSafetyMeasures] = useState([]);
const [delayedFireMonitoringRecord, setDelayedFireMonitoringRecord] = useState([]); const [delayedMonitoringRecord, setDelayedMonitoringRecord] = useState([]);
const [gasFireMonitoringRecord, setGasFireMonitoringRecord] = useState([]); const [gasMonitoringRecord, setGasMonitoringRecord] = useState([]);
const getData = async () => { const getData = async () => {
const { data: basicInfo } = await props["eightworkInfo"]({ id: query.id }); const { data: basicInfo } = await props["eightworkInfo"]({ id: query.id });
setInfo(basicInfo); setInfo(basicInfo);
const { data: supplementaryInfo } = await props["eightworkSupplementaryInfo"]({ eqWorkId: query.workId, pageSize: 999, pageIndex: 1 }); const { data: supplementaryInfo } = await props["eightworkSupplementaryInfo"]({ eqWorkId: query.workId, pageSize: 999, pageIndex: 1 });
setDelayedFireMonitoringRecord(supplementaryInfo.filter(item => item.type === "delay")); setDelayedMonitoringRecord(supplementaryInfo.filter(item => item.type === "delay"));
setGasFireMonitoringRecord(supplementaryInfo.filter(item => item.type === "gas")); setGasMonitoringRecord(supplementaryInfo.filter(item => item.type === "gas"));
const { data: measuresLogs } = await props["eightworkMeasuresLogs"]({ workId: query.workId }); const { data: measuresLogs } = await props["eightworkMeasuresLogs"]({ workId: query.workId });
console.log(measuresLogs);
setSafetyMeasures(measuresLogs.filter(item => item.type === 1)); setSafetyMeasures(measuresLogs.filter(item => item.type === 1));
setOtherSafetyMeasures(measuresLogs.filter(item => item.type === 2)); setOtherSafetyMeasures(measuresLogs.filter(item => item.type === 2));
}; };
@ -111,13 +110,13 @@ function View(props) {
<td className="title">动火监火人</td> <td className="title">动火监火人</td>
<td colSpan={3}>{info?.info?.workMonitor}</td> <td colSpan={3}>{info?.info?.workMonitor}</td>
</tr> </tr>
{gasFireMonitoringRecord.length > 0 && ( {gasMonitoringRecord.length > 0 && (
<tr> <tr>
<td className="title center" colSpan={4}>可燃气体分析运行的生产装置罐区和具有火灾爆炸危险场所</td> <td className="title center" colSpan={4}>可燃气体分析运行的生产装置罐区和具有火灾爆炸危险场所</td>
</tr> </tr>
)} )}
{ {
gasFireMonitoringRecord.map(item => ( gasMonitoringRecord.map(item => (
<Fragment key={item.id}> <Fragment key={item.id}>
<tr> <tr>
<td className="title">分析时间</td> <td className="title">分析时间</td>
@ -142,10 +141,10 @@ function View(props) {
<table> <table>
<tbody> <tbody>
<tr> <tr>
<td className="center" width={80}>序号</td> <td className="center title" style={{ width: 80 }}>序号</td>
<td className="center">安全措施</td> <td className="center title" style={{ width: "auto" }}>安全措施</td>
<td className="center" width={100}>是否涉及</td> <td className="center title" style={{ width: 100 }}>是否涉及</td>
<td className="center" width={100}>确认人</td> <td className="center title" style={{ width: 100 }}>确认人</td>
</tr> </tr>
{safetyMeasures.map((item, index) => ( {safetyMeasures.map((item, index) => (
<tr key={index}> <tr key={index}>
@ -164,7 +163,7 @@ function View(props) {
otherSafetyMeasures.map((item, index) => ( otherSafetyMeasures.map((item, index) => (
<div key={index} style={{ display: "flex", justifyContent: "space-between" }}> <div key={index} style={{ display: "flex", justifyContent: "space-between" }}>
<div> <div>
<span>安全措施</span> <span>安全措施</span>
<span>{item.content}</span> <span>{item.content}</span>
</div> </div>
<div> <div>
@ -240,7 +239,7 @@ function View(props) {
<td className="title center">时间</td> <td className="title center">时间</td>
<td className="title center">签字照片</td> <td className="title center">签字照片</td>
</tr> </tr>
{delayedFireMonitoringRecord.map((item, index) => ( {delayedMonitoringRecord.map((item, index) => (
<tr key={index}> <tr key={index}>
<td className="center">{item?.details?.actUserName}</td> <td className="center">{item?.details?.actUserName}</td>
<td className="center">{item?.details?.delayHotTime}</td> <td className="center">{item?.details?.delayHotTime}</td>

View File

@ -0,0 +1,7 @@
import ListPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/List";
function List(props) {
return (<ListPage status="999" entrance="stakeholder" {...props} />);
}
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/View";
function View(props) {
return (<ViewPage entrance="stakeholder" {...props} />);
}
export default View;

View File

@ -0,0 +1,5 @@
function Archive(props) {
return props.children;
}
export default Archive;

View File

@ -0,0 +1,7 @@
import ListPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/List";
function List(props) {
return (<ListPage entrance="stakeholder" {...props} />);
}
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/View";
function View(props) {
return (<ViewPage entrance="stakeholder" {...props} />);
}
export default View;

View File

@ -0,0 +1,5 @@
function Homework(props) {
return props.children;
}
export default Homework;

View File

@ -0,0 +1,5 @@
function ConfinedSpaceWork(props) {
return props.children;
}
export default ConfinedSpaceWork;

View File

@ -0,0 +1,9 @@
import ListPage from "~/pages/Container/Supervision/HotWork/List";
function List(props) {
return (
<ListPage eqWorkType="confinedspace_work" {...props} />
);
}
export default List;

View File

@ -0,0 +1,10 @@
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import ListPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/List";
function RecordsList(props) {
const query = useGetUrlQuery();
return (<ListPage status={query.status} entrance="supervision" {...props} />);
}
export default RecordsList;

View File

@ -0,0 +1,5 @@
function ConfinedSpaceWork(props) {
return props.children;
}
export default ConfinedSpaceWork;

View File

@ -11,7 +11,7 @@ function List(props) {
const { tableProps, getData } = useTable(props["eightworkRecordsList"], { const { tableProps, getData } = useTable(props["eightworkRecordsList"], {
form, form,
params: { eqWorkType: "hot_work" }, params: { eqWorkType: props.eqWorkType || "hot_work" },
}); });
return ( return (