rtgk-screen-web/pages/components/Card/index.js

368 lines
11 KiB
JavaScript
Raw Permalink Normal View History

2024-06-20 11:26:44 +08:00
import react from "react";
import { useState } from "react";
import requests from "../../../utils/requests";
import { doPost } from "../../../utils/requests";
import {
PlayIcon,
StopIcon,
PauseIcon,
BellIcon,
ViewListIcon,
} from "@heroicons/react/outline";
import { BellIcon as BellIconS } from "@heroicons/react/solid";
import { PuzzleIcon } from "@heroicons/react/solid";
import VLabel from "../Header/VLabel";
import eqs from "../../../utils/eqs";
import { Tooltip } from 'antd';
const { eqstatus, orderstatus } = eqs;
function Card({
eq,
popHandle,
alartPopHandle,
classNamez,
typecode,
selectedTab,
alertData,
}) {
if (!eq) {
eq = {};
}
const [status, setStatus] = useState(eqstatus[0]);
const [alertcount, setAlertcount] = useState(0);
const [fieldValueMap, setFieldValueMap] = react.useState({});
const [imgUrl, setImgUrl] = react.useState(null);
// const [fields, setFields] = react.useState([]);
react.useEffect(() => {
if (eq.runningstatus === undefined) eq.runningstatus = 0;
setStatus(eqstatus.filter((item) => item.key === eq.runningstatus)[0]);
// console.log(eq.code,eq.runningstatus)
}, [eq.runningstatus]);
// eq.updatestatus=(statuscur)=>{
// setStatus(eqstatus.filter((item) => item.key === statuscur)[0]);
// }
react.useEffect(() => {
//updatefields();
// if (eq.operationCode === typecode) {
// setFields(eq.bmIotEquipmentRelationshipList);
// }
async function async1() {
if (typecode === "1002") {
let item = eq?.bmIotEquipmentRelationshipList.filter(
(x) => x.iotField.indexOf("IoStatus") > -1
);
if (item && item.length > 0) {
eq.runningstatus =
item[0].iotFieldValue || item[0].iotFieldValue === 1 ? 2 : 4;
}
}
}
async1();
}, [typecode]);
react.useEffect(() => {
if (alertData && alertData.length > 0) {
eq.alert = alertData.filter((al) => {
if (al.equipCode === eq.code) {
return al;
}
});
if(eq.alert.length>0)
{
let alertcout = eq?.alert?.filter((aa) => {
if (!aa?.eliminationTime) {
return aa;
}
});
eq.alertcount = alertcout.length;
setAlertcount(alertcout.length);
}
}
}, [alertData, selectedTab]);
// react.useEffect(() => {
// if(!eq.alertcount){
// eq.alertcount=0;
// eq.alert= [];
// }
// else{
// setAlertcount(eq.alertcount);
// }
// }, [eq.alertcount, selectedTab]);
react.useEffect(() => {
}, [eq.alert]);
react.useEffect(() => {
if (eq.Img) {
setImgUrl(eq.Img);
}
}, [eq.Img]);
react.useEffect(() => {}, [eq.runningstatus]);
react.useEffect(() => {
// setTimeout(() => {
// setFields(eq.bmIotEquipmentRelationshipList);
// }, 100);
}, [eq.bmIotEquipmentRelationshipList]);
eq.updateFields = () => {
// updatefields();
};
let updatefields = () => {
if (!eq?.bmIotEquipmentRelationshipList) {
if (!eq.code) {
return;
}
doPost(requests.fetchEquipFields.url, [eq.code])
.then((res) => res.json())
.then((data) => {
if (data.success) {
// var fileGroupIds = curdata.map((zz) => zz.fileGroupId);
//获取图片信息
if (data.data.length > 0) {
var eqcur = data.data[0][0];
eq.bmIotEquipmentRelationshipList =
eqcur.bmIotEquipmentRelationshipList;
updateonlyfields();
}
}
});
} else {
updateonlyfields();
}
};
let updateonlyfields = () => {
//接口请求物联网influxdb查询服务
doPost(requests.fetchLastFieldsValue.url, {
equipCode: eq.code,
fields: eq.bmIotEquipmentRelationshipList
.filter((re) => {
if (re.status && !re.iotIsalarm) {
return re;
}
})
.map((field) => field.iotField),
})
.then((res) => res.json())
.then((data) => {
if (data.success) {
if (data.data !== null && data.data !== []) {
var _fieldValueMap = data.data[0];
if (!_fieldValueMap) return;
eq.bmIotEquipmentRelationshipList.map((field) => {
field.iotFieldValue = !(field.iotField in _fieldValueMap)
? null
: _fieldValueMap[field.iotField];
if (field.iotIsalarm) {
if (!field.iotFieldValue) field.iotFieldValue = 0;
if (field.iotField.indexOf("IoStatus") > -1) {
field.iotFieldValue =
field.iotFieldValue === 1 ? true : false;
} else {
field.iotFieldValue =
field.iotFieldValue === 0 ? false : true;
}
}
});
if (eq.bmIotEquipmentRelationshipList) {
var _alertcount = eq.bmIotEquipmentRelationshipList.filter(
(re) => {
if (re.iotIsalarm && re.status && re.iotFieldValue) {
return re;
}
}
).length;
// setAlertcount(_alertcount);
setFieldValueMap(_fieldValueMap);
}
}
} else {
// console.log(data);
}
})
.catch((ex) => {
console.log(ex);
});
};
react.useEffect(() => {
if (eq.code === null) return;
//updatefields();
}, [eq]);
react.useEffect(() => {
//updatefields();
}, [eq.iotFieldValue]);
let togglePop = () => {
popHandle(eq);
// setState((prevState) => ({
// ...prevState,
// }));
};
let alartPop = () => {
alartPopHandle(eq);
// setState((prevState) => ({
// ...prevState,
// }));
};
return (
<div className={` bg-white h-fit rounded w-64 `}>
{/* 第一行 */}
<div className={`group flex flex-raw h-6 rounded-t ${status.bg}`}>
<div
className={`flex-0 inline-flex items-center text-white justify-center`}
>
{/* <div className="w-2"></div> {orderstatus[0].title} */}
<div className="w-2"></div>
<p className="truncate w-28 text-left cardP" alt={eq.code}>
{" "}
{eq.code}
</p>
{/* {eq?.typeName} */}
</div>
<div className="flex-auto"></div>
<div className=" flex-0 inline-flex items-center text-white justify-center ">
<p className="truncate w-28 text-right cardP" alt={eq.name}>
{" "}
{eq.name}
</p>
<div className="w-2"></div>
</div>
</div>
<div className="relative flex">
{!imgUrl ? (
<img
src={`../img/eqimg.jpeg`}
alt={eq.name}
className=" w-full h-20 bg-gray-500 "
/>
) : (
// eslint-disable-next-line
<img
src={imgUrl}
alt={eq.name}
className=" w-full h-20 bg-gray-500 "
/>
)}
<Tooltip
placement="top"
title={eq?.bmIotEquipmentRelationshipList?.length>0?eq?.bmIotEquipmentRelationshipList[0].updateTime:""}
mouseEnterDelay={1}
>
<button
className={` absolute top-1 left-2 inline-block px-1 text-xs ${status.bg}-txt text-white ${status.bg}-border border rounded-sm`}
>
{status.title}
{status.key > 0 ? "中" : ""}
</button>
</Tooltip>
</div>
{/* 第二行 */}
<div className="border-l border-r text-left pl-4 py-2 border-gray-200 flex flex-col h-48">
{!eq?.bmIotEquipmentRelationshipList ? (
<></>
) : (
eq?.bmIotEquipmentRelationshipList
.filter((re) => {
if (re.iotIsMainField && re.status) {
return re;
}
})
.sort((a, b) =>
parseInt(a.fieldSort) > parseInt(b.fieldSort) ? 1 : -1
)
.map((re, idx) => {
return (
<div className={` flex flex-row mb-1 mr-3 `} key={idx}>
<VLabel>{re.iotFieldDescribe}</VLabel>{" "}
<div className="flex-auto"></div>
<Tooltip
placement="top"
title={re.iotFieldValueTime}
mouseEnterDelay={1}
>
{!fieldValueMap ? (
""
) : (
<label
className={` text-right ${classNamez} text-[#297FC8]`}
>
{typeof re.iotFieldValue === "boolean"
? String(re.iotFieldValue)
: re.iotFieldValue}
</label>
)}
</Tooltip>
</div>
);
})
)}
</div>
{/* 第三行 */}
<div className=" border group flex items-center flex-raw h-12 rounded-b border-gray-200 px-1">
<div className=" flex flex-row flex-auto w-12 justify-center cursor-pointer">
{status.key === 2 ? (
<PlayIcon className={` flex-0 h-5 w-5 mr-1 ${status.text}`} />
) : status.key === 1 ? (
<PauseIcon className={` flex-0 h-5 w-5 mr-1 ${status.text}`} />
) : status.key === 3 ? (
<StopIcon className={` flex-0 h-5 w-5 mr-1 ${status.text}`} />
) : (
<BellIcon className={` flex-0 h-5 w-5 mr-1 ${status.text}`} />
)}
<div className=" flex-0 inline-flex items-center ml-1 text-black justify-center ">
{status.title}
</div>
</div>
<div className="border-l border-gray-200 h-full flex-0"></div>
<div
onClick={alartPop}
className=" flex items-center justify-center flex-auto w-12 border-gray-200 cursor-pointer"
>
{/* {alertcount > 0 ? (
<span className=" inline-flex rounded-full text-red-500 items-center justify-center ">
{alertcount}
</span>
) : */}
<div className="relative inline-flex">
{alertcount > 0 ? (
<BellIconS
className={`flex-0 h-5 w-5 mr-1 text-red-500 `}
></BellIconS>
) : (
<BellIcon className={`flex-0 h-5 w-5 mr-1 `}></BellIcon>
)}
{alertcount > 0 ? (
<span className="text-red-500">{alertcount}</span>
) : (
``
)}
</div>
<div
className={`flex-0 inline-flex items-center ml-1 ${
alertcount > 0 ? "text-red-500" : "text-black"
} justify-center`}
>
告警
</div>
</div>
<div className="border-l border-gray-200 h-full flex-0"></div>
<div
onClick={togglePop}
className=" flex flex-row items-center justify-center flex-auto w-12 border-gray-200 cursor-pointer"
>
{ViewListIcon && <ViewListIcon className=" flex-0 h-5 w-5 mr-1 " />}
<div className=" flex-0 inline-flex items-center ml-1 text-black justify-center ">
其他
</div>
</div>
</div>
</div>
);
}
export default Card;