From 2cb5c7fcd274458f93452d8ae078789dde355ba7 Mon Sep 17 00:00:00 2001 From: juzi <819872918@qq.com> Date: Tue, 27 Aug 2024 10:48:46 +0800 Subject: [PATCH] line5 --- public/png/lp/eq_msg_always.png | Bin 0 -> 7789 bytes public/png/lp/eq_msg_detail.png | Bin 0 -> 44346 bytes public/png/lp/line_part.png | Bin 0 -> 54015 bytes src/babylonjs/LinePageBabylon copy.tsx | 447 ++++++++++++++++ src/babylonjs/LinePageBabylon.tsx | 484 ++++++++++++++++-- src/page/LinePage/Center/CenterDown.tsx | 211 +++++++- .../LinePage/Center/LineChart/chart.config.ts | 45 +- src/page/LinePage/Center/LineChart/index.tsx | 6 - .../LinePage/Component/SwitchButton/index.css | 2 +- .../LinePage/Component/SwitchButton/index.tsx | 50 +- .../LinePage/Component/TitleBox/index.tsx | 6 +- .../LinePage/Left/BarChart/chart.config.ts | 14 +- src/page/LinePage/Left/BarChart/index.tsx | 6 - src/page/LinePage/Left/LeftDown.tsx | 129 ++++- src/page/LinePage/Left/LeftUp.tsx | 67 ++- .../Left/SummaryBarChart/chart.config.ts | 129 ++--- .../LinePage/Left/SummaryBarChart/index.tsx | 6 - .../LinePage/Right/LineChart/chart.config.ts | 35 +- src/page/LinePage/Right/LineChart/index.tsx | 6 - src/page/LinePage/Right/RightDown.tsx | 238 ++++++++- src/page/LinePage/Right/RightUp.tsx | 20 +- src/page/LinePage/assets/icon/g.png | Bin 0 -> 2359 bytes src/page/LinePage/assets/icon/r.png | Bin 0 -> 2110 bytes src/page/LinePage/assets/icon/y.png | Bin 0 -> 2299 bytes src/page/LinePage/assets/svg/alarmTip.svg | 23 + src/page/LinePage/index.css | 77 ++- 26 files changed, 1733 insertions(+), 268 deletions(-) create mode 100644 public/png/lp/eq_msg_always.png create mode 100644 public/png/lp/eq_msg_detail.png create mode 100644 public/png/lp/line_part.png create mode 100644 src/babylonjs/LinePageBabylon copy.tsx delete mode 100644 src/page/LinePage/Center/LineChart/index.tsx delete mode 100644 src/page/LinePage/Left/BarChart/index.tsx delete mode 100644 src/page/LinePage/Left/SummaryBarChart/index.tsx delete mode 100644 src/page/LinePage/Right/LineChart/index.tsx create mode 100644 src/page/LinePage/assets/icon/g.png create mode 100644 src/page/LinePage/assets/icon/r.png create mode 100644 src/page/LinePage/assets/icon/y.png create mode 100644 src/page/LinePage/assets/svg/alarmTip.svg diff --git a/public/png/lp/eq_msg_always.png b/public/png/lp/eq_msg_always.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e096f6fe7d5ee02389c1a4e3213cfb74a66a23 GIT binary patch literal 7789 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 Q4`4jT1}6HI*BxK{A7esoJpcdz literal 0 HcmV?d00001 diff --git a/public/png/lp/eq_msg_detail.png b/public/png/lp/eq_msg_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..cd53bcde748f7e9bb6be5d2b9f3adcc2cd4e7a72 GIT binary patch literal 44346 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 We&50H&< literal 0 HcmV?d00001 diff --git a/public/png/lp/line_part.png b/public/png/lp/line_part.png new file mode 100644 index 0000000000000000000000000000000000000000..da50aa95d00a1bd2c412395d13d2ab8d14bd7540 GIT binary patch literal 54015 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 F^-o`o8kqn9 literal 0 HcmV?d00001 diff --git a/src/babylonjs/LinePageBabylon copy.tsx b/src/babylonjs/LinePageBabylon copy.tsx new file mode 100644 index 0000000..30d6cab --- /dev/null +++ b/src/babylonjs/LinePageBabylon copy.tsx @@ -0,0 +1,447 @@ +import React, { useEffect, useRef, useState, useContext, useMemo } from "react"; +import * as BABYLON from "@babylonjs/core"; +import "@babylonjs/core/Debug/debugLayer"; +import "@babylonjs/inspector"; +import "@babylonjs/loaders/glTF"; +import { GridMaterial } from "@babylonjs/materials/"; +import { + Animatable, + HemisphericLight, + Mesh, + Observable, + Vector3, +} from "@babylonjs/core"; +import { useAppSelector } from "../store/hooks"; +import "../page/style/standard.css"; +import { EquStatusInterface, selectEquStatus } from "../store/EquStatusEntity"; +import EquMap from "./EquMap"; + +// const onEquObservable = new Observable(); + +const myStyle = { + width: "1041px", + height: "562px", + outline: "none", +}; +interface MybabylonJSProps { + modelPath: string; // 明确 modelPath 属性的类型为 string +} +interface EqInfoListInterface { + [key: string]: EqInfo[]; +} +interface EqInfo { + name: string; + inputNum: number; + outPut: number; + position: [number, number]; +} +const eqInfoList: EqInfoListInterface = { + "Line1-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 101, outPut: 101, position: [82, 306] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 100, outPut: 100, position: [337, 51] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 100, outPut: 100, position: [521, 4] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [756, 2] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [833, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line1-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [100, 210] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [410, 58] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [594, 252] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [610, 5] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [838, 1] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [837, 145] }, + ], + "Line2-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line2-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [215, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [710, 237] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [502, 58] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [733, 3] }, + ], + "Line3-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line3-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [187, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [502, 58] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [733, 3] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [710, 237] }, + ], + "Line4-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [231, 216] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [403, 400] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [643, 276] }, + { name: "二次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "二次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line4-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [187, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [710, 237] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [820, 237] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [553, 7] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [839, 137] }, + ], + "Line5-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 101, outPut: 101, position: [82, 306] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [521, 4] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [672, 287] }, + { name: "二次固化", inputNum: 100, outPut: 100, position: [756, 2] }, + { name: "二次固化", inputNum: 101, outPut: 101, position: [833, 90] }, + { name: "二次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line5-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [100, 270] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [434, 133] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [640, 305] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [645, 54] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [838, 1] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [837, 226] }, + ], +}; +function MybabylonJS({ modelPath }: MybabylonJSProps) { + console.log("modelPath:;;;;;;", modelPath); + // const EquStatus = useAppSelector(selectEquStatus); + const canvasRef = useRef(null); + // onEquObservable.notifyObservers(EquStatus); + const [SelectedMeshName, setSelectedMeshName] = useState(null); + + // 使用 useRef 来存储当前加载的模型引用 + const currentMeshesRef = useRef>([]); + + useEffect(() => { + // 确保 canvas 引用存在 + if (!canvasRef.current) return; + + const canvas = canvasRef.current; + const engine = new BABYLON.Engine(canvas, true, { + preserveDrawingBuffer: true, + stencil: true, + }); + + const createScene = async function () { + // This creates a basic Babylon Scene object (non-mesh) + const scene = new BABYLON.Scene(engine); + scene.clearColor = new BABYLON.Color4(0, 0, 0, 0); + + const baseLight = new HemisphericLight( + "hemiLight", + new Vector3(-1, 1, 0), + scene + ); + baseLight.intensity = 1; + baseLight.diffuse = new BABYLON.Color3(1, 1, 1); + baseLight.specular = new BABYLON.Color3(0.25, 0.25, 0.25); + baseLight.groundColor = new BABYLON.Color3(0.5, 0.5, 0.5); + + //add an arcRotateCamera to the scene + const camera = new BABYLON.ArcRotateCamera( + "camera", + BABYLON.Tools.ToRadians(245), + BABYLON.Tools.ToRadians(25), + modelPath.slice(-1) === "1" + ? 110 + : modelPath.slice(-3) === "5-2" + ? 100 + : 75, + new BABYLON.Vector3(-13, 0, 0) + ); + console.log("camera", camera); + camera.lowerRadiusLimit = 10; + camera.upperRadiusLimit = 600; + + // This attaches the camera to the canvas + camera.attachControl(canvas, true); + + //创建一个材质 + const newMt = new BABYLON.StandardMaterial("newMt"); + newMt.diffuseColor = BABYLON.Color3.Blue(); + + const ground = BABYLON.MeshBuilder.CreateGround( + "ground", + { + width: 1000, + height: 1000, + subdivisions: 1, + }, + scene + ); + + ground.scaling.x = 100; + ground.scaling.z = ground.scaling.x; + ground.isPickable = false; + + let grid = new GridMaterial("grid", scene); + + grid.majorUnitFrequency = 10; + grid.minorUnitVisibility = 0.3; + grid.gridRatio = 0.04; + grid.backFaceCulling = !1; + grid.mainColor = new BABYLON.Color3(1, 1, 1); + grid.lineColor = new BABYLON.Color3(1, 1, 1); + grid.opacity = 0; + grid.zOffset = 1; + grid.opacityTexture = new BABYLON.Texture( + "/public/png/backgroundGround.png", + scene + ); + ground.material = grid; + + let hl = new BABYLON.HighlightLayer("hl1", scene); + let hl2 = new BABYLON.HighlightLayer("hl2", scene); + + // 定义一个函数来加载或重新加载模型 + const loadOrReloadModel = async () => { + // 在加载新模型之前卸载已加载的模型 + currentMeshesRef.current.forEach((mesh) => { + if (mesh && mesh.parent) { + scene.removeMesh(mesh, true); + } + }); + currentMeshesRef.current = []; // 重置模型数组 + try { + // 使用 ImportMeshAsync 加载新模型 + var LOD0MESH = await BABYLON.SceneLoader.ImportMeshAsync( + "", + "/Line/", + `${modelPath}.babylon`, + scene + ); + // 将新加载的模型添加到 currentMeshesRef 中 + currentMeshesRef.current.push(...LOD0MESH.meshes); + + // ...为新加载的模型设置交互逻辑 + + LOD0MESH.meshes.map((mesh) => { + mesh.isPickable = true; + mesh.actionManager = new BABYLON.ActionManager(scene); + // console.log("mesh==========", mesh); + if (modelPath.slice(-1) === "1") { + if ( + mesh.name.includes("磨边机") || + mesh.name.includes("打孔机") || + mesh.name.includes("丝印机") || + mesh.name.includes("固化") + ) { + // @ts-ignore + hl.addMesh(mesh, BABYLON.Color3.Green()); + } + } else { + if ( + mesh.name.includes("钢化") || + mesh.name.includes("铺纸机") || + mesh.name.includes("下片机械手") + ) { + // @ts-ignore + hl.addMesh(mesh, BABYLON.Color3.Green()); + } + } + + //鼠标移动到物体上亮显 + // mesh.actionManager.registerAction( + // new BABYLON.ExecuteCodeAction( + // BABYLON.ActionManager.OnPointerOverTrigger, + // (a) => { + // console.log("================", a); + // // @ts-ignore + // hl.addMesh(mesh, BABYLON.Color3.Green()); + // } + // ) + // ); + // 鼠标移出物体上不亮 + // mesh.actionManager.registerAction( + // new BABYLON.ExecuteCodeAction( + // BABYLON.ActionManager.OnPointerOutTrigger, + // () => { + // // @ts-ignore + // hl.removeMesh(mesh); + // } + // ) + // ); + + mesh._scene.onPointerDown = async (event, _pickResult) => { + const pickInfo = mesh._scene.pick( + mesh._scene.pointerX, + mesh._scene.pointerY + ); + + const clickedPosition = _pickResult.pickedPoint; + //如果需要获取吗模型根节点,而不是模型中某个组件,请用一下方法 + // getRootNode(pickInfo.pickedMesh as BABYLON.Node) 如上篇文章getRootNode函数 + + //判断是否是右键 + if (!(event.buttons === 1 && pickInfo.pickedMesh)) return; + const MeshName1 = pickInfo.pickedMesh.name.split(".")[0]; + + setSelectedMeshName(MeshName1); + }; + }); + + // onEquObservable.add((eventData, eventState) => { + // LOD0MESH.meshes.find((mesh) => { + // // @ts-ignore + // hl2.removeMesh(mesh); + // }); + // Object.keys(eventData as EquStatusInterface).map((key) => { + // // @ts-ignore + // if (eventData[key] == 2) { + // // @ts-ignore + // EquMap[key].map((name) => { + // LOD0MESH.meshes.find((mesh) => { + // if (mesh.name == name) { + // // @ts-ignore + // hl2.addMesh(mesh, BABYLON.Color3.Red()); + // } + // }); + // }); + // } + // }); + // }); + } catch (error) { + console.error("加载模型失败:", error); + } + }; + + // 调用函数以加载或重新加载模型 + loadOrReloadModel(); + + function reset() { + camera.target = new BABYLON.Vector3(-13, 0, 0); + camera.alpha = BABYLON.Tools.ToRadians(245); + camera.beta = BABYLON.Tools.ToRadians(25); + camera.radius = + modelPath.slice(-1) === "1" + ? 110 + : modelPath.slice(-3) === "5-2" + ? 100 + : 75; + } + + let resetCamera = setTimeout(reset, 15000); + scene.onPointerObservable.add((pointerInfo) => { + switch (pointerInfo.type) { + case BABYLON.PointerEventTypes.POINTERMOVE: + clearTimeout(resetCamera); + resetCamera = setTimeout(reset, 15000); + } + }); + return scene; + }; + + // call the createScene function + const scene = createScene(); + + scene.then((scene) => {}); + + // run the render loop + scene.then( + (scene) => { + engine.runRenderLoop(function () { + scene.render(); + }); + }, + (reason) => { + console.log(reason); + } + ); + + // Resize + window.addEventListener("resize", function () { + engine.resize(); + }); + + // 组件卸载时的清理逻辑 + // return () => { + // // 清理场景和引擎资源 + // engine.dispose(); + // }; + }, [modelPath]); + const resetModel = () => { + //模型初始位置 + console.log("回到初始位置"); + }; + return ( +

