master
LiuJiaNan 2025-11-14 11:35:35 +08:00
parent 3c06f3a91e
commit 421662ae0d
51 changed files with 3998 additions and 5 deletions

View File

@ -9,7 +9,7 @@ module.exports = {
// 应用后端分支名称,部署上线需要
javaGitBranch: "<branch-name>",
// 接口服务地址
API_HOST: "开发环境后端地址",
API_HOST: "http://192.168.20.100:30140",
},
production: {
// 应用后端分支名称,部署上线需要
@ -24,7 +24,7 @@ module.exports = {
contextInject: {
// 应用Key
appKey: "",
fileUrl: "附件地址",
fileUrl: "http://192.168.20.230:7811/csyfile/",
},
// public/index.html注入全局变量
windowInject: {
@ -39,12 +39,14 @@ module.exports = {
},
},
// 注入js链接集合
scripts: [],
scripts: [
"https://api.map.baidu.com/api?v=1.0&type=webgl&ak=OElqFYoKiAH8KFtph8ftLKF5NlNrbCUr",
],
},
// 开发服务
server: {
// 监听端口号
port: "8080",
port: "8081",
// 服务地址
host: "127.0.0.1",
// 是否自动打开浏览器

View File

@ -30,7 +30,8 @@
"lodash-es": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"zy-react-library": "latest"
"react-to-print": "^3.2.0",
"zy-react-library": "^1.0.93"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",

View File

@ -0,0 +1,10 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const acceptanceList = declareRequest(
"acceptanceLoading",
`Post > @/hidden/hidden/checkList`,
);
export const acceptanceReview = declareRequest(
"acceptanceLoading",
`Put > @/hidden/hidden/check`,
);

10
src/api/average/index.js Normal file
View File

@ -0,0 +1,10 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const averageCorpInfoCountList = declareRequest(
"averageLoading",
`Post > @/hidden/hidden/generalHiddenListByCorp`,
);
export const averageByCorpInfoList = declareRequest(
"ignoreLoading",
"Post > @/hidden/hidden/generalHiddenList",
);

10
src/api/confirm/index.js Normal file
View File

@ -0,0 +1,10 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const confirmList = declareRequest(
"confirmLoading",
`Post > @/hidden/hidden/confirmList`,
);
export const confirmSubmit = declareRequest(
"confirmLoading",
`Put > @/hidden/hidden/confirm`,
);

View File

@ -0,0 +1,18 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const confirmUserList = declareRequest(
"confirmUserLoading",
`Post > @/hidden/hiddenConfirmUser/listAll`,
);
export const confirmUserDelete = declareRequest(
"confirmUserLoading",
`Delete > @/hidden/hiddenConfirmUser/{id}`,
);
export const confirmUserAdd = declareRequest(
"confirmUserLoading",
`Post > @/hidden/hiddenConfirmUser/save`,
);
export const confirmUserAllList = declareRequest(
"confirmUserLoading",
`Post > @/hidden/hiddenConfirmUser/list`,
);

14
src/api/ignore/index.js Normal file
View File

@ -0,0 +1,14 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const ignoreList = declareRequest(
"ignoreLoading",
"Post > @/hidden/hidden/ignoreList",
);
export const ignoreCorpInfoCountList = declareRequest(
"ignoreLoading",
"Post > @/hidden/hidden/ignoreHiddenListByCorp",
);
export const ignoreByCorpInfoList = declareRequest(
"ignoreLoading",
"Post > @/hidden/hidden/ignoreHiddenList",
);

26
src/api/ledger/index.js Normal file
View File

@ -0,0 +1,26 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const ledgerList = declareRequest(
"ledgerLoading",
"Post > @/hidden/hidden/list",
);
export const hiddenDelete = declareRequest(
"ledgerLoading",
`Delete > @/hidden/hidden/{id}`,
);
export const hiddenAdd = declareRequest(
"ledgerLoading",
`Post > @/hidden/hidden/save`,
);
export const hiddenEdit = declareRequest(
"ledgerLoading",
`Put > @/hidden/hidden/edit`,
);
export const hiddenView = declareRequest(
"ledgerLoading",
`Get > /hidden/hidden/{id}`,
);
export const hiddenExportColumn = declareRequest(
"ledgerLoading",
`Get > /hidden/hidden/exportHiddenFields`,
);

30
src/api/part/index.js Normal file
View File

@ -0,0 +1,30 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const partList = declareRequest(
"partLoading",
`Post > @/hidden/hiddenRegion/list`,
);
export const partTreeList = declareRequest(
"partLoading",
`Post > @/hidden/hiddenRegion/listByTree`,
);
export const partAdd = declareRequest(
"partLoading",
`Post > @/hidden/hiddenRegion/save`,
);
export const partEdit = declareRequest(
"partLoading",
`Put > @/hidden/hiddenRegion/edit`,
);
export const partDelete = declareRequest(
"partLoading",
`Delete > @/hidden/hiddenRegion/{id}`,
);
export const partView = declareRequest(
"partLoading",
`Get > /hidden/hiddenRegion/{id}`,
);
export const partGetParentId = declareRequest(
"partLoading",
`Get > /hidden/hiddenRegion/getInfoByHiddenregionId/{id}`,
);

View File

@ -0,0 +1,18 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const rectificationList = declareRequest(
"rectificationLoading",
"Post > @/hidden/hidden/rectifyList",
);
export const rectificationAddTemporarySafetyMeasures = declareRequest(
"rectificationLoading",
"Put > @/hidden/hidden/tempSafeMeasure",
);
export const rectificationRequestAnExtension = declareRequest(
"rectificationLoading",
"Post > @/hidden/hiddenExamine/requestAnExtension",
);
export const rectificationSave = declareRequest(
"rectificationLoading",
"Put > @/hidden/hidden/rectify",
);

View File

@ -0,0 +1,22 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const specialDisposalList = declareRequest(
"specialDisposalLoading",
"Post > @/hidden/hidden/extensionHiddenList",
);
export const specialDisposalReview = declareRequest(
"specialDisposalLoading",
"Post > @/hidden/hiddenExamine/reviewSpecial",
);
export const postponementReview = declareRequest(
"specialDisposalLoading",
"Post > @/hidden/hiddenExamine/reviewExtension",
);
export const specialDisposalCorpInfoCountList = declareRequest(
"specialDisposalLoading",
"Post > @/hidden/hidden/extensionHiddenListByCorp",
);
export const specialDisposalByCorpInfoList = declareRequest(
"ignoreLoading",
"Post > @/hidden/hidden/extensionHiddenList",
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -5,3 +5,12 @@
import { defineNamespace } from "@cqsjjb/jjb-dva-runtime";
export const NS_GLOBAL = defineNamespace("global");
export const NS_LEDGER = defineNamespace("ledger");
export const NS_IGNORE = defineNamespace("ignore");
export const NS_CONFIRM_USER = defineNamespace("confirmUser");
export const NS_CONFIRM = defineNamespace("confirm");
export const NS_RECTIFICATION = defineNamespace("rectification");
export const NS_SPECIAL_DISPOSAL = defineNamespace("specialDisposal");
export const NS_ACCEPTANCE = defineNamespace("acceptance");
export const NS_PART = defineNamespace("part");
export const NS_AVERAGE = defineNamespace("average");

View File

@ -0,0 +1,126 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import dayjs from "dayjs";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_ACCEPTANCE } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["acceptanceList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: { eqType: 1 },
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{ name: "checkUserName", label: "验收人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "整改时间", dataIndex: "rectificationTime" },
{ title: "验收人", dataIndex: "hiddenYUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: () => "待验收" },
{
title: "操作",
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./review?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
验收
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_ACCEPTANCE], true)(List);

View File

@ -0,0 +1,73 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Divider, Form, message } from "antd";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
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 useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { NS_ACCEPTANCE } from "~/enumerate/namespace";
function Rectification(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const status = Form.useWatch("status", form);
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const onSubmit = async (values) => {
await uploadFile({ single: false, files: values.files, params: { type: UPLOAD_FILE_TYPE_ENUM["5"], foreignKey: query.hiddenId } });
await props["acceptanceReview"]({
id: query.id,
hiddenId: query.hiddenId,
...values,
});
message.success("操作成功");
props.history.goBack();
};
return (
<div>
<HeaderBack title="隐患验收" />
<HiddenInfo isShowHeaderBack={false} />
<Divider orientation="left">隐患验收</Divider>
<div style={{ paddingBottom: 20 }}>
<FormBuilder
values={{
status: 1,
}}
form={form}
loading={props.acceptance.acceptanceLoading || uploadFileLoading}
onFinish={onSubmit}
options={[
{
name: "status",
label: "是否合格",
span: 24,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }],
},
{
name: "repulseCause",
label: "打回意见",
span: 24,
render: FORM_ITEM_RENDER_ENUM.TEXTAREA,
dependencies: ["status"],
hidden: formValues => !(formValues.status === 0),
},
...(
status === 1
? [
{ name: "descr", label: "验收描述" },
{ name: "rectificationTime", label: "验收时间", render: FORM_ITEM_RENDER_ENUM.DATETIME },
{ name: "files", label: "验收图片", required: false, render: <Upload /> },
]
: []
),
]}
/>
</div>
</div>
);
}
export default Connect([NS_ACCEPTANCE], true)(Rectification);

View File

@ -0,0 +1,9 @@
function Acceptance(props) {
return (
<div>
{props.children}
</div>
);
}
export default Acceptance;

View File

@ -0,0 +1,119 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import dayjs from "dayjs";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_CONFIRM } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["confirmList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: () => "待确认" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./review?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
确认
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_CONFIRM], true)(List);

View File

@ -0,0 +1,256 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Divider, Form, message, Modal } from "antd";
import { useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { NS_CONFIRM } from "~/enumerate/namespace";
function Confirm(props) {
const [data, setData] = useState({});
const [form] = Form.useForm();
const hiddenLevel = Form.useWatch("hiddenLevel", form);
const deptId = Form.useWatch("deptId", form);
const checkDeptId = Form.useWatch("checkDeptId", form);
const [rejectModalOpen, setRejectModalOpen] = useState(false);
const onSubmit = (values) => {
Modal.confirm({
title: "提示",
content: "是否确认隐患?",
onOk: async () => {
await props["confirmSubmit"]({
status: "1",
rectificationType: data.rectificationType,
...values,
id: data.id,
hiddenId: data.hiddenId,
});
message.success("确认成功");
props.history.goBack();
},
});
};
return (
<div>
<HeaderBack title="确认" />
<HiddenInfo
isShowHeaderBack={false}
onGetData={(data) => {
setData(data);
}}
/>
<Divider orientation="left">隐患确认</Divider>
<div style={{ paddingBottom: 20 }}>
<FormBuilder
form={form}
loading={props.confirm.confirmLoading}
showCancelButton={false}
submitButtonText="通过"
onFinish={onSubmit}
extraActionButtons={[
<Button key="reject" type="primary" danger onClick={() => setRejectModalOpen(true)}>打回</Button>,
<Button key="back" onClick={() => props.history.goBack()}>取消</Button>,
]}
options={[
{
name: "hiddenLevel",
label: "隐患级别",
span: 24,
render: (
<HiddenLevelSelectTree
isShowMajor={false}
isShowLarger={false}
onChange={() => {
form.setFieldValue("deptName", "");
form.setFieldValue("userName", "");
form.setFieldValue("deptName", "");
form.setFieldValue("userName", "");
form.setFieldValue("checkDeptName", "");
form.setFieldValue("checkUserName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("hiddenLevelName", label);
}}
/>
),
},
{ name: "hiddenLevelName", label: "隐患级别名称", onlyForLabel: true },
...(
hiddenLevel !== "hiddenLevel1001"
? [
...(
data.rectificationType === 2
? [
{
name: "deptId",
label: "整改负责人部门",
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("userId", "");
form.setFieldValue("userName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("deptName", label);
}}
/>
),
},
{ name: "deptName", label: "整改负责人部门名称", onlyForLabel: true },
{
name: "userId",
label: "整改负责人",
render: (
<PersonnelSelect
params={{ departmentId: deptId }}
onGetLabel={label => form.setFieldValue("userName", label)}
/>
),
},
{ name: "userName", label: "整改负责人名称", onlyForLabel: true },
{
name: "rectificationDeadline",
label: "整改完成期限",
render: FORM_ITEM_RENDER_ENUM.DATE,
span: 24,
},
]
: [
{
name: "rectificationType",
label: "是否立即整改",
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
span: 24,
componentProps: {
onChange: () => {
form.setFieldValue("checkDeptName", "");
form.setFieldValue("checkUserName", "");
},
},
},
{
name: "deptId",
label: "整改负责人部门",
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("userId", "");
form.setFieldValue("userName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("deptName", label);
}}
/>
),
},
{ name: "deptName", label: "整改负责人部门名称", onlyForLabel: true },
{
name: "userId",
label: "整改负责人",
render: (
<PersonnelSelect
params={{ departmentId: deptId }}
onGetLabel={label => form.setFieldValue("userName", label)}
/>
),
},
{ name: "userName", label: "整改负责人名称", onlyForLabel: true },
{
name: "rectificationDeadline",
label: "整改完成期限",
render: FORM_ITEM_RENDER_ENUM.DATE,
span: 24,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 2),
},
{
name: "checkDeptId",
label: "验收部门",
required: false,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("checkUserId", "");
form.setFieldValue("checkUserName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("checkDeptName", label);
}}
/>
),
},
{ name: "checkDeptName", label: "验收部门名称", onlyForLabel: true },
{
name: "checkUserId",
label: "验收人",
required: false,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
render: (
<PersonnelSelect
params={{ departmentId: checkDeptId }}
onGetLabel={label => form.setFieldValue("checkUserName", label)}
/>
),
},
{ name: "checkUserName", label: "验收人名称", onlyForLabel: true },
]),
]
: []
),
]}
/>
</div>
<RejectModal open={rejectModalOpen} onCancel={() => setRejectModalOpen(false)} data={data} />
</div>
);
}
const RejectModalComponent = (props) => {
const [form] = Form.useForm();
const onSubmit = async (values) => {
await props["confirmSubmit"]({
status: "0",
...values,
id: props.data.id,
hiddenId: props.data.hiddenId,
rectificationType: props.data.rectificationType,
});
message.success("打回成功");
props.onCancel();
window.history.back();
};
return (
<Modal
title="驳回原因"
open={props.open}
onCancel={props.onCancel}
onOk={form.submit}
confirmLoading={props.confirm.confirmLoading}
>
<FormBuilder
form={form}
onFinish={onSubmit}
showActionButtons={false}
span={24}
labelCol={{ span: 6 }}
options={[
{ name: "repulseCause", label: "意见", render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
]}
/>
</Modal>
);
};
const RejectModal = Connect([NS_CONFIRM], true)(RejectModalComponent);
export default Connect([NS_CONFIRM], true)(Confirm);

View File

@ -0,0 +1,9 @@
function Confirm(props) {
return (
<div>
{props.children}
</div>
);
}
export default Confirm;

View File

@ -0,0 +1,155 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal } from "antd";
import { useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import Search from "zy-react-library/components/Search";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import Table from "zy-react-library/components/Table";
import useTable from "zy-react-library/hooks/useTable";
import { NS_CONFIRM_USER } from "~/enumerate/namespace";
function HiddenConfirmUser(props) {
const [form] = Form.useForm();
const [addModalOpen, setAddModalOpen] = useState(false);
const { tableProps, getData } = useTable(props["confirmUserList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
});
const onDelete = (id) => {
Modal.confirm({
title: "删除确认",
content: "确定要删除吗?",
onOk: async () => {
await props["confirmUserDelete"]({ id });
message.success("删除成功");
getData();
},
});
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 4 }}
options={[
{ name: "likeName", label: "用户名" },
{ name: "likeUserName", label: "姓名" },
{ name: "eqDeptId", label: "部门", render: <DepartmentSelectTree /> },
]}
form={form}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
setAddModalOpen(true);
}}
>
新增
</Button>
</>
)}
columns={[
{ title: "用户名", dataIndex: "name" },
{ title: "姓名", dataIndex: "userName" },
{ title: "部门", dataIndex: "deptName" },
{ title: "岗位", dataIndex: "postName" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>
),
},
]}
{...tableProps}
/>
<AddModal open={addModalOpen} onCancel={() => setAddModalOpen(false)} getData={getData} />
</div>
);
}
const AddModalComponent = (props) => {
const [form] = Form.useForm();
const deptId = Form.useWatch("deptId", form);
const onSubmit = async (values) => {
await props["confirmUserAdd"]({ ...values });
message.success("操作成功");
props.onCancel();
props.getData();
};
return (
<Modal
title="新增隐患确认人"
width={800}
open={props.open}
onCancel={() => {
props.onCancel();
form.resetFields();
}}
onOk={form.submit}
loading={props.confirmUser.confirmUserLoading}
>
<FormBuilder
form={form}
span={24}
labelCol={{ span: 8 }}
showActionButtons={false}
onFinish={onSubmit}
options={[
{
name: "deptId",
label: "部门",
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("userId", "");
form.setFieldValue("confirmUsers", "");
}}
onGetLabel={(label) => {
form.setFieldValue("deptName", label);
}}
/>
),
},
{ name: "deptName", label: "部门名称", onlyForLabel: true },
{
name: "userId",
label: "隐患确认人",
render: (
<PersonnelSelect
mode="multiple"
params={{ departmentId: deptId }}
onGetOption={(option) => {
form.setFieldValue("confirmUsers", option.map(item => ({
name: item.name,
userName: item.username,
userId: item.id,
postName: item.postName,
postId: item.postId,
})));
}}
/>
),
},
{ name: "confirmUsers", label: "确认人信息", onlyForLabel: true },
]}
/>
</Modal>
);
};
const AddModal = Connect([NS_CONFIRM_USER], true)(AddModalComponent);
export default Connect([NS_CONFIRM_USER], true)(HiddenConfirmUser);

View File

@ -0,0 +1,11 @@
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
function HiddenView() {
return (
<div>
<HiddenInfo />
</div>
);
}
export default HiddenView;

View File

@ -0,0 +1,103 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import dayjs from "dayjs";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_IGNORE } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["ignoreList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{
title: "确认时间",
dataIndex: "confirmTime",
render: (_, record) => record.confirmTime ? dayjs(record.confirmTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{ title: "隐患状态", dataIndex: "state", render: () => "已忽略" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_IGNORE], true)(List);

View File

@ -0,0 +1,9 @@
function Ignore(props) {
return (
<div>
{props.children}
</div>
);
}
export default Ignore;

View File

@ -0,0 +1,475 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Input, message } from "antd";
import { useEffect, useRef, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Map from "zy-react-library/components/Map";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Upload from "zy-react-library/components/Upload";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM } from "zy-react-library/enum/hidden/gwj";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { getFileUrl } from "zy-react-library/utils";
import ai_recognize from "~/assets/images/ai_recognize.png";
import { NS_CONFIRM_USER, NS_LEDGER, NS_PART } from "~/enumerate/namespace";
function Add(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const hiddenFindDept = Form.useWatch("hiddenFindDept", form);
const rectificationDeptId = Form.useWatch("rectificationDeptId", form);
const checkDeptId = Form.useWatch("checkDeptId", form);
const isAi = Form.useWatch("isAi", form);
const [aiHiddenImageRecognizeLoading, setAIHiddenImageRecognizeLoading] = useState(false);
const aiHiddenImageRecognizeFilePath = useRef("");
const [hiddenPartType, setHiddenPartType] = useState("select");
const [confirmUserList, setConfirmUserList] = useState([]);
const [deleteHiddenImageFiles, setDeleteHiddenImageFiles] = useState([]);
const [deleteHiddenVideoFiles, setDeleteHiddenVideoFiles] = useState([]);
const [deleteAfterRectificationImageFiles, setDeleteAfterRectificationImageFiles] = useState([]);
const { getUserInfo } = useGetUserInfo();
const { loading: deleteFileLoading, deleteFile } = useDeleteFile();
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const { loading: getFileLoading, getFile } = useGetFile();
const getData = async () => {
if (query.id) {
const { data } = await props["hiddenView"]({ id: query.id });
const hiddenImageFiles = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["3"], eqForeignKey: query.hiddenId });
const hiddenVideoFiles = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["102"], eqForeignKey: query.hiddenId });
const afterRectificationImageFiles = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["4"],
eqForeignKey: query.hiddenId,
});
const values = {
hiddenImageFiles,
hiddenVideoFiles,
afterRectificationImageFiles,
confirmUserId: data.confirmUserCO?.userId,
rectificationDeptId: data.hiddenUserPresetsCO?.rectifyDeptId,
rectificationUserId: data.hiddenUserPresetsCO?.rectifyUserId,
...data,
};
form.setFieldsValue({
...values,
confirmUserName: data.confirmUserCO?.userName,
confirmDeptName: data.confirmUserCO?.deptName,
confirmDeptId: data.confirmUserCO?.deptId,
rectificationDeptName: data.hiddenUserPresetsCO?.rectifyDeptName,
rectificationUserName: data.hiddenUserPresetsCO?.rectifyUserName,
});
}
else {
const userInfo = await getUserInfo();
form.setFieldsValue({
hiddenFindDept: userInfo.departmentId,
creatorId: userInfo.userId,
hiddenFindDeptName: userInfo.departmentName,
creatorName: userInfo.name,
});
}
};
const getConfirmUserList = async () => {
const { data } = await props["confirmUserAllList"]();
setConfirmUserList(data);
};
useEffect(() => {
getData();
getConfirmUserList();
}, []);
const onSubmit = async (values) => {
await deleteFile({ single: false, files: deleteHiddenImageFiles });
await deleteFile({ single: false, files: deleteHiddenVideoFiles });
await deleteFile({ single: false, files: deleteAfterRectificationImageFiles });
const { id } = await uploadFile({
single: false,
files: values.hiddenImageFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["3"], foreignKey: query.hiddenId },
});
await uploadFile({
single: false,
files: values.hiddenVideoFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["102"], foreignKey: id },
});
await uploadFile({
single: false,
files: values.afterRectificationImageFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["4"], foreignKey: id },
});
if (hiddenPartType === "input") {
await props["partAdd"]({ hiddenregion: values.hiddenPart });
}
await props[!query.id ? "hiddenAdd" : "hiddenEdit"]({
...values,
id: query.id,
hiddenId: id,
source: "1",
});
message.success("操作成功");
props.history.goBack();
};
const getAIHiddenImageRecognize = async () => {
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
if (!hiddenImageFiles || hiddenImageFiles.length === 0) {
message.warning("请上传图片");
return;
}
if (hiddenImageFiles.length > 1) {
message.warning("只能上传一张图片");
return;
}
setAIHiddenImageRecognizeLoading(true);
if (!aiHiddenImageRecognizeFilePath.current) {
const { filePath } = await uploadFile({ files: hiddenImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["3"] } });
aiHiddenImageRecognizeFilePath.current = filePath;
}
try {
const response = await fetch("http://101.201.170.9:3000/ai-manager/ai/url/modelResult", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: getFileUrl() + aiHiddenImageRecognizeFilePath.current }),
});
const { data } = await response.json();
form.setFieldValue("isAi", 1);
form.setFieldValue("hiddenDesc", data.description);
form.setFieldValue("legalBasis", data.legalBasis);
form.setFieldValue("rectificationDescr", data.guidance);
aiHiddenImageRecognizeFilePath.current = "";
await deleteFile({ files: [{ filePath: aiHiddenImageRecognizeFilePath.current }] });
}
catch {
message.error("获取图片识别结果失败");
}
finally {
setAIHiddenImageRecognizeLoading(false);
}
};
return (
<div>
<HeaderBack title={query.id ? "编辑" : "新增"} />
<div style={{ paddingBottom: 10 }}>
<FormBuilder
form={form}
loading={deleteFileLoading || uploadFileLoading || getFileLoading || aiHiddenImageRecognizeLoading || props.ledger.ledgerLoading}
values={{
isRelated: 2,
rectificationType: 2,
}}
onFinish={onSubmit}
options={[
{
name: "hiddenImageFiles",
label: "隐患图片",
render: (
<Upload
maxCount={isAi === 1 ? 1 : 4}
onRemove={() => {
if (isAi === 1) {
form.setFieldValue("isAi", "");
form.setFieldValue("hiddenDesc", "");
form.setFieldValue("legalBasis", "");
form.setFieldValue("rectificationDescr", "");
}
}}
onGetRemoveFile={(file) => {
setDeleteHiddenImageFiles([...deleteHiddenImageFiles, file]);
}}
tipContent={(
<>
<img
src={ai_recognize}
alt="ai_recognize"
style={{ width: 150, height: 30, cursor: "pointer", marginBottom: 10 }}
onClick={getAIHiddenImageRecognize}
/>
<div>
最多上传
{isAi === 1 ? 1 : 4}
个文件并且只能上传jpgjpegpng格式的文件
</div>
</>
)}
/>
),
span: 24,
},
{ name: "isAi", label: "是否AI识别隐患", onlyForLabel: true },
{ name: "hiddenDesc", label: "隐患描述", render: FORM_ITEM_RENDER_ENUM.TEXTAREA, span: 24 },
{
name: "legalBasis",
label: "法律依据",
render: FORM_ITEM_RENDER_ENUM.TEXTAREA,
span: 24,
required: false,
hidden: !(isAi === 1),
componentProps: { readOnly: true },
},
{
name: "hiddenPart",
customizeRender: true,
render: (
<Form.Item label="隐患部位" required>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item name="hiddenPart" noStyle rules={[{ required: true, message: "请选择隐患部位" }]}>
{
hiddenPartType === "select"
? <HiddenPartSelectTree />
: <Input placeholder="请输入隐患部位" />
}
</Form.Item>
<Button
type="primary"
onClick={() => {
if (hiddenPartType === "select")
setHiddenPartType("input");
if (hiddenPartType === "input")
setHiddenPartType("select");
form.setFieldValue("hiddenPart", "");
}}
>
{hiddenPartType === "select" ? "输入" : "选择"}
</Button>
</div>
</Form.Item>
),
},
{
name: "hiddenLevel",
label: "隐患级别",
render: (
<HiddenLevelSelectTree
isShowNeglect={false}
onGetLabel={label => form.setFieldValue("hiddenLevelName", label)}
/>
),
},
{ name: "hiddenLevelName", label: "隐患级别名称", onlyForLabel: true },
{
name: "hiddenType",
label: "隐患类型",
render: (
<DictionarySelectTree
dictValue="hiddenType"
onGetLabel={label => form.setFieldValue("hiddenTypeName", label)}
/>
),
},
{ name: "hiddenTypeName", label: "隐患类型名称", onlyForLabel: true },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
{ name: "map", customizeRender: true, render: <Map required={false} />, span: 24 },
{ name: "positionDesc", label: "隐患位置描述", required: false, span: 24 },
{
name: "hiddenVideoFiles",
label: "隐患视频",
render: (
<Upload
fileType="video"
onGetRemoveFile={(file) => {
setDeleteHiddenVideoFiles([...deleteHiddenVideoFiles, file]);
}}
/>
),
span: 24,
required: false,
},
{
name: "hiddenFindDept",
label: "隐患发现部门",
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("creatorId", "");
form.setFieldValue("creatorName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("hiddenFindDeptName", label);
}}
/>
),
},
{ name: "hiddenFindDeptName", label: "隐患发现部门名称", onlyForLabel: true },
{
name: "creatorId",
label: "隐患发现人",
render: (
<PersonnelSelect
params={{ departmentId: hiddenFindDept }}
onGetLabel={label => form.setFieldValue("creatorName", label)}
/>
),
},
{ name: "creatorName", label: "隐患发现人名称", onlyForLabel: true },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATETIME },
{
name: "confirmUserId",
label: "隐患确认人",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: confirmUserList,
itemsField: { valueKey: "userId", labelKey: "userName" },
componentProps: {
onChange: (value) => {
const findItem = confirmUserList.find(item => item.userId === value);
form.setFieldValue("confirmUserName", findItem.userName);
form.setFieldValue("confirmDeptName", findItem.deptName);
form.setFieldValue("confirmDeptId", findItem.deptId);
},
},
},
{ name: "confirmUserName", label: "隐患确认人名称", onlyForLabel: true },
{ name: "confirmDeptName", label: "隐患确认人部门名称", onlyForLabel: true },
{ name: "confirmDeptId", label: "隐患确认人部门id", onlyForLabel: true },
{
name: "rectificationType",
label: "隐患处置",
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: HIDDEN_RECTIFICATION_TYPE_ENUM,
span: 24,
componentProps: {
onChange: (value) => {
if (value.target.value === 2) {
form.setFieldValue("rectificationDeptId", "");
form.setFieldValue("rectificationUserId", "");
form.setFieldValue("rectificationDeptName", "");
form.setFieldValue("rectificationUserName", "");
form.setFieldValue("hiddenYDeptName", "");
form.setFieldValue("hiddenYUserName", "");
}
else {
const hiddenFindDept = form.getFieldValue("hiddenFindDept");
const creatorId = form.getFieldValue("creatorId");
const hiddenFindDeptName = form.getFieldValue("hiddenFindDeptName");
const creatorName = form.getFieldValue("creatorName");
form.setFieldValue("rectificationDeptId", hiddenFindDept);
form.setFieldValue("rectificationUserId", creatorId);
form.setFieldValue("checkDeptId", hiddenFindDept);
form.setFieldValue("checkUserId", creatorId);
form.setFieldValue("rectificationDeptName", hiddenFindDeptName);
form.setFieldValue("rectificationUserName", creatorName);
form.setFieldValue("hiddenYDeptName", hiddenFindDeptName);
form.setFieldValue("hiddenYUserName", creatorName);
}
},
},
},
{
name: "rectificationDeadline",
label: "整改期限",
required: false,
render: FORM_ITEM_RENDER_ENUM.DATE,
span: 24,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 2),
},
{
name: "rectificationDescr",
label: "整改描述",
render: FORM_ITEM_RENDER_ENUM.TEXTAREA,
span: 24,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
},
{
name: "afterRectificationImageFiles",
label: "整改后图片",
render: (
<Upload onGetRemoveFile={(file) => {
setDeleteAfterRectificationImageFiles([...deleteAfterRectificationImageFiles, file]);
}}
/>
),
span: 24,
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
},
{
name: "rectificationDeptId",
label: "整改部门",
required: false,
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("rectificationUserId", "");
form.setFieldValue("rectificationUserName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("rectificationDeptName", label);
}}
/>
),
},
{ name: "rectificationDeptName", label: "整改部门名称", onlyForLabel: true },
{
name: "rectificationUserId",
label: "整改人",
required: false,
render: (
<PersonnelSelect
params={{ departmentId: rectificationDeptId }}
onGetLabel={label => form.setFieldValue("rectificationUserName", label)}
/>
),
},
{ name: "rectificationUserName", label: "整改人名称", onlyForLabel: true },
{
name: "checkDeptId",
label: "验收部门",
required: false,
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("checkUserId", "");
form.setFieldValue("hiddenYUserName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("hiddenYDeptName", label);
}}
/>
),
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
},
{ name: "hiddenYDeptName", label: "验收部门名称", onlyForLabel: true },
{
name: "checkUserId",
label: "验收人",
required: false,
render: (
<PersonnelSelect
params={{ departmentId: checkDeptId }}
onGetLabel={label => form.setFieldValue("hiddenYUserName", label)}
/>
),
dependencies: ["rectificationType"],
hidden: formValues => !(formValues.rectificationType === 1),
},
{ name: "hiddenYUserName", label: "验收人名称", onlyForLabel: true },
]}
/>
</div>
</div>
);
}
export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add);

View File

@ -0,0 +1,418 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Spin } from "antd";
import dayjs from "dayjs";
import { useEffect, useRef, useState } from "react";
import { useReactToPrint } from "react-to-print";
import FormBuilder from "zy-react-library/components/FormBuilder";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import PrintIcon from "zy-react-library/components/Icon/PrintIcon";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_LEDGER } from "~/enumerate/namespace";
import "./index.less";
function List(props) {
const [form] = Form.useForm();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [exportByColumnModalOpen, setExportByColumnModalOpen] = useState(false);
const [printModalOpen, setPrintModalOpen] = useState(false);
const [printData, setPrintData] = useState([]);
const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob();
const { tableProps, getData } = useTable(props["ledgerList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
});
const onDelete = (id) => {
Modal.confirm({
title: "删除确认",
content: "确定要删除吗?",
onOk: async () => {
await props["hiddenDelete"]({ id });
message.success("删除成功");
getData();
},
});
};
const onExportExcel = async () => {
const hiddenFindTime = form.getFieldValue("hiddenFindTime");
if (!hiddenFindTime) {
message.error("请选择隐患发现时间");
return;
}
if (hiddenFindTime.filter(Boolean).length === 0) {
message.error("请选择隐患发现时间");
return;
}
Modal.confirm({
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hidden/hidden/exportHidden", {
params: { hiddenFindTime: hiddenFindTime[0], hiddenFindTimeLe: hiddenFindTime[1] },
});
message.success("导出成功");
},
});
};
return (
<div style={{ padding: 20 }}>
<Spin spinning={downloadBlobLoading}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: (
<HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />
),
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "state", label: "隐患状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_STATE_ENUM },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{ name: "checkUserName", label: "验收人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
rowSelection={{
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys);
},
}}
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
<Button
type="primary"
icon={<PrintIcon />}
onClick={() => {
if (selectedRowKeys.length === 0) {
message.error("请选中要打印的数据");
return;
}
setPrintModalOpen(true);
setPrintData(tableProps.dataSource.filter(item => selectedRowKeys.includes(item.id)));
}}
>
打印
</Button>
<Button
type="primary"
icon={<ExportIcon />}
onClick={() => {
onExportExcel();
}}
>
导出
</Button>
<Button
type="primary"
icon={<ExportIcon />}
onClick={() => {
const hiddenFindTime = form.getFieldValue("hiddenFindTime");
if (!hiddenFindTime) {
message.error("请选择隐患发现时间");
return;
}
if (hiddenFindTime.filter(Boolean).length === 0) {
message.error("请选择隐患发现时间");
return;
}
setExportByColumnModalOpen(true);
}}
>
按列导出
</Button>
</>
)}
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({
list: HIDDEN_RECTIFICATION_TYPE_ENUM,
status: record.rectificationType,
}),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "整改时间", dataIndex: "rectificationTime" },
{ title: "验收人", dataIndex: "hiddenYUserName", width: 100 },
{
title: "隐患状态",
dataIndex: "state",
render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }),
},
{
title: "操作",
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
{
record.state === 201 && (
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
编辑
</Button>
)
}
<Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>
</Space>
),
},
]}
{...tableProps}
/>
</Spin>
<ExportByColumnModal
open={exportByColumnModalOpen}
hiddenFindTime={form.getFieldValue("hiddenFindTime")}
onCancel={() => setExportByColumnModalOpen(false)}
/>
<PrintModal
open={printModalOpen}
data={printData}
onCancel={() => {
setPrintModalOpen(false);
setPrintData([]);
}}
/>
</div>
);
}
const ExportByColumnModalComponent = (props) => {
const [form] = Form.useForm();
const { loading, downloadBlob } = useDownloadBlob();
const [items, setItems] = useState([]);
const getExportColumn = async () => {
const { data } = await props["hiddenExportColumn"]();
setItems(data.map(item => ({ bianma: item, name: item })));
};
useEffect(() => {
getExportColumn();
}, []);
const onSubmit = async (values) => {
Modal.confirm({
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hidden/hidden/exportHidden", {
params: { hiddenFindTime: props.hiddenFindTime[0], hiddenFindTimeLe: props.hiddenFindTime[1], ...values },
});
message.success("导出成功");
props.onCancel();
},
});
};
return (
<Modal
title="按列导出"
width={800}
open={props.open}
onCancel={props.onCancel}
onOk={form.submit}
loading={loading}
>
<FormBuilder
form={form}
span={24}
labelCol={{ span: 8 }}
showActionButtons={false}
onFinish={onSubmit}
options={[
{
name: "exportFields",
label: "导出内容",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items,
componentProps: {
mode: "multiple",
},
},
]}
/>
</Modal>
);
};
const PrintModal = (props) => {
const contentRef = useRef(null);
const handlePrint = useReactToPrint({
contentRef,
pageStyle: `@page {
size: landscape;
margin: 10px;
}
@media print {
body {
margin: 10px;
padding: 10px;
}
}
`,
documentTitle: "",
});
const getIsQualified = (isQualified) => {
if (isQualified === 1)
return "合格";
else if (isQualified === 0)
return "不合格";
return "";
};
return (
<Modal
title="打印"
width={1500}
okText="打印"
open={props.open}
onCancel={props.onCancel}
onOk={handlePrint}
>
<Table
options={false}
disabledResizer={false}
dataSource={props.data}
pagination={false}
columns={[
{ title: "排查时间", dataIndex: "hiddenFindTime", render: (_, record) => dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") },
{ title: "检查人", dataIndex: "createName" },
{ title: "责任部门", dataIndex: "hiddenFindDeptName" },
{ title: "事故隐患", dataIndex: "hiddenDesc" },
{ title: "隐患等级", dataIndex: "hiddenLevelName" },
{ title: "治理措施", dataIndex: "tempSafeMeasure" },
{ title: "完成时限", dataIndex: "rectificationDeadline" },
{ title: "整改责任人", dataIndex: "rectificationUserName" },
{
title: "验收人员",
dataIndex: "hiddenYUserName",
render: (_, record) => record.state === 301 ? record.hiddenYUserName : "",
},
{ title: "验收时间", dataIndex: "hiddenYTime" },
{
title: "验收结果",
dataIndex: "isQualified",
render: (_, record) => record.state === 301 ? getIsQualified(record.isQualified) : "",
},
]}
/>
<div ref={contentRef}>
<table className="print-table">
<thead>
<tr>
<th>排查时间</th>
<th>检查人</th>
<th>责任部门</th>
<th>事故隐患</th>
<th>隐患等级</th>
<th>治理措施</th>
<th>完成时限</th>
<th>整改责任人</th>
<th>验收人员</th>
<th>验收时间</th>
<th>验收结果</th>
</tr>
</thead>
<tbody>
{(props.data || []).map(item => (
<tr key={item.id}>
<td>{dayjs(item.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss")}</td>
<td>{item.createName}</td>
<td>{item.hiddenFindDeptName}</td>
<td>{item.hiddenDesc}</td>
<td>{item.hiddenLevelName}</td>
<td>{item.RECTIFYDESCR}</td>
<td>{item.RECTIFICATIONDEADLINE}</td>
<td>{item.rectificationUserName}</td>
<td>{item.state === 301 ? item.hiddenYUserName : ""}</td>
<td>{item.hiddenYTime}</td>
<td>{item.state === 301 ? getIsQualified(item.isSuccess) : ""}</td>
</tr>
))}
</tbody>
</table>
</div>
</Modal>
);
};
const ExportByColumnModal = Connect([NS_LEDGER], true)(ExportByColumnModalComponent);
export default Connect([NS_LEDGER], true)(List);

View File

@ -0,0 +1,16 @@
.print-table {
display: none;
border-collapse: collapse;
width: 100%;
td, th {
border: 1px solid #eaeaea;
padding: 8px;
line-height: 1.6;
text-align: center;
}
@media print {
display: table;
}
}

View File

@ -0,0 +1,9 @@
function Ledger(props) {
return (
<div>
{props.children}
</div>
);
}
export default Ledger;

View File

@ -0,0 +1,257 @@
import { RightOutlined } from "@ant-design/icons";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Spin, Tag } from "antd";
import { useEffect, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import BackIcon from "zy-react-library/components/Icon/BackIcon";
import BasicLeftTree from "zy-react-library/components/LeftTree/Basic";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
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 { NS_PART } from "~/enumerate/namespace";
function Part(props) {
const urlQuery = useGetUrlQuery();
const [treeData, setTreeData] = useState([]);
const [parentId, setParentId] = useState(urlQuery.eqParentId || "");
const [parentName, setParentName] = useState(urlQuery.eqParentName || "");
const [addModalOpen, setAddModalOpen] = useState(false);
const [currentId, setCurrentId] = useState("");
const getTreeData = async () => {
const { data } = await props["partTreeList"]();
setTreeData(data);
};
useEffect(() => {
getTreeData();
}, []);
const { tableProps, getData } = useTable(props["partList"], {
params: () => ({ eqParentId: parentId }),
});
const onDelete = (id) => {
Modal.confirm({
title: "删除确认",
content: "确定要删除吗?",
onOk: async () => {
await props["partDelete"]({ id });
message.success("删除成功");
getData();
getTreeData();
},
});
};
useEffect(() => {
const unlisten = props.history.listen((location) => {
const searchParams = new URLSearchParams(location.search);
const newParentId = searchParams.get("eqParentId");
const newParentName = searchParams.get("eqParentName");
setParentId(newParentId);
setParentName(newParentName);
getData();
});
return unlisten;
}, []);
const getNextLevel = (hiddenregion, hiddenregionId) => {
setParentName(hiddenregion);
setParentId(hiddenregionId);
const currentSearchParams = new URLSearchParams(props.history.location.search);
currentSearchParams.set("eqParentId", hiddenregionId);
currentSearchParams.set("eqParentName", hiddenregion);
const queryString = currentSearchParams.toString();
const newPath = `./part${queryString ? `?${queryString}` : ""}`;
props.history.push(newPath);
};
return (
<div style={{ padding: 20 }}>
<div style={{ display: "flex", gap: 20 }}>
<div style={{ width: 300 }}>
<Spin spinning={props.part.partLoading}>
<BasicLeftTree
treeData={treeData}
nameKey="hiddenregion"
idKey="hiddenregionId"
onGetNodePaths={(event) => {
const hiddenregion = event.at(-1).hiddenregion;
const hiddenregionId = event.at(-1).hiddenregionId;
getNextLevel(hiddenregion, hiddenregionId);
}}
/>
</Spin>
</div>
<div style={{ flex: 1 }}>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
setAddModalOpen(true);
}}
>
新增
</Button>
{
parentId && (
<Button
icon={<BackIcon />}
onClick={() => {
props.history.goBack();
}}
>
返回
</Button>
)
}
</>
)}
columns={[
{
title: "区域/设备名称",
dataIndex: "hiddenregion",
render: (_, record) => (
<Button
type="link"
icon={<RightOutlined />}
iconPosition="end"
onClick={() => {
const hiddenregion = record.hiddenregion;
const hiddenregionId = record.hiddenregionId;
getNextLevel(hiddenregion, hiddenregionId);
}}
>
{record.hiddenregion}
</Button>
),
},
{ title: "负责人部门", dataIndex: "responsibleDeptName" },
{ title: "负责人", dataIndex: "responsibleUserName" },
{ title: "排序", dataIndex: "sortindex" },
{
title: "操作",
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
setAddModalOpen(true);
setCurrentId(record.id);
}}
>
编辑
</Button>
<Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
</div>
<AddModal
open={addModalOpen}
id={currentId}
parentName={parentName}
parentId={parentId}
getData={getData}
getTreeData={getTreeData}
onCancel={() => {
setAddModalOpen(false);
setCurrentId("");
}}
/>
</div>
);
}
const AddModalComponent = (props) => {
const [form] = Form.useForm();
const responsibleDeptId = Form.useWatch("responsibleDeptId", form);
const getData = async () => {
const { data } = await props["partView"]({ id: props.id });
form.setFieldsValue(data);
};
useEffect(() => {
props.id && getData();
}, [props.id]);
const onSubmit = async (values) => {
await props[!props.id ? "partAdd" : "partEdit"]({ ...values, parentId: props.parentId, id: props.id });
message.success("操作成功");
props.onCancel();
props.getData();
props.getTreeData();
};
return (
<Modal
title={props.id ? "编辑" : "新增"}
width={800}
open={props.open}
onCancel={() => {
props.onCancel();
form.resetFields();
}}
onOk={form.submit}
loading={props.part.partLoading}
>
<FormBuilder
form={form}
span={24}
labelCol={{ span: 10 }}
showActionButtons={false}
onFinish={onSubmit}
options={[
{ name: "parentName", label: "上级区域/设备名称", required: false, render: <Tag color="blue">{props.parentName}</Tag> },
{ name: "hiddenregion", label: "区域/设备名称" },
{
name: "responsibleDeptId",
label: "负责部门",
span: 12,
required: false,
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("responsibleUserId", "");
form.setFieldValue("responsibleUserName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("responsibleDeptName", label);
}}
/>
),
},
{ name: "responsibleDeptName", label: "负责部门名称", onlyForLabel: true },
{
name: "responsibleUserId",
label: "负责人",
span: 12,
required: false,
render: (
<PersonnelSelect
params={{ departmentId: responsibleDeptId }}
onGetLabel={label => form.setFieldValue("responsibleUserName", label)}
/>
),
},
{ name: "responsibleUserName", label: "负责人名称", onlyForLabel: true },
{ name: "sortindex", label: "排序", render: FORM_ITEM_RENDER_ENUM.NUMBER },
{ name: "comments", label: "备注", render: FORM_ITEM_RENDER_ENUM.TEXTAREA, required: false },
]}
/>
</Modal>
);
};
const AddModal = Connect([NS_PART], true)(AddModalComponent);
export default Connect([NS_PART], true)(Part);

View File

@ -0,0 +1,123 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import dayjs from "dayjs";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["specialDisposalList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: { eqType: 2 },
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }) },
{
title: "操作",
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./review?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
审核
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_SPECIAL_DISPOSAL], true)(List);

View File

@ -0,0 +1,82 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space } from "antd";
import { useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function Review(props) {
const query = useGetUrlQuery();
const [rejectModalOpen, setRejectModalOpen] = useState(false);
const onSubmit = () => {
Modal.confirm({
title: "提示",
content: "是否确认通过延期?",
onOk: async () => {
await props["postponementReview"]({
id: query.id,
hiddenId: query.hiddenId,
state: 3,
});
message.success("操作成功");
props.history.goBack();
},
});
};
return (
<div>
<HeaderBack title="延期审核" />
<HiddenInfo isShowHeaderBack={false} />
<div style={{ paddingBottom: 20, textAlign: "center" }}>
<Space>
<Button type="primary" onClick={onSubmit}>通过</Button>
<Button key="reject" type="primary" danger onClick={() => setRejectModalOpen(true)}>打回</Button>
<Button key="back" onClick={() => props.history.goBack()}>取消</Button>
</Space>
</div>
<RejectModal open={rejectModalOpen} onCancel={() => setRejectModalOpen(false)} data={{ id: query.id, hiddenId: query.hiddenId }} />
</div>
);
}
const RejectModalComponent = (props) => {
const [form] = Form.useForm();
const onSubmit = async (values) => {
await props["postponementReview"]({
state: "4",
...values,
id: props.data.id,
hiddenId: props.data.hiddenId,
});
message.success("打回成功");
props.onCancel();
window.history.back();
};
return (
<Modal
title="驳回原因"
open={props.open}
onCancel={props.onCancel}
onOk={form.submit}
confirmLoading={props.specialDisposal.specialDisposalLoading}
>
<FormBuilder
form={form}
onFinish={onSubmit}
showActionButtons={false}
span={24}
labelCol={{ span: 6 }}
options={[
{ name: "examine", label: "意见", render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
]}
/>
</Modal>
);
};
const RejectModal = Connect([NS_SPECIAL_DISPOSAL], true)(RejectModalComponent);
export default Connect([NS_SPECIAL_DISPOSAL], true)(Review);

View File

@ -0,0 +1,9 @@
function Postponement(props) {
return (
<div>
{props.children}
</div>
);
}
export default Postponement;

View File

@ -0,0 +1,236 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space } from "antd";
import dayjs from "dayjs";
import { useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
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 { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useTable from "zy-react-library/hooks/useTable";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { getLabelName } from "zy-react-library/utils";
import { NS_RECTIFICATION } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const [temporarySafetyMeasuresModalOpen, setTemporarySafetyMeasuresModalOpen] = useState(false);
const [requestAnExtensionModalOpen, setRequestAnExtensionModalOpen] = useState(false);
const [currentId, setCurrentId] = useState("");
const { tableProps, getData } = useTable(props["rectificationList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: () => "未整改" },
{
title: "操作",
width: 260,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./review?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
整改
</Button>
<Button
type="link"
onClick={() => {
setTemporarySafetyMeasuresModalOpen(true);
setCurrentId(record.id);
}}
>
临时安全措施
</Button>
<Button
type="link"
onClick={() => {
setRequestAnExtensionModalOpen(true);
setCurrentId(record.hiddenId);
}}
>
申请延期
</Button>
</Space>
),
},
]}
{...tableProps}
/>
<TemporarySafetyMeasuresModal
id={currentId}
open={temporarySafetyMeasuresModalOpen}
onCancel={() => {
setTemporarySafetyMeasuresModalOpen(false);
setCurrentId("");
}}
getData={getData}
/>
<RequestAnExtensionModal
id={currentId}
open={requestAnExtensionModalOpen}
onCancel={() => {
setRequestAnExtensionModalOpen(false);
setCurrentId("");
}}
getData={getData}
/>
</div>
);
}
const TemporarySafetyMeasuresModalComponent = (props) => {
const [form] = Form.useForm();
const onSubmit = async (values) => {
await props["rectificationAddTemporarySafetyMeasures"]({ id: props.id, ...values });
message.success("操作成功");
props.onCancel();
props.getData();
};
return (
<Modal
title="添加临时安全措施"
width={800}
open={props.open}
onCancel={props.onCancel}
onOk={form.submit}
loading={props.rectification.rectificationLoading}
>
<FormBuilder
form={form}
span={24}
labelCol={{ span: 8 }}
showActionButtons={false}
onFinish={onSubmit}
options={[
{ name: "tempSafeMeasure", label: "临时安全措施", render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
]}
/>
</Modal>
);
};
const RequestAnExtensionModalComponent = (props) => {
const [form] = Form.useForm();
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const onSubmit = async (values) => {
const { filePath } = await uploadFile({ files: values.files, params: { type: UPLOAD_FILE_TYPE_ENUM["138"] } });
await props["rectificationRequestAnExtension"]({ hiddenId: props.id, ...values, disposalFile: filePath });
message.success("操作成功");
props.onCancel();
props.getData();
};
return (
<Modal
title="申请延期"
width={800}
open={props.open}
onCancel={props.onCancel}
onOk={form.submit}
loading={props.rectification.rectificationLoading || uploadFileLoading}
>
<FormBuilder
form={form}
span={24}
labelCol={{ span: 8 }}
showActionButtons={false}
onFinish={onSubmit}
options={[
{ name: "delayTime", label: "申请延期日期", render: FORM_ITEM_RENDER_ENUM.DATE },
{ name: "disposalPlan", label: "处置方案", render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
{ name: "files", label: "处置方案附件", required: false, render: <Upload fileType="document" maxCount={1} /> },
]}
/>
</Modal>
);
};
const TemporarySafetyMeasuresModal = Connect([NS_RECTIFICATION], true)(TemporarySafetyMeasuresModalComponent);
const RequestAnExtensionModal = Connect([NS_RECTIFICATION], true)(RequestAnExtensionModalComponent);
export default Connect([NS_RECTIFICATION], true)(List);

View File

@ -0,0 +1,219 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Col, Divider, Form, message, Row } from "antd";
import dayjs from "dayjs";
import { useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
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 useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { NS_RECTIFICATION } from "~/enumerate/namespace";
function Rectification(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const status = Form.useWatch("status", form);
const isRectificationScheme = Form.useWatch("isRectificationScheme", form);
const hiddenUserAddCmds = Form.useWatch("hiddenUserAddCmds", form);
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const [data, setData] = useState({});
const onSubmit = async (values) => {
await uploadFile({ single: false, files: values.afterRectificationImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["4"], foreignKey: query.hiddenId } });
await uploadFile({ single: false, files: values.rectificationPlanImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["8"], foreignKey: query.hiddenId } });
await props["rectificationSave"]({
id: query.id,
hiddenId: query.hiddenId,
...values,
});
message.success("操作成功");
props.history.goBack();
};
const range = (start, end) => {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
};
const disabledTime = (current) => {
if (current && current.isSame(dayjs(), "day")) {
return {
disabledHours: () => range(dayjs().hour() + 1, 24),
disabledMinutes: (selectedHour) => {
if (selectedHour === dayjs().hour()) {
return range(dayjs().minute() + 1, 60);
}
return [];
},
disabledSeconds: (selectedHour, selectedMinute) => {
if (selectedHour === dayjs().hour() && selectedMinute === dayjs().minute()) {
return range(dayjs().second() + 1, 60);
}
return [];
},
};
}
return {};
};
return (
<div>
<HeaderBack title="整改" />
<HiddenInfo
isShowHeaderBack={false}
onGetData={(data) => {
setData(data);
form.setFieldValue("tempSafeMeasure", data.tempSafeMeasure);
}}
/>
<Divider orientation="left">隐患整改</Divider>
<div style={{ paddingBottom: 20 }}>
<FormBuilder
values={{
status: 1,
hiddenUserAddCmds: [
{ deptId: "", deptName: "", userId: "", userName: "", type: 300 },
],
}}
form={form}
loading={uploadFileLoading || props.rectification.rectificationLoading}
onFinish={onSubmit}
options={[
{
name: "status",
label: "是否正常整改",
span: 24,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }],
},
...(
status === 0
? [
{ name: "repulseCause", span: 24, label: "无法正常整改原因", render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
]
: [
{ name: "descr", label: "整改描述" },
{ name: "investmentFunds", label: "投入资金", render: FORM_ITEM_RENDER_ENUM.NUMBER, componentProps: { addonAfter: "元" } },
{
name: "rectificationTime",
label: "整改时间",
render: FORM_ITEM_RENDER_ENUM.DATETIME,
componentProps: {
disabledDate: current => current && current > dayjs().endOf("day"),
disabledTime,
},
},
{ name: "tempSafeMeasure", label: "临时安全措施" },
{ name: "afterRectificationImageFiles", label: "整改后图片", span: 24, render: <Upload /> },
{
key: "acceptance",
customizeRender: true,
span: 24,
render: (
<>
<Form.List name="hiddenUserAddCmds">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={24} key={field.key}>
<Col span={12}>
<Form.Item label="验收部门" rules={[{ required: true, message: "请选择验收部门" }]} name={[field.name, "deptId"]}>
<DepartmentSelectTree
onChange={() => {
form.setFieldValue(["hiddenUserAddCmds", field.name, "userId"], "");
form.setFieldValue(["hiddenUserAddCmds", field.name, "userName"], "");
}}
onGetLabel={(label) => {
form.setFieldValue(["hiddenUserAddCmds", field.name, "deptName"], label);
}}
/>
</Form.Item>
<Form.Item label="验收部门名称" noStyle name={[field.name, "deptName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="验收人" required>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item
noStyle
rules={
[
{ required: true, message: "请选择验收人" },
{ validator: (_, value) => {
// 获取已存在的用户名
const confirmUserName = data?.hiddenConfirmUserCO?.rectifyUserName;
const presetUserName = data?.hiddenUserPresetsCO?.rectifyUserName;
// 验证是否与已有用户名相同
if (value && (value === confirmUserName || value === presetUserName)) {
return Promise.reject(new Error("验收人不能与整改人相同"));
}
return Promise.resolve();
} },
]
}
name={[field.name, "userId"]}
>
<PersonnelSelect
params={{ departmentId: hiddenUserAddCmds?.[field.name]?.deptId || "" }}
onGetLabel={label => form.setFieldValue(["hiddenUserAddCmds", field.name, "userName"], label)}
/>
</Form.Item>
{
index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: <Button type="primary" onClick={() => add({ deptId: "", deptName: "", userId: "", userName: "", type: 300 })}>新增</Button>
}
</div>
</Form.Item>
<Form.Item label="验收人名称" noStyle name={[field.name, "userName"]}>
<input type="hidden" />
</Form.Item>
<Form.Item label="用户类型" noStyle name={[field.name, "type"]}>
<input type="hidden" />
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</>
),
},
{ name: "isRectificationScheme", label: "整改方案", span: 24, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
...(
isRectificationScheme !== undefined
? (
isRectificationScheme === 1
? [
{ name: "governStanDards", label: "治理标准" },
{ name: "governMethod", label: "治理方法" },
{ name: "expenditure", label: "经费落实" },
{ name: "principal", label: "负责人员" },
{ name: "programming", label: "工时安排" },
{ name: "timeLimitFor", label: "时限要求" },
{ name: "jobRequireMent", label: "工作要求" },
{ name: "otherBusiness", label: "其他事项" },
{ name: "rectificationPlanImageFiles", label: "方案图片", span: 24, render: <Upload /> },
]
: []
)
: []
),
]
),
]}
/>
</div>
</div>
);
}
export default Connect([NS_RECTIFICATION], true)(Rectification);

View File

@ -0,0 +1,9 @@
function Rectification(props) {
return (
<div>
{props.children}
</div>
);
}
export default Rectification;

View File

@ -0,0 +1,123 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import dayjs from "dayjs";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["specialDisposalList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: { eqType: 1 },
});
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: () => "待处理特殊隐患" },
{
title: "操作",
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./review?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
审核
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_SPECIAL_DISPOSAL], true)(List);

View File

@ -0,0 +1,137 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Divider, Form, message } from "antd";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
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 useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function Review(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const deptId = Form.useWatch("deptId", form);
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const onSubmit = async (values) => {
const { filePath } = await uploadFile({ files: values.files, params: { type: UPLOAD_FILE_TYPE_ENUM["138"] } });
await props["specialDisposalReview"]({
...values,
id: query.id,
hiddenId: query.hiddenId,
disposalFile: filePath,
});
message.success("操作成功");
props.history.goBack();
};
return (
<div>
<HeaderBack title="特殊处理审核" />
<HiddenInfo
isShowHeaderBack={false}
onGetData={(data) => {
form.setFieldValue("tempSafeMeasure", data.tempSafeMeasure);
}}
/>
<Divider orientation="left">特殊处理审核</Divider>
<div style={{ paddingBottom: 20 }}>
<FormBuilder
values={{
state: 2,
}}
form={form}
loading={uploadFileLoading || props.specialDisposal.specialDisposalLoading}
onFinish={onSubmit}
options={[
{
name: "state",
label: "是否通过",
span: 24,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 2, name: "通过" }, { bianma: 1, name: "不通过" }],
componentProps: {
onChange: () => {
form.setFieldValue("modifyRectifyPerson", 0);
form.setFieldValue("deptId", "");
form.setFieldValue("deptName", "");
form.setFieldValue("rectifyPersonId", "");
form.setFieldValue("rectifyPersonName", "");
},
},
},
{
name: "disposalPlan",
label: "处置方案",
span: 24,
render: FORM_ITEM_RENDER_ENUM.TEXTAREA,
dependencies: ["state"],
hidden: formValues => !(formValues.state === 2),
},
{
name: "files",
label: "处置方案附件",
span: 24,
render: <Upload fileType="document" maxCount={1} />,
dependencies: ["state"],
hidden: formValues => !(formValues.state === 2),
},
{
name: "modifyRectifyPerson",
label: "是否更换整改负责人",
span: 24,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }],
componentProps: {
onChange: () => {
form.setFieldValue("deptId", "");
form.setFieldValue("deptName", "");
form.setFieldValue("rectifyPersonId", "");
form.setFieldValue("rectifyPersonName", "");
},
},
dependencies: ["state"],
hidden: formValues => !(formValues.state === 1),
},
{
name: "deptId",
label: "整改负责人部门",
render: (
<DepartmentSelectTree
onChange={() => {
form.setFieldValue("rectifyPersonId", "");
form.setFieldValue("rectifyPersonName", "");
}}
onGetLabel={(label) => {
form.setFieldValue("deptName", label);
}}
/>
),
dependencies: ["state", "modifyRectifyPerson"],
hidden: formValues => !(formValues.state === 1 && formValues.modifyRectifyPerson === 1),
},
{ name: "deptName", label: "整改负责人部门名称", onlyForLabel: true },
{
name: "rectifyPersonId",
label: "整改负责人",
render: (
<PersonnelSelect
params={{ departmentId: deptId }}
onGetLabel={label => form.setFieldValue("rectifyPersonName", label)}
/>
),
dependencies: ["state", "modifyRectifyPerson"],
hidden: formValues => !(formValues.state === 1 && formValues.modifyRectifyPerson === 1),
},
{ name: "rectifyPersonName", label: "整改负责人名称", onlyForLabel: true },
]}
/>
</div>
</div>
);
}
export default Connect([NS_SPECIAL_DISPOSAL], true)(Review);

View File

@ -0,0 +1,9 @@
function SpecialDisposal(props) {
return (
<div>
{props.children}
</div>
);
}
export default SpecialDisposal;

View File

@ -0,0 +1,9 @@
function Average(props) {
return (
<div>
{props.children}
</div>
);
}
export default Average;

View File

@ -0,0 +1,9 @@
function BranchCompany(props) {
return (
<div>
{props.children}
</div>
);
}
export default BranchCompany;

View File

@ -0,0 +1,52 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import Search from "zy-react-library/components/Search";
import Table from "zy-react-library/components/Table";
import useTable from "zy-react-library/hooks/useTable";
import { NS_AVERAGE } from "~/enumerate/namespace";
function CorpInfoList(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["averageCorpInfoCountList"], { form });
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "corpName", label: "企业名称" },
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "企业名称", dataIndex: "corpName" },
{ title: "一般隐患", children: [
{ title: "轻微隐患数", dataIndex: "minorCount" },
{ title: "一般隐患数", dataIndex: "generalCount" },
] },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./HiddenList?corpName=${record.corpName}&corpId=${record.corpId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_AVERAGE], true)(CorpInfoList);

View File

@ -0,0 +1,285 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Spin } from "antd";
import dayjs from "dayjs";
import { useRef, useState } from "react";
import { useReactToPrint } from "react-to-print";
import HeaderBack from "zy-react-library/components/HeaderBack";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import PrintIcon from "zy-react-library/components/Icon/PrintIcon";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_AVERAGE } from "~/enumerate/namespace";
function HiddenList(props) {
const query = useGetUrlQuery();
const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [printModalOpen, setPrintModalOpen] = useState(false);
const [printData, setPrintData] = useState([]);
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["averageByCorpInfoList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: {
corpId: query.corpId,
},
});
const onExportExcel = async () => {
if (selectedRowKeys.length === 0) {
message.error("请选中要导出的数据");
return;
}
Modal.confirm({
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hidden/hidden/exportHiddenById", {
params: { ids: selectedRowKeys },
});
message.success("导出成功");
},
});
};
return (
<div>
<HeaderBack title="一般隐患" />
<div style={{ padding: 20 }}>
<Spin spinning={downloadBlobLoading}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "state", label: "隐患状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_STATE_ENUM },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{ name: "checkUserName", label: "验收人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
rowSelection={{
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys);
},
}}
headerTitle={query.corpName}
toolBarRender={() => (
<Space>
<Button
type="primary"
icon={<PrintIcon />}
onClick={() => {
if (selectedRowKeys.length === 0) {
message.error("请选择要打印的隐患");
return;
}
setPrintModalOpen(true);
setPrintData(tableProps.dataSource.filter(item => selectedRowKeys.includes(item.id)));
}}
>
打印
</Button>
<Button
type="primary"
icon={<ExportIcon />}
onClick={() => {
onExportExcel();
}}
>
导出
</Button>
</Space>
)}
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "整改时间", dataIndex: "rectificationTime" },
{ title: "验收人", dataIndex: "hiddenYUserName", width: 100 },
{
title: "隐患状态",
dataIndex: "state",
render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }),
},
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</Spin>
</div>
<PrintModal
open={printModalOpen}
data={printData}
onCancel={() => {
setPrintModalOpen(false);
setPrintData([]);
}}
/>
</div>
);
}
const PrintModal = (props) => {
const contentRef = useRef(null);
const handlePrint = useReactToPrint({
contentRef,
pageStyle: `@page {
size: landscape;
margin: 10px;
}
@media print {
body {
margin: 10px;
padding: 10px;
}
}
`,
documentTitle: "",
});
return (
<Modal
title="打印"
width={1500}
okText="打印"
open={props.open}
onCancel={props.onCancel}
onOk={handlePrint}
>
<Table
options={false}
disabledResizer={false}
dataSource={props.data}
pagination={false}
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患发现人", dataIndex: "createName" },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{ title: "确认人", dataIndex: "confirmUserName" },
{ title: "整改负责人", dataIndex: "rectificationUserName" },
{ title: "隐患状态", dataIndex: "state", render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }) },
{ title: "验收人", dataIndex: "hiddenYUserName" },
]}
/>
<div ref={contentRef}>
<table className="print-table">
<thead>
<tr>
<th>隐患来源</th>
<th>隐患描述</th>
<th>隐患发现人</th>
<th>隐患发现时间</th>
<th>确认人</th>
<th>整改负责人</th>
<th>隐患状态</th>
<th>验收人</th>
</tr>
</thead>
<tbody>
{(props.data || []).map(item => (
<tr key={item.id}>
<td>{getLabelName({ list: HIDDEN_SOURCE_ENUM, status: item.source })}</td>
<td>{item.hiddenDesc}</td>
<td>{item.createName}</td>
<td>{item.hiddenFindTime ? dayjs(item.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : ""}</td>
<td>{item.confirmUserName}</td>
<td>{item.rectificationUserName}</td>
<td>{getLabelName({ list: HIDDEN_STATE_ENUM, status: item.state })}</td>
<td>{item.hiddenYUserName}</td>
</tr>
))}
</tbody>
</table>
</div>
</Modal>
);
};
export default Connect([NS_AVERAGE], true)(HiddenList);

View File

@ -0,0 +1,9 @@
function Ignore(props) {
return (
<div>
{props.children}
</div>
);
}
export default Ignore;

View File

@ -0,0 +1,11 @@
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
function HiddenView() {
return (
<div>
<HiddenInfo />
</div>
);
}
export default HiddenView;

View File

@ -0,0 +1,49 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import Search from "zy-react-library/components/Search";
import Table from "zy-react-library/components/Table";
import useTable from "zy-react-library/hooks/useTable";
import { NS_IGNORE } from "~/enumerate/namespace";
function CorpInfoList(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["ignoreCorpInfoCountList"], { form });
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "corpName", label: "企业名称" },
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "企业名称", dataIndex: "corpName" },
{ title: "忽略隐患数", dataIndex: "ignoreCount" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./HiddenList?corpName=${record.corpName}&corpId=${record.corpId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_IGNORE], true)(CorpInfoList);

View File

@ -0,0 +1,154 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Spin } from "antd";
import dayjs from "dayjs";
import { useState } from "react";
import HeaderBack from "zy-react-library/components/HeaderBack";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_IGNORE } from "~/enumerate/namespace";
function HiddenList(props) {
const query = useGetUrlQuery();
const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["ignoreByCorpInfoList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: {
corpId: query.corpId,
},
});
const onExportExcel = async () => {
if (selectedRowKeys.length === 0) {
message.error("请选中要导出的数据");
return;
}
Modal.confirm({
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hidden/hidden/exportHiddenById", {
params: { ids: selectedRowKeys },
});
message.success("导出成功");
},
});
};
return (
<div>
<HeaderBack title="忽略隐患" />
<div style={{ padding: 20 }}>
<Spin spinning={downloadBlobLoading}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
rowSelection={{
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys);
},
}}
headerTitle={query.corpName}
toolBarRender={() => (
<Button
type="primary"
icon={<ExportIcon />}
onClick={() => {
onExportExcel();
}}
>
导出
</Button>
)}
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{
title: "确认时间",
dataIndex: "confirmTime",
render: (_, record) => record.confirmTime ? dayjs(record.confirmTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{ title: "隐患状态", dataIndex: "state", render: () => "已忽略" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</Spin>
</div>
</div>
);
}
export default Connect([NS_IGNORE], true)(HiddenList);

View File

@ -0,0 +1,9 @@
function Ignore(props) {
return (
<div>
{props.children}
</div>
);
}
export default Ignore;

View File

@ -0,0 +1,52 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import Search from "zy-react-library/components/Search";
import Table from "zy-react-library/components/Table";
import useTable from "zy-react-library/hooks/useTable";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function CorpInfoList(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["specialDisposalCorpInfoCountList"], { form });
return (
<div style={{ padding: 20 }}>
<Search
options={[
{ name: "corpName", label: "企业名称" },
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "企业名称", dataIndex: "corpName" },
{ title: "一般隐患", children: [
{ title: "轻微隐患数", dataIndex: "minorCount" },
{ title: "一般隐患数", dataIndex: "generalCount" },
] },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./HiddenList?corpName=${record.corpName}&corpId=${record.corpId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_SPECIAL_DISPOSAL], true)(CorpInfoList);

View File

@ -0,0 +1,165 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Spin } from "antd";
import dayjs from "dayjs";
import { useState } from "react";
import HeaderBack from "zy-react-library/components/HeaderBack";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import Search from "zy-react-library/components/Search";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj";
import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { NS_SPECIAL_DISPOSAL } from "~/enumerate/namespace";
function HiddenList(props) {
const query = useGetUrlQuery();
const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["specialDisposalByCorpInfoList"], {
form,
transform: formData => ({
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
}),
params: {
corpId: query.corpId,
},
});
const onExportExcel = async () => {
if (selectedRowKeys.length === 0) {
message.error("请选中要导出的数据");
return;
}
Modal.confirm({
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hidden/hidden/exportHiddenById", {
params: { ids: selectedRowKeys },
});
message.success("导出成功");
},
});
};
return (
<div>
<HeaderBack title="特殊处置隐患" />
<div style={{ padding: 20 }}>
<Spin spinning={downloadBlobLoading}>
<Search
options={[
{ name: "source", label: "隐患来源", render: FORM_ITEM_RENDER_ENUM.SELECT, items: HIDDEN_SOURCE_ENUM },
{ name: "hiddenDesc", label: "隐患描述" },
{ name: "hiddenFindTime", label: "隐患发现时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "hiddenFindDept", label: "隐患发现部门", render: <DepartmentSelectTree /> },
{
name: "hiddenType",
label: "隐患类型",
render: <DictionarySelectTree dictValue="hiddenType" />,
},
{
name: "hiddenPart",
label: "隐患部位",
render: <HiddenPartSelectTree />,
},
{
name: "hiddenLevel",
label: "隐患级别",
render: <HiddenLevelSelectTree isShowNeglect={false} isShowLarger={false} isShowMajor={false} />,
},
{ name: "creatorName", label: "隐患发现人" },
{ name: "confirmUserName", label: "确认人" },
{ name: "rectificationUserName", label: "整改人" },
{ name: "rectificationDeptId", label: "整改部门", render: <DepartmentSelectTree /> },
{
name: "isRelated",
label: "是否相关方",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
},
]}
form={form}
onFinish={getData}
/>
<Table
rowSelection={{
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys);
},
}}
headerTitle={query.corpName}
toolBarRender={() => (
<Button
type="primary"
icon={<ExportIcon />}
onClick={() => {
onExportExcel();
}}
>
导出
</Button>
)}
columns={[
{
title: "隐患来源",
dataIndex: "source",
render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }),
},
{ title: "隐患描述", dataIndex: "hiddenDesc" },
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
{ title: "隐患部位", dataIndex: "hiddenPartName" },
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
{
title: "隐患发现时间",
dataIndex: "hiddenFindTime",
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
},
{
title: "整改类型",
dataIndex: "rectificationType",
width: 100,
render: (_, record) => getLabelName({ list: HIDDEN_RECTIFICATION_TYPE_ENUM, status: record.rectificationType }),
},
{ title: "确认人", dataIndex: "confirmUserName", width: 100 },
{ title: "整改人", dataIndex: "rectificationUserName", width: 100 },
{ title: "隐患状态", dataIndex: "state", render: () => "待处理特殊隐患" },
{
title: "操作",
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`../HiddenView?id=${record.id}&hiddenId=${record.hiddenId}`);
}}
>
查看
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</Spin>
</div>
</div>
);
}
export default Connect([NS_SPECIAL_DISPOSAL], true)(HiddenList);

View File

@ -0,0 +1,9 @@
function Ignore(props) {
return (
<div>
{props.children}
</div>
);
}
export default Ignore;

View File

@ -0,0 +1,9 @@
function Average(props) {
return (
<div>
{props.children}
</div>
);
}
export default Average;

View File

@ -0,0 +1,9 @@
function Supervision(props) {
return (
<div>
{props.children}
</div>
);
}
export default Supervision;