Compare commits

..

2 Commits
master ... dev

Author SHA1 Message Date
853931625@qq.com 560ba2a9bc 添加事故详情页面 2026-06-13 15:23:31 +08:00
853931625@qq.com bd5bb63a51 6.5 需求变更 2026-06-10 10:11:15 +08:00
8 changed files with 299 additions and 218 deletions

View File

@ -10,6 +10,7 @@ module.exports = {
javaGitBranch: "<branch-name>",
// 接口服务地址
API_HOST: "https://gbs-gateway.qhdsafety.com",
},
production: {
// 应用后端分支名称,部署上线需要
@ -44,7 +45,7 @@ module.exports = {
// 开发服务
server: {
// 监听端口号
port: "8080",
port: "8030",
// 服务地址
host: "127.0.0.1",
// 是否自动打开浏览器

View File

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

View File

@ -1,38 +1,42 @@
import { declareRequest } from '@cqsjjb/jjb-dva-runtime';
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const accidentList = declareRequest(
'accidentLoading',
'Post > @/accident/accident/list',
"accidentLoading",
"Post > @/accident/accident/list",
);
export const accidentAdd = declareRequest(
'accidentLoading',
'Post > @/accident/accident/save'
"accidentLoading",
"Post > @/accident/accident/save",
);
export const accidentEdit = declareRequest(
'accidentLoading',
'Put > @/accident/accident/edit'
"accidentLoading",
"Put > @/accident/accident/edit",
);
export const accidentDelete = declareRequest(
'accidentLoading',
'Delete > @/accident/accident/{id}'
"accidentLoading",
"Delete > @/accident/accident/{id}",
);
export const accidentBatchDelete = declareRequest(
'accidentLoading',
'Delete > @/accident/accident/ids?ids={ids}'
"accidentLoading",
"Delete > @/accident/accident/ids?ids={ids}",
);
export const accidentInfo = declareRequest('accidentLoading', 'Get > /accident/accident/{id}');
export const accidentInfo = declareRequest("accidentLoading", "Get > /accident/accident/{id}");
export const accidentCountByCorpinfoAndType = declareRequest(
'accidentLoading',
'Post > @/accident/accident/countByCorpinfoAndType'
"accidentLoading",
"Post > @/accident/accident/countByCorpinfoAndType",
);
export const getCorpInfoList = declareRequest(
'accidentLoading',
'Post > @/basicInfo/corpInfo/list'
"accidentLoading",
"Post > @/basicInfo/corpInfo/list",
);
export const accidentExport = declareRequest(
'accidentLoading',
'Post > @/accident/accident/export'
"accidentLoading",
"Post > @/accident/accident/export",
);
export const countByIncidentType = declareRequest(
"accidentLoading",
"Post > @/accident/accident/countByIncidentType",
);

View File

@ -1,29 +1,27 @@
import React, { useEffect, useState } from "react";
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, message, Modal, Space } 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 DeleteIcon from "zy-react-library/components/Icon/DeleteIcon";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import Page from "zy-react-library/components/Page";
import PreviewImg from "zy-react-library/components/PreviewImg";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import Table from "zy-react-library/components/Table";
import Upload from "zy-react-library/components/Upload";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import { TWO_DECIMAL_PLACES } from "zy-react-library/regular";
import useTable from "zy-react-library/hooks/useTable";
import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { NS_ACCIDENT } from "~/enumerate/namespace";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon";
import ExportIcon from "zy-react-library/components/Icon/ExportIcon";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob";
import useUrlQueryCriteria from "zy-react-library/hooks/useUrlQueryCriteria";
import PreviewImg from "zy-react-library/components/PreviewImg";
import useDownloadFile from "zy-react-library/hooks/useDownloadFile";
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import Page from "zy-react-library/components/Page";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useTable from "zy-react-library/hooks/useTable";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import useUrlQueryCriteria from "zy-react-library/hooks/useUrlQueryCriteria";
import { NS_ACCIDENT } from "~/enumerate/namespace";
function Accident(props) {
const [addModalVisible, setAddModalVisible] = useState(false);
@ -39,10 +37,11 @@ function Accident(props) {
params: {
eqType: props.type,
eqCorpinfoId: props.corpinfoId,
eqIncidentType: props.eqIncidentType,
},
transform: data => ({
geIncidentDate: data.incidentDate?.[0] ? (data.incidentDate[0] + " 00:00:00") : "",
leIncidentDate: data.incidentDate?.[1] ? (data.incidentDate[1] + " 23:59:59") : "",
geIncidentDate: data.incidentDate?.[0] ? (`${data.incidentDate[0]} 00:00:00`) : "",
leIncidentDate: data.incidentDate?.[1] ? (`${data.incidentDate[1]} 23:59:59`) : "",
}),
});
const typeName = props.type === 1 ? "事件" : "事故";
@ -70,18 +69,28 @@ function Accident(props) {
}}
toolBarRender={() => (
<Space>
{!props.isSupervise && props.permission(props.addPermission) &&
<Button type="primary" icon={<AddIcon />} onClick={() => setAddModalVisible(true)}>新增</Button>
}
{props.permission(props.exportPermission) &&
<Button type="primary" loading={loading} icon={<ExportIcon />} ghost onClick={async () => {
{!props.isSupervise && props.permission(props.addPermission)
&& <Button type="primary" icon={<AddIcon />} onClick={() => setAddModalVisible(true)}>新增</Button>}
{props.permission(props.exportPermission)
&& (
<Button
type="primary"
loading={loading}
icon={<ExportIcon />}
ghost
onClick={async () => {
const exportParams = getUrlCriteriaQuery("searchFormKeys", "searchFormValues");
await downloadBlob("/accident/accident/export", { params: { ...exportParams, eqType: props.type } })
}}>全部导出</Button>
}
{!props.isSupervise && props.permission(props.deleteBatchPermission) &&
<Button icon={<DeleteIcon />}
await downloadBlob("/accident/accident/export", { params: { ...exportParams, eqType: props.type } });
}}
>
全部导出
</Button>
)}
{!props.isSupervise && props.permission(props.deleteBatchPermission)
&& (
<Button
icon={<DeleteIcon />}
ghost
type="primary"
danger
@ -101,7 +110,7 @@ function Accident(props) {
>
批量删除
</Button>
}
)}
</Space>
)}
columns={[
@ -127,7 +136,8 @@ function Accident(props) {
>
查看
</Button>
{!props.isSupervise && props.permission(props.editPermission) &&
{!props.isSupervise && props.permission(props.editPermission)
&& (
<Button
type="link"
onClick={() => {
@ -138,8 +148,9 @@ function Accident(props) {
>
编辑
</Button>
}
{!props.isSupervise && props.permission(props.deletePermission) &&
)}
{!props.isSupervise && props.permission(props.deletePermission)
&& (
<Button
type="link"
danger
@ -156,14 +167,15 @@ function Accident(props) {
>
删除
</Button>
}
)}
</Space>
),
},
]}
{...tableProps}
/>
{addModalVisible && <AddModal
{addModalVisible && (
<AddModal
currentId={currentId}
accidentId={accidentId}
onCancel={() => {
@ -174,9 +186,11 @@ function Accident(props) {
type={props.type}
typeName={typeName}
getData={getData}
/>}
/>
)}
{infoModalVisible && <InfoModal
{infoModalVisible && (
<InfoModal
currentId={currentId}
accidentId={accidentId}
onCancel={() => {
@ -186,7 +200,8 @@ function Accident(props) {
}}
typeName={typeName}
getData={getData}
/>}
/>
)}
</Page>
);
}
@ -218,7 +233,7 @@ function AddModalComponent(props) {
const values = {
...data,
imageFiles,
attachmentFiles
attachmentFiles,
};
form.setFieldsValue(values);
@ -255,31 +270,32 @@ function AddModalComponent(props) {
await uploadFile({
single: false,
files: values.imageFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["136"], foreignKey: accidentId }
params: { type: UPLOAD_FILE_TYPE_ENUM["136"], foreignKey: accidentId },
});
}
if (values.attachmentFiles && values.attachmentFiles.length > 0) {
await uploadFile({
single: false,
files: values.attachmentFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["137"], foreignKey: accidentId }
params: { type: UPLOAD_FILE_TYPE_ENUM["137"], foreignKey: accidentId },
});
}
// 保存基本信息
await props["accidentEdit"]({ ...values, ...dicNames, id: props.currentId });
} else {
}
else {
// 上传文件
const { id } = await uploadFile({
single: false,
files: values.imageFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["136"], foreignKey: "" }
params: { type: UPLOAD_FILE_TYPE_ENUM["136"], foreignKey: "" },
});
if (values.attachmentFiles && values.attachmentFiles.length > 0) {
await uploadFile({
single: false,
files: values.attachmentFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["137"], foreignKey: id }
params: { type: UPLOAD_FILE_TYPE_ENUM["137"], foreignKey: id },
});
}
@ -294,7 +310,8 @@ function AddModalComponent(props) {
onCancel();
props.getData();
message.success("操作成功");
} catch (error) {
}
catch (error) {
message.error("操作失败,请重试");
}
};
@ -318,8 +335,8 @@ function AddModalComponent(props) {
options={[
{ name: "incidentNumber", label: `${typeName}案号` },
{ name: "incidentName", label: `${typeName}名称` },
{ name: "incidentType", label: `${typeName}类型`, render: <DictionarySelect dictValue="accidentType" onGetLabel={(label) => setDicNames({ ...dicNames, incidentTypeName: label })} /> },
{ name: "incidentLevel", label: `${typeName}等级`, render: <DictionarySelect dictValue="accidentLevel" onGetLabel={(label) => setDicNames({ ...dicNames, incidentLevelName: label })} /> },
{ name: "incidentType", label: `${typeName}类型`, render: <DictionarySelect dictValue="accidentType" onGetLabel={label => setDicNames({ ...dicNames, incidentTypeName: label })} /> },
{ name: "incidentLevel", label: `${typeName}等级`, render: <DictionarySelect dictValue="accidentLevel" onGetLabel={label => setDicNames({ ...dicNames, incidentLevelName: label })} /> },
{ name: "location", label: `${typeName}发生地点` },
{ name: "incidentDate", label: `${typeName}发生时间`, render: FORM_ITEM_RENDER_ENUM.DATETIME },
{ name: "directLoss", label: "直接经济损失(万元)", render: FORM_ITEM_RENDER_ENUM.NUMBER, componentProps: { precision: 2, min: 0 }, required: false },
@ -344,7 +361,7 @@ function AddModalComponent(props) {
}}
/>
),
span: 24
span: 24,
},
// 添加附件上传
{
@ -359,7 +376,7 @@ function AddModalComponent(props) {
}}
/>
),
span: 24
span: 24,
},
]}
/>
@ -371,7 +388,7 @@ function InfoModalComponent(props) {
const [info, setInfo] = useState({});
const [imageFiles, setImageFiles] = useState([]);
const [attachmentFiles, setAttachmentFiles] = useState([]);
const { loading, downloadFile } = useDownloadFile()
const { loading, downloadFile } = useDownloadFile();
const typeName = props.typeName;
const { getFile } = useGetFile();
@ -432,7 +449,7 @@ function InfoModalComponent(props) {
label: `${typeName}图片`,
children: (
<PreviewImg files={imageFiles} />
)
),
},
// 显示附件
{
@ -448,7 +465,7 @@ function InfoModalComponent(props) {
))}
{attachmentFiles.length === 0 && <span></span>}
</div>
)
),
},
]}
/>

View File

@ -2,12 +2,13 @@ import Accident from "../Accident/components/Accident";
function AccidentContainer(props) {
return (
<Accident type={1}
addPermission={"zcloud-event-add"}
editPermission={"zcloud-event-edit"}
deletePermission={"zcloud-event-delete"}
deleteBatchPermission={"zcloud-event-delete-batch"}
exportPermission={"zcloud-event-export"}
<Accident
type={1}
addPermission="zcloud-event-add"
editPermission="zcloud-event-edit"
deletePermission="zcloud-event-delete"
deleteBatchPermission="zcloud-event-delete-batch"
exportPermission="zcloud-event-export"
{...props}
/>
);

View File

@ -1,16 +1,71 @@
import Accident from "../../Accident/components/Accident";
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form } from "antd";
import { useEffect, useState } from "react";
import Page from "zy-react-library/components/Page";
import Table from "zy-react-library/components/Table";
import useDictionary from "zy-react-library/hooks/useDictionary";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { NS_ACCIDENT } from "~/enumerate/namespace";
function Bulletin(props) {
const [form] = Form.useForm();
const query = useGetUrlQuery();
const { getDictionary } = useDictionary();
const [accidentType, setAccidentType] = useState([]);
const [countByIncidentType, setCountByIncidentType] = useState([]);
useEffect(() => {
getDictionary({ dictValue: "accidentType" }).then((res) => {
setAccidentType(res);
});
}, []);
const { tableProps } = useTable(props["countByIncidentType"], {
form,
usePagination: false,
params: {
eqAccidentType: query.eqAccidentType,
corpinfoIds: [query.corpinfoId],
},
onSuccess: ({ data }) => {
setCountByIncidentType(data);
},
});
const getAccidentCount = (corpinfoId, incidentType) => {
return countByIncidentType.find(item => item.corpinfoId === corpinfoId && item.incidentType === incidentType)?.count || 0;
};
function AccidentContainer(props) {
const {corpinfoId,eqAccidentType} = useGetUrlQuery();
return (
<Accident type={Number(eqAccidentType)}
isSupervise={true}
corpinfoId={corpinfoId}
exportPermission = { "zcloud-accident-supervise-export" }
{...props}
<Page headerTitle="查看">
<Table
options={false}
columns={[
...accidentType.map(item => ({
dataIndex: `countByCorpinfoAndType_${item.dictValue}`,
title: `${item.dictLabel}`,
render: (_, record) => (
<Button
type="link"
onClick={() => {
props.history.push(`./View?corpinfoId=${record.corpinfoId}&eqAccidentType=${query.eqAccidentType}&eqIncidentType=${item.dictValue}`);
}}
>
{getAccidentCount(record.corpinfoId, item.dictValue)}
</Button>
),
})),
]}
{...tableProps}
dataSource={[{ corpinfoId: query.corpinfoId || countByIncidentType[0]?.corpinfoId }]}
/>
</Page>
);
}
export default AccidentContainer;
export default Connect([NS_ACCIDENT], true)(Permission(Bulletin));

View File

@ -1,38 +1,21 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import {Button, Form, Space} from "antd";
import {useEffect, useState} from "react";
import { Button, Form } from "antd";
import { useState } from "react";
import Page from "zy-react-library/components/Page";
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_ACCIDENT } from "~/enumerate/namespace";
import useDictionary from "zy-react-library/hooks/useDictionary";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useUrlQueryCriteria from "zy-react-library/hooks/useUrlQueryCriteria";
import Page from "zy-react-library/components/Page";
const TYPE = [
{name: "事件", bianma: "1"},
{name: "事故", bianma: "2"},
]
function SuperviseAccident(props) {
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [form] = Form.useForm();
const {getDictionary} = useDictionary();
const [accidentType, setAccidentType] = useState([]);
const {getUrlCriteriaQuery} = useUrlQueryCriteria();
const [accidentCountByCorpinfoAndType, setAccidentCountByCorpinfoAndType] = useState([]);
useEffect(() => {
getDictionary({dictValue: "accidentType"}).then(res => {
setAccidentType(res);
});
}, []);
const getAccidentCountByCorpinfoAndType = async (corpinfoIds, type) => {
const {data} = await props["accidentCountByCorpinfoAndType"]({corpinfoIds,eqAccidentType:type})
setAccidentCountByCorpinfoAndType(data)
}
const { data } = await props["accidentCountByCorpinfoAndType"]({ corpinfoIds, eqAccidentType: type });
setAccidentCountByCorpinfoAndType(data);
};
const { tableProps, getData } = useTable(props["getCorpInfoList"], {
form,
@ -40,58 +23,59 @@ function SuperviseAccident(props) {
inType: [0, 1, 6],
},
onSuccess: ({ data }) => {
getAccidentCountByCorpinfoAndType(data.map(item => item.id),form.getFieldValue("eqAccidentType"))
getAccidentCountByCorpinfoAndType(data.map(item => item.id), form.getFieldValue("eqAccidentType"));
},
});
const getAccidentCount=(id,type)=>{
return accidentCountByCorpinfoAndType.find(item => item.corpinfoId === id && item.incidentType === type)?.[`count`] || 0;
}
const searchType = getUrlCriteriaQuery("searchFormKeys","searchFormValues").eqAccidentType;
const getAccidentTotal = (id, key) => {
return accidentCountByCorpinfoAndType.find(item => item.corpinfoId === id)?.[key] || 0;
};
return (
<Page isShowAllAction={false}>
<Search
form={form}
values={{
eqAccidentType: "1",
}}
onFinish={getData}
options={[
{ name: "likecorpName", label: `公司名称` },
{name: "eqAccidentType", label: `类型`, render: FORM_ITEM_RENDER_ENUM.SELECT, items: TYPE,componentProps: {allowClear: false }},
]}
/>
<Table
rowSelection={{
selectedRowKeys,
onChange: selectedRowKeys => setSelectedRowKeys(selectedRowKeys),
}}
columns={[
{ dataIndex: "corpName", title: `公司名称` },
...accidentType.map(item => ({
dataIndex: `countByCorpinfoAndType_${item.dictValue}`,
title: `${item.dictLabel}`,
render: (_, record) => (
getAccidentCount(record.id,item.dictValue)
),
})),
{
title: "操作",
width: 160,
fixed: "right",
dataIndex: "eventCount",
title: "事件总数",
width: 180,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./info?corpinfoId=${record.id}&eqAccidentType=${searchType}`)
props.history.push(`./info?corpinfoId=${record.id}&eqAccidentType=1`);
}}
>
查看
{getAccidentTotal(record.id, "eventCount")}
</Button>
</Space>
),
},
{
dataIndex: "accidentCount",
title: "事故总数",
width: 180,
render: (_, record) => (
<Button
type="link"
onClick={() => {
props.history.push(`./info?corpinfoId=${record.id}&eqAccidentType=2`);
}}
>
{ getAccidentTotal(record.id, "accidentCount")}
</Button>
),
},
]}
{...tableProps}
/>

View File

@ -0,0 +1,19 @@
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import Accident from "../../Accident/components/Accident";
function AccidentContainer(props) {
const { corpinfoId, eqAccidentType, eqIncidentType } = useGetUrlQuery();
return (
<Accident
type={Number(eqAccidentType)}
isSupervise={true}
corpinfoId={corpinfoId}
eqIncidentType={eqIncidentType}
exportPermission="zcloud-accident-supervise-export"
{...props}
/>
);
}
export default AccidentContainer;