+

当前选择: {SelectedMeshName}

+
+ + 第五产线钢化后段 +
+ {/*
+
+ 设备名称: + 下片机械手 +
+
+ 进口数量: + 12,302 +
+
+ 出口数量: + 1,302 +
+
+ 报警状态: + 未报警 +
+
+ 在线状态: + 在线 +
+
*/} + {eqInfoList[modelPath] && + eqInfoList[modelPath].map((item, index) => { + return ( +
+
+ 设备名称: + {item.name} +
+
+ 进口数量: + {item.inputNum} +
+
+ 出口数量: + {item.outPut} +
+
+ ); + })} + + +
+ ); +} + +export default MybabylonJS; diff --git a/src/babylonjs/LinePageBabylon.tsx b/src/babylonjs/LinePageBabylon.tsx index baec296..4da9f8b 100644 --- a/src/babylonjs/LinePageBabylon.tsx +++ b/src/babylonjs/LinePageBabylon.tsx @@ -15,31 +15,282 @@ import { useAppSelector } from "../store/hooks"; import "../page/style/standard.css"; import { EquStatusInterface, selectEquStatus } from "../store/EquStatusEntity"; import EquMap from "./EquMap"; +import AlarmTipGreen from "./../page/LinePage/assets/icon/g.png"; +import AlarmTipYellow from "./../page/LinePage/assets/icon/y.png"; +import AlarmTipRed from "./../page/LinePage/assets/icon/r.png"; -const onEquObservable = new Observable(); +// const onEquObservable = new Observable(); const myStyle = { width: "1041px", height: "562px", outline: "none", }; - interface MybabylonJSProps { modelPath: string; // 明确 modelPath 属性的类型为 string } - +interface EqInfoListInterface { + [key: string]: EqInfo[]; +} +interface EqInfo { + name: string; + inputNum: number; + outPut: number; + position: [number, number]; +} +const eqInfoList: EqInfoListInterface = { + "Line1-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 101, outPut: 101, position: [82, 306] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 100, outPut: 100, position: [337, 51] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 100, outPut: 100, position: [521, 4] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [756, 2] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [833, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line1-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [100, 210] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [410, 58] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [594, 252] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [610, 5] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [838, 1] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [837, 145] }, + ], + "Line2-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line2-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [215, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [710, 237] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [502, 58] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [733, 3] }, + ], + "Line3-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "打孔机", inputNum: 101, outPut: 101, position: [338, 156] }, + { name: "打孔机", inputNum: 105, outPut: 105, position: [510, 310] }, + { name: "丝印机", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "丝印机", inputNum: 105, outPut: 105, position: [672, 226] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line3-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [187, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [502, 58] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [733, 3] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [710, 237] }, + ], + "Line4-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [231, 216] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [403, 400] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [643, 276] }, + { name: "二次固化", inputNum: 100, outPut: 100, position: [724, 38] }, + { name: "二次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line4-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [187, 247] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [710, 237] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [820, 237] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [553, 7] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [839, 137] }, + ], + "Line5-1": [ + { name: "磨边机", inputNum: 100, outPut: 100, position: [134, 202] }, + { name: "磨边机", inputNum: 101, outPut: 101, position: [82, 306] }, + { name: "磨边机", inputNum: 105, outPut: 105, position: [342, 400] }, + { name: "一次固化", inputNum: 100, outPut: 100, position: [521, 4] }, + { name: "一次固化", inputNum: 101, outPut: 101, position: [520, 90] }, + { name: "一次固化", inputNum: 105, outPut: 105, position: [672, 287] }, + { name: "二次固化", inputNum: 100, outPut: 100, position: [756, 2] }, + { name: "二次固化", inputNum: 101, outPut: 101, position: [833, 90] }, + { name: "二次固化", inputNum: 105, outPut: 105, position: [835, 186] }, + ], + "Line5-2": [ + { name: "退火", inputNum: 100, outPut: 100, position: [100, 270] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [434, 133] }, + { name: "铺纸机", inputNum: 100, outPut: 100, position: [640, 305] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [645, 54] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [838, 1] }, + { name: "下片机", inputNum: 100, outPut: 100, position: [837, 226] }, + ], +}; +interface EqInfoInterface { + name: string; + data: Array<{ name: string; value: number }>; + position: Array; +} +interface EqInfoDataInterface { + [key: string]: Array; +} +const eqInfoData: EqInfoDataInterface = { + "Line5-1": [ + { + name: "磨边进口", + data: [ + { name: "1支线", value: 413 }, + { name: "2支线", value: 435 }, + { name: "3支线", value: 397 }, + ], + position: [154, 266], + }, + { + name: "磨边清洗出口", + data: [ + { name: "1支线", value: 401 }, + { name: "2支线", value: 418 }, + { name: "3支线", value: 389 }, + ], + position: [331, 177], + }, + { + name: "一次镀膜进口", + data: [ + { name: "1支线", value: 400 }, + { name: "2支线", value: 418 }, + { name: "3支线", value: 388 }, + ], + position: [555, 329], + }, + { + name: "二次镀膜进口", + data: [ + { name: "1支线", value: 387 }, + { name: "2支线", value: 399 }, + { name: "3支线", value: 381 }, + ], + position: [550, 85], + }, + { + name: "二次固化出口", + data: [ + { name: "1支线", value: 384 }, + { name: "2支线", value: 398 }, + { name: "3支线", value: 377 }, + ], + position: [857, 184], + }, + { + name: "钢化进口", + data: [{ name: "钢化进口", value: 1157 }], + position: [870, 48], + }, + ], + "Line5-2": [ + { + name: "钢化出口", + data: [{ name: "钢化出口", value: 1124 }], + position: [305, 255], + }, + { + name: "包装清洗机入口", + data: [ + { name: "包装清洗机5_1", value: 515 }, + { name: "包装清洗机5_2", value: 507 }, + ], + position: [508, 319], + }, + { + name: "包装清洗机出口", + data: [ + { name: "包装清洗机5_1", value: 515 }, + { name: "包装清洗机5_2", value: 505 }, + ], + position: [444, 159], + }, + { + name: "铺纸机", + data: [ + { name: "铺纸机5_1", value: 509 }, + { name: "铺纸机5_2", value: 504 }, + ], + position: [696, 272], + }, + { + name: "下片机械手", + data: [ + { name: "下片机械手5_1", value: 347 }, + { name: "下片机械手5_2", value: 334 }, + { name: "下片机械手5_3", value: 316 }, + ], + position: [712, 28], + }, + ], +}; +interface EqStatusListInterface { + [key: string]: Array<{ + equipment: string; + alarm: boolean; + online: boolean; + }>; +} +const eqStatusList: EqStatusListInterface = { + "Line5-1": [ + { equipment: "磨边机5_1", alarm: false, online: true }, + { equipment: "磨边机5_2", alarm: false, online: true }, + { equipment: "磨边机5_3", alarm: false, online: true }, + { equipment: "清洗机5_1", alarm: false, online: true }, + { equipment: "清洗机5_2", alarm: false, online: true }, + { equipment: "清洗机5_3", alarm: false, online: true }, + { equipment: "一次镀膜5_2", alarm: false, online: true }, + { equipment: "一次镀膜5_3", alarm: false, online: true }, + { equipment: "一次固化5_1", alarm: false, online: true }, + { equipment: "一次镀膜5_1", alarm: false, online: true }, + { equipment: "一次固化5_2", alarm: false, online: true }, + { equipment: "一次固化5_3", alarm: false, online: true }, + { equipment: "二次镀膜5_1", alarm: false, online: true }, + { equipment: "二次镀膜5_2", alarm: false, online: true }, + { equipment: "二次镀膜5_3", alarm: false, online: true }, + { equipment: "二次固化5_1", alarm: false, online: true }, + { equipment: "二次固化5_2", alarm: false, online: true }, + { equipment: "二次固化5_3", alarm: false, online: true }, + ], + "Line5-2": [ + { equipment: "钢化炉5", alarm: false, online: true }, + { equipment: "包装清洗机5_1", alarm: false, online: true }, + { equipment: "包装清洗机5_2", alarm: false, online: true }, + { equipment: "在线铺纸机5_1", alarm: false, online: true }, + { equipment: "在线铺纸机5_2", alarm: false, online: true }, + { equipment: "下片机械手5_1", alarm: false, online: true }, + { equipment: "下片机械手5_2", alarm: false, online: true }, + { equipment: "下片机械手5_3", alarm: false, online: true }, + ], +}; function MybabylonJS({ modelPath }: MybabylonJSProps) { - const EquStatus = useAppSelector(selectEquStatus); + console.log("modelPath:;;;;;;", modelPath); + // const EquStatus = useAppSelector(selectEquStatus); const canvasRef = useRef(null); - onEquObservable.notifyObservers(EquStatus); - const [SelectedMeshName, setSelectedMeshName] = useState(null); + const resetRef = useRef<(() => void) | null>(null); + // onEquObservable.notifyObservers(EquStatus); + const [selectedMeshName, setSelectedMeshName] = useState(null); + const [selectedMeshObj, setSelectedMeshObj] = useState({ + equipment: "", + alarm: false, + online: true, + }); + const [showInfo, setShowInfo] = useState(true); // 使用 useRef 来存储当前加载的模型引用 const currentMeshesRef = useRef>([]); + useEffect(() => { + console.log("canvasRef++++++", canvasRef); + console.log("resetRef++++++", resetRef); // 确保 canvas 引用存在 if (!canvasRef.current) return; - const canvas = canvasRef.current; const engine = new BABYLON.Engine(canvas, true, { preserveDrawingBuffer: true, @@ -50,7 +301,6 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { // This creates a basic Babylon Scene object (non-mesh) const scene = new BABYLON.Scene(engine); scene.clearColor = new BABYLON.Color4(0, 0, 0, 0); - const baseLight = new HemisphericLight( "hemiLight", new Vector3(-1, 1, 0), @@ -70,10 +320,9 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { ? 110 : modelPath.slice(-3) === "5-2" ? 100 - : 80, + : 75, new BABYLON.Vector3(-13, 0, 0) ); - console.log("camera", camera); camera.lowerRadiusLimit = 10; camera.upperRadiusLimit = 600; @@ -106,7 +355,7 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { grid.backFaceCulling = !1; grid.mainColor = new BABYLON.Color3(1, 1, 1); grid.lineColor = new BABYLON.Color3(1, 1, 1); - grid.opacity = 0.8; + grid.opacity = 0; grid.zOffset = 1; grid.opacityTexture = new BABYLON.Texture( "/public/png/backgroundGround.png", @@ -142,25 +391,50 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { LOD0MESH.meshes.map((mesh) => { mesh.isPickable = true; mesh.actionManager = new BABYLON.ActionManager(scene); + // console.log("mesh==========", mesh); + if (modelPath.slice(-1) === "1") { + if ( + mesh.name.includes("磨边") || + mesh.name.includes("清洗") || + mesh.name.includes("镀膜") || + mesh.name.includes("固化") + ) { + // @ts-ignore + hl.addMesh(mesh, BABYLON.Color3.Green()); + } + } else { + if ( + mesh.name.includes("钢化") || + mesh.name.includes("包装") || + mesh.name.includes("铺纸") || + mesh.name.includes("下片机械手") + ) { + // @ts-ignore + hl.addMesh(mesh, BABYLON.Color3.Green()); + } + } + //鼠标移动到物体上亮显 - mesh.actionManager.registerAction( - new BABYLON.ExecuteCodeAction( - BABYLON.ActionManager.OnPointerOverTrigger, - () => { - // @ts-ignore - hl.addMesh(mesh, BABYLON.Color3.Green()); - } - ) - ); - mesh.actionManager.registerAction( - new BABYLON.ExecuteCodeAction( - BABYLON.ActionManager.OnPointerOutTrigger, - () => { - // @ts-ignore - hl.removeMesh(mesh); - } - ) - ); + // mesh.actionManager.registerAction( + // new BABYLON.ExecuteCodeAction( + // BABYLON.ActionManager.OnPointerOverTrigger, + // (a) => { + // console.log("================", a); + // // @ts-ignore + // hl.addMesh(mesh, BABYLON.Color3.Green()); + // } + // ) + // ); + // 鼠标移出物体上不亮 + // mesh.actionManager.registerAction( + // new BABYLON.ExecuteCodeAction( + // BABYLON.ActionManager.OnPointerOutTrigger, + // () => { + // // @ts-ignore + // hl.removeMesh(mesh); + // } + // ) + // ); mesh._scene.onPointerDown = async (event, _pickResult) => { const pickInfo = mesh._scene.pick( @@ -177,29 +451,34 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { const MeshName1 = pickInfo.pickedMesh.name.split(".")[0]; setSelectedMeshName(MeshName1); + eqStatusList[modelPath].map((item: any) => { + if (item.equipment === MeshName1) { + setSelectedMeshObj(item); + } + }); }; }); - onEquObservable.add((eventData, eventState) => { - LOD0MESH.meshes.find((mesh) => { - // @ts-ignore - hl2.removeMesh(mesh); - }); - Object.keys(eventData as EquStatusInterface).map((key) => { - // @ts-ignore - if (eventData[key] == 2) { - // @ts-ignore - EquMap[key].map((name) => { - LOD0MESH.meshes.find((mesh) => { - if (mesh.name == name) { - // @ts-ignore - hl2.addMesh(mesh, BABYLON.Color3.Red()); - } - }); - }); - } - }); - }); + // onEquObservable.add((eventData, eventState) => { + // LOD0MESH.meshes.find((mesh) => { + // // @ts-ignore + // hl2.removeMesh(mesh); + // }); + // Object.keys(eventData as EquStatusInterface).map((key) => { + // // @ts-ignore + // if (eventData[key] == 2) { + // // @ts-ignore + // EquMap[key].map((name) => { + // LOD0MESH.meshes.find((mesh) => { + // if (mesh.name == name) { + // // @ts-ignore + // hl2.addMesh(mesh, BABYLON.Color3.Red()); + // } + // }); + // }); + // } + // }); + // }); } catch (error) { console.error("加载模型失败:", error); } @@ -217,8 +496,12 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { ? 110 : modelPath.slice(-3) === "5-2" ? 100 - : 80; + : 75; + setShowInfo(true); + setSelectedMeshName(null); } + // 外部初始位置按钮 + resetRef.current = reset; let resetCamera = setTimeout(reset, 15000); scene.onPointerObservable.add((pointerInfo) => { @@ -226,6 +509,7 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { case BABYLON.PointerEventTypes.POINTERMOVE: clearTimeout(resetCamera); resetCamera = setTimeout(reset, 15000); + setShowInfo(false); } }); return scene; @@ -234,17 +518,16 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { // call the createScene function const scene = createScene(); - scene.then((scene) => {}); - // run the render loop scene.then( (scene) => { + console.log("createScene被调用了=====", scene); engine.runRenderLoop(function () { scene.render(); }); }, (reason) => { - console.log(reason); + console.log("reason=============", reason); } ); @@ -252,16 +535,107 @@ function MybabylonJS({ modelPath }: MybabylonJSProps) { window.addEventListener("resize", function () { engine.resize(); }); - // 组件卸载时的清理逻辑 return () => { // 清理场景和引擎资源 engine.dispose(); }; }, [modelPath]); - + const resetModel = () => { + //模型初始位置 + console.log("回到初始位置"); + if (resetRef.current) { + resetRef.current(); + } + }; return (
+ {/*

当前选择: {selectedMeshName}

*/} +
+ + 第五产线钢化后段 +
+ {selectedMeshName && ( +
+
+ 设备名称: + {selectedMeshObj.equipment} +
+
+ 报警状态: + + {selectedMeshObj.alarm ? ( + <> + + 报警 + + ) : ( + <> + + 正常 + + )} + +
+
+ 在线状态: + + {selectedMeshObj.online ? ( + <> + + 在线 + + ) : ( + <> + + 离线 + + )} + +
+
+ )} + {showInfo && + eqInfoData[modelPath] && + eqInfoData[modelPath].map((item, index) => { + return ( +
+
{item.name}
+ {item.data.map((info, index) => { + return ( +
+ {info.name}:{info.value} +
+ ); + })} +
+ ); + })} +
); diff --git a/src/page/LinePage/Center/CenterDown.tsx b/src/page/LinePage/Center/CenterDown.tsx index d52f884..18dfe48 100644 --- a/src/page/LinePage/Center/CenterDown.tsx +++ b/src/page/LinePage/Center/CenterDown.tsx @@ -1,15 +1,54 @@ +import ReactECharts from "echarts-for-react"; import TitleBox from "../Component/TitleBox"; -import LineChart from "./LineChart"; import ScrollBoard from "./../../Component/ScrollBoard"; import SwitchButton from "../Component/SwitchButton"; import { useState } from "react"; +import getOptions from "./LineChart/chart.config"; +import { useParams } from "react-router-dom"; function CenterDown() { - const nameList = [{ name: "天" }, { name: "周" }, { name: "月" }]; - const [activeName, setActiveName] = useState(nameList[0].name); + const { LineID } = useParams(); + const lineID = LineID?.toString() || "1-1"; + console.log(lineID.slice(-1)); + // 假数据 + const dataSource = { + day: { + yData1: [76.1, 77.4, 75.2, 74.1, 78.5, 81.3, 79.2], + yData2: [77.2, 78.1, 78.2, 77.1, 79.2, 78.3, 79.5], + yData3: [75.1, 74.3, 71.3, 79.8, 82.3, 81.4, 80.3], + yData4: [82.4, 83.1, 88.4, 85.3, 87.1, 82.5, 84.9], + yData5: [82.3, 81.9, 85.8, 81.9, 84.1, 83.5, 82.3], + }, + week: { + yData1: [120, 200, 150, 80, 100, 89, 69], + yData2: [100, 150, 120, 70, 90, 97, 89], + yData3: [80, 120, 90, 60, 80, 79, 98], + yData4: [60, 90, 70, 40, 60, 69, 98], + yData5: [40, 60, 50, 20, 40, 89, 99], + }, + month: { + yData1: [1200, 2000, 1500, 800, 1000, 999, 889], + yData2: [1000, 1500, 1200, 700, 900, 987, 897], + yData3: [800, 1200, 900, 600, 800, 962, 759], + yData4: [600, 900, 700, 400, 600, 896, 987], + yData5: [400, 600, 500, 200, 400, 986, 951], + }, + }; + const nameList = [ + { name: "天", ename: "day" }, + { name: "周", ename: "week" }, + { name: "月", ename: "month" }, + ]; + const [activeName, setActiveName] = useState(nameList[0].ename); + let chartData = (dataSource as { [key: string]: any })[activeName]; + const handleButtonChange = (activeName: string) => { + setActiveName(activeName); + }; + const options = getOptions(chartData); const config = { header: ["序号", "报警时间", "报警编码", "设备状态"], headerHeight: 36, rowNum: 6, + align: ["center", "left", "left", "left"], headerBGC: "rgba(79, 114, 136, 0.3)", oddRowBGC: "rgba(79, 114, 136, 0.3)", evenRowBGC: "rgba(76, 97, 123, 0.1)", @@ -32,6 +71,138 @@ function CenterDown() { ], ], }; + const config1 = { + header: ["序号", "报警时间", "报警设备", "报警内容"], + headerHeight: 36, + rowNum: 6, + align: ["center", "left", "left", "left"], + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [80, 137, 137, 137], + data: [ + [ + "1", + "2024/8/28 08:32", + "清洗机5_1", + "故障", + ], + [ + "2", + "2024/8/28 06:12", + "清洗机5_1", + "离线", + ], + [ + "3", + "2024/8/28 06:05", + "磨边机5_2", + "离线", + ], + [ + "4", + "2024/8/28 04:43", + "二次镀膜机5_1", + "离线", + ], + [ + "5", + "2024/8/28 02:14", + "磨边机5_1", + "故障", + ], + [ + "6", + "2024/8/27 22:54", + "磨边机5_2", + "离线", + ], + [ + "7", + "2024/8/27 21:55", + "磨边机5_1", + "离线", + ], + [ + "8", + "2024/8/27 21:42", + "一次镀膜机5_2", + "离线", + ], + [ + "9", + "2024/8/27 21:37", + "磨边机5_1", + "离线", + ], + ], + }; + const config2 = { + header: ["序号", "报警时间", "报警设备", "报警内容"], + headerHeight: 36, + rowNum: 6, + align: ["center", "left", "left", "left"], + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [80, 137, 137, 137], + data: [ + [ + "1", + "2024/8/28 07:44", + "下片机械手5_1", + "故障", + ], + [ + "2", + "2024/8/28 07:35", + "下片机械手5_1", + "故障", + ], + [ + "3", + "2024/8/28 03:23", + "在线铺纸机5_1", + "离线", + ], + [ + "4", + "2024/8/28 01:36", + "下片机械手5_2", + "故障", + ], + [ + "5", + "2024/8/28 00:38", + "钢化炉5", + "离线", + ], + [ + "6", + "2024/8/27 23:58", + "下片机械手5_3", + "离线", + ], + [ + "7", + "2024/8/27 23:45", + "下片机械手5_2", + "离线", + ], + [ + "8", + "2024/8/27 22:34", + "钢化炉5", + "离线", + ], + [ + "9", + "2024/8/27 20:31", + "在线铺纸机5_1", + "故障", + ], + ], + }; return (
@@ -40,7 +211,7 @@ function CenterDown() {
321,343
@@ -48,16 +219,28 @@ function CenterDown() { {/* 产线成品率 */}
-
- -
-
- -
+ {/*
+ +
*/} + + {options && ( +
+ {} +
+ )} + {!options && ( +

+ 暂无数据 +

+ )}
); diff --git a/src/page/LinePage/Center/LineChart/chart.config.ts b/src/page/LinePage/Center/LineChart/chart.config.ts index cb9c8e3..5c75f7d 100644 --- a/src/page/LinePage/Center/LineChart/chart.config.ts +++ b/src/page/LinePage/Center/LineChart/chart.config.ts @@ -1,18 +1,19 @@ -import * as echarts from "echarts"; -export default function getOptions() { +export default function getOptions(chartData: any) { + if (Object.keys(chartData).length === 0) { + return null; + } const colors = ["#1A99FF", "#FFB70C", "#C69DFF", "#50F4E3", "#E02094"]; return { color: colors, grid: { top: 38, right: 12, bottom: 26, left: 48 }, legend: { show: true, - icon: "roundRect", top: 10, right: 10, padding: 0, - itemWidth: 10, + itemWidth: 14, itemHeight: 10, - itemGap: 3, + itemGap: 8, height: 10, textStyle: { color: "#DFF1FE", @@ -21,17 +22,18 @@ export default function getOptions() { }, xAxis: { type: "category", - data: Array(7) - .fill(1) - .map((_, index) => { - const today = new Date(); - const dtimestamp = - today.getTime() - (index + 1) * 24 * 60 * 60 * 1000; - return `${new Date(dtimestamp).getMonth() + 1}.${new Date( - dtimestamp - ).getDate()}`; - }) - .reverse(), + data: ["8/22", "8/23", "8/24", "8/25", "8/26", "8/27", "8/28"], + // data: Array(7) + // .fill(1) + // .map((_, index) => { + // const today = new Date(); + // const dtimestamp = + // today.getTime() - (index + 1) * 24 * 60 * 60 * 1000; + // return `${new Date(dtimestamp).getMonth() + 1}.${new Date( + // dtimestamp + // ).getDate()}`; + // }) + // .reverse(), axisLabel: { color: "#fff", fontSize: 14, @@ -73,6 +75,7 @@ export default function getOptions() { tooltip: { trigger: "axis", className: "luoyang-chart-tooltip", + show: false, }, series: [ { @@ -80,35 +83,35 @@ export default function getOptions() { type: "line", symbol: "circle", symbolSize: 4, - data: [20, 32, 10, 34, 90, 30, 20], + data: chartData.yData1, }, { name: "产线2", type: "line", symbol: "circle", symbolSize: 4, - data: [22, 82, 91, 34, 90, 33, 31], + data: chartData.yData2, }, { name: "产线3", type: "line", symbol: "circle", symbolSize: 4, - data: [50, 32, 20, 54, 19, 33, 41], + data: chartData.yData3, }, { name: "产线4", type: "line", symbol: "circle", symbolSize: 4, - data: [30, 32, 30, 34, 90, 33, 32], + data: chartData.yData4, }, { name: "产线5", type: "line", symbol: "circle", symbolSize: 4, - data: [20, 92, 91, 94, 90, 30, 53], + data: chartData.yData5, }, ], }; diff --git a/src/page/LinePage/Center/LineChart/index.tsx b/src/page/LinePage/Center/LineChart/index.tsx deleted file mode 100644 index 5d13da5..0000000 --- a/src/page/LinePage/Center/LineChart/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import ReactECharts from "echarts-for-react"; -import getOptions from "./chart.config"; -function LineChart() { - return ; -} -export default LineChart; diff --git a/src/page/LinePage/Component/SwitchButton/index.css b/src/page/LinePage/Component/SwitchButton/index.css index e885d58..604d81a 100644 --- a/src/page/LinePage/Component/SwitchButton/index.css +++ b/src/page/LinePage/Component/SwitchButton/index.css @@ -4,7 +4,7 @@ .switch-button button { color: #fff; font-size: 18px; - padding: 4px 15px; + padding: 4px 10px; background-color: rgba(49, 135, 140, 0.3); cursor: pointer; } diff --git a/src/page/LinePage/Component/SwitchButton/index.tsx b/src/page/LinePage/Component/SwitchButton/index.tsx index 46fec83..9209c06 100644 --- a/src/page/LinePage/Component/SwitchButton/index.tsx +++ b/src/page/LinePage/Component/SwitchButton/index.tsx @@ -1,23 +1,59 @@ +import { useEffect, useState } from "react"; import "./index.css"; interface Name { name: string; + ename: string; } interface nameListProps { nameList: Name[]; - activeName: string; - setActiveName: (name: string) => void; + onChange: (value: string) => void; +} +function createActiveNameUpdater(nameList: any, activeName: string) { + let activeIndex = nameList.findIndex((obj: any) => obj.name === activeName); + + return function updateActiveName() { + activeIndex = (activeIndex + 1) % nameList.length; + return nameList[activeIndex].ename; + }; } function SwitchButton(props: nameListProps) { + const [activeName, setActiveName] = useState(props.nameList[0].ename); + const [timerId, setTimerId] = useState(null); + let updateActiveName = createActiveNameUpdater(props.nameList, activeName); + useEffect(() => { + const timer = setInterval(() => { + let active = updateActiveName(); + setActiveName(active); + props.onChange(active); + }, 60000); + setTimerId(timer); + return () => { + if (timerId !== null) { + clearInterval(timerId); + } + }; + }, [props.nameList.length]); + const btnClick = (ename: string) => { + if (timerId !== null) { + clearInterval(timerId); + } + setActiveName(ename); + props.onChange(ename); // 通知父组件 + const newTimer = setInterval(() => { + let active = updateActiveName(); + setActiveName(active); + props.onChange(active); + }, 60000); + setTimerId(newTimer); + }; return (
{props.nameList.map((item, index) => { return ( diff --git a/src/page/LinePage/Component/TitleBox/index.tsx b/src/page/LinePage/Component/TitleBox/index.tsx index 9c4c043..dd43a66 100644 --- a/src/page/LinePage/Component/TitleBox/index.tsx +++ b/src/page/LinePage/Component/TitleBox/index.tsx @@ -14,12 +14,12 @@ function TitleBox(props: titleProps) { case "left_up": return { img: Defect, - title: "产线缺陷汇总", + title: "产线报废汇总", }; case "left_down": return { img: Record, - title: "当前产线缺陷", + title: "当前产线报废情况", }; case "center_down_left": return { @@ -39,7 +39,7 @@ function TitleBox(props: titleProps) { default: return { img: InputAndOutput, - title: "各产线投入和产出", + title: "当前产线投入和产出", }; } }; diff --git a/src/page/LinePage/Left/BarChart/chart.config.ts b/src/page/LinePage/Left/BarChart/chart.config.ts index 1ff6774..00a7f4b 100644 --- a/src/page/LinePage/Left/BarChart/chart.config.ts +++ b/src/page/LinePage/Left/BarChart/chart.config.ts @@ -1,15 +1,14 @@ import * as echarts from "echarts"; -export default function getOptions() { - const colors = ["#1A99FF", "#FFB70C", "#C69DFF", "#50F4E3", "#E02094"]; +export default function getOptions(dataProps: number[], color: string[]) { + if (dataProps.length === 0) return null; return { - color: colors, grid: { top: 30, right: 12, bottom: 26, left: 48 }, legend: { show: false, }, xAxis: { type: "category", - data: ["缺陷1", "缺陷2", "缺陷3", "缺陷4", "缺陷5", "缺陷6"], + data: ["磨边后", "包装1", "包装2"], axisLabel: { color: "#fff", fontSize: 14, @@ -55,10 +54,11 @@ export default function getOptions() { type: "shadow", }, className: "luoyang-chart-tooltip", + show: false, }, series: [ { - data: [120, 200, 150, 80, 70, 110], + data: dataProps, type: "bar", barWidth: 10, label: { @@ -69,8 +69,8 @@ export default function getOptions() { }, itemStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#9DD5FF" }, - { offset: 1, color: "#1295FF" }, + { offset: 0, color: color[0] }, + { offset: 1, color: color[1] }, ]), }, }, diff --git a/src/page/LinePage/Left/BarChart/index.tsx b/src/page/LinePage/Left/BarChart/index.tsx deleted file mode 100644 index ff5631c..0000000 --- a/src/page/LinePage/Left/BarChart/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import ReactECharts from "echarts-for-react"; -import getOptions from "./chart.config"; -function BarChart() { - return ; -} -export default BarChart; diff --git a/src/page/LinePage/Left/LeftDown.tsx b/src/page/LinePage/Left/LeftDown.tsx index c3f6193..9ecd183 100644 --- a/src/page/LinePage/Left/LeftDown.tsx +++ b/src/page/LinePage/Left/LeftDown.tsx @@ -1,15 +1,23 @@ +import ReactECharts from "echarts-for-react"; import TitleBox from "../Component/TitleBox"; import SwitchButton from "../Component/SwitchButton"; -import BarChart from "./BarChart"; import ScrollBoard from "./../../Component/ScrollBoard"; import { useState } from "react"; +import getOptions from "./BarChart/chart.config"; function LeftDown() { - const nameList = [{ name: "表单" }, { name: "柱状" }]; - const [activeName, setActiveName] = useState(nameList[0].name); + const nameList = [ + { name: "表单", ename: "table" }, + { name: "柱状", ename: "chart" }, + ]; + const [activeName, setActiveName] = useState(nameList[0].ename); + const handleButtonChange = (activeName: string) => { + setActiveName(activeName); + }; const config = { - header: ["序号", "缺陷种类", "缺陷数量"], + header: ["序号", "工序类型", "报废数量"], headerHeight: 30, rowNum: 4, + align: ["center", "left", "left"], headerBGC: "rgba(79, 114, 136, 0.3)", oddRowBGC: "rgba(79, 114, 136, 0.3)", evenRowBGC: "rgba(76, 97, 123, 0.1)", @@ -27,15 +35,64 @@ function LeftDown() { ["行10列1", "行10列2", "行10列3"], ], }; + const config1 = { + header: ["序号", "工序类型", "报废数量"], + headerHeight: 30, + rowNum: 4, + align: ["center", "left", "left"], + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [73, 117, 190], + data: [ + ["1", "磨边后", 224], + ["2", "包装1", 322], + ["3", "包装2", 66], + ], + }; + const config2 = { + header: ["序号", "工序类型", "报废数量"], + headerHeight: 30, + rowNum: 4, + align: ["center", "left", "left"], + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [73, 117, 190], + data: [ + ["1", "磨边后", 1119], + ["2", "包装1", 1798], + ["3", "包装2", 435], + ], + }; + const config3 = { + header: ["序号", "工序类型", "报废数量"], + headerHeight: 30, + rowNum: 4, + align: ["center", "left", "left"], + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [73, 117, 190], + data: [ + ["1", "磨边后", 5004], + ["2", "包装1", 9122], + ["3", "包装2", 1924], + ], + }; + const color1 = ["#9DD5FF", "#1295FF"]; + const color2 = ["#85F6E9", "#2EC6B4"]; + const dataProps1 = [224, 322, 66]; + const dataProps2 = [1119, 1798, 435]; + const dataProps3 = [5004, 9122, 1924]; + const options1 = getOptions(dataProps1, color1); + const options2 = getOptions(dataProps2, color2); + const options3 = getOptions(dataProps3, color1); return (
- +
@@ -44,13 +101,25 @@ function LeftDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options1 ? ( + ) : ( - +

+ 暂无数据 +

)}
@@ -59,13 +128,25 @@ function LeftDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options2 ? ( + ) : ( - +

+ 暂无数据 +

)}
@@ -74,13 +155,25 @@ function LeftDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options3 ? ( + ) : ( - +

+ 暂无数据 +

)}
diff --git a/src/page/LinePage/Left/LeftUp.tsx b/src/page/LinePage/Left/LeftUp.tsx index a2fdde3..0cd8b82 100644 --- a/src/page/LinePage/Left/LeftUp.tsx +++ b/src/page/LinePage/Left/LeftUp.tsx @@ -1,23 +1,68 @@ +import ReactECharts from "echarts-for-react"; import TitleBox from "../Component/TitleBox"; import SwitchButton from "../Component/SwitchButton"; -import SummaryBarChart from "./SummaryBarChart"; +import getOptions from "./SummaryBarChart/chart.config"; import { useState } from "react"; function LeftUp() { - const nameList = [{ name: "天" }, { name: "周" }, { name: "月" }]; - const [activeName, setActiveName] = useState(nameList[0].name); + // 假数据 + const dataSource = { + day: { + xData: ["钢1线", "钢2线", "钢3线", "钢4线", "钢5线"], + yData1: [236, 214, 196, 239, 224], + yData2: [346, 296, 327, 311, 322], + yData3: [78, 85, 56, 106, 66], + sumData: [660, 595, 579, 656, 612], + }, + week: { + xData: ["钢1线", "钢2线", "钢3线", "钢4线", "钢5线"], + yData1: [1336, 1223, 1313, 1134, 1119], + yData2: [2146, 1996, 2053, 1857, 1798], + yData3: [892, 658, 467, 758, 435], + sumData: [4374, 3877, 3833, 3749, 3352], + }, + month: { + xData: ["钢1线", "钢2线", "钢3线", "钢4线", "钢5线"], + yData1: [5789, 6432, 4679, 5456, 5004], + yData2: [8762, 9732, 8137, 8820, 9122], + yData3: [2468, 3120, 2782, 2395, 1924], + sumData: [17019, 19284, 15598, 16671, 16050], + }, + }; + const nameList = [ + { name: "天", ename: "day" }, + { name: "周", ename: "week" }, + { name: "月", ename: "month" }, + ]; + const [activeName, setActiveName] = useState(nameList[0].ename); + let chartData = (dataSource as { [key: string]: any })[activeName]; + const handleButtonChange = (activeName: string) => { + setActiveName(activeName); + }; + const options = getOptions(chartData); return (
- -
-
- +
+ {options && ( +
+ {} +
+ )} + {!options && ( +

+ 暂无数据 +

+ )}
); } diff --git a/src/page/LinePage/Left/SummaryBarChart/chart.config.ts b/src/page/LinePage/Left/SummaryBarChart/chart.config.ts index 3e093e7..d05d190 100644 --- a/src/page/LinePage/Left/SummaryBarChart/chart.config.ts +++ b/src/page/LinePage/Left/SummaryBarChart/chart.config.ts @@ -1,18 +1,21 @@ -import * as echarts from "echarts"; -export default function getOptions() { - const colors = ["#1A99FF", "#FFB70C", "#C69DFF", "#50F4E3", "#E02094"]; +export default function getOptions(chartData: any) { + if (Object.keys(chartData).length === 0) { + return null; + } + const colors = ["#2760FF", "#8167F6", "#5B9BFF", "#99D66C", "#FFD160"]; + let sum = chartData.sumData; return { color: colors, - grid: { top: 38, right: 12, bottom: 26, left: 48 }, + grid: { top: 48, right: 20, bottom: 5, left: 15, containLabel: true }, legend: { show: true, icon: "roundRect", top: 10, - right: 10, + right: 20, padding: 0, itemWidth: 10, itemHeight: 10, - itemGap: 3, + itemGap: 15, height: 10, textStyle: { color: "#DFF1FE", @@ -21,19 +24,10 @@ export default function getOptions() { }, xAxis: { type: "category", - // data: Array(7) - // .fill(1) - // .map((_, index) => { - // const today = new Date(); - // const dtimestamp = today - (index+1) * 24 * 60 * 60 * 1000; - // return `${new Date(dtimestamp).getMonth() + 1}.${new Date( - // dtimestamp - // ).getDate()}`; - // }) - // .reverse(), + data: chartData.xData, axisLabel: { color: "#fff", - fontSize: 14, + fontSize: 16, }, axisTick: { show: false }, axisLine: { @@ -52,7 +46,7 @@ export default function getOptions() { type: "value", axisLabel: { color: "#fff", - fontSize: 14, + fontSize: 16, formatter: "{value}", }, axisLine: { @@ -70,73 +64,84 @@ export default function getOptions() { }, }, tooltip: { + show: false, trigger: "axis", axisPointer: { type: "shadow", }, className: "luoyang-chart-tooltip", }, - dataset: { - source: [ - ["product", "产线1", "产线2", "产线3", "产线4", "产线5"], - ["缺陷1", 43, 85, 93, 60, 80], - ["缺陷2", 83, 73, 55, 67, 90], - ["缺陷3", 86, 65, 82, 68, 90], - ["缺陷4", 72, 53, 39, 88, 50], - ["缺陷5", 72, 53, 39, 88, 50], - ], - }, // Declare several bar series, each will be mapped // to a column of dataset.source by default. series: [ { + data: chartData.yData1, type: "bar", - barWidth: 8, - itemStyle: { - color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#9DD5FF" }, - { offset: 1, color: "#1295FF" }, - ]), + stack: "a", + name: "磨边后", + barWidth: 14, + label: { + show: true, + position: "right", + color: "inherit", }, }, { + data: chartData.yData2, type: "bar", - barWidth: 8, - itemStyle: { - color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#FFC844" }, - { offset: 1, color: "#FFB70C" }, - ]), + stack: "a", + name: "包装1", + label: { + show: true, + position: "right", + color: "inherit", }, }, { + data: chartData.yData3, type: "bar", - barWidth: 8, - itemStyle: { - color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#FF8BC3" }, - { offset: 1, color: "#EB46A1" }, - ]), + stack: "a", + name: "包装2", + label: { + show: true, + position: "right", + color: "inherit", }, }, + // { + // data: chartData.yData4, + // type: "bar", + // stack: "a", + // name: "镀膜", + // label: { + // show: true, + // position: "right", + // color: "inherit", + // }, + // }, + // { + // data: chartData.yData5, + // type: "bar", + // stack: "a", + // name: "包装", + // label: { + // show: true, + // position: "right", + // color: "inherit", + // }, + // }, { + data: [0, 0, 0, 0, 0], type: "bar", - barWidth: 8, - itemStyle: { - color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#85F6E9" }, - { offset: 1, color: "#2EC6B4" }, - ]), - }, - }, - { - type: "bar", - barWidth: 8, - itemStyle: { - color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { offset: 0, color: "#9496FF" }, - { offset: 1, color: "#6567FF" }, - ]), + stack: "a", + name: "", + label: { + show: true, + position: "top", + color: "#fff", + formatter: function (params: any) { + return sum[params.dataIndex]; + }, }, }, ], diff --git a/src/page/LinePage/Left/SummaryBarChart/index.tsx b/src/page/LinePage/Left/SummaryBarChart/index.tsx deleted file mode 100644 index d019ede..0000000 --- a/src/page/LinePage/Left/SummaryBarChart/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import ReactECharts from "echarts-for-react"; -import getOptions from "./chart.config"; -function SummaryBarChart() { - return ; -} -export default SummaryBarChart; diff --git a/src/page/LinePage/Right/LineChart/chart.config.ts b/src/page/LinePage/Right/LineChart/chart.config.ts index 723cbe6..18bd639 100644 --- a/src/page/LinePage/Right/LineChart/chart.config.ts +++ b/src/page/LinePage/Right/LineChart/chart.config.ts @@ -1,9 +1,12 @@ import * as echarts from "echarts"; -export default function getOptions() { +export default function getOptions(tempData: any) { + if (Object.keys(tempData).length === 0) { + return null; + } const colors = ["#1A99FF", "#50F4E3"]; return { color: colors, - grid: { top: 38, right: 12, bottom: 26, left: 48 }, + grid: { top: 30, right: 12, bottom: 10, left: 10, containLabel: true }, legend: { show: true, icon: "roundRect", @@ -21,17 +24,18 @@ export default function getOptions() { }, xAxis: { type: "category", - data: Array(7) - .fill(1) - .map((_, index) => { - const today = new Date(); - const dtimestamp = - today.getTime() - (index + 1) * 24 * 60 * 60 * 1000; - return `${new Date(dtimestamp).getMonth() + 1}.${new Date( - dtimestamp - ).getDate()}`; - }) - .reverse(), + data: tempData.time, + // data: Array(7) + // .fill(1) + // .map((_, index) => { + // const today = new Date(); + // const dtimestamp = + // today.getTime() - (index + 1) * 24 * 60 * 60 * 1000; + // return `${new Date(dtimestamp).getMonth() + 1}.${new Date( + // dtimestamp + // ).getDate()}`; + // }) + // .reverse(), axisLabel: { color: "#fff", fontSize: 14, @@ -76,19 +80,20 @@ export default function getOptions() { type: "line", symbol: "circle", symbolSize: 4, - data: [20, 32, 10, 34, 90, 30, 20], + data: tempData.input, }, { name: "产出", type: "line", symbol: "circle", symbolSize: 4, - data: [22, 82, 91, 34, 90, 33, 31], + data: tempData.output, }, ], tooltip: { trigger: "axis", className: "luoyang-chart-tooltip", + show: false, }, }; } diff --git a/src/page/LinePage/Right/LineChart/index.tsx b/src/page/LinePage/Right/LineChart/index.tsx deleted file mode 100644 index ff5631c..0000000 --- a/src/page/LinePage/Right/LineChart/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import ReactECharts from "echarts-for-react"; -import getOptions from "./chart.config"; -function BarChart() { - return ; -} -export default BarChart; diff --git a/src/page/LinePage/Right/RightDown.tsx b/src/page/LinePage/Right/RightDown.tsx index 9e6a3da..b4b3954 100644 --- a/src/page/LinePage/Right/RightDown.tsx +++ b/src/page/LinePage/Right/RightDown.tsx @@ -1,11 +1,122 @@ +import ReactECharts from "echarts-for-react"; import TitleBox from "../Component/TitleBox"; import SwitchButton from "../Component/SwitchButton"; -import LineChart from "./LineChart"; import ScrollBoard from "./../../Component/ScrollBoard"; import { useState } from "react"; +import getOptions from "./LineChart/chart.config"; function RightDown() { - const nameList = [{ name: "表单" }, { name: "折线" }]; - const [activeName, setActiveName] = useState(nameList[0].name); + // 假数据 + let tempData = [ + { + type: "day", + data: { + time: [ + "0:00", + "1:00", + "2:00", + "3:00", + "4:00", + "5:00", + "6:00", + "7:00", + "8:00", + "9:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + ], + input: [ + 456, 425, 246, 424, 453, 466, 412, 434, 425, 418, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + ], + output: [ + 432, 401, 232, 398, 421, 439, 378, 411, 400, 394, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + ], + }, + }, + { + type: "week", + data: { + time: [ + "2024/8/22", + "2024/8/23", + "2024/8/24", + "2024/8/25", + "2024/8/26", + "2024/8/27", + "2024/8/28", + ], + input: [9753, 10357, 11246, 10123, 9872, 9985, 10352], + output: [7925, 8216, 9091, 7847, 7589, 8126, 8112], + }, + }, + { + type: "month", + data: { + time: [ + "2024/8/1", + "2024/8/2", + "2024/8/3", + "2024/8/4", + "2024/8/5", + "2024/8/6", + "2024/8/7", + "2024/8/8", + "2024/8/9", + "2024/8/10", + "2024/8/11", + "2024/8/12", + "2024/8/13", + "2024/8/14", + "2024/8/15", + "2024/8/16", + "2024/8/17", + "2024/8/18", + "2024/8/19", + "2024/8/20", + "2024/8/21", + "2024/8/22", + "2024/8/23", + "2024/8/24", + "2024/8/25", + "2024/8/26", + "2024/8/27", + "2024/8/28", + "2024/8/29", + "2024/8/30", + "2024/8/31", + ], + input: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9813, 9753, + 10357, 11246, 10123, 9872, 9985, 10352, 4235, 0, 0, 0, + ], + output: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7883, 7925, + 8216, 9091, 7847, 7589, 8126, 8112, 3962, 0, 0, 0, + ], + }, + }, + ]; + const nameList = [ + { name: "表单", ename: "table" }, + { name: "折线", ename: "chart" }, + ]; + const [activeName, setActiveName] = useState(nameList[0].ename); + const handleButtonChange = (activeName: string) => { + setActiveName(activeName); + }; const config = { header: ["时间", "投入数量", "产出数量"], headerHeight: 30, @@ -27,15 +138,72 @@ function RightDown() { ["行10列1", "行10列2", "行10列3"], ], }; + const config1 = { + header: ["时间", "投入数量", "产出数量"], + headerHeight: 30, + rowNum: 5, + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [120, 130, 130], + data: [], + }; + const config2 = { + header: ["时间", "投入数量", "产出数量"], + headerHeight: 30, + rowNum: 5, + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [120, 130, 130], + data: [], + }; + const config3 = { + header: ["时间", "投入数量", "产出数量"], + headerHeight: 30, + rowNum: 5, + headerBGC: "rgba(79, 114, 136, 0.3)", + oddRowBGC: "rgba(79, 114, 136, 0.3)", + evenRowBGC: "rgba(76, 97, 123, 0.1)", + columnWidth: [120, 130, 130], + data: [], + }; + let data1Lenght = tempData[0].data.input.length; + for (let i = 0; i < data1Lenght; i++) { + (config1.data as any).push([ + tempData[0].data.time ? tempData[0].data.time[i] : "-", + tempData[0].data.input ? tempData[0].data.input[i] : "-", + tempData[0].data.output ? tempData[0].data.output[i] : "-", + ]); + } + let data2Lenght = tempData[1].data.input.length; + for (let i = 0; i < data2Lenght; i++) { + (config2.data as any).push([ + tempData[1].data.time ? tempData[1].data.time[i] : "-", + tempData[1].data.input ? tempData[1].data.input[i] : "-", + tempData[1].data.output ? tempData[1].data.output[i] : "-", + ]); + } + let data3Lenght = tempData[0].data.input.length; + for (let i = 0; i < data3Lenght; i++) { + (config3.data as any).push([ + tempData[2].data.time ? tempData[2].data.time[i] : "-", + tempData[2].data.input ? tempData[2].data.input[i] : "-", + tempData[2].data.output ? tempData[2].data.output[i] : "-", + ]); + } + + const chartData1 = tempData[0].data; + const chartData2 = tempData[1].data; + const chartData3 = tempData[2].data; + const options1 = getOptions(chartData1); + const options2 = getOptions(chartData2); + const options3 = getOptions(chartData3); return (
- +
@@ -44,13 +212,25 @@ function RightDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options1 ? ( + ) : ( - +

+ 暂无数据 +

)}
@@ -59,13 +239,25 @@ function RightDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options2 ? ( + ) : ( - +

+ 暂无数据 +

)}
@@ -74,13 +266,25 @@ function RightDown() {
- {activeName === "表单" ? ( + {activeName === "table" ? ( + ) : options3 ? ( + ) : ( - +

+ 暂无数据 +

)}
diff --git a/src/page/LinePage/Right/RightUp.tsx b/src/page/LinePage/Right/RightUp.tsx index b56b579..9107cbc 100644 --- a/src/page/LinePage/Right/RightUp.tsx +++ b/src/page/LinePage/Right/RightUp.tsx @@ -2,24 +2,20 @@ import TitleBox from "../Component/TitleBox"; import ScrollBoard from "./../../Component/ScrollBoard"; function RightUp() { const config = { - header: ["产线", "上片数据量", "成品下片数量", "成品下片"], + header: ["序号", "产线", "上片数据量", "成品下片数量"], headerHeight: 32, rowNum: 5, + align: ["center", "left", "left", "left"], headerBGC: "rgba(79, 114, 136, 0.3)", oddRowBGC: "rgba(79, 114, 136, 0.3)", evenRowBGC: "rgba(76, 97, 123, 0.1)", - columnWidth: [73, 100, 117, 90], + columnWidth: [70, 90, 106, 114], data: [ - ["1", "行1列1", "行1列2", "行1列3"], - ["2", "行2列1", "行2列2", "行2列3"], - ["3", "行3列1", "行3列2", "行3列3"], - ["4", "行4列1", "行4列2", "行4列3"], - ["5", "行5列1", "行5列2", "行5列3"], - ["6", "行6列1", "行6列2", "行6列3"], - ["7", "行7列1", "行7列2", "行7列3"], - ["8", "行8列1", "行8列2", "行8列3"], - ["9", "行9列1", "行9列2", "行9列3"], - ["10", "行10列1", "行10列2", "行10列3"], + ["1", "钢1线", "82315", "64268"], + ["2", "钢2线", "78246", "61235"], + ["3", "钢3线", "79092", "63562"], + ["4", "钢4线", "84125", "66789"], + ["5", "钢5线", "85223", "68246"], ], }; return ( diff --git a/src/page/LinePage/assets/icon/g.png b/src/page/LinePage/assets/icon/g.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1b107ec0e4dd82fbdefa76046f6a3ae69e82ef GIT binary patch literal 2359 zcmV-73CQ+|P)^j*$BGZ4AnuFe zlPJb{MX8 zr|9ihbY*j7*Xd6>`L6_ppBkqPC-+0Nzfx#MVUL$|xHbHTbKvE=Llvw&8=j~H#g9UG z2>van^v)mL_1--Kv*VJ6zPw~E;IPRm2g#HZ1}}hB{v(cF>v!l;O{zp z)+;)XkMsUe#N-ATCz?7xd)evZ5J# zMdH#QwXlhg`H;X?ZH!{EqQ^>;noL?sD_(;rS1GG2?rmzbJFUgRfjAlCoaW+VYE7hy zPh?6@lFTU-j1e=ymS;q3hj}GZd^6JEc1y=LFYB^}Ou7_i%WdV4X3{4hdV;0T^D|)X zAHRX&p9sC4%3nQ_J5?pCFRRf#m_}1MN~JVQ^qWyv zGcM6x5Im91Y9XC3D4-gRJqvbMY(~gDDi=n_VU`u%S>0naG8+#HfW+`nSGQ8vAn7YA z8Btl;prul`rKHzTBfVeHJpuE?prK<)SM^D32Sn~LXRB%gh;)a@Z-A54M6Jy^z1N*5 z4YoHF0P~mhR5e$3CXzczZV95FV4u@g49 z$UQ<9o`(25+6kEZGh}}w4C`3(PNeMZnkvgLX<-l}->s-UHm1r9mE<_oM`8X6>mD~o zQ41G%e-?9p!vNhK!@3jLwhkAc81_GfpR>XN%9|DSI~UZ* zyp^X|6YWg-U4(Gr{4HYm>;0_6<^|U7;DMdWWodh79*srQOG2a9*DM=`yv!2|-0|Np z_6tb?vm>kvOO(5J%Sx6Lz1OoW8xCYv%qeM2s(mX~WU<&}=?FPb46o32_^0W4EQpqt zRNihtV7z-#CpYAk6t5%|<#ozdo&5sJ1Nt1m*zU;#p6RX?(_M`12{3Us?g?7tR30q= zm8zLhwX*vehs5_=u)DH+VnWytM%aS{5-Se`-2RMMEESm zzfL49@4_K&AnNzP!noYvUwYi$(V!;xm1>0d=Aj*akbVzjpXR-Y6!Qlf_!jZ|6j7j= zs6-UYv}C|Nh&}pFsp|>@=x-FkQl4o54Vc1W7y(vpz_Ofv=z$CaVIUpIbF>b}CCr7M z+UT;VkXS1mn;KZJ;0Wc0-ZqL2Kz*1go8hewXMuYI6>q|8b;0h_$jxaz9(>eN(_7?q zaeh&sA=MrAKv`*YIvfSY@*ZfD{!NU#OJqJ?82vuhz-Qg$MdrWqL#c0iWvkSL73vB{ zvb#O0sQ0Q~&x&q>ykPgX1 ze+#pzg>K(K%RK8=j!)@sJkV5y)Ksy2%qiyjlvg>=2?|RX0?K8n0<88O5~DoD^JoWe zcTz>2o;sar)^2Df-Cu@H^Faf4?ZFUxqzn2RnjzO9&W%c#r}C@*!;-&1?E{Iz`Knitp7{V daQoo@e*qMdq~cR23YP!?002ovPDHLkV1ng5Rh0k$ literal 0 HcmV?d00001 diff --git a/src/page/LinePage/assets/icon/r.png b/src/page/LinePage/assets/icon/r.png new file mode 100644 index 0000000000000000000000000000000000000000..d11591e802d06ebd56723cfe495080b8d8730b7e GIT binary patch literal 2110 zcmYL~c{tRI8pnUL7)FUfvL$9LLs9lEh3w1N*Fkg?F_UZwlV$9(6y{cT#=azkEYpHQ zS%#4HM$X`bv5X~ahkNgH?)yBS=llJ>&-eZNO)$skv$68C0sz2fXrNUW9eWl43gQP&wxDCKfdu~XdLT3a`Oh8< z0C9H#=>IyHV?CKC$DG{!SHbzZhv5TgL*wZ{Xk$06bzRfDA1~*8qUo z(@;mt+8$o~OdaQB!x6hcpKe-F3A^1hi2);2kl=Gq0TCuC4h00Vupqw>D#9;ngcjlE zj!)Frid;k&Xc-vHD2NIZZ*X4hba{7k>CqHrXX9{z{xax1^Sa8=a<;n1o&MhJ7pfk8 zjwmID;?^eD1@&#@;;EU!fkcm}sAs=a;M@~}W>~?zdh4Ie@$t`#p_!rU30zU5o^AbJ z?&Hg1>@jAq)^cq77(!-PZd3W-4uoa-mjug|faS5UP7ImQ-F`o2S1~Kc*_c;cykDEZ zQy!G#zQN#`c>6#dWuuR;_qNz)qIzSZcz#%w`iQtLknEBxPkJ{R>i`+7= z*5FhPm&TC8$_$#HL)FTXi?9EneR`IS_2sA~XOl_lzs4$l)~0&Q&2_^Y+p9d)pf+h_3jv_h$POhY~y1b==9U2rnS5m1~mJ~79SXcJT0DCBg^xB5e?41 zX?#{zceAntUYpFLeJy+S5K`c4iQ29Ldq~?Ukmh4-z zvYH9ap#<2hL`Gl!BI|69Sz4p{SXVoo`zjE|8hh@6apT(oqFscI>m<=tqo)L?q@(hF zSv)h`M|L&2aIwW-@^n_GI2`%Gc(NzGW)`^KzsWvmxE@o8qaHZyR?|2ca3qrzBz#(58IiAlGy9(RSCTiBQ$CPWKLdNQqq{# zS-f{DUsQJO@bFiq@EH(Ok9@^@sakuak~jW$!_1}o?ZuXn85c zfulz{yV6yXO{5~kHqK8DUshwiNhy z+%TGRo@>=DcGQp!GFc*plt5HF0NpjqFDXTV>-y+Rm#ib$BPekTlr9*F$LH+0xmFU3 zZp_f7C>!7UE9F`{X9o5;+6Cz{?_1v!1k6KPqqbMNpK1}*Q;6wkbmTs8UjB?l^29h! zh;Ux4$zX>qx+7Z4Hp3`O>H77@X)xl?ppGjGVgqH`RuY*g7slGX0^uQT340k-AT~9b zR&6gRYyd%fmin=M#BTPPVx6i)O7B#-uA-@NdisOE9%h~)x&KkiJJD;>?Wa$bWqhs8 zHyumHvVMFP!C7Nzs7iAi8p$yc=R!=4?d>7?Q>W5n&P-4G%1>=5mnnaZ$KMXH z@cZ1%;|{loeN(ciDl~Hb20Pp;9pVK9GH-=+?CnEjwM2vQB6$Ye=%xKZzpf2_x2-R zE7_@iu1C%eJ1ciO;k{U5ATvm#hUU5&=M+O}Q9YeC<%C$IFiL603gry4mDT=klWjH9 zvNWxmUmskafr9KKgkYb{6<~85{jF&0& zCw=~2DAGDQsHB;@ZVfSAeclDTGZe^OaU^#JCwEiNWuSy9 z#hs6G7HMIY%cI5+?ygtSEU1XkcjFkP5CE|n5M6h=wd;FWd3YWqEc&8O-t#T61=(}$ zB^-CFeM@fc$kw4J{&d#QB>yW?=Qis?xIg5&lS;xBt`2z2=~D}oTLLQ6>QpL(X0g@t zX$jf=AEPyhlEfax(@IpQ7Zr`$;jwAvAp!U@J5i1HotR*~O2J_jsk0j4UiM`{Mf^2; zrR|D+2X?Z*<9zvcZvvDW(i18DX|Q6`g?+jL1H#PjUP|W|%WNkNKeVjL+js=)kReXW z?KE~VhLf(v*0OQCb3bQg!lWi;bjogU9a+7HwT4U zH-mIGi9OBPcsTP2H^EMc2nr#fIj2blm@;wE)ybUu9ehuEs?uk&dMll`YTDkYx2ngM zDSV+R7@|@e%5yQg9ub*ojB{GX|fnMa+7T|+VXGt{2|5?p&G@862^4pI5 lymo&4e&)jvUFA4wcfr zlRLT1SxAm=X!!E`{hsgd{XDPdbv&>4^ZxgJ@6tuI0G}iu2m}%^H8Hf>W9UA3xIiF) zBf{*)p5buQ!{~uP)oJ|f>zsQY?`mgy3xffj*wZ{94nPvLp8|V04@mv1jRAQOOJAM$^_U;R*?vc5;WekS&TAkY!SJ^)iI`10O; zgsGvPjU8`pmic`L^x=eETKFH-h|Z~I7yL~Lv|h&1B+fw)KXfSl5#qjGI;Yj4BTBJ$ z(DX}k{KASH`u5N(B2tHh`43%!L%C$(!XanGVXp~aV>eVux7V9}$FAKi@v&@1*2564 zW8riDH{u&r{i^2u)A+_^UURSebxXS^+z;cQ;7>@_3c$ z>PG%oxNF#q2%|>6vaOdkJ@bi!VJDM2YsZSdhny-KVbe0`gW(l6USu53-l)5+I|yUi zRKeJ`wp?0dE_gn`}9c{*lmM>zpEPER8V)uT`*cd zSa_Y36^DWiUpPwRoT%>|mTD5tZne@y*s4m6iYZWhPITh>+>8gTXOqT0%rzaWVC%2@mBW|M zu4iR5YB08)rBt_OQUu%kJ*5>;>kvEt#!SWRXIkCVn&$1BJ6i=-x$af+pDZU!tdlg7 zmk?mect0gh@JqF6Ql-bjF8xZVSo?GrSlIq@ZKQ+gx&dKcb}9lK$V3NyC@k#^ zP$qDs-d(9@2N&mUP)=d1MUq31+ff2rQJ{GG%F++Ui?I(;T9vaCcZ$rngV*c-tjZf& z=un%!rxtdcKt7uSj`ka0OHM8meU%pf0`Q5*x=Ok-1!1 z33Z2k7>#UKeKGF*rd7nTvn?#4{lj67mQ>ZsRZTcl4fl4+r-V9MT4^SjFK+*!?6OSR zOO1XPvZN+Uv#K$=QOMJr{u(0Oh`P|5M2MG~BuQi5X0n}skF)E=I1Ojg0>9y>v%4wp zc#wXbe2Ha7K!6MLIk)6)B5GjjZy#wMg_t0&+CDp5H64t&jNu>6e6%s!*O;o_HiT!Gy&ddxMInXWZ18}Ibe^%;1`Y|*U_QRlx8ty{r{oS*Z;@8H5cKjq z=k>rE!Y9f#ijxyzVv!*SQEZ#V*3f8LPp5x9_;u&=sZBHK`Kh>)7J?A-^yrUO_cimS z9P(>Ol`TK|V%)6bPP5q1BpI?TxK*qM!U@@VTFAHg#Ige1XH{`iIe(ShROUt7+;`*7 zS=R(RXeM2M@B{Yy&u?d?EQgJg=*7YtmZYFkspIg6{?jj8MMG0khj^NZ2{I#yck`U` zrf|`Yxn61Ume1zCrPU|uGtPe0OiSn0Z%q)^mf@B?5b^B7bLAb#khdt~WM)mNq*ai} z%=^LvUyMc%oTMBx>JsOxMB}?DdAOnX{vbLToWWX@j$j>q^MYHa5?Q$ zzHA=q5w-W$0M+=#1>C{+;xT}O%9<>3JvvMs3Q>Ti-^el)f;H2+hz)gBEn3|om^HN^ z{se|VcDoPBOT*hbgk3`$l*C>|tGpM1EKpNX%poHz)t4wHYP&r2jY9=Zwcl23xJP=H zRxl;S6ZD?w5Ud*_^)|gzA2{|D2%J7BS%$5Re;rH+KIg=J-Ajc9IL#Ibv0?&y!NPa) zMCwwib=xQd6D-XYs2EHMaPe|}^m3q(3vx`6_R>#G>zAIZRY^XjO6;`*SD6RNu#4I0>}Up{)*!Nm zCEYqc)&?rtM7tOD$aiuJKDOyArIsU)HxvUpOmv=sf6ZH0#0YsC;=I_({hnXxnD7Gx zGrEIyyL1~XV>2bJdt;*1LT{UA{0rJD%pm`;{6~*a-sD%OOzw*HEK9z#^@BRb05#)H zpSZD>*jzHsE3eLN8dn&9&0jaDPK?IDdD~h^`6{RP#;?7rVe{SKsy19s*Hd5tl zt=J0U)UvJif1F-tSEvb=YgP>W7G;nji!3-a(ESgyNrAl1#pZyo@mKlZ#(i>&GB$dWJcR^PAJezA4~9 z&c34^Wx*PW^5qL;xt*MM2CP=Dqff7HsGeQeeEcf}BW38V-TwQ0@)5(M; literal 0 HcmV?d00001 diff --git a/src/page/LinePage/assets/svg/alarmTip.svg b/src/page/LinePage/assets/svg/alarmTip.svg new file mode 100644 index 0000000..265f3f0 --- /dev/null +++ b/src/page/LinePage/assets/svg/alarmTip.svg @@ -0,0 +1,23 @@ + + + 矩形备份 16 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/page/LinePage/index.css b/src/page/LinePage/index.css index 9a18902..62a62e2 100644 --- a/src/page/LinePage/index.css +++ b/src/page/LinePage/index.css @@ -64,6 +64,7 @@ background: url(../../../public/png/rect/lp_center_up.png) no-repeat; background-size: 100% 100%; background-position: 0 0; + position: relative; } .center_down { width: 1041px; @@ -168,6 +169,7 @@ height: 185px; /* padding-bottom: 5px; */ } +/* 滚动表格部分 */ .dv-scroll-board .header .header-item, .dv-scroll-board .rows .ceil { border-right: 1px solid #0d1728; @@ -177,7 +179,7 @@ border-right: none; border: none; } - +/* chart图部分 */ .luoyang-chart-tooltip { background: #0a2b4f77 !important; border: none !important; @@ -187,3 +189,76 @@ .luoyang-chart-tooltip * { color: #fff !important; } +/* 三维页面部分 */ +.center_up .model_name { + position: absolute; + left: 0px; + top: 0px; + z-index: 1000; +} +.center_up .model_info { + position: absolute; + left: 100px; + bottom: 0px; + z-index: 1000; + width: 841px; + height: 62px; + background: url(/public/png/lp/line_part.png) 100% no-repeat; + background-size: 100% 100%; +} +.center_up .model_info .reset_btn { + position: absolute; + top: 20px; + left: 40px; + width: 140px; + height: 40px; + cursor: pointer; +} +.center_up .model_info .title { + display: inline-block; + width: 361px; + text-align: center; + font-size: 32px; + color: #fff; + letter-spacing: 5px; + position: absolute; + left: 241px; + bottom: 10px; +} +.center_up .eq_detail_info { + position: absolute; + right: 0px; + bottom: 0px; + z-index: 1002; + width: 240px; + height: 110px; + background: url(/public/png/lp/eq_msg_detail.png) 100% no-repeat; + background-size: 100% 100%; + color: #fff; + padding: 15px 0 0 15px; +} +.center_up .eq_detail_info .left_name { + display: inline-block; + width: 95px; + height: 28px; + text-align: right; + font-size: 18px; +} +.center_up .eq_detail_info .right_value { + display: inline-block; + height: 28px; + font-size: 18px; +} +.center_up .eq_info { + position: absolute; + z-index: 1002; + background: url(/public/png/lp/eq_msg_always.png) 100% no-repeat; + background-size: 100% 100%; + color: #fff; + padding: 10px 15px; +} +.center_up .eq_info .eq_info_inner { + height: 20px; + font-size: 18px; + white-space: nowrap; +}