368 lines
11 KiB
JavaScript
368 lines
11 KiB
JavaScript
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;
|