受限空间
parent
779091006f
commit
a8537e42d1
|
|
@ -32,7 +32,7 @@
|
|||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-to-print": "^3.3.0",
|
||||
"zy-react-library": "1.2.6"
|
||||
"zy-react-library": "^1.2.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@antfu/eslint-config": "^5.4.1",
|
||||
|
|
|
|||
14
router.md
14
router.md
|
|
@ -5,6 +5,14 @@
|
|||
`/eightwork/container/enterprise/hotWork/archive/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/archive/list`
|
||||
- 有限空间作业/作业管理
|
||||
`/eightwork/container/stakeholder/confinedSpaceWork/homework/list`
|
||||
- 有限空间作业/归档管理
|
||||
`/eightwork/container/stakeholder/confinedSpaceWork/archive/list`
|
||||
|
||||
|
||||
### 监管端
|
||||
- 动火作业
|
||||
`/eightwork/container/supervision/hotWork/list`
|
||||
- 有限空间作业
|
||||
`/eightwork/container/supervision/confinedSpaceWork/list`
|
||||
|
|
|
|||
|
|
@ -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}`,
|
||||
);
|
||||
|
|
@ -21,6 +21,6 @@ export const STATUS_ENUM = [
|
|||
{ name: "归档", bianma: "999" },
|
||||
];
|
||||
export const WORK_TYPE_ENUM = [
|
||||
{ name: "相关方", bianma: "1" },
|
||||
{ name: "内部", bianma: "2" },
|
||||
{ name: "相关方作业", bianma: "1" },
|
||||
{ name: "内部作业", bianma: "2" },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -6,3 +6,4 @@ import { defineNamespace } from "@cqsjjb/jjb-dva-runtime";
|
|||
|
||||
export const NS_GLOBAL = defineNamespace("global");
|
||||
export const NS_EIGHTWORK = defineNamespace("eightwork");
|
||||
export const NS_CONFINED_SPACE_WORK_LEDGER = defineNamespace("confinedSpaceWorkLedger");
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
import ListPage from "../../Homework/List";
|
||||
|
||||
function List(props) {
|
||||
return (<ListPage status="999" {...props} />);
|
||||
}
|
||||
|
||||
export default List;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ViewPage from "../../Homework/View";
|
||||
|
||||
function View(props) {
|
||||
return (<ViewPage {...props} />);
|
||||
}
|
||||
|
||||
export default View;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function Archive(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default Archive;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ListPage from "../../Homework/List";
|
||||
|
||||
function List(props) {
|
||||
return (<ListPage status="998" {...props} />);
|
||||
}
|
||||
|
||||
export default List;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ViewPage from "../../Homework/View";
|
||||
|
||||
function View(props) {
|
||||
return (<ViewPage {...props} />);
|
||||
}
|
||||
|
||||
export default View;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function ForceClose(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default ForceClose;
|
||||
|
|
@ -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);
|
||||
|
|
@ -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);
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function Homework(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default Homework;
|
||||
|
|
@ -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);
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function Ledger(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default Ledger;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function ConfinedSpaceWork(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default ConfinedSpaceWork;
|
||||
|
|
@ -101,7 +101,7 @@ function List(props) {
|
|||
{
|
||||
title: "作业时间",
|
||||
dataIndex: ["info", "workStartTime"],
|
||||
render: (_, record) => `${record.info.workStartTime}至${record.info.workEndTime}`,
|
||||
render: (_, record) => `${record.info.workStartTime || ""}-${record.info.workEndTime || ""}`,
|
||||
},
|
||||
{ title: "作业内容", dataIndex: ["info", "workContent"] },
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ 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 "./index.less";
|
||||
import "~/css/index.less";
|
||||
|
||||
function View(props) {
|
||||
const query = useGetUrlQuery();
|
||||
|
|
@ -30,17 +30,16 @@ function View(props) {
|
|||
const [info, setInfo] = useState({});
|
||||
const [safetyMeasures, setSafetyMeasures] = useState([]);
|
||||
const [otherSafetyMeasures, setOtherSafetyMeasures] = useState([]);
|
||||
const [delayedFireMonitoringRecord, setDelayedFireMonitoringRecord] = useState([]);
|
||||
const [gasFireMonitoringRecord, setGasFireMonitoringRecord] = 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 });
|
||||
setDelayedFireMonitoringRecord(supplementaryInfo.filter(item => item.type === "delay"));
|
||||
setGasFireMonitoringRecord(supplementaryInfo.filter(item => item.type === "gas"));
|
||||
setDelayedMonitoringRecord(supplementaryInfo.filter(item => item.type === "delay"));
|
||||
setGasMonitoringRecord(supplementaryInfo.filter(item => item.type === "gas"));
|
||||
const { data: measuresLogs } = await props["eightworkMeasuresLogs"]({ workId: query.workId });
|
||||
console.log(measuresLogs);
|
||||
setSafetyMeasures(measuresLogs.filter(item => item.type === 1));
|
||||
setOtherSafetyMeasures(measuresLogs.filter(item => item.type === 2));
|
||||
};
|
||||
|
|
@ -111,13 +110,13 @@ function View(props) {
|
|||
<td className="title">动火监火人</td>
|
||||
<td colSpan={3}>{info?.info?.workMonitor}</td>
|
||||
</tr>
|
||||
{gasFireMonitoringRecord.length > 0 && (
|
||||
{gasMonitoringRecord.length > 0 && (
|
||||
<tr>
|
||||
<td className="title center" colSpan={4}>可燃气体分析(运行的生产装置、罐区和具有火灾爆炸危险场所)</td>
|
||||
</tr>
|
||||
)}
|
||||
{
|
||||
gasFireMonitoringRecord.map(item => (
|
||||
gasMonitoringRecord.map(item => (
|
||||
<Fragment key={item.id}>
|
||||
<tr>
|
||||
<td className="title">分析时间</td>
|
||||
|
|
@ -142,10 +141,10 @@ function View(props) {
|
|||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td className="center" width={80}>序号</td>
|
||||
<td className="center">安全措施</td>
|
||||
<td className="center" width={100}>是否涉及</td>
|
||||
<td className="center" width={100}>确认人</td>
|
||||
<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}>
|
||||
|
|
@ -164,7 +163,7 @@ function View(props) {
|
|||
otherSafetyMeasures.map((item, index) => (
|
||||
<div key={index} style={{ display: "flex", justifyContent: "space-between" }}>
|
||||
<div>
|
||||
<span>其他安全措施:</span>
|
||||
<span>其它安全措施:</span>
|
||||
<span>{item.content}</span>
|
||||
</div>
|
||||
<div>
|
||||
|
|
@ -240,7 +239,7 @@ function View(props) {
|
|||
<td className="title center">时间</td>
|
||||
<td className="title center">签字照片</td>
|
||||
</tr>
|
||||
{delayedFireMonitoringRecord.map((item, index) => (
|
||||
{delayedMonitoringRecord.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td className="center">{item?.details?.actUserName}</td>
|
||||
<td className="center">{item?.details?.delayHotTime}</td>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ViewPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/View";
|
||||
|
||||
function View(props) {
|
||||
return (<ViewPage entrance="stakeholder" {...props} />);
|
||||
}
|
||||
|
||||
export default View;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function Archive(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default Archive;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ListPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/List";
|
||||
|
||||
function List(props) {
|
||||
return (<ListPage entrance="stakeholder" {...props} />);
|
||||
}
|
||||
|
||||
export default List;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import ViewPage from "~/pages/Container/Enterprise/ConfinedSpaceWork/Homework/View";
|
||||
|
||||
function View(props) {
|
||||
return (<ViewPage entrance="stakeholder" {...props} />);
|
||||
}
|
||||
|
||||
export default View;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function Homework(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default Homework;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function ConfinedSpaceWork(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default ConfinedSpaceWork;
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
import ListPage from "~/pages/Container/Supervision/HotWork/List";
|
||||
|
||||
function List(props) {
|
||||
return (
|
||||
<ListPage eqWorkType="confinedspace_work" {...props} />
|
||||
);
|
||||
}
|
||||
|
||||
export default List;
|
||||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function ConfinedSpaceWork(props) {
|
||||
return props.children;
|
||||
}
|
||||
|
||||
export default ConfinedSpaceWork;
|
||||
|
|
@ -11,7 +11,7 @@ function List(props) {
|
|||
|
||||
const { tableProps, getData } = useTable(props["eightworkRecordsList"], {
|
||||
form,
|
||||
params: { eqWorkType: "hot_work" },
|
||||
params: { eqWorkType: props.eqWorkType || "hot_work" },
|
||||
});
|
||||
|
||||
return (
|
||||
|
|
|
|||
Loading…
Reference in New Issue