|  |  | 
 |  |  | <template> | 
 |  |  |   <div> | 
 |  |  |     <div> | 
 |  |  |       <div class="Stackerbox"> | 
 |  |  |         <div class="card"> | 
 |  |  |           <div class="card-header"> | 
 |  |  |             <div> | 
 |  |  |               <div class="card-body Stacker"> | 
 |  |  |                 {{ StackerOne.deviceName }} | 
 |  |  |               </div> | 
 |  |  |             </div> | 
 |  |  |           </div> | 
 |  |  |           <div class="card-body"> | 
 |  |  |             <ul class="list-group"> | 
 |  |  |               <li class="list-group-item list-group-item-secondary"> | 
 |  |  |                 任务号:{{ StackerOne.data.currentTaskNum || '暂无任务号' }} | 
 |  |  |               </li> | 
 |  |  |               <li :class="getStatusClass(StackerOne.data.stackerCraneAutoStatusDes)"> | 
 |  |  |                 工作模式:{{ StackerOne.data.stackerCraneAutoStatusDes }} | 
 |  |  |               </li> | 
 |  |  |               <li :class="getStatusClass(StackerOne.data.stackerCraneStatusDes)"> | 
 |  |  |                 设备状态:{{ StackerOne.data.stackerCraneStatusDes }} | 
 |  |  |               </li> | 
 |  |  |               <li :class="getStatusClass(StackerOne.data.stackerCraneWorkStatusDes)"> | 
 |  |  |                 工作状态:{{ StackerOne.data.stackerCraneWorkStatusDes }} | 
 |  |  |               </li> | 
 |  |  |             </ul> | 
 |  |  |           </div> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |     <device-line v-for="device in devices" :key="device.deviceName" :device="device" /> | 
 |  |  |   </div> | 
 |  |  | </template> | 
 |  |  |  | 
 |  |  | <script setup> | 
 |  |  | import { onMounted, reactive, toRefs } from "vue"; | 
 |  |  | import eventBus from "@/uitils/eventBus"; | 
 |  |  | import DeviceLine from "@/components/DeviceLine.vue"; | 
 |  |  |  | 
 |  |  | // 堆垛机 | 
 |  |  | const StackerOne = reactive({ | 
 |  |  |   deviceName: "", | 
 |  |  |   data: { | 
 |  |  |   } | 
 |  |  | }); | 
 |  |  |  | 
 |  |  | // 设备列表(修改重复设备名称) | 
 |  |  | const devices = reactive([ | 
 |  |  |   { deviceName: "陈化出库输送线", data: { command: {}, commandWrite: {}, writeInteractiveSignal: [] } }, | 
 |  |  |   { deviceName: "陈化入库输送线", data: { command: {}, commandWrite: {}, writeInteractiveSignal: [] } }, | 
 |  |  |   // { deviceName: "堆垛机1", data: { command: {}, commandWrite: {}, writeInteractiveSignal: [] } }, | 
 |  |  |   // Add all devices similarly... | 
 |  |  | ]); | 
 |  |  |  | 
 |  |  | // 获取状态类名(优化状态判断) | 
 |  |  | const getStatusClass = (status) => { | 
 |  |  |   if (status === '正常' || status === '自动' || status === '待机') { | 
 |  |  |     return 'list-group-item list-group-item-success'; | 
 |  |  |   } | 
 |  |  |   if (status === '故障' || status === '停机') { | 
 |  |  |     return 'list-group-item list-group-item-danger'; | 
 |  |  |   } | 
 |  |  |   return 'list-group-item list-group-item-warning'; // 默认警告状态 | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | // 监听设备数据变化 | 
 |  |  | onMounted(() => { | 
 |  |  |   eventBus.on('locationData', eventData => { | 
 |  |  |     const device = devices.find(d => d.deviceName === eventData.deviceName); | 
 |  |  |     if (device) { | 
 |  |  |       // 使用扩展运算符更新对象属性,保持响应性 | 
 |  |  |       device.data = { ...device.data, ...eventData.data }; | 
 |  |  |     } | 
 |  |  |   }); | 
 |  |  | }); | 
 |  |  | </script> | 
 |  |  | <style scoped> | 
 |  |  | .Stackerbox { | 
 |  |  |   width: 220px; | 
 |  |  |   float: left; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .Linebox { | 
 |  |  |   width: 500px; | 
 |  |  |   float: left; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .box1 { | 
 |  |  |   float: left; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .card-body { | 
 |  |  |   text-align: center; | 
 |  |  |   border-radius: 6%; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .Stacker { | 
 |  |  |   background-color: burlywood; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .lis { | 
 |  |  |   float: left; | 
 |  |  |   width: 233px; | 
 |  |  | } | 
 |  |  | </style> | 
 |  |  |   <el-row> | 
 |  |  |      <el-col :span="3"> | 
 |  |  |        | 
 |  |  |        <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker> | 
 |  |  |      </el-col> | 
 |  |  |      <el-col :span="21"> | 
 |  |  |        <device-line v-for="device in devices" :key="device.deviceName" :device="device" /> | 
 |  |  |      </el-col> | 
 |  |  |    </el-row> | 
 |  |  |  </template> | 
 |  |  |   | 
 |  |  |  <script setup> | 
 |  |  |  import { onMounted, reactive, toRefs } from "vue"; | 
 |  |  |  import eventBus from "@/uitils/eventBus"; | 
 |  |  |  import DeviceLine from "@/components/DeviceLine.vue"; | 
 |  |  |  import DeviceStacker from "@/components/DeviceStacker.vue"; | 
 |  |  |   | 
 |  |  |  // 堆垛机 | 
 |  |  |  const Stackers = reactive([]); | 
 |  |  |   | 
 |  |  |  // 设备列表(修改重复设备名称) | 
 |  |  |  const devices = reactive([]); | 
 |  |  |   | 
 |  |  |  const intToBitArrayFromBinaryString = (num, numBits) => { | 
 |  |  |    let binaryString = num.toString(2).padStart(numBits, '0'); | 
 |  |  |    return Array.from({ length: numBits }, (_, index) => binaryString[index] === '1'); | 
 |  |  |  }; | 
 |  |  |   | 
 |  |  |  // 监听设备数据变化 | 
 |  |  |  onMounted(() => { | 
 |  |  |    eventBus.on('locationData', eventData => { | 
 |  |  |      console.log(eventData) | 
 |  |  |      if (eventData.deviceName === "陈化入库输送线"||eventData.deviceName === "陈化入库输送线") { | 
 |  |  |   | 
 |  |  |        if (devices.length <= 0) { | 
 |  |  |          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode }); | 
 |  |  |        } | 
 |  |  |        else { | 
 |  |  |          const device = devices.find(c => c.childDeviceCode == eventData.childDeviceCode) | 
 |  |  |          if (device) { | 
 |  |  |            const number = eventData.data.commandWrite.writeInteractiveSignal; | 
 |  |  |            const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8) | 
 |  |  |            eventData.data.writeInteractiveSignal = writeInteractiveSignal; | 
 |  |  |            device.data = eventData.data | 
 |  |  |          } | 
 |  |  |          else { | 
 |  |  |            const number = eventData.data.commandWrite.writeInteractiveSignal; | 
 |  |  |            const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8) | 
 |  |  |            eventData.data.writeInteractiveSignal = writeInteractiveSignal; | 
 |  |  |            devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode }); | 
 |  |  |          } | 
 |  |  |        } | 
 |  |  |      } | 
 |  |  |    }); | 
 |  |  |    eventBus.on('stackerData', eventData => { | 
 |  |  |      if (eventData.deviceName == "陈化1号堆垛机"||eventData.deviceName == "陈化2号堆垛机") { | 
 |  |  |        if (Stackers.length == 0) { | 
 |  |  |          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data }); | 
 |  |  |        } | 
 |  |  |        else { | 
 |  |  |          const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName); | 
 |  |  |          if (Stacker) { | 
 |  |  |            Stacker.data = eventData.data | 
 |  |  |          } | 
 |  |  |          else { | 
 |  |  |            Stackers.push({ deviceName: eventData.deviceName, data: eventData.data }); | 
 |  |  |          } | 
 |  |  |        } | 
 |  |  |      } | 
 |  |  |    }) | 
 |  |  |  }); | 
 |  |  |  </script> | 
 |  |  |  <style scoped> | 
 |  |  |  .Stackerbox { | 
 |  |  |    width: 220px; | 
 |  |  |    float: left; | 
 |  |  |  } | 
 |  |  |   | 
 |  |  |  .Linebox { | 
 |  |  |    width: 500px; | 
 |  |  |    float: left; | 
 |  |  |  } | 
 |  |  |   | 
 |  |  |  .box1 { | 
 |  |  |    float: left; | 
 |  |  |  } | 
 |  |  |   | 
 |  |  |  .card-body { | 
 |  |  |    text-align: center; | 
 |  |  |    border-radius: 6%; | 
 |  |  |  } | 
 |  |  |   | 
 |  |  |  .Stacker { | 
 |  |  |    background-color: burlywood; | 
 |  |  |  } | 
 |  |  |   | 
 |  |  |  .lis { | 
 |  |  |    float: left; | 
 |  |  |    width: 233px; | 
 |  |  |  } | 
 |  |  |  </style> |