12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712 |
- import ModuleTitle from '@/components/ManagementPage/moduleTitle';
- import TabsContent from '@/components/TabsContent';
- import ThresholdDetail from '@/components/ThresholdDetail';
- import ThresholdModal from '@/components/ThresholdDetail/ThresholdModal';
- import { changeRecordStatus, getDumuDetail } from '@/services/eqSelfInspection';
- import { UnityAction } from '@/utils/utils';
- import { connect, useRequest } from '@umijs/max';
- import {
- Col,
- DatePicker,
- Form,
- Input,
- Modal,
- Row,
- Select,
- Spin,
- Table,
- message,
- } from 'antd';
- import dayjs from 'dayjs';
- import { useEffect, useMemo, useState } from 'react';
- import ReactZmage from 'react-zmage';
- import styles from './PatrolReportDetail.less';
- function Detail(props) {
- const { data, userList, projectId, dispatch, loading = false } = props;
- const [select, setSelect] = useState();
- const [dumuList, setDumuList] = useState([]);
- const sendMessageToUnity = (select, data) => {
- setSelect(select);
- if (window.HightlightEquipment) {
- window.HightlightEquipment(data);
- }
- };
- const { run: detailRun } = useRequest(getDumuDetail, {
- manual: true,
- fetchKey: (id) => id,
- onSuccess: (data) => {
- var item = dumuList?.find((child) => child.id === data.id);
- if (item) {
- item.url = base64ToImageUrl(data.event_bg);
- }
- setDumuList([...dumuList]);
- },
- });
- const result = useMemo(() => {
- var resultArr = [];
- var tempResult = data?.PatrolResult;
- var tempArr = tempResult?.split(';');
- const getTextColor = (status) => {
- switch (status) {
- case '警告':
- return {
- color: '#FFE26D',
- className: styles.warn,
- };
- case '异常':
- return {
- color: '#FE5850',
- className: styles.error,
- };
- default:
- return {
- color: '#12CEB3',
- className: '',
- };
- }
- };
- if (tempArr?.length > 0) {
- tempArr?.forEach((item, index) => {
- var tempItem = item;
- var itemSplit = tempItem.split(':');
- if (itemSplit?.length > 1) {
- var label = '';
- var value = itemSplit[1];
- if (index === 0) label = '设备自检';
- else if (index === 1) label = '工艺自检';
- else {
- label = '安全隐患';
- value = data?.secureStatus === 0 ? '正常' : '异常';
- }
- resultArr.push({
- ...getTextColor(value),
- label,
- value,
- });
- }
- });
- }
- return resultArr;
- }, [data]);
- useEffect(() => {
- dispatch({
- type: 'eqSelfInspection/fetchUserList',
- payload: {
- projectId,
- },
- });
- }, []);
- useEffect(() => {
- setDumuList(data?.dumuList);
- data?.dumuList?.map((item) => {
- detailRun(item.id);
- });
- }, [data?.dumuList]);
- return (
- <Spin spinning={loading}>
- <div className={styles.card}>
- <Row>
- <Col span={24} className={styles.cardText}>
- 自检时间:{data?.CreatedTime}
- </Col>
- </Row>
- <Row>
- <Col span={12} className={styles.cardText}>
- 自检路线:{data?.RouteInfo?.Name}
- </Col>
- <Col span={12} className={styles.cardText}>
- 工艺段:{data?.RouteInfo?.GroupID}
- </Col>
- </Row>
- <Row>
- {result?.map((item) => {
- return (
- <Col span={8} className={styles.cardText}>
- <div className={styles.statusBox}>
- <div className={`${styles.orderIcon} ${item.className}`}>
- {item.value}
- </div>
- {item?.label}
- </div>
- </Col>
- );
- })}
- </Row>
- </div>
- <div>
- <ModuleTitle title="设备自检报告" />
- {/* 设备自检报告 */}
- <ReportCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- waringData={data?.extendWarningData}
- allData={data?.extendWarningAllData}
- key="extend"
- type={'extend'}
- userList={userList}
- title={'设备自检'}
- ></ReportCom>
- {/* 液位异常 */}
- <LiquidLevelCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.FluidLevelList}
- key="liquid"
- type={'liquid'}
- userList={userList}
- title="液位异常"
- />
- {/* 加药流量校验 */}
- <DosingFlowCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.FluidLevelList}
- title="加药流量校验"
- />
- <WaterInCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.WaterInCheckList}
- title="进出水流量校验"
- />
- <PressureGaugeCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.PressureCompareList}
- title="压力仪表校验"
- />
- <WaterQualityCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.WaterQualityCompareList}
- title="水质仪表校验"
- />
- {/* 工艺自检报告"> */}
- <div className={styles.content}>
- <div className={styles.tableStatus}>
- 异常({data?.FaultAnalysis?.length || 0})
- </div>
- <ModuleTitle title="工艺自检报告" />
- <AalysisTable
- onClickItem={sendMessageToUnity}
- select={select}
- data={data}
- />
- </div>
- {/* 安全隐患自检报告"> */}
- <div className={styles.content}>
- <ModuleTitle title="安全隐患自检报告" />
- {/* 环境异常 */}
- <ReportCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- waringData={data?.sensorWaringData}
- allData={data?.sensor}
- data={data?.sensorWaringData}
- key="sensor"
- type={'sensor'}
- userList={userList}
- title={'环境异常'}
- ></ReportCom>
- {/* 液位异常 */}
- {/* <LiquidLevelCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- allData={data?.FluidLevelList}
- key="liquid"
- type={'liquid'}
- userList={userList}
- title={<ModuleTitle title="液位异常" />}
- /> */}
- {/* 安防检测异常 */}
- <ReportDumCom data={dumuList} title={'安防检测异常'} />
- {/* 电器检测异常 */}
- <ReportCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- waringData={[]}
- allData={[]}
- key="extend"
- type={'extend'}
- userList={userList}
- title={'电气检测异常'}
- ></ReportCom>
- {/* 密闭空间检测异常 */}
- <ReportCom
- sendMessageToUnity={sendMessageToUnity}
- select={select}
- waringData={[]}
- allData={[]}
- key="extend"
- type={'extend'}
- userList={userList}
- title={'密闭空间检测异常'}
- ></ReportCom>
- </div>
- </div>
- {/* </Card> */}
- </Spin>
- );
- }
- export function DeviceTable(props) {
- const {
- onClickItem,
- data = {},
- items,
- onErrorHandle,
- select,
- userList,
- type,
- } = props;
- console.log(items);
- const { ProjectId, Id } = data;
- const [loading, setLoading] = useState(false);
- const [visible, setVisible] = useState(false);
- const [errVisible, setErrVisible] = useState(false);
- const [currentItem, setCurrentItem] = useState({});
- const isSensor = type == 'sensor';
- const onClickThreshold = (record) => {
- setCurrentItem(record);
- setVisible(true);
- };
- const onClickError = (record) => {
- setCurrentItem(record);
- setErrVisible(true);
- };
- const handleError = async (values) => {
- setLoading(true);
- var res = await changeRecordStatus({
- ...values,
- Id: currentItem.Id,
- DeviceCode: currentItem.DeviceCode,
- DeviceName: currentItem.DeviceName,
- RecordId: data.Id,
- RepairMan: values.RepairMan * 1,
- });
- setLoading(false);
- if (res) {
- message.success('操作成功');
- setErrVisible(false);
- }
- };
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'DeviceName',
- },
- {
- title: '巡检项',
- key: 'TemplateItem.Name',
- dataIndex: 'TemplateItem',
- render: (TemplateItem) => <div>{TemplateItem.Name}</div>,
- },
- // {
- // title: '设备位号',
- // width: '16%',
- // dataIndex: 'DeviceCode',
- // },
- {
- title: '设定值范围',
- render: (record) => (
- <ThresholdDetail
- current={record.Value || 0}
- data={record || {}}
- // onClick={() => onClickThreshold(record)}
- />
- ),
- },
- {
- title: '状态',
- dataIndex: 'Status',
- width: '1.25rem',
- render: (Status) => {
- switch (Status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- ></i>
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FE5850' }}
- ></i>
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- ></i>
- 警告
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (data) => {
- if (!isSensor) {
- onClickItem(`DeviceTable-${data.Id}`, {
- type: data.Status,
- deviceCode: data.DeviceCode,
- });
- } else {
- onClickItem(`DeviceTable-${data.Id}`, {
- // type: data.Status,
- deviceCode: data.DeviceCode,
- value: Number(data.Value || 0),
- threshold: data.JsonNumThreshold,
- });
- UnityAction.sendMsg('SinglePowerEnvironFromWeb', JSON.stringify(data));
- }
- };
- // useEffect(() => {
- // console.log('温控', items);
- // if (isSensor)
- // UnityAction.sendMsg('PowerEnvironsFromWeb', JSON.stringify(items));
- // }, [items]);
- // if (!isSensor) {
- // columns.push({
- // title: '操作',
- // render: (record) =>
- // record.Status == 1 && (
- // <a style={{ color: '#FE5850' }} onClick={() => onClickError(record)}>
- // 异常处理
- // </a>
- // ),
- // });
- // }
- return (
- <div>
- <Table
- columns={columns}
- dataSource={items}
- rowKey="Id"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- <ThresholdModal
- open={visible}
- data={currentItem.JsonNumThreshold}
- onClose={() => setVisible(false)}
- />
- <ErrorHandleModal
- open={errVisible}
- userList={userList}
- onCancel={() => setErrVisible(false)}
- onOk={handleError}
- />
- </div>
- );
- }
- function AalysisTable(props) {
- const { onClickItem, data = {}, select } = props;
- const { FaultAnalysis } = data;
- const columns = [
- {
- title: '异常名称',
- width: '18%',
- dataIndex: 'device_name',
- },
- // {
- // title: '位号',
- // width: '15%',
- // dataIndex: 'device_code',
- // },
- {
- title: '可能原因',
- width: '30%',
- render: (record) => record.reason,
- },
- {
- title: '解决方案',
- width: '52%',
- render: (record) => {
- if (record.fix_plan instanceof Array) {
- return (
- <div>
- {record.fix_plan.map((item) => (
- <div>
- {item.content}
- <br />
- </div>
- ))}
- </div>
- );
- } else {
- return record.fix_plan;
- }
- },
- },
- ];
- return (
- <div>
- <Table
- columns={columns}
- dataSource={FaultAnalysis}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- </div>
- );
- }
- function ErrorHandleModal(props) {
- const { visible, onCancel, onOk, userList } = props;
- const [form] = Form.useForm();
- const status = form.getFieldValue('Status');
- const handleOk = () => {
- form.validateFields((error, values) => {
- if (error) return;
- onOk({
- ...values,
- PlanTime: values?.PlanTime?.format('YYYY-MM-DD HH:mm:ss'),
- });
- });
- };
- return (
- <Modal
- title="异常处理"
- open={visible}
- onCancel={onCancel}
- onOk={handleOk}
- destroyOnClose
- >
- <Form labelCol={{ span: 7 }} wrapperCol={{ span: 16 }}>
- <Form.Item label="异常处理备注" name="ExceptionHandling">
- <Input.TextArea />
- </Form.Item>
- <Form.Item
- label="审核状态"
- name="Status"
- rules={[{ required: true, message: '请选择验收状态' }]}
- >
- <Select style={{ width: '100%' }} placeholder="请选择验收状态">
- <Select.Option value={1}>已派遣</Select.Option>
- <Select.Option value={2}>已通过</Select.Option>
- </Select>
- </Form.Item>
- <Form.Item
- label="维修人"
- name="RepairMan"
- rules={[{ required: true, message: '请选择维修人' }]}
- >
- <Select
- showSearch
- placeholder="请选择维修人"
- filterOption={(input, option) =>
- option.props.children.indexOf(input) >= 0
- }
- style={{ width: '100%' }}
- >
- {userList?.map((item) => (
- <Select.Option key={item.ID}>{item.CName}</Select.Option>
- ))}
- </Select>
- </Form.Item>
- {status == 1 && (
- <>
- <Form.Item
- label="难度级别"
- name="DifficultyLevel"
- rules={[{ required: true, message: '请选择难度级别' }]}
- >
- <Select placeholder="请选择难度级别" style={{ width: '100%' }}>
- <Select.Option value={0}>大修</Select.Option>
- <Select.Option value={1}>项目维修</Select.Option>
- <Select.Option value={2}>小修</Select.Option>
- </Select>
- </Form.Item>
- <Form.Item
- label="维修方式"
- name="RepairType"
- rules={[{ required: true, message: '请选择维修方式' }]}
- >
- <Select placeholder="请选择维修方式" style={{ width: '100%' }}>
- <Select.Option value={0}>自维</Select.Option>
- <Select.Option value={1}>外委</Select.Option>
- </Select>
- </Form.Item>
- <Form.Item
- label="计划完成日期"
- name="PlanTime"
- rules={[{ required: true, message: '请选择计划完成日期' }]}
- >
- <DatePicker inputReadOnly />
- </Form.Item>
- </>
- )}
- </Form>
- </Modal>
- );
- }
- export function WarningTable(props) {
- const {
- onClickItem,
- data = {},
- onErrorHandle,
- select,
- userList,
- type,
- items,
- } = props;
- const { ProjectId, Id } = data;
- const [loading, setLoading] = useState(false);
- const [visible, setVisible] = useState(false);
- const [errVisible, setErrVisible] = useState(false);
- const [currentItem, setCurrentItem] = useState({});
- const isSensor = type == 'sensor';
- const onClickThreshold = (record) => {
- setCurrentItem(record);
- setVisible(true);
- };
- const onClickError = (record) => {
- setCurrentItem(record);
- setErrVisible(true);
- };
- const handleError = async (values) => {
- setLoading(true);
- var res = await changeRecordStatus({
- ...values,
- Id: currentItem.Id,
- DeviceCode: currentItem.DeviceCode,
- DeviceName: currentItem.DeviceName,
- RecordId: data.Id,
- RepairMan: values.RepairMan * 1,
- });
- setLoading(false);
- if (res) {
- message.success('操作成功');
- setErrVisible(false);
- }
- };
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'DeviceName',
- },
- {
- title: '巡检项',
- dataIndex: 'TemplateItem.Name',
- },
- // {
- // title: '设备位号',
- // width: '16%',
- // dataIndex: 'DeviceCode',
- // },
- {
- title: '设定值范围',
- width: '30%',
- render: (record) => (
- <ThresholdDetail
- current={record.Value || 0}
- data={record || {}}
- // onClick={() => onClickThreshold(record)}
- />
- ),
- },
- {
- title: '状态',
- dataIndex: 'Status',
- width: '1.25rem',
- render: (Status) => {
- switch (Status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- ></i>
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FE5850' }}
- ></i>
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- ></i>
- 警告
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (data) => {
- if (!isSensor) {
- onClickItem(`DeviceTable-${data.Id}`, {
- type: data.Status,
- deviceCode: data.DeviceCode,
- });
- } else {
- onClickItem(`DeviceTable-${data.Id}`, {
- // type: data.Status,
- deviceCode: data.DeviceCode,
- value: Number(data.Value || 0),
- threshold: data.JsonNumThreshold,
- });
- UnityAction.sendMsg('SinglePowerEnvironFromWeb', JSON.stringify(data));
- }
- };
- // if (!isSensor) {
- // columns.push({
- // title: '操作',
- // render: (record) =>
- // record.Status == 1 && (
- // <a style={{ color: '#FE5850' }} onClick={() => onClickError(record)}>
- // 异常处理
- // </a>
- // ),
- // });
- // }
- // useEffect(() => {
- // if (isSensor)
- // UnityAction.sendMsg('PowerEnvironsFromWeb', JSON.stringify(items));
- // }, [items]);
- return (
- <div>
- <Table
- columns={columns}
- dataSource={items}
- rowKey="Id"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- <ThresholdModal
- open={visible}
- data={currentItem.JsonNumThreshold}
- onClose={() => setVisible(false)}
- />
- <ErrorHandleModal
- open={errVisible}
- userList={userList}
- onCancel={() => setErrVisible(false)}
- onOk={handleError}
- />
- </div>
- );
- }
- function ReportCom(props) {
- const {
- sendMessageToUnity,
- select,
- waringData = [],
- allData = [],
- userList,
- type,
- title,
- data,
- } = props;
- const [activeKey, setActiveKey] = useState('1');
- const handleTabsChange = (activeKey) => {
- setActiveKey(activeKey);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="1"
- onChange={handleTabsChange}
- small={true}
- items={[
- {
- key: '1',
- label: `异常/警告(${waringData.length || 0})`,
- children: <div></div>,
- },
- {
- key: '2',
- label: `全部(${allData.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey == '1' && (
- <WarningTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={waringData}
- key={type}
- data={data}
- type={type}
- userList={userList}
- />
- )}
- {activeKey == '2' && (
- <DeviceTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- data={data}
- key={type}
- type={type}
- userList={userList}
- />
- )}
- </div>
- );
- }
- export function LiquidTable(props) {
- const { onClickItem, data = {}, items, select, type } = props;
- const { ProjectId, Id } = data;
- const [loading, setLoading] = useState(false);
- const [currentItem, setCurrentItem] = useState({});
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'device_name',
- },
- {
- title: '类型',
- key: 'template_item_name',
- dataIndex: 'template_item_name',
- },
- {
- title: '液位数',
- dataIndex: 'origin_value',
- },
- {
- title: '差值',
- dataIndex: 'value',
- },
- {
- title: '设定值范围',
- width: '25%',
- render: (record) => (
- <ThresholdDetail
- current={record.value || 0}
- data={{
- JsonNumThreshold: record?.json_num_threshold,
- Type: record.type || 2,
- }}
- />
- ),
- },
- {
- title: '状态',
- dataIndex: 'status',
- width: '1.25rem',
- render: (status) => {
- switch (status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- ></i>
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- ></i>
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- ></i>
- 警告
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (data) => {
- onClickItem(`DeviceTable-${data.device_code}`, {
- type: data.status,
- deviceCode: data.device_code,
- });
- };
- return (
- <Table
- columns={columns}
- dataSource={items}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- );
- }
- function LiquidLevelCom(props) {
- const { sendMessageToUnity, select, allData = [], type, title } = props;
- const [activeKey, setActiveKey] = useState('1');
- const errorData = useMemo(() => {
- const errorData = allData?.filter((item) => item.status);
- return errorData;
- }, [allData]);
- const handleTabsChange = (activeKey) => {
- setActiveKey(activeKey);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="1"
- onChange={handleTabsChange}
- small
- items={[
- {
- key: '1',
- label: `异常/警告(${errorData?.length || 0})`,
- children: <div></div>,
- },
- {
- key: '2',
- label: `全部(${allData?.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey == '1' && (
- <LiquidTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={errorData}
- key={type}
- type={type}
- />
- )}
- {activeKey == '2' && (
- <LiquidTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- key={type}
- type={type}
- />
- )}
- </div>
- );
- }
- function DosingFlowTable(props) {
- const { onClickItem, data = {}, items } = props;
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'device_name',
- },
- {
- title: '类型',
- width: '1rem',
- key: 'template_item_name',
- dataIndex: 'template_item_name',
- },
- {
- title: '实际流量',
- dataIndex: 'origin_value',
- },
- {
- title: '计量流量',
- dataIndex: 'value',
- },
- {
- title: '差值/比值',
- dataIndex: 'value',
- },
- {
- title: '设定值范围',
- width: '20%',
- render: (record) => (
- <ThresholdDetail
- current={record.value || 0}
- data={{
- JsonNumThreshold: record?.json_num_threshold,
- Type: record.type || 2,
- }}
- />
- ),
- },
- {
- title: '状态',
- dataIndex: 'status',
- width: '1.25rem',
- render: (status) => {
- switch (status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- />
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- />
- 警告
- </div>
- );
- default:
- return null;
- }
- },
- },
- ];
- const handleClickItem = (data) => {
- onClickItem(`DeviceTable-${data.device_code}`, {
- type: data.status,
- deviceCode: data.device_code,
- });
- };
- return (
- <Table
- columns={columns}
- dataSource={items}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- );
- }
- function DosingFlowCom(props) {
- const { sendMessageToUnity, select, allData = [], type, title } = props;
- const [activeKey, setActiveKey] = useState('1');
- const errorData = useMemo(() => {
- const errorData = allData?.filter((item) => item.status);
- return errorData;
- }, [allData]);
- const handleTabsChange = (key) => {
- setActiveKey(key);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="1"
- onChange={handleTabsChange}
- small
- items={[
- {
- key: '1',
- label: `异常/警告(${errorData?.length || 0})`,
- children: <div></div>,
- },
- {
- key: '2',
- label: `全部(${allData?.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey === '1' && (
- <DosingFlowTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={errorData}
- />
- )}
- {activeKey === '2' && (
- <DosingFlowTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- />
- )}
- </div>
- );
- }
- function WaterInTable(props) {
- const { onClickItem, data = {}, items } = props;
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'item_alias',
- },
- {
- title: '差值',
- // width: '15%',
- dataIndex: 'current_val',
- },
- {
- title: '时间',
- // width: '15%',
- dataIndex: 'create_time',
- render: (text) => {
- if (text) {
- return dayjs(text).format('HH:mm:ss');
- }
- return '-';
- },
- },
- {
- title: '设定值范围',
- width: '30%',
- render: (record) => (
- <ThresholdDetail
- current={record.current_val || 0}
- data={{
- JsonNumThreshold: {
- exception: [
- { ThresholdValue: record?.thresholds, ThresholdType: 1 },
- ],
- },
- Type: 2,
- }}
- />
- ),
- },
- {
- title: '状态',
- dataIndex: 'status',
- width: '1.25rem',
- render: (status) => {
- switch (status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- />
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- />
- 警告
- </div>
- );
- default:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (params) => {
- onClickItem(`DeviceTable-${params.device_code}`, {
- type: params.status,
- deviceCode: params.device_code,
- });
- };
- return (
- <Table
- columns={columns}
- dataSource={items}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- );
- }
- function WaterInCom(props) {
- const { sendMessageToUnity, select, allData = [], title } = props;
- const [activeKey, setActiveKey] = useState('1');
- const errorData = useMemo(() => {
- const tempData = allData?.filter((item) => item.status);
- return tempData;
- }, [allData]);
- const handleTabsChange = (key) => {
- setActiveKey(key);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="1"
- onChange={handleTabsChange}
- small
- items={[
- {
- key: '1',
- label: `异常/警告(${errorData?.length || 0})`,
- children: <div></div>,
- },
- {
- key: '2',
- label: `全部(${allData?.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey === '1' && (
- <WaterInTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={errorData}
- />
- )}
- {activeKey === '2' && (
- <WaterInTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- />
- )}
- </div>
- );
- }
- function PressureGaugeTable(props) {
- const { onClickItem, data = {}, items } = props;
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'item_alias',
- },
- {
- title: '时间范围',
- key: 'dataRange',
- width: '1.5rem',
- render: (record) => {
- if (record.query_start && record.query_end) {
- return (
- <>
- {dayjs(record.query_start).format('HH:mm:ss')}
- <br />
- {dayjs(record.query_end).format('HH:mm:ss')}
- </>
- );
- }
- return '-';
- },
- },
- {
- title: (
- <>
- 仪表
- <br />
- 最小数
- </>
- ),
- width: '1.25rem',
- dataIndex: 'data_min',
- },
- {
- title: (
- <>
- 仪表
- <br />
- 最大数
- </>
- ),
- width: '1.25rem',
- dataIndex: 'data_max',
- },
- {
- title: '可能原因',
- dataIndex: 'content',
- },
- {
- title: '状态',
- dataIndex: 'status',
- width: '1.25rem',
- render: (status) => {
- switch (status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- />
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- />
- 警告
- </div>
- );
- default:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (params) => {
- onClickItem(`DeviceTable-${params.device_code}`, {
- type: params.status,
- deviceCode: params.device_code,
- });
- };
- return (
- <Table
- columns={columns}
- dataSource={items}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- );
- }
- function PressureGaugeCom(props) {
- const { sendMessageToUnity, select, allData = [], title } = props;
- const [activeKey, setActiveKey] = useState('2');
- const errorData = useMemo(() => {
- const tempData = allData?.filter((item) => item.status);
- return tempData;
- }, [allData]);
- const handleTabsChange = (key) => {
- setActiveKey(key);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="2"
- onChange={handleTabsChange}
- small
- items={[
- {
- key: '2',
- label: `异常/警告(${allData?.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey === '2' && (
- <PressureGaugeTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- />
- )}
- </div>
- );
- }
- function WaterQualityTable(props) {
- const { onClickItem, data = {}, items } = props;
- const columns = [
- {
- title: '设备名称',
- width: '20%',
- dataIndex: 'item_alias',
- },
- {
- title: '时间范围',
- key: 'dataRange',
- width: '1.5rem',
- render: (record) => {
- if (record.query_start && record.query_end) {
- return (
- <>
- {dayjs(record.query_start).format('HH:mm:ss')}
- <br />
- {dayjs(record.query_end).format('HH:mm:ss')}
- </>
- );
- }
- return '-';
- },
- },
- {
- title: (
- <>
- 仪表
- <br />
- 最小数
- </>
- ),
- width: '1.25rem',
- dataIndex: 'data_min',
- },
- {
- title: (
- <>
- 仪表
- <br />
- 最大数
- </>
- ),
- width: '1.25rem',
- dataIndex: 'data_max',
- },
- {
- title: '可能原因',
- dataIndex: 'content',
- },
- {
- title: '状态',
- dataIndex: 'status',
- width: '1.25rem',
- render: (status) => {
- switch (status) {
- case -1:
- case 0:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#12CEB3' }}
- />
- 正常
- </div>
- );
- case 1:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- case 2:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FFE26D' }}
- />
- 警告
- </div>
- );
- default:
- return (
- <div>
- <i
- className={styles.iconStatus}
- style={{ background: '#FF8600' }}
- />
- 异常
- </div>
- );
- }
- },
- },
- ];
- const handleClickItem = (params) => {
- onClickItem(`DeviceTable-${params.device_code}`, {
- type: params.status,
- deviceCode: params.device_code,
- });
- };
- return (
- <Table
- columns={columns}
- dataSource={items}
- rowKey="device_code"
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- );
- }
- function WaterQualityCom(props) {
- const { sendMessageToUnity, select, allData = [], title } = props;
- const [activeKey, setActiveKey] = useState('2');
- const errorData = useMemo(() => {
- const tempData = allData?.filter((item) => item.status);
- return tempData;
- }, [allData]);
- const handleTabsChange = (key) => {
- setActiveKey(key);
- };
- return (
- <div className={styles.detailCard}>
- <div className={styles.tableTop}>
- {title}
- <TabsContent
- defaultActiveKey="2"
- onChange={handleTabsChange}
- small
- items={[
- {
- key: '2',
- label: `异常/警告(${allData?.length || 0})`,
- children: <div></div>,
- },
- ]}
- ></TabsContent>
- </div>
- {activeKey === '2' && (
- <WaterQualityTable
- onClickItem={sendMessageToUnity}
- select={select}
- items={allData}
- />
- )}
- </div>
- );
- }
- function ReportDumCom(props) {
- const { data = [], title } = props;
- const columns = [
- {
- title: '报警时间',
- dataIndex: 'event_time',
- render: (time) => dayjs(time).format('YYYY-MM-DD HH:mm:ss'),
- },
- {
- title: '设备名称',
- dataIndex: 'device_name',
- },
- {
- title: '报警类型',
- dataIndex: 'event_type',
- // render: type => alarmType[type],
- },
- {
- title: '报警图片',
- render: (item) => (
- <ReactZmage
- controller={{
- // 关闭按钮
- close: true,
- // 旋转按钮
- rotate: true,
- // 缩放按钮
- zoom: false,
- // 下载按钮
- download: false,
- // 翻页按钮
- flip: false,
- // 多页指示
- pagination: false,
- }}
- backdrop="rgba(255,255,255,0.5)"
- style={{ height: '0.9rem' }}
- src={item.path}
- />
- ),
- },
- ];
- return (
- <div style={{ marginBottom: '0.3rem' }}>
- <div className={styles.tabBarExtraContent}>
- <div className={styles.text} style={{ width: '60%' }}>
- {title}
- </div>
- <div className={styles.abnormal}>
- <div className={styles.text} style={{ float: 'right' }}>
- 异常({data?.length || 0})
- </div>
- </div>
- </div>
- <Table
- bordered
- rowKey="event_time"
- columns={columns}
- dataSource={data}
- locale={{
- emptyText: <Empty />,
- }}
- pagination={false}
- />
- </div>
- );
- }
- function base64ToImageUrl(base64String) {
- const byteCharacters = atob(base64String);
- const byteArrays = [];
- for (let i = 0; i < byteCharacters.length; i++) {
- byteArrays.push(byteCharacters.charCodeAt(i));
- }
- const byteArray = new Uint8Array(byteArrays);
- const blob = new Blob([byteArray], { type: 'image/png' });
- const imageUrl = URL.createObjectURL(blob);
- return imageUrl;
- }
- function Empty() {
- return (
- <div>
- <img
- src={require('@/assets/self-empty.png')}
- style={{ margin: '0.2rem 0', width: '1rem' }}
- />
- <p style={{ textAlign: 'center', color: '#555' }}>自检正常</p>
- </div>
- );
- }
- export default connect(({ eqSelfInspection }) => ({
- userList: eqSelfInspection.userList,
- mandateInfo: eqSelfInspection.mandateInfo,
- }))(Detail);
|