From 3cd89b88edd913530062e13e20e7d6b866fd190f Mon Sep 17 00:00:00 2001 From: helongyang <647556386@qq.com> Date: 星期五, 19 九月 2025 10:02:43 +0800 Subject: [PATCH] 更新 --- 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue | 177 ++- 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue | 230 +++-- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs | 2 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue | 138 ++- 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue | 294 +++--- 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue | 302 +++--- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 133 ++ 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs | 11 代码管理/WCS/WIDESEAWCS_Client/src/views/Login.vue | 1170 ++++++++++++++++++++-------- 9 files changed, 1,574 insertions(+), 883 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Login.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Login.vue" index c61c0e8..78a3fb9 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Login.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Login.vue" @@ -1,386 +1,864 @@ <template> - <div class="login-container"> - <div class="project-name">WIDESEA_WMS</div> - <div class="login-form"> - <div class="form-user" @keypress="loginPress"> - <div class="login-text"> - <div> - <div>娆㈣繋鐧诲綍...</div> - <div class="login-line"></div> - </div> - <div style="flex:1;"></div> - </div> - <div class="login-text-small">WELCOME TO LOGIN</div> - <div class="item"> - <div class="input-icon el-icon-user"></div> - <input type="text" v-focus v-model="userInfo.userName" placeholder="璇疯緭鍏ヨ处鍙�" /> - </div> - <div class="item"> - <div class="input-icon el-icon-lock"></div> - <input type="password" v-focus v-model="userInfo.password" placeholder="璇疯緭鍏ュ瘑鐮�" /> - </div> - <div class="item"> - <div class="input-icon el-icon-mobile"></div> - - <input v-focus type="text" v-model="userInfo.verificationCode" placeholder="杈撳叆楠岃瘉鐮�" /> - <div class="code" @click="getVierificationCode"> - <img v-show="codeImgSrc != ''" :src="codeImgSrc" /> - </div> - </div> + <div id="vol-container" :class="['vol-theme-' + theme]"> + <div class="vol-aside" :style="{ width: menuWidth + 'px' }"> + <div class="header" :style="{ width: menuWidth - 1 + 'px' }"> + <img v-show="!isCollapse" v-bind:src="logo" /> + <i + @click="toggleLeft" + class="collapse-menu" + :class="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'" + /> </div> - <div class="loging-btn"> - <el-button size="large" :loading="loading" color="#3a6cd1" :dark="true" @click="login" long> - <span v-if="!loading">鐧诲綍</span> - <span v-else>姝e湪鐧诲綍...</span> - </el-button> + <div class="vol-menu"> + <el-scrollbar style="height: 100%"> + <VolMenu + :currentMenuId="currentMenuId" + :on-select="onSelect" + :enable="true" + :open-select="false" + :isCollapse="isCollapse" + :list="menuOptions" + ></VolMenu> + </el-scrollbar> </div> - - <!-- 璐﹀彿淇℃伅 --> - <!-- <div class="account-info"> - <p>婕旂ず璐﹀彿锛歛dmin666 瀵嗙爜:123456</p> - <p>鏈湴璐﹀彿锛歛dmin 瀵嗙爜:123456</p> - <p><a href="https://jq.qq.com/?_wv=1027&k=Sqstuy0M" style="text-decoration: none" - target="_blank">QQ3缇�:743852316</a> - - <a href="http://v2.volcore.xyz/document/guide" style="text-decoration: none" target="_blank">妗嗘灦鏂囨。</a> - </p> - </div> --> - <!-- 閾炬帴浣嶇疆 --> - <!-- <div class="app-link" > - <a href="#" style="text-decoration: none">绉诲姩绔壂鐮�</a> - <a> - <i class="el-icon-chat-dot-round"></i> 灏忕▼搴� - <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/wechat.jpg" /></a> - <a> - <i class="el-icon-apple"></i> - Android - <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/Android.png" /></a> - <a> - <i class="el-icon-document"></i> - H5 - <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/H5.png" /></a> - </div> --> </div> + <div class="vol-container" :style="{ left: menuWidth - 1 + 'px' }"> + <div class="vol-header"> + <div class="project-name">WMS</div> + <div class="header-text"> + <div class="h-link"> + <a + href="javascript:void(0)" + @click="to(item)" + v-for="(item, index) in links.filter((c) => { + return !c.icon; + })" + :key="index" + > + <span v-if="!item.icon">{{ item.text }}</span> + <i v-else :class="item.icon"></i> + </a> + </div> + </div> + <div class="header-info"> + <div class="h-link"> + <a + href="javascript:void(0)" + @click="to(item)" + v-for="(item, index) in links.filter((c) => { + return c.icon; + })" + :key="index" + > + <span v-if="!item.icon">{{ item.text }}</span> + <i v-else :class="item.icon"></i> + </a> + </div> + <!--娑堟伅绠$悊--> + <div class="h-link" @click="messageModel = true"> + <a> + <i class="el-icon-message-solid"> + <el-badge + :value="messageList.length" + :type="messageList.length > 0 ? 'danger' : 'success'" + class="item" + style="width: 10px" + ></el-badge> + </i> + </a> + </div> + <div> + <img class="user-header" :src="userImg" :onerror="errorImg" /> + </div> + <div class="user"> + <span>{{ userName }}</span> + <span id="index-date"></span> + </div> + <div class="settings"> + <i style="font-size: 20px" class="el-icon-s-tools" @click="drawer_model = true" /> + </div> + </div> + </div> + <div class="vol-path"> + <el-tabs + @tab-click="selectNav" + @tab-remove="removeNav" + @contextmenu.prevent="bindRightClickMenu(false)" + type="border-card" + class="header-navigation" + v-model="selectId" + :strtch="false" + > + <el-tab-pane + v-for="(item, navIndex) in navigation" + type="card" + :name="navIndex + ''" + :closable="navIndex > 0" + :key="navIndex" + :label="item.name" + > + <span style="display: none">{{ navIndex }}</span> + </el-tab-pane> + </el-tabs> + <!-- 鍙抽敭鑿滃崟 --> + <div v-show="contextMenuVisible"> + <ul :style="{ left: menuLeft + 'px', top: menuTop + 'px' }" class="contextMenu"> + <li v-show="visibleItem.all"> + <el-button link @click="closeTabs()"> + <i class="el-icon-close"></i> + {{ + navigation.length == 2 ? "鍏抽棴鑿滃崟" : "鍏抽棴鎵�鏈�" + }} + </el-button> + </li> + <li v-show="visibleItem.left"> + <el-button link @click="closeTabs('left')"> + <i class="el-icon-back"></i>鍏抽棴宸﹁竟 + </el-button> + </li> + <li v-show="visibleItem.right"> + <el-button link @click="closeTabs('right')"> + <i class="el-icon-right"></i>鍏抽棴鍙宠竟 + </el-button> + </li> + <li v-show="visibleItem.other"> + <el-button link @click="closeTabs('other')"> + <i class="el-icon-right"></i>鍏抽棴鍏朵粬 + </el-button> + </li> + </ul> + </div> + </div> + <div class="vol-main" id="vol-main"> + <el-scrollbar style="height: 100%" v-if="permissionInited"> + <loading v-show="$store.getters.isLoading()"></loading> + <router-view v-slot="{ Component }"> + <keep-alive> + <component + :is="Component" + :key="$route.name" + v-if=" + !$route.meta || + ($route.meta && !$route.meta.hasOwnProperty('keepAlive')) + " + /> + </keep-alive> + <component + :is="Component" + :key="$route.name" + v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')" + /> + </router-view> + </el-scrollbar> + </div> + </div> + <el-drawer title="閫夋嫨涓婚" v-model="drawer_model" direction="rtl" destroy-on-close> + <div class="theme-selector"> + <div + @click="changeTheme(item.name)" + class="item" + v-for="(item, index) in theme_color" + :key="index" + :style="{ background: item.color }" + > + <div + v-show="item.leftColor" + :style="{ background: item.leftColor }" + style="height: 100%; width: 20px" + class="t-left" + ></div> + <div class="t-right"></div> + </div> + </div> + </el-drawer> - <!-- 椤甸潰搴曢儴 --> - <!-- <div class="login-footer"> - <a style="text-decoration: none" href="https://beian.miit.gov.cn/" target="_blank">浜琁CP澶�19056538鍙�-1</a> - - - <a href="https://dotnet9.com/" style="text-decoration: none" target="blank">Dotnet9</a> - <a href="https://space.bilibili.com/525836469" style="text-decoration: none" target="blank">NET瑙嗛鏁欑▼(寰蒋MVP-ACE褰曞埗)</a> - <a href="https://www.cctalk.com/m/group/90268531" style="text-decoration: none" target="blank">VOL妗嗘灦瑙嗛</a> - <a href="http://120.48.115.252:9990" style="text-decoration: none" target="blank">瑙嗛婕旂ず鍦板潃</a> - </div> --> - - <img class="login-bg" src="/static/login_bg.png" /> + <el-drawer title="娑堟伅鍒楄〃" v-model="messageModel" direction="rtl" destroy-on-close size="40%"> + <Message :list="messageList"></Message> + </el-drawer> </div> </template> - - -<script > +<style lang="less" scoped> +@import "./index/index.less"; +</style> +<script> +import loading from "@/components/basic/RouterLoading"; +import VolMenu from "@/components/basic/VolElementMenu.vue"; +import Message from "./index/Message.vue"; +import MessageConfig from "./index/MessageConfig.js"; +var imgUrl = require("@/assets/imgs/wms_x.png"); +var $this; +var $interval; +var $indexDate; import { defineComponent, - ref, reactive, - toRefs, - getCurrentInstance -} from 'vue'; -import { useRouter, useRoute } from 'vue-router'; -import store from '../store/index'; -import http from '@/../src/api/http.js'; + ref, + watch, + onMounted, + getCurrentInstance, + h +} from "vue"; +import { useRouter, useRoute } from "vue-router"; +import store from "../store/index"; +import http from "@/../src/api/http.js"; +import { ElNotification } from "element-plus"; +import { useStore } from "vuex"; + export default defineComponent({ - setup(props, context) { - store.commit('clearUserInfo', ''); - const loading = ref(false); - const codeImgSrc = ref(''); - const userInfo = reactive({ - userName: '', - password: '', - verificationCode: '', - UUID: undefined - }); + components: { + VolMenu, + loading, + Message + }, - const getVierificationCode = () => { - http.get('/api/User/getVierificationCode').then((x) => { - codeImgSrc.value = 'data:image/png;base64,' + x.img; - userInfo.UUID = x.uuid; - }); - }; - getVierificationCode(); - - let appContext = getCurrentInstance().appContext; - let $message = appContext.config.globalProperties.$message; - let router = useRouter(); - - const login = () => { - if (!userInfo.userName) return $message.error('璇疯緭鍏ョ敤鎴峰悕'); - if (!userInfo.password) return $message.error('璇疯緭鍏ュ瘑鐮�'); - if (!userInfo.verificationCode) { - return $message.error('璇疯緭鍏ラ獙璇佺爜'); - } - loading.value = true; - http.post('/api/User/login', userInfo, '姝e湪鐧诲綍....').then((result) => { - if (!result.status) { - loading.value = false; - getVierificationCode(); - return $message.error(result.message); - } - $message.success('鐧诲綍鎴愬姛,姝e湪璺宠浆!'); - store.commit('setUserInfo', result.data); - router.push({ path: '/' }); - }); - }; - const loginPress = (e) => { - if (e.keyCode == 13) { - login(); - } - }; - const openUrl = (url) => { - window.open(url, '_blank'); - }; + data() { return { - loading, - codeImgSrc, - getVierificationCode, - login, - userInfo, - loginPress, - openUrl + allTabs: true, + leftTabs: true, + rightTabs: true, + otherTabs: true, + menuLeft: 0, + menuTop: 0 }; }, - directives: { - focus: { - inserted: function (el) { - el.focus(); + setup(props, context) { + let client = ref(null); + // 鑺傛祦鐩稿叧鍙橀噺锛堝欢杩熸椂闂村缓璁�300-500ms锛屾牴鎹悗绔帹閫侀鐜囪皟鏁达級 + const THROTTLE_DELAY = 300; // 寤惰繜鏇存柊鏃堕棿锛堟绉掞級 + let lastUpdateTime = ref(0); // 涓婁竴娆℃洿鏂版椂闂� + let latestWsData = ref(null); // 缂撳瓨鏈�鏂扮殑WebSocket鏁版嵁 + let throttleTimer = ref(null); // 鑺傛祦瀹氭椂鍣� + + // 鑾峰彇鍏ㄥ眬灞炴�у拰鏂规硶 + const { proxy } = getCurrentInstance(); + + // 鑿滃崟瀵艰埅榛樿瀹藉害 + const menuWidth = ref(200); + const contextMenuVisible = ref(false); + const isCollapse = ref(false); + const drawer_model = ref(false); + const messageModel = ref(false); + const theme_color = ref([ + { name: "blue", color: "rgb(45, 140, 240)" }, + { name: "blue2", color: "rgb(45, 140, 240)", leftColor: "#0068d6" }, + { name: "red", color: "rgb(237, 64, 20)" }, + { name: "red2", color: "rgb(237, 64, 20)", leftColor: "#a90000" }, + { name: "dark", color: "#272929" }, + { name: "orange", color: "#ff9900" }, + { name: "orange2", color: "#ff9900", leftColor: "rgb(232 141 5)" }, + { name: "green", color: "rgb(25, 190, 107)" }, + { name: "green2", color: "rgb(25, 190, 107)", leftColor: "#019e4f" }, + { name: "white", color: "#fff" } + ]); + const links = ref([ + { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" }, + { + text: "瀹夊叏閫�鍑�", + path: "/login", + id: -4, + icon: "el-icon-switch-button" } + ]); + const errorImg = ref( + 'this.src="' + require("@/assets/imgs/error-img.png") + '"' + ); + const selectId = ref("1"); + // 銆愰椤点�戞爣绛惧簭鍙�(褰撳墠鍙抽敭閫変腑鐨勮彍鍗�) + const selectMenuIndex = ref("0"); + //2022.05.29澧炲姞tab閫夐」涓庤彍鍗曡仈鍔ㄥ姛鑳� + const currentMenuId = ref(0); + const userName = ref("--"); + const userTrueName = ref("--"); + const userInfo = ref({}); + const visibleItem = reactive({ + left: false, + right: false, + all: false, + other: false + }); + const userImg = ref(""); + const navigation = reactive([ + { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" } + ]); + const logo = ref(imgUrl); + const theme = ref("blue2"); + const menuOptions = ref([]); + const permissionInited = ref(false); + const messageList = reactive([]); + let _config = getCurrentInstance().appContext.config.globalProperties; + let router = useRouter(); + const toggleLeft = () => { + isCollapse.value = !isCollapse.value; + menuWidth.value = isCollapse.value ? 63 : 200; + }; + //2021.08.28寮�鏀炬墜鍔ㄦ姌鍙犺彍鍗曟柟娉� + _config.menu = { + show() { + toggleLeft(); + }, + hide() { + toggleLeft(); + } + }; + const Store = useStore(); + const s = ref(null); + + // 鑺傛祦澶勭悊WebSocket鏁版嵁锛堟牳蹇冮�昏緫锛� + const handleThrottledWsData = (rawData) => { + // 缂撳瓨鏈�鏂版暟鎹紙纭繚鏈�缁堟洿鏂扮敤鐨勬槸鏈�鏂板�硷級 + latestWsData.value = rawData; + const now = Date.now(); + + // 鎯呭喌1锛氳窛绂讳笂娆℃洿鏂拌秴杩囧欢杩熸椂闂达紝鐩存帴澶勭悊 + if (now - lastUpdateTime.value >= THROTTLE_DELAY) { + processAndUpdateData(); + lastUpdateTime.value = now; + } + // 鎯呭喌2锛氭湭瓒呰繃寤惰繜鏃堕棿锛岀敤瀹氭椂鍣ㄥ欢杩熷鐞嗭紙閬垮厤閲嶅瑙﹀彂锛� + else { + if (throttleTimer.value) clearTimeout(throttleTimer.value); + throttleTimer.value = setTimeout(() => { + processAndUpdateData(); + lastUpdateTime.value = Date.now(); + }, THROTTLE_DELAY); + } + }; + + // 缁熶竴澶勭悊骞舵洿鏂版暟鎹紙閬垮厤閲嶅浠g爜锛� + const processAndUpdateData = () => { + if (!latestWsData.value) return; + try { + // 瑙f瀽WebSocket鏁版嵁 + const parsedData = typeof latestWsData.value === 'string' + ? JSON.parse(latestWsData.value) + : latestWsData.value; + + // 1. 鏇存柊Vuex涓殑homedata + store.dispatch("sethomedata", parsedData); + + // 2. 澶勭悊娑堟伅鍒楄〃 + if (parsedData.title && parsedData.message) { + messageList.push(parsedData); + // 鏄剧ず閫氱煡 + ElNotification({ + title: parsedData.title, + message: h("i", { style: "color: teal" }, parsedData.message), + position: "bottom-right" + }); + } + } catch (err) { + console.error("WebSocket鏁版嵁澶勭悊澶辫触锛�", err); + } + }; + + // WebSocket杩炴帴閫昏緫锛堜娇鐢ㄨ妭娴佸鐞嗘暟鎹級 + const createSocket = url => { + // 鍏抽棴宸叉湁杩炴帴锛堥伩鍏嶉噸澶嶈繛鎺ワ級 + if (client.value) { + client.value.close(); + } + + // 鍒涘缓WebSocket杩炴帴 + client.value = new WebSocket("ws:localhost:9260/"); + + client.value.onopen = function() { + console.log("WebSocket 杩炴帴鎴愬姛"); + }; + + // 鏀跺埌娑堟伅鍚庝氦缁欒妭娴佸嚱鏁板鐞� + client.value.onmessage = function(event) { + if (event && event.data) { + handleThrottledWsData(event.data); + } + }; + + client.value.onclose = function() { + console.log("WebSocket 杩炴帴鍏抽棴"); + // 閲嶈繛閫昏緫 + setTimeout(() => createSocket(url), 5000); + }; + + client.value.onerror = function(err) { + console.log("WebSocket 杩炴帴閿欒: ", err); + // 閿欒鍚庨噸杩� + setTimeout(() => createSocket(url), 5000); + }; + }; + + const changeTheme = name => { + if (theme.value != name) { + theme.value = name; + } + localStorage.setItem("vol3_theme", name); + }; + const to = item => { + if (item.path == "#") { + window.open("https://github.com/cq-panda/Vue.NetCore"); + return; + } + if (item.path.indexOf("http") != -1) { + window.open(item.path); + return; + } + if (typeof item == "string" || item.path == "/login") { + if (item == "/login" || item.path == "/login") { + store.commit("clearUserInfo", ""); + window.location.href = "/"; + return; + } + router.push({ path: item }); + return; + } + if (item.path == "#") return; + open(item); + }; + const open = (item, useRoute) => { + let _index = navigation.findIndex(x => { + return x.path == item.path; + }); + if (_index == -1) { + navigation.push({ + id: item.id + "", + name: item.name || item.text || "鏃犳爣棰�", + path: item.path, + query: item.query + }); + selectId.value = navigation.length - 1 + ""; + } else { + selectId.value = _index + ""; + } + if (useRoute === undefined) { + setItem(item); + router.push(item); + } + currentMenuId.value = item.id * 1; + // tab鑿滃崟缁戝畾鍙抽敭浜嬩欢 + proxy.$nextTick(function(e) { + proxy.bindRightClickMenu(true); + }); + }; + const close = path => { + let index = navigation.findIndex(x => { + return x.path == path; + }); + if (index == -1) { + return _config.$Message.error("鏈壘鍒拌彍鍗�"); + } + removeNav(index); + }; + const setItem = item => { + localStorage.setItem( + window.location.origin + "_tabs", + JSON.stringify(item) + ); + }; + const getItem = () => { + let nav = localStorage.getItem(window.location.origin + "_tabs"); + return nav ? JSON.parse(nav) : null; + }; + const selectNav = item => { + selectId.value = item.props.name; + let _path = navigation[item.index].path; + currentMenuId.value = ( + menuOptions.value.find(c => { + return c.path == _path; + }) || { id: 0 } + ).id; + + router.push({ + path: navigation[item.index].path, + query: navigation[item.index].query + }); + }; + + const removeNav = _index => { + return new Promise(() => { + //鍏抽棴鐨勫綋鍓嶉」,璺宠浆鍒板墠涓�涓〉闈� + if (selectId.value == _index + "") { + setItem(navigation[_index - 1]); + router.push({ + path: navigation[_index - 1].path, + query: navigation[_index - 1].query + }); + navigation.splice(_index, 1); + selectId.value = selectId.value - 1 + ""; + return; + } + if (_index < selectId.value) { + selectId.value = selectId.value - 1 + ""; + } + navigation.splice(_index, 1); + currentMenuId.value = ( + menuOptions.value.find(c => { + return c.path == navigation[selectId.value * 1].path; + }) || { id: 0 } + ).id; + }); + }; + + const getSelectMenuName = id => { + return menuOptions.value.find(function(x) { + return x.id == id; + }); + }; + const onSelect = treeId => { + var item = getSelectMenuName(treeId); + open(item, false); + }; + + /** + * 鏄剧ず鍙抽敭鑿滃崟 + */ + const openTabsMenu = function(e) { + e.preventDefault(); + let tabId = e.target.id.split("-")[1] * 1; + + //璁板綍褰撳墠閫変腑鐨勮彍鍗昳ndex + selectMenuIndex.value = + document.getElementById("pane-" + tabId).children[0].textContent * 1; + //鍙湁棣栭〉鏃朵笉鏄剧ず + if (navigation.length == 1) { + return; + } + + //棣栭〉璁剧疆鏄剧ず鍏抽棴鍙宠竟鑿滃崟 + if (!selectMenuIndex.value) { + visibleItem.all = false; + visibleItem.right = true; + visibleItem.left = false; + visibleItem.other = false; + } else { + visibleItem.all = true; + //涓嶆槸鏈�鍚庝竴涓樉绀哄叧闂彸杈硅彍鍗� + visibleItem.right = selectMenuIndex.value != navigation.length - 1; + //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴宸﹁竟 + visibleItem.left = navigation.length != 2; + //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴鍏朵粬 + visibleItem.other = navigation.length != 2; + } + contextMenuVisible.value = true; + // 璁剧疆鍙抽敭鑿滃崟鏄剧ず鐨勪綅缃� + proxy.menuLeft = + e.target.getBoundingClientRect().left - (isCollapse.value ? 63 : 198); + proxy.menuTop = 36; + }; + + /** + * 鍏抽棴鍙抽敭鑿滃崟 + */ + const closeTabsMenu = () => { + contextMenuVisible.value = false; + }; + const toHome = () => { + open({ + text: navigation[0].name, + path: navigation[0].path + }); + }; + /** + * 鍏抽棴鍏跺畠鏍囩椤� + */ + const closeTabs = value => { + let _menuId = navigation[selectId.value * 1].id; + let currnetIndex = selectId.value * 1; + switch (value) { + case "left": { + // 鍒犻櫎宸︿晶tab鏍囩 + navigation.splice(1, currnetIndex - 1); + break; + } + case "right": { + // 鍒犻櫎鍙充晶tab鏍囩 + if (selectMenuIndex.value == 0) { + navigation.splice(currnetIndex); + toHome(); + } else { + navigation.splice(currnetIndex + 1); + if (selectMenuIndex.value < currnetIndex) { + navigation.splice( + selectMenuIndex.value, + currnetIndex - selectMenuIndex.value + ); + } + } + break; + } + case "other": { + // 鍒犻櫎鍏朵粬鎵�鏈塼ab鏍囩 + navigation.splice(currnetIndex + 1); + navigation.splice(1, currnetIndex - 1); + break; + } + default: { + //鍏抽棴鎵�鏈� + navigation.splice(1, navigation.length); + toHome(); + break; + } + } + selectId.value = + navigation.findIndex(c => { + return c.id == _menuId; + }) + ""; + closeTabsMenu(); + }; + + watch( + () => contextMenuVisible.value, + (newVal, oldVal) => { + if (newVal) { + document.body.addEventListener("click", closeTabsMenu); + } else { + document.body.removeEventListener("click", closeTabsMenu); + } + } + ); + + /** + * 绯荤粺鍒涘缓寮�濮� + */ + const created = () => { + let _theme = localStorage.getItem("vol3_theme"); + if (_theme) { + theme.value = _theme; + } + + let _userInfo = store.getters.getUserInfo(); + if (_userInfo) { + userName.value = _userInfo.userName; + userTrueName.value = _userInfo.userTrueName; + if (_userInfo.img) { + userImg.value = _config.base.getImgSrc(_userInfo.img, http.ipAddress); + } + } + + createSocket(window.webConfig.webSocketUrl); + + Object.assign(_config.$tabs, { open: open, close: close }); + + http.get("api/Sys_Menu/getTreeMenu", {}, true).then(data => { + data.push({ id: "1", name: "棣栭〉", url: "/home" }); + data.forEach(d => { + d.path = (d.url || "").replace("/Manager", ""); + d.to = (d.url || "").replace("/Manager", ""); + if (!d.icon || d.icon.substring(0, 3) != "el-") { + d.icon = "el-icon-menu"; + } + }); + + store.dispatch("setPermission", data); + menuOptions.value = data; + permissionInited.value = true; + + //寮�鍚秷鎭帹閫� + if (_config.$global.signalR) { + MessageConfig(http, result => { + messageList.unshift(result); + }); + } + + //褰撳墠鍒锋柊鏄笉鏄椤� + if (router.currentRoute.value.path != navigation[0].path) { + //鏌ユ壘绯荤粺鑿滃崟 + let item = menuOptions.value.find(x => { + return x.path == router.currentRoute.value.path; + }); + if (item) return onSelect(item.id); + //鏌ユ壘椤堕儴蹇嵎杩炴帴 + item = links.value.find(x => { + return x.path == router.currentRoute.value.path; + }); + //鏌ユ壘鏈�鍚庝竴娆¤烦杞殑椤甸潰 + if (!item) { + item = getItem(); + } + if (item) { + return open(item, false); + } + } + selectId.value = "1"; + }); + }; + created(); + return { + menuWidth, + isCollapse, + drawer_model, + theme_color, + errorImg, + userInfo, + userName, + userTrueName, + userImg, + selectId, + selectMenuIndex, + navigation, + links, + onSelect, + openTabsMenu, + selectNav, + getSelectMenuName, + removeNav, + logo, + theme, + menuOptions, + permissionInited, + changeTheme, + to, + toggleLeft, + messageModel, + messageList, + contextMenuVisible, + visibleItem, + closeTabsMenu, + closeTabs, + currentMenuId + }; + }, + /** + * 鎸傝浇閽╁瓙鍑芥暟 + */ + mounted() { + let _date = showTime(); + $indexDate = document.getElementById("index-date"); + $indexDate.innerText = _date; + $interval = setInterval(function() { + $indexDate.innerText = showTime(); + }, 1000); + + this.bindRightClickMenu(true); + }, + + methods: { + /** + * 缁戝畾鍙抽敭浜嬩欢 + */ + bindRightClickMenu(enable) { + if (!enable) return; + let that = this; + // 浣跨敤鍘熺敓js 涓哄崟涓猟om缁戝畾榧犳爣鍙冲嚮浜嬩欢 + that.$nextTick(() => { + let tab_top_dom = Object.assign( + [], + document.getElementsByClassName("el-tabs__item is-top") + ); + tab_top_dom.forEach((item, index) => { + item.oncontextmenu = that.openTabsMenu; + }); + }); + } + }, + + /** + * 閿�姣侀挬瀛愬嚱鏁� + */ + destroyed() { + $this = null; + clearInterval($interval); + // 鍏抽棴WebSocket杩炴帴 + if (client && client.value) { + client.value.close(); } } }); +const week = new Array( + "鏄熸湡涓�", + "鏄熸湡浜�", + "鏄熸湡涓�", + "鏄熸湡鍥�", + "鏄熸湡浜�", + "鏄熸湡鍏�", + "鏄熸湡鏃�" +); +function showTime() { + let date = new Date(); + let year = date.getFullYear(); + let month = date.getMonth() + 1; + let day = date.getDate(); + let hour = date.getHours(); + let minutes = date.getMinutes(); + let second = date.getSeconds(); + + return ( + year + + "." + + (month < 10 ? "0" + month : month) + + "." + + (day < 10 ? "0" + day : day) + + "" + + " " + + (hour < 10 ? "0" + hour : hour) + + ":" + + (minutes < 10 ? "0" + minutes : minutes) + + ":" + + (second < 10 ? "0" + second : second) + + " " + + (week[date.getDay() - 1] || week[6]) + ); +} </script> + <style lang="less" scoped> -.login-container { - display: flex; - width: 100%; - height: 100%; - background: rgb(246, 247, 252); - justify-content: flex-end; - align-items: center; +.vol-container .vol-path ::v-deep(.el-tabs__content) { + padding: 0; } -.login-form { - align-items: center; - width: 50%; - display: flex; - flex-direction: column; - // margin-right: 150px; - z-index: 999; - - .form-user { - // margin: 25px 0; - - .item { - border-radius: 5px; - border: 1px solid #ececec; - display: flex; - margin-bottom: 30px; - background: #ffff; - height: 45px; - padding-left: 20px; - display: flex; - - .code { - position: relative; - cursor: pointer; - width: 74px; - padding: 5px 10px 0 0; - } - - .input-icon { - line-height: 45px; - color: #7a7a7a; - padding-right: 20px; - } - } - } - - input:-webkit-autofill { - box-shadow: 0 0 0px 1000px white inset; - -webkit-box-shadow: 0 0 0px 1000px white inset !important; - } - - input { - background: white; - display: block; - box-sizing: border-box; - width: 100%; - min-width: 0; - margin: 0; - padding: 0; - color: #323233; - line-height: inherit; - text-align: left; - border: 0; - outline: none; - font-size: 16px; - line-height: 20px; - } +.item { + margin-top: -20px; + margin-right: 40px; } -.form-user, -.loging-btn { - width: 400px; -} - -.loging-btn { - box-shadow: 2px 4px 11px #a4c2ff; - margin-top: 10px; - +.contextMenu { + width: 120px; + margin: 0; + border: 1px solid #eaeaea; + background: #fff; + z-index: 30000; + position: absolute; + list-style-type: none; + padding: 5px 0; + border-radius: 4px; + font-size: 14px; + color: #333; + box-shadow: 2px 2px 3px 0 rgb(182 182 182 / 20%); + i, button { - padding: 21px; font-size: 14px !important; - width: 100%; } } -.login-text { - font-weight: bolder; - font-size: 20px; - letter-spacing: 2px; - - position: relative; - display: flex; - - .login-line { - z-index: -1; - padding: 5px; - position: relative; - top: -8px; - width: 100%; - background-image: linear-gradient(to right, #6598ff, white); - } +.contextMenu li { + margin: 0; + padding: 5px 17px; } -.login-text-small { - margin-bottom: 20px; - font-size: 13px; - color: #7d7c7c; +.contextMenu li:hover { + background: #fafafa; + cursor: pointer; } -.login-bg { - left: 0; - position: absolute; - height: 100%; - width: 50%; - z-index: 0; +.contextMenu li button { + color: #626060; + font-size: 14px; + letter-spacing: 1px; } -.project-name { - position: absolute; - top: 40px; - left: 40px; - z-index: 9999; - font-weight: bolder; - background-image: linear-gradient(to right, #1850c1, #9c009c); - -webkit-background-clip: text; - color: transparent; - font-size: 25px; +.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation + > .el-tabs__header + .el-tabs__item:last-child, +.el-tabs--top.el-tabs--border-card.header-navigation + > .el-tabs__header + .el-tabs__item:nth-child(2) { + padding: 0; +} + +.header-navigation ::v-deep(.el-tabs__item.is-top) { + padding: 0 15px; } </style> -<style lang="less" scoped> -.app-link { - // font-weight: bolder; - text-align: center; - padding-top: 5px; - font-size: 12px; - width: 400px; - padding-left: 40px; - display: flex; - - a { - flex: 1; - position: relative; - cursor: pointer; - width: 70px; - color: #666666; - margin: 2px 10px 0 0; - } - - img { - display: none; - } - - a:hover { - color: #0545f6 !important; - - img { - display: block; - position: absolute; - z-index: 999999999; - top: -130px; - width: 120px; - left: -22px; - - border: 1px solid #b1b1b1; - } - } -} - -.login-footer { - position: absolute; - width: 50%; - bottom: 0.5rem; - font-size: 12px; - text-align: center; - padding-bottom: 10px; - color: #4f4f4f; - - a { - margin-right: 10px; - font-size: 12px; - color: #4f4f4f; - } - - div { - margin-bottom: 5px; - } - - a:hover { - cursor: pointer; - color: #0540e3 !important; - } -} - -.account-info { - font-size: 12px; - color: #636363; - margin-top: 15px; +<style> +.horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, + 0s padding-right ease-in-out; } </style> - -<style lang="less" scoped> -@media screen and (max-width: 700px) { - - .login-bg, - .account-info, - .app-link, - .login-footer, - .project-name { - display: none; - } - - .login-container { - padding: 2rem; - justify-content: center; - } - - .login-form { - width: 100%; - } - - .form-user, - .loging-btn { - width: 100%; - } -} -</style> \ No newline at end of file diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue" index 52eb37e..dc53e33 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue" @@ -1,24 +1,23 @@ <template> <div id="title"> <div id="bkuang" style="border-top: none"> - <div class="skuang"> <div class="zhuname">鍏ュ簱8005绔欏彴</div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_PutFinish5">{{ data.W_PutFinish5 }}</div> + <div class="xzhi" :title="flData.W_PutFinish5">{{ flData.W_PutFinish5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍏ュ簱鍒颁綅鎸囦护(璇�):</div> - <div class="xzhi" :title="data.R_ConveyArrivaled5">{{ data.R_ConveyArrivaled5 }}</div> + <div class="xzhi" :title="flData.R_ConveyArrivaled5">{{ flData.R_ConveyArrivaled5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍒颁綅鎵樼洏鍙�(璇�):</div> - <div class="xzhi" :title="data.R_Barcode5">{{ data.R_Barcode5 }}</div> + <div class="xzhi" :title="flData.R_Barcode5">{{ flData.R_Barcode5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍒颁綅浠诲姟鍙�(璇�):</div> - <div class="xzhi" :title="data.R_TaskNum5">{{ data.R_TaskNum5 }}</div> + <div class="xzhi" :title="flData.R_TaskNum5">{{ flData.R_TaskNum5 || '-' }}</div> </div> </div> @@ -26,20 +25,19 @@ <div class="zhuname">鍑哄簱8001绔欏彴</div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_PutFinish1">{{ data.W_PutFinish1 }}</div> + <div class="xzhi" :title="flData.W_PutFinish1">{{ flData.W_PutFinish1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div> - <div class="xzhi" :title="data.R_IsCanPut">{{ data.R_IsCanPut }}</div> + <div class="xzhi" :title="flData.R_IsCanPut">{{ flData.R_IsCanPut || '-' }}</div> </div> </div> </div> - </div> </template> <script> -import { ref, nextTick } from "vue"; +import { ref, nextTick, watch, onUnmounted } from "vue"; import { useStore } from "vuex"; import { onMounted } from "vue"; @@ -49,69 +47,106 @@ xuan: 0 }; }, - methods: { - }, setup() { const store = useStore(); - const data = ref({}); + // 浠呭瓨鍌‵L鐩稿叧鏁版嵁 + const flData = ref({}); - // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯 - const statusMap = { - + // 寤惰繜鏇存柊閰嶇疆锛岃В鍐抽棯鐑侀棶棰� + const UPDATE_DELAY = 300; // 300ms寤惰繜锛屽钩琛″疄鏃舵�у拰鐣岄潰绋冲畾鎬� + let updateTimer = null; // 瀹氭椂鍣ㄥ疄渚� + + // FL鏁版嵁鏄犲皠瑙勫垯閰嶇疆 + const flStatusConfig = { + // FL boolean绫诲瀷瀛楁鏄犲皠 + booleanFields: { + keys: [ + "W_PutFinish5", "W_PutFinish1", + "R_IsCanPut", "R_ConveyArrivaled5" + ], + map: { true: "鏄�", false: "鍚�" } + } }; - // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯 - const booleanFields = [ - "W_PutFinish5", "W_PutFinish1", - "R_IsCanPut", "R_ConveyArrivaled5", - ]; - const booleanMap = { - true: "鏄�", - false: "鍚�" - }; - - // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁 - const processData = (rawData) => { + // 澶勭悊FL鍘熷鏁版嵁 + const processFLData = (rawData) => { if (!rawData) return {}; const processed = { ...rawData }; - // 澶勭悊鏅�氬瓧娈垫槧灏� - Object.keys(statusMap).forEach(key => { + // 澶勭悊boolean绫诲瀷瀛楁 + flStatusConfig.booleanFields.keys.forEach(key => { if (processed.hasOwnProperty(key)) { - const map = statusMap[key]; - processed[key] = map[processed[key]] || processed[key]; - } - }); - - // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈� - booleanFields.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = booleanMap[processed[key]] || processed[key]; + processed[key] = flStatusConfig.booleanFields.map[processed[key]] || processed[key]; } }); return processed; }; - onMounted(() => { - nextTick(() => { - setInterval(() => { - const rawData = store.state.homedata; - data.value = processData(rawData); - const xian = document.getElementsByClassName("xzhi"); - for (let i = 0; i < xian.length; i++) { - if (xian[i].innerHTML === "鏄�") { - xian[i].style.color = "yellow"; - } else if (xian[i].innerHTML === "鍚�") { - xian[i].style.color = "red"; + // 寤惰繜鏇存柊FL鏁版嵁锛岄伩鍏嶉珮棰戝埛鏂板鑷寸殑闂儊 + const delayedUpdateFLData = (newRawData) => { + if (updateTimer) clearTimeout(updateTimer); + + updateTimer = setTimeout(() => { + // 妫�鏌ユ槸鍚﹀寘鍚獸L鐗瑰緛瀛楁 + const hasFLFields = flStatusConfig.booleanFields.keys.some(key => + newRawData && newRawData[key] !== undefined + ); + + if (hasFLFields) { + flData.value = processFLData(newRawData); + + // 鏇存柊鏍峰紡 + nextTick(() => { + const valueElements = document.getElementsByClassName("xzhi"); + for (let i = 0; i < valueElements.length; i++) { + const text = valueElements[i].innerHTML; + if (text === "鏄�") { + valueElements[i].style.color = "yellow"; + } else if (text === "鍚�") { + valueElements[i].style.color = "red"; + } } + }); + } + }, UPDATE_DELAY); + }; + + onMounted(() => { + // 鍒濆鍔犺浇鏁版嵁 + const initialData = store.state.homedata; + const hasFLFields = flStatusConfig.booleanFields.keys.some(key => + initialData && initialData[key] !== undefined + ); + + if (hasFLFields) { + flData.value = processFLData(initialData); + } + + // 鐩戝惉鏁版嵁鍙樺寲锛屽彧澶勭悊FL鏁版嵁 + const unwatch = watch( + () => store.state.homedata, + (newData) => { + const hasFLFields = flStatusConfig.booleanFields.keys.some(key => + newData && newData[key] !== undefined + ); + + if (hasFLFields) { + delayedUpdateFLData(newData); } - }); + }, + { deep: true } + ); + + // 缁勪欢鍗歌浇鏃舵竻鐞嗚祫婧� + onUnmounted(() => { + unwatch(); + if (updateTimer) clearTimeout(updateTimer); }); }); return { - data, + flData }; } }; @@ -255,3 +290,4 @@ border-radius: 10px; } </style> + \ No newline at end of file diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue" index 94a238c..d04a45a 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue" @@ -1,151 +1,156 @@ <template> <div id="title"> <div id="bkuang" style="border-top: none"> + <!-- GM浠撳爢鍨涙満鐘舵�侀潰鏉� --> <div class="skuang"> <div class="zhuname">骞茶啘浠撳爢鍨涙満</div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈虹姸鎬�:</div> - <div class="xzhi" :title="data.R_GM_Status">{{ data.R_GM_Status }}</div> + <div class="xzhi" :title="gmData.R_GM_Status">{{ gmData.R_GM_Status || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div> - <div class="xzhi" :title="data.R_GM_AutoStatus">{{ data.R_GM_AutoStatus }}</div> + <div class="xzhi" :title="gmData.R_GM_AutoStatus">{{ gmData.R_GM_AutoStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div> - <div class="xzhi" :title="data.R_GM_TaskNum">{{ data.R_GM_TaskNum }}</div> + <div class="xzhi" :title="gmData.R_GM_TaskNum">{{ gmData.R_GM_TaskNum || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div> - <div class="xzhi" :title="data.R_GM_WorkStatus">{{ data.R_GM_WorkStatus }}</div> + <div class="xzhi" :title="gmData.R_GM_WorkStatus">{{ gmData.R_GM_WorkStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">浣滀笟绫诲瀷:</div> - <div class="xzhi" :title="data.R_GM_WorkType">{{ data.R_GM_WorkType }}</div> + <div class="xzhi" :title="gmData.R_GM_WorkType">{{ gmData.R_GM_WorkType || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎵樼洏绫诲瀷:</div> - <div class="xzhi" :title="data.R_GM_TrayType">{{ data.R_GM_TrayType }}</div> + <div class="xzhi" :title="gmData.R_GM_TrayType">{{ gmData.R_GM_TrayType || '-' }}</div> </div> </div> + + <!-- GM鍏宠仈绔欏彴锛堝叆搴�7003锛� --> <div class="skuang"> <div class="zhuname">鍏ュ簱7003绔欏彴</div> <div class="zhankuang"> <div class="xname">璇诲彇绠变綋鐮�(璇�):</div> - <div class="xzhi" :title="data.R_GM_Boxcode">{{ data.R_GM_Boxcode }}</div> + <div class="xzhi" :title="gmData.R_GM_Boxcode">{{ gmData.R_GM_Boxcode || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_HandShake3">{{ data.R_GM_HandShake3 }}</div> + <div class="xzhi" :title="gmData.R_GM_HandShake3">{{ gmData.R_GM_HandShake3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_GM_Online3">{{ data.R_GM_Online3 }}</div> + <div class="xzhi" :title="gmData.R_GM_Online3">{{ gmData.R_GM_Online3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_GM_Free3">{{ data.R_GM_Free3 }}</div> + <div class="xzhi" :title="gmData.R_GM_Free3">{{ gmData.R_GM_Free3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_GM_Goods3">{{ data.R_GM_Goods3 }}</div> + <div class="xzhi" :title="gmData.R_GM_Goods3">{{ gmData.R_GM_Goods3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_GM_Alarm3">{{ data.R_GM_Alarm3 }}</div> + <div class="xzhi" :title="gmData.R_GM_Alarm3">{{ gmData.R_GM_Alarm3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_STB3">{{ data.R_GM_STB3 }}</div> + <div class="xzhi" :title="gmData.R_GM_STB3">{{ gmData.R_GM_STB3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_ACK3">{{ data.R_GM_ACK3 }}</div> + <div class="xzhi" :title="gmData.R_GM_ACK3">{{ gmData.R_GM_ACK3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_STB3">{{ data.W_GM_STB3 }}</div> + <div class="xzhi" :title="gmData.W_GM_STB3">{{ gmData.W_GM_STB3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_ACK3">{{ data.W_GM_ACK3 }}</div> + <div class="xzhi" :title="gmData.W_GM_ACK3">{{ gmData.W_GM_ACK3 || '-' }}</div> </div> </div> - + + <!-- GM鍏宠仈绔欏彴锛堝嚭搴�7004+7005锛� --> <div class="skuang"> <div class="zhuname">鍑哄簱缁堢偣7004绔欏彴</div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_HandShake4">{{ data.R_GM_HandShake4 }}</div> + <div class="xzhi" :title="gmData.R_GM_HandShake4">{{ gmData.R_GM_HandShake4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_GM_Online4">{{ data.R_GM_Online4 }}</div> + <div class="xzhi" :title="gmData.R_GM_Online4">{{ gmData.R_GM_Online4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_GM_Free4">{{ data.R_GM_Free4 }}</div> + <div class="xzhi" :title="gmData.R_GM_Free4">{{ gmData.R_GM_Free4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_GM_Goods4">{{ data.R_GM_Goods4 }}</div> + <div class="xzhi" :title="gmData.R_GM_Goods4">{{ gmData.R_GM_Goods4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_GM_Alarm4">{{ data.R_GM_Alarm4 }}</div> + <div class="xzhi" :title="gmData.R_GM_Alarm4">{{ gmData.R_GM_Alarm4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_STB4">{{ data.R_GM_STB4 }}</div> + <div class="xzhi" :title="gmData.R_GM_STB4">{{ gmData.R_GM_STB4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_ACK4">{{ data.R_GM_ACK4 }}</div> + <div class="xzhi" :title="gmData.R_GM_ACK4">{{ gmData.R_GM_ACK4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_STB4">{{ data.W_GM_STB4 }}</div> + <div class="xzhi" :title="gmData.W_GM_STB4">{{ gmData.W_GM_STB4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_ACK4">{{ data.W_GM_ACK4 }}</div> + <div class="xzhi" :title="gmData.W_GM_ACK4">{{ gmData.W_GM_ACK4 || '-' }}</div> </div> + <div class="zhuname">鍑哄簱7005绔欏彴</div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_HandShake5">{{ data.R_GM_HandShake5 }}</div> + <div class="xzhi" :title="gmData.R_GM_HandShake5">{{ gmData.R_GM_HandShake5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_GM_Online5">{{ data.R_GM_Online5 }}</div> + <div class="xzhi" :title="gmData.R_GM_Online5">{{ gmData.R_GM_Online5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_GM_Free5">{{ data.R_GM_Free5 }}</div> + <div class="xzhi" :title="gmData.R_GM_Free5">{{ gmData.R_GM_Free5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_GM_Goods5">{{ data.R_GM_Goods5 }}</div> + <div class="xzhi" :title="gmData.R_GM_Goods5">{{ gmData.R_GM_Goods5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_GM_Alarm5">{{ data.R_GM_Alarm5 }}</div> + <div class="xzhi" :title="gmData.R_GM_Alarm5">{{ gmData.R_GM_Alarm5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_STB5">{{ data.R_GM_STB5 }}</div> + <div class="xzhi" :title="gmData.R_GM_STB5">{{ gmData.R_GM_STB5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_GM_ACK5">{{ data.R_GM_ACK5 }}</div> + <div class="xzhi" :title="gmData.R_GM_ACK5">{{ gmData.R_GM_ACK5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_STB5">{{ data.W_GM_STB5 }}</div> + <div class="xzhi" :title="gmData.W_GM_STB5">{{ gmData.W_GM_STB5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_GM_ACK5">{{ data.W_GM_ACK5 }}</div> + <div class="xzhi" :title="gmData.W_GM_ACK5">{{ gmData.W_GM_ACK5 || '-' }}</div> </div> </div> </div> @@ -153,7 +158,7 @@ </template> <script> -import { ref, nextTick } from "vue"; +import { ref, nextTick, watch, onUnmounted } from "vue"; import { useStore } from "vuex"; import { onMounted } from "vue"; @@ -163,162 +168,132 @@ xuan: 0 }; }, - methods: { - }, setup() { const store = useStore(); - const data = ref({}); + // 浠呭瓨鍌℅M鏁版嵁锛屼笌鍏朵粬浠撴暟鎹殧绂� + const gmData = ref({}); - // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯 - const statusMap = { - R_GM_Status: { - 1: "姝e父", - 2: "鏁呴殰", - 3: "鎬ュ仠", + // 寤惰繜鏇存柊閰嶇疆锛岃В鍐抽棯鐑侀棶棰� + const UPDATE_DELAY = 300; // 300ms寤惰繜锛屽钩琛″疄鏃舵�у拰鐣岄潰绋冲畾鎬� + let updateTimer = null; // 瀹氭椂鍣ㄥ疄渚� + + // GM鏁版嵁鏄犲皠瑙勫垯閰嶇疆锛堟寜鍔熻兘鍒嗙粍锛� + const gmStatusConfig = { + coreStatus: { + R_GM_Status: { 1: "姝e父", 2: "鏁呴殰", 3: "鎬ュ仠" }, + R_GM_AutoStatus: { 0: "缁翠慨", 1: "鎵嬪姩", 2: "鍗婅嚜鍔�", 3: "鑷姩" }, + R_GM_WorkStatus: { 0: "寰呮満", 1: "鍙栬揣涓�", 2: "鍙栬揣瀹屾垚", 4: "鏀捐揣涓�", 5: "鏀捐揣瀹屾垚", 6: "浠诲姟瀹屾垚" }, + R_GM_WorkType: { 0: "鏃犱綔涓氫换鍔�(0)", 1: "鍙栨斁璐т綔涓�(1)", 2: "鍙彇璐т綔涓�(2)", 3: "鍙斁璐т綔涓�(3)", 4: "绉诲姩鍒版寚瀹氫綅缃�" }, + R_GM_TrayType: { "-1": "绌虹(-1)", 1: "灏忔墭鐩�(1)", 2: "涓墭鐩�(2)", 3: "澶ф墭鐩�(3)", 4: "鐗瑰ぇ鎵樼洏(4)" } }, - R_GM_AutoStatus: { - 0: "缁翠慨", - 1: "鎵嬪姩", - 2: "鍗婅嚜鍔�", - 3: "鑷姩", + onlineStatus: { + keys: ["R_GM_Online3", "R_GM_Online4", "R_GM_Online5"], + map: { true: "鑱旀満", false: "鑴辨満" } }, - R_GM_WorkStatus: { - 0: "寰呮満", - 1: "鍙栬揣涓�", - 2: "鍙栬揣瀹屾垚", - 4: "鏀捐揣涓�", - 5: "鏀捐揣瀹屾垚", - 6: "浠诲姟瀹屾垚", + alarmStatus: { + keys: ["R_GM_Alarm3", "R_GM_Alarm4", "R_GM_Alarm5"], + map: { true: "鏁呴殰", false: "姝e父" } }, - R_GM_WorkType: { - 0: "鏃犱綔涓氫换鍔�(0)", - 1: "鍙栨斁璐т綔涓�(1)", - 2: "鍙彇璐т綔涓�(2)", - 3: "鍙斁璐т綔涓�(3)", - 4: "绉诲姩鍒版寚瀹氫綅缃�" + freeStatus: { + keys: ["R_GM_Free3", "R_GM_Free4", "R_GM_Free5"], + map: { true: "绌洪棽", false: "绻佸繖" } }, - R_GM_TrayType: { - "-1": "绌虹(-1)", - 1: "灏忔墭鐩�(1)", - 2: "涓墭鐩�(2)", - 3: "澶ф墭鐩�(3)", - 4: "鐗瑰ぇ鎵樼洏(4)", + goodsStatus: { + keys: ["R_GM_Goods3", "R_GM_Goods4", "R_GM_Goods5"], + map: { true: "鏈夎揣", false: "鏃犺揣" } + }, + signalFields: { + keys: [ + "R_GM_HandShake3", "R_GM_STB3", "R_GM_ACK3", "W_GM_STB3", "W_GM_ACK3", + "R_GM_HandShake4", "R_GM_STB4", "R_GM_ACK4", "W_GM_STB4", "W_GM_ACK4", + "R_GM_HandShake5", "R_GM_STB5", "R_GM_ACK5", "W_GM_STB5", "W_GM_ACK5" + ], + map: { true: "鏄�", false: "鍚�" } } }; - const onlines = [ - "R_GM_Online3","R_GM_Online4", - "R_GM_Online5", - ] - const online = { - 1: "鑱旀満", - 0: "鑴辨満" - }; - const alarms = [ - "R_GM_Alarm3","R_GM_Alarm4", - "R_GM_Alarm5", - ] - const alarm = { - 1: "鏁呴殰", - 0: "姝e父" - }; - const frees = [ - "R_GM_Free3","R_GM_Free4", - "R_GM_Free5", - ] - const free = { - 1: "绌洪棽", - 0: "绻佸繖" - }; - const goods = [ - "R_GM_Goods3", "R_GM_Goods4", - "R_GM_Goods5", - ] - const good = { - 1: "鏈夎揣", - 0: "鏃犺揣" - }; - // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯 - const booleanFields = [ - "R_GM_HandShake3", - "R_GM_STB3", - "R_GM_ACK3", "W_GM_STB3", - "W_GM_ACK3", - "R_GM_HandShake4", - "R_GM_STB4", - "R_GM_ACK4", "W_GM_STB4", - "W_GM_ACK4", - "R_GM_HandShake5", - "R_GM_STB5", - "R_GM_ACK5", "W_GM_STB5", - "W_GM_ACK5", - ]; - const booleanMap = { - true: "鏄�", - false: "鍚�" - }; - // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁 - const processData = (rawData) => { + // 澶勭悊GM鍘熷鏁版嵁 + const processGMData = (rawData) => { if (!rawData) return {}; const processed = { ...rawData }; - // 澶勭悊鏅�氬瓧娈垫槧灏� - Object.keys(statusMap).forEach(key => { + // 澶勭悊鏍稿績鐘舵�佸瓧娈� + Object.entries(gmStatusConfig.coreStatus).forEach(([key, map]) => { if (processed.hasOwnProperty(key)) { - const map = statusMap[key]; processed[key] = map[processed[key]] || processed[key]; } }); - // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈� - booleanFields.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = booleanMap[processed[key]] || processed[key]; - } - }); - onlines.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = online[processed[key]] || processed[key]; - } - }); - alarms.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = alarm[processed[key]] || processed[key]; - } - }); - frees.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = free[processed[key]] || processed[key]; - } - }); - goods.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = good[processed[key]] || processed[key]; - } + // 鎵归噺澶勭悊鍒嗙粍瀛楁 + [ + gmStatusConfig.onlineStatus, + gmStatusConfig.alarmStatus, + gmStatusConfig.freeStatus, + gmStatusConfig.goodsStatus, + gmStatusConfig.signalFields + ].forEach(group => { + group.keys.forEach(key => { + if (processed.hasOwnProperty(key)) { + processed[key] = group.map[processed[key]] || processed[key]; + } + }); }); return processed; }; - onMounted(() => { - nextTick(() => { - setInterval(() => { - const rawData = store.state.homedata; - data.value = processData(rawData); - const xian = document.getElementsByClassName("xzhi"); - for (let i = 0; i < xian.length; i++) { - if (xian[i].innerHTML === "鏄�" || xian[i].innerHTML === "鑱旀満") { - xian[i].style.color = "yellow"; - } else if (xian[i].innerHTML === "鍚�") { - xian[i].style.color = "red"; + // 寤惰繜鏇存柊GM鏁版嵁锛岄伩鍏嶉珮棰戝埛鏂板鑷寸殑闂儊 + const delayedUpdateGMData = (newRawData) => { + if (updateTimer) clearTimeout(updateTimer); + + updateTimer = setTimeout(() => { + // 浠呭鐞嗗寘鍚獹M鐗瑰緛瀛楁鐨勬暟鎹� + if (newRawData && newRawData.R_GM_Status !== undefined) { + gmData.value = processGMData(newRawData); + + // 鏇存柊鏍峰紡 + nextTick(() => { + const valueElements = document.getElementsByClassName("xzhi"); + for (let i = 0; i < valueElements.length; i++) { + const text = valueElements[i].innerHTML; + if (text === "鏄�" || text === "鑱旀満") { + valueElements[i].style.color = "yellow"; + } else if (text === "鍚�") { + valueElements[i].style.color = "red"; + } } + }); + } + }, UPDATE_DELAY); + }; + + onMounted(() => { + // 鍒濆鍔犺浇鏁版嵁 + const initialData = store.state.homedata; + if (initialData && initialData.R_GM_Status !== undefined) { + gmData.value = processGMData(initialData); + } + + // 鐩戝惉鏁版嵁鍙樺寲锛屽彧澶勭悊GM鏁版嵁 + const unwatch = watch( + () => store.state.homedata, + (newData) => { + if (newData && newData.R_GM_Status !== undefined) { + delayedUpdateGMData(newData); } - }); + }, + { deep: true } + ); + + // 缁勪欢鍗歌浇鏃舵竻鐞嗚祫婧� + onUnmounted(() => { + unwatch(); + if (updateTimer) clearTimeout(updateTimer); }); }); return { - data, + gmData }; } }; @@ -462,3 +437,4 @@ border-radius: 10px; } </style> + \ No newline at end of file diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue" index dbc0396..23ed561 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue" @@ -1,95 +1,98 @@ <template> <div id="title"> <div id="bkuang" style="border-top: none"> + <!-- YM浠撳爢鍨涙満鐘舵�侀潰鏉� --> <div class="skuang"> <div class="zhuname">娌瑰ⅷ浠撳爢鍨涙満</div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈虹姸鎬�:</div> - <div class="xzhi" :title="data.R_YM_Status">{{ data.R_YM_Status }}</div> + <div class="xzhi" :title="ymData.R_YM_Status">{{ ymData.R_YM_Status || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div> - <div class="xzhi" :title="data.R_YM_AutoStatus">{{ data.R_YM_AutoStatus }}</div> + <div class="xzhi" :title="ymData.R_YM_AutoStatus">{{ ymData.R_YM_AutoStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div> - <div class="xzhi" :title="data.R_YM_TaskNum">{{ data.R_YM_TaskNum }}</div> + <div class="xzhi" :title="ymData.R_YM_TaskNum">{{ ymData.R_YM_TaskNum || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div> - <div class="xzhi" :title="data.R_YM_WorkStatus">{{ data.R_YM_WorkStatus }}</div> + <div class="xzhi" :title="ymData.R_YM_WorkStatus">{{ ymData.R_YM_WorkStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">浣滀笟绫诲瀷:</div> - <div class="xzhi" :title="data.R_YM_WorkType">{{ data.R_YM_WorkType }}</div> + <div class="xzhi" :title="ymData.R_YM_WorkType">{{ ymData.R_YM_WorkType || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎵樼洏绫诲瀷:</div> - <div class="xzhi" :title="data.R_YM_TrayType">{{ data.R_YM_TrayType }}</div> + <div class="xzhi" :title="ymData.R_YM_TrayType">{{ ymData.R_YM_TrayType || '-' }}</div> </div> </div> + + <!-- YM鍏宠仈绔欏彴锛堝嚭鍏ュ簱9001锛� --> <div class="skuang"> <div class="zhuname">鍑哄叆搴�9001绔欏彴</div> <div class="zhankuang"> <div class="xname">鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_YM_Tray1">{{ data.R_YM_Tray1 }}</div> + <div class="xzhi" :title="ymData.R_YM_Tray1">{{ ymData.R_YM_Tray1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍏ュ簱鎵ц涓�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Inbounding1">{{ data.R_YM_Inbounding1 }}</div> + <div class="xzhi" :title="ymData.R_YM_Inbounding1">{{ ymData.R_YM_Inbounding1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎻愬崌鏈虹┖闂�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Leisure1">{{ data.R_YM_Leisure1 }}</div> + <div class="xzhi" :title="ymData.R_YM_Leisure1">{{ ymData.R_YM_Leisure1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍑哄簱鎵ц涓�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Outbounding1">{{ data.R_YM_Outbounding1 }}</div> + <div class="xzhi" :title="ymData.R_YM_Outbounding1">{{ ymData.R_YM_Outbounding1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鐢宠鍏ュ簱(鍐�):</div> - <div class="xzhi" :title="data.W_YM_RequestIn1">{{ data.W_YM_RequestIn1 }}</div> + <div class="xzhi" :title="ymData.W_YM_RequestIn1">{{ ymData.W_YM_RequestIn1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鐢宠鍑哄簱(鍐�):</div> - <div class="xzhi" :title="data.W_YM_RequestOut1">{{ data.W_YM_RequestOut1 }}</div> + <div class="xzhi" :title="ymData.W_YM_RequestOut1">{{ ymData.W_YM_RequestOut1 || '-' }}</div> </div> </div> - + + <!-- YM鍏宠仈绔欏彴锛堝嚭鍏ュ簱9002锛� --> <div class="skuang"> <div class="zhuname">鍑哄叆搴�9002绔欏彴</div> <div class="zhankuang"> <div class="xname">鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_YM_Tray2">{{ data.R_YM_Tray2 }}</div> + <div class="xzhi" :title="ymData.R_YM_Tray2">{{ ymData.R_YM_Tray2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍏ュ簱鎵ц涓�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Inbounding2">{{ data.R_YM_Inbounding2 }}</div> + <div class="xzhi" :title="ymData.R_YM_Inbounding2">{{ ymData.R_YM_Inbounding2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎻愬崌鏈虹┖闂�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Leisure2">{{ data.R_YM_Leisure2 }}</div> + <div class="xzhi" :title="ymData.R_YM_Leisure2">{{ ymData.R_YM_Leisure2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍑哄簱鎵ц涓�(璇�):</div> - <div class="xzhi" :title="data.R_YM_Outbounding2">{{ data.R_YM_Outbounding2 }}</div> + <div class="xzhi" :title="ymData.R_YM_Outbounding2">{{ ymData.R_YM_Outbounding2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鐢宠鍏ュ簱(鍐�):</div> - <div class="xzhi" :title="data.W_YM_RequestIn2">{{ data.W_YM_RequestIn2 }}</div> + <div class="xzhi" :title="ymData.W_YM_RequestIn2">{{ ymData.W_YM_RequestIn2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鐢宠鍑哄簱(鍐�):</div> - <div class="xzhi" :title="data.W_YM_RequestOut2">{{ data.W_YM_RequestOut2 }}</div> + <div class="xzhi" :title="ymData.W_YM_RequestOut2">{{ ymData.W_YM_RequestOut2 || '-' }}</div> </div> </div> </div> - </div> </template> <script> -import { ref, nextTick } from "vue"; +import { ref, nextTick, watch, onUnmounted } from "vue"; import { useStore } from "vuex"; import { onMounted } from "vue"; @@ -99,14 +102,17 @@ xuan: 0 }; }, - methods: { - }, setup() { const store = useStore(); - const data = ref({}); + // 浠呭瓨鍌╕M鏁版嵁锛屼笌鍏朵粬鏁版嵁闅旂 + const ymData = ref({}); - // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯 - const statusMap = { + // 寤惰繜鏇存柊閰嶇疆锛岃В鍐抽棯鐑侀棶棰� + const UPDATE_DELAY = 300; // 寤惰繜300ms鏇存柊UI + let updateTimer = null; // 瀹氭椂鍣ㄥ疄渚� + + // YM鏁版嵁鏄犲皠瑙勫垯 + const ymStatusMap = { R_YM_Status: { 1: "姝e父", 2: "鏁呴殰", @@ -142,62 +148,103 @@ } }; - // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯 - const booleanFields = [ - "R_YM_Tray1", "R_YM_Inbounding1", - "R_YM_Leisure1", "R_YM_Outbounding1", - "W_YM_RequestIn1", "W_YM_RequestOut1", - "R_YM_Tray2", "R_YM_Inbounding2", - "R_YM_Leisure2", "R_YM_Outbounding2", - "W_YM_RequestIn2", "W_YM_RequestOut2", - ]; - const booleanMap = { - true: "鏄�", - false: "鍚�" + // YM瀛楁鍒嗙粍 + const ymFieldGroups = { + statusFields: { + keys: [ + "R_YM_Tray1", "R_YM_Inbounding1", "R_YM_Leisure1", "R_YM_Outbounding1", + "R_YM_Tray2", "R_YM_Inbounding2", "R_YM_Leisure2", "R_YM_Outbounding2" + ], + map: { true: "鏄�", false: "鍚�" } + }, + requestFields: { + keys: [ + "W_YM_RequestIn1", "W_YM_RequestOut1", + "W_YM_RequestIn2", "W_YM_RequestOut2" + ], + map: { true: "鏄�", false: "鍚�" } + } }; - // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁 - const processData = (rawData) => { + // 澶勭悊YM鍘熷鏁版嵁 + const processYMData = (rawData) => { if (!rawData) return {}; - const processed = { ...rawData }; + const processedData = { ...rawData }; - // 澶勭悊鏅�氬瓧娈垫槧灏� - Object.keys(statusMap).forEach(key => { - if (processed.hasOwnProperty(key)) { - const map = statusMap[key]; - processed[key] = map[processed[key]] || processed[key]; + // 澶勭悊鏍稿績鐘舵�佸瓧娈� + Object.keys(ymStatusMap).forEach(key => { + if (processedData.hasOwnProperty(key)) { + processedData[key] = ymStatusMap[key][processedData[key]] || processedData[key]; } }); - // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈� - booleanFields.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = booleanMap[processed[key]] || processed[key]; - } + // 澶勭悊鍒嗙粍瀛楁 + Object.values(ymFieldGroups).forEach(group => { + group.keys.forEach(key => { + if (processedData.hasOwnProperty(key)) { + processedData[key] = group.map[processedData[key]] || processedData[key]; + } + }); }); - return processed; + return processedData; + }; + + // 寤惰繜鏇存柊YM鏁版嵁锛岄伩鍏嶉珮棰戝埛鏂� + const delayedUpdateYMData = (newRawData) => { + if (updateTimer) { + clearTimeout(updateTimer); + } + + updateTimer = setTimeout(() => { + // 鍙鐞嗗寘鍚玒M鐗瑰緛瀛楁鐨勬暟鎹� + if (newRawData && newRawData.R_YM_Status !== undefined) { + ymData.value = processYMData(newRawData); + + // 鏇存柊鏍峰紡 + nextTick(() => { + const valueElements = document.getElementsByClassName("xzhi"); + for (let i = 0; i < valueElements.length; i++) { + if (valueElements[i].innerHTML === "鏄�") { + valueElements[i].style.color = "yellow"; + } else if (valueElements[i].innerHTML === "鍚�") { + valueElements[i].style.color = "red"; + } + } + }); + } + }, UPDATE_DELAY); }; onMounted(() => { - nextTick(() => { - setInterval(() => { - const rawData = store.state.homedata; - data.value = processData(rawData); - const xian = document.getElementsByClassName("xzhi"); - for (let i = 0; i < xian.length; i++) { - if (xian[i].innerHTML === "鏄�") { - xian[i].style.color = "yellow"; - } else if (xian[i].innerHTML === "鍚�") { - xian[i].style.color = "red"; - } + // 鍒濆鍔犺浇鏁版嵁 + const initialData = store.state.homedata; + if (initialData && initialData.R_YM_Status !== undefined) { + ymData.value = processYMData(initialData); + } + + // 鐩戝惉鏁版嵁鍙樺寲锛屽彧澶勭悊YM鏁版嵁 + const unwatch = watch( + () => store.state.homedata, + (newData) => { + if (newData && newData.R_YM_Status !== undefined) { + delayedUpdateYMData(newData); } - }); + }, + { deep: true } + ); + + // 缁勪欢鍗歌浇鏃舵竻鐞� + onUnmounted(() => { + unwatch(); + if (updateTimer) { + clearTimeout(updateTimer); + } }); }); return { - data, + ymData }; } }; diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue" index 706d1b3..27b8a2a 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue" @@ -1,189 +1,194 @@ <template> <div id="title"> <div id="bkuang" style="border-top: none"> + <!-- PP浠撳爢鍨涙満鐘舵�侀潰鏉� --> <div class="skuang"> <div class="zhuname">PP浠撳爢鍨涙満</div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈虹姸鎬�:</div> - <div class="xzhi" :title="data.R_PP_Status">{{ data.R_PP_Status }}</div> + <div class="xzhi" :title="ppData.R_PP_Status">{{ ppData.R_PP_Status }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div> - <div class="xzhi" :title="data.R_PP_AutoStatus">{{ data.R_PP_AutoStatus }}</div> + <div class="xzhi" :title="ppData.R_PP_AutoStatus">{{ ppData.R_PP_AutoStatus }}</div> </div> <div class="zhankuang"> <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div> - <div class="xzhi" :title="data.R_PP_TaskNum">{{ data.R_PP_TaskNum }}</div> + <div class="xzhi" :title="ppData.R_PP_TaskNum">{{ ppData.R_PP_TaskNum }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div> - <div class="xzhi" :title="data.R_PP_WorkStatus">{{ data.R_PP_WorkStatus }}</div> + <div class="xzhi" :title="ppData.R_PP_WorkStatus">{{ ppData.R_PP_WorkStatus }}</div> </div> <div class="zhankuang"> <div class="xname">浣滀笟绫诲瀷:</div> - <div class="xzhi" :title="data.R_PP_WorkType">{{ data.R_PP_WorkType }}</div> + <div class="xzhi" :title="ppData.R_PP_WorkType">{{ ppData.R_PP_WorkType }}</div> </div> <div class="zhankuang"> <div class="xname">鎵樼洏绫诲瀷:</div> - <div class="xzhi" :title="data.R_PP_TrayType">{{ data.R_PP_TrayType }}</div> + <div class="xzhi" :title="ppData.R_PP_TrayType">{{ ppData.R_PP_TrayType }}</div> </div> </div> + + <!-- PP鍏宠仈绔欏彴锛堝叆搴�2004+鍑哄簱2005锛� --> <div class="skuang"> <div class="zhuname">鍏ュ簱2004绔欏彴</div> <div class="zhankuang"> <div class="xname">璇诲彇绠变綋鐮�(璇�):</div> - <div class="xzhi" :title="data.R_PP_Boxcode">{{ data.R_PP_Boxcode }}</div> + <div class="xzhi" :title="ppData.R_PP_Boxcode">{{ ppData.R_PP_Boxcode || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_HandShake4">{{ data.R_PP_HandShake4 }}</div> + <div class="xzhi" :title="ppData.R_PP_HandShake4">{{ ppData.R_PP_HandShake4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_PP_Online4">{{ data.R_PP_Online4 }}</div> + <div class="xzhi" :title="ppData.R_PP_Online4">{{ ppData.R_PP_Online4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_PP_Free4">{{ data.R_PP_Free4 }}</div> + <div class="xzhi" :title="ppData.R_PP_Free4">{{ ppData.R_PP_Free4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_PP_Goods4">{{ data.R_PP_Goods4 }}</div> + <div class="xzhi" :title="ppData.R_PP_Goods4">{{ ppData.R_PP_Goods4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_PP_Alarm4">{{ data.R_PP_Alarm4 }}</div> + <div class="xzhi" :title="ppData.R_PP_Alarm4">{{ ppData.R_PP_Alarm4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_STB4">{{ data.R_PP_STB4 }}</div> + <div class="xzhi" :title="ppData.R_PP_STB4">{{ ppData.R_PP_STB4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_ACK4">{{ data.R_PP_ACK4 }}</div> + <div class="xzhi" :title="ppData.R_PP_ACK4">{{ ppData.R_PP_ACK4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_STB4">{{ data.W_PP_STB4 }}</div> + <div class="xzhi" :title="ppData.W_PP_STB4">{{ ppData.W_PP_STB4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_ACK4">{{ data.W_PP_ACK4 }}</div> + <div class="xzhi" :title="ppData.W_PP_ACK4">{{ ppData.W_PP_ACK4 || '-' }}</div> </div> <div class="zhuname">鍑哄簱2005绔欏彴</div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_HandShake5">{{ data.R_PP_HandShake5 }}</div> + <div class="xzhi" :title="ppData.R_PP_HandShake5">{{ ppData.R_PP_HandShake5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_PP_Online5">{{ data.R_PP_Online5 }}</div> + <div class="xzhi" :title="ppData.R_PP_Online5">{{ ppData.R_PP_Online5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_PP_Free5">{{ data.R_PP_Free5 }}</div> + <div class="xzhi" :title="ppData.R_PP_Free5">{{ ppData.R_PP_Free5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_PP_Goods5">{{ data.R_PP_Goods5 }}</div> + <div class="xzhi" :title="ppData.R_PP_Goods5">{{ ppData.R_PP_Goods5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_PP_Alarm5">{{ data.R_PP_Alarm5 }}</div> + <div class="xzhi" :title="ppData.R_PP_Alarm5">{{ ppData.R_PP_Alarm5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_STB5">{{ data.R_PP_STB5 }}</div> + <div class="xzhi" :title="ppData.R_PP_STB5">{{ ppData.R_PP_STB5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_ACK5">{{ data.R_PP_ACK5 }}</div> + <div class="xzhi" :title="ppData.R_PP_ACK5">{{ ppData.R_PP_ACK5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_STB5">{{ data.W_PP_STB5 }}</div> + <div class="xzhi" :title="ppData.W_PP_STB5">{{ ppData.W_PP_STB5 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_ACK5">{{ data.W_PP_ACK5 }}</div> + <div class="xzhi" :title="ppData.W_PP_ACK5">{{ ppData.W_PP_ACK5 || '-' }}</div> </div> </div> - + + <!-- PP鍏宠仈绔欏彴锛堝嚭搴�2016+鍑哄簱2017锛� --> <div class="skuang"> <div class="zhuname">鍑哄簱2016绔欏彴</div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_HandShake6">{{ data.R_PP_HandShake6 }}</div> + <div class="xzhi" :title="ppData.R_PP_HandShake6">{{ ppData.R_PP_HandShake6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_PP_Online6">{{ data.R_PP_Online6 }}</div> + <div class="xzhi" :title="ppData.R_PP_Online6">{{ ppData.R_PP_Online6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_PP_Free6">{{ data.R_PP_Free6 }}</div> + <div class="xzhi" :title="ppData.R_PP_Free6">{{ ppData.R_PP_Free6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_PP_Goods6">{{ data.R_PP_Goods6 }}</div> + <div class="xzhi" :title="ppData.R_PP_Goods6">{{ ppData.R_PP_Goods6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_PP_Alarm6">{{ data.R_PP_Alarm6 }}</div> + <div class="xzhi" :title="ppData.R_PP_Alarm6">{{ ppData.R_PP_Alarm6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_STB6">{{ data.R_PP_STB6 }}</div> + <div class="xzhi" :title="ppData.R_PP_STB6">{{ ppData.R_PP_STB6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_ACK6">{{ data.R_PP_ACK6 }}</div> + <div class="xzhi" :title="ppData.R_PP_ACK6">{{ ppData.R_PP_ACK6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_STB6">{{ data.W_PP_STB6 }}</div> + <div class="xzhi" :title="ppData.W_PP_STB6">{{ ppData.W_PP_STB6 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_ACK6">{{ data.W_PP_ACK6 }}</div> + <div class="xzhi" :title="ppData.W_PP_ACK6">{{ ppData.W_PP_ACK6 || '-' }}</div> </div> + <div class="zhuname">鍑哄簱2017绔欏彴</div> <div class="zhankuang"> <div class="xname">鎻℃墜淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_HandShake7">{{ data.R_PP_HandShake7 }}</div> + <div class="xzhi" :title="ppData.R_PP_HandShake7">{{ ppData.R_PP_HandShake7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鑱旀満(璇�):</div> - <div class="xzhi" :title="data.R_PP_Online7">{{ data.R_PP_Online7 }}</div> + <div class="xzhi" :title="ppData.R_PP_Online7">{{ ppData.R_PP_Online7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁绌洪棽(璇�):</div> - <div class="xzhi" :title="data.R_PP_Free7">{{ data.R_PP_Free7 }}</div> + <div class="xzhi" :title="ppData.R_PP_Free7">{{ ppData.R_PP_Free7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏈夎揣(璇�):</div> - <div class="xzhi" :title="data.R_PP_Goods7">{{ data.R_PP_Goods7 }}</div> + <div class="xzhi" :title="ppData.R_PP_Goods7">{{ ppData.R_PP_Goods7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鏁呴殰(璇�):</div> - <div class="xzhi" :title="data.R_PP_Alarm7">{{ data.R_PP_Alarm7 }}</div> + <div class="xzhi" :title="ppData.R_PP_Alarm7">{{ ppData.R_PP_Alarm7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_STB7">{{ data.R_PP_STB7 }}</div> + <div class="xzhi" :title="ppData.R_PP_STB7">{{ ppData.R_PP_STB7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(璇�):</div> - <div class="xzhi" :title="data.R_PP_ACK7">{{ data.R_PP_ACK7 }}</div> + <div class="xzhi" :title="ppData.R_PP_ACK7">{{ ppData.R_PP_ACK7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">璇锋眰淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_STB7">{{ data.W_PP_STB7 }}</div> + <div class="xzhi" :title="ppData.W_PP_STB7">{{ ppData.W_PP_STB7 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍝嶅簲淇″彿(鍐�):</div> - <div class="xzhi" :title="data.W_PP_ACK7">{{ data.W_PP_ACK7 }}</div> + <div class="xzhi" :title="ppData.W_PP_ACK7">{{ ppData.W_PP_ACK7 || '-' }}</div> </div> </div> </div> @@ -191,7 +196,7 @@ </template> <script> -import { ref, nextTick } from "vue"; +import { ref, nextTick, watch, onUnmounted } from "vue"; import { useStore } from "vuex"; import { onMounted } from "vue"; @@ -201,13 +206,16 @@ xuan: 0 }; }, - methods: { - }, setup() { const store = useStore(); - const data = ref({}); + // 浠呭瓨鍌≒P鏁版嵁锛岄伩鍏嶄笌ZH鏁版嵁娣锋穯 + const ppData = ref({}); - // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯 + // 寤惰繜鏇存柊閰嶇疆锛岃В鍐抽珮棰戝埛鏂板鑷寸殑闂儊 + const UPDATE_DELAY = 300; // 寤惰繜300ms鏇存柊UI + let updateTimer = null; // 瀹氭椂鍣ㄥ疄渚� + + // PP鏁版嵁鏄犲皠瑙勫垯锛堜粎澶勭悊PP鐩稿叧瀛楁锛� const statusMap = { R_PP_Status: { 1: "姝e父", @@ -243,121 +251,120 @@ 4: "鐗瑰ぇ鎵樼洏(4)", } }; - const onlines = [ - "R_PP_Online6","R_PP_Online4", - "R_PP_Online5","R_PP_Online7" - ] - const online = { - true: "鑱旀満", - false: "鑴辨満" - }; - const alarms = [ - "R_PP_Alarm6","R_PP_Alarm4", - "R_PP_Alarm5","R_PP_Alarm7" - ] - const alarm = { - true: "鏁呴殰", - false: "姝e父" - }; - const frees = [ - "R_PP_Free6","R_PP_Free4", - "R_PP_Free5","R_PP_Free7" - ] - const free = { - true: "绌洪棽", - false: "绻佸繖" - }; - const goods = [ - "R_PP_Goods6", "R_PP_Goods4", - "R_PP_Goods5","R_PP_Goods7" - ] - const good = { - true: "鏈夎揣", - false: "鏃犺揣" + + // PP鐩稿叧甯冨皵瀛楁鍒嗙粍 + const fieldGroups = { + online: { + fields: ["R_PP_Online6", "R_PP_Online4", "R_PP_Online5", "R_PP_Online7"], + map: { true: "鑱旀満", false: "鑴辨満" } + }, + alarm: { + fields: ["R_PP_Alarm6", "R_PP_Alarm4", "R_PP_Alarm5", "R_PP_Alarm7"], + map: { true: "鏁呴殰", false: "姝e父" } + }, + free: { + fields: ["R_PP_Free6", "R_PP_Free4", "R_PP_Free5", "R_PP_Free7"], + map: { true: "绌洪棽", false: "绻佸繖" } + }, + goods: { + fields: ["R_PP_Goods6", "R_PP_Goods4", "R_PP_Goods5", "R_PP_Goods7"], + map: { true: "鏈夎揣", false: "鏃犺揣" } + }, + signal: { + fields: [ + "R_PP_HandShake4", "R_PP_STB4", "R_PP_ACK4", "W_PP_STB4", "W_PP_ACK4", + "R_PP_HandShake5", "R_PP_STB5", "R_PP_ACK5", "W_PP_STB5", "W_PP_ACK5", + "R_PP_HandShake6", "R_PP_STB6", "R_PP_ACK6", "W_PP_STB6", "W_PP_ACK6", + "R_PP_HandShake7", "R_PP_STB7", "R_PP_ACK7", "W_PP_STB7", "W_PP_ACK7" + ], + map: { true: "鏄�", false: "鍚�" } + } }; - // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯 - const booleanFields = [ - "R_PP_HandShake4", "R_PP_STB4", - "R_PP_ACK4", "W_PP_STB4", - "W_PP_ACK4", - "R_PP_HandShake5", "R_PP_STB5", - "R_PP_ACK5", "W_PP_STB5", - "W_PP_ACK5", - "R_PP_HandShake6", "R_PP_STB6", - "R_PP_ACK6", "W_PP_STB6", - "W_PP_ACK6", - "R_PP_HandShake7", "R_PP_STB7", - "R_PP_ACK7", "W_PP_STB7", - "W_PP_ACK7", - ]; - const booleanMap = { - true: "鏄�", - false: "鍚�" - }; - - // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁 - const processData = (rawData) => { + // 澶勭悊PP鍘熷鏁版嵁 + const processPPData = (rawData) => { if (!rawData) return {}; + + // 澶嶅埗鍘熷鏁版嵁锛岄伩鍏嶇洿鎺ヤ慨鏀� const processed = { ...rawData }; - // 澶勭悊鏅�氬瓧娈垫槧灏� + // 澶勭悊鐘舵�佸瓧娈垫槧灏� Object.keys(statusMap).forEach(key => { if (processed.hasOwnProperty(key)) { - const map = statusMap[key]; - processed[key] = map[processed[key]] || processed[key]; + processed[key] = statusMap[key][processed[key]] || processed[key]; } }); - // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈� - booleanFields.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = booleanMap[processed[key]] || processed[key]; - } - }); - onlines.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = online[processed[key]] || processed[key]; - } - }); - alarms.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = alarm[processed[key]] || processed[key]; - } - }); - frees.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = free[processed[key]] || processed[key]; - } - }); - goods.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = good[processed[key]] || processed[key]; - } + // 澶勭悊甯冨皵鍨嬪瓧娈垫槧灏� + Object.values(fieldGroups).forEach(group => { + group.fields.forEach(key => { + if (processed.hasOwnProperty(key)) { + processed[key] = group.map[processed[key]] || processed[key]; + } + }); }); return processed; }; - onMounted(() => { - nextTick(() => { - setInterval(() => { - const rawData = store.state.homedata; - data.value = processData(rawData); - const xian = document.getElementsByClassName("xzhi"); - for (let i = 0; i < xian.length; i++) { - if (xian[i].innerHTML === "鏄�") { - xian[i].style.color = "yellow"; - } else if (xian[i].innerHTML === "鍚�") { - xian[i].style.color = "red"; + // 寤惰繜鏇存柊PP鏁版嵁锛岄伩鍏嶉珮棰戝埛鏂� + const delayedUpdatePPData = (newRawData) => { + // 娓呴櫎涔嬪墠鐨勫畾鏃跺櫒锛岀‘淇濆彧鎵ц鏈�鍚庝竴娆℃洿鏂� + if (updateTimer) { + clearTimeout(updateTimer); + } + + // 寤惰繜鎸囧畾鏃堕棿鍚庢洿鏂版暟鎹� + updateTimer = setTimeout(() => { + // 鍙鐞嗗寘鍚玃P鐗瑰緛瀛楁鐨勬暟鎹� + if (newRawData && newRawData.R_PP_Status !== undefined) { + ppData.value = processPPData(newRawData); + + // 鏇存柊鏍峰紡 + nextTick(() => { + const valueElements = document.getElementsByClassName("xzhi"); + for (let i = 0; i < valueElements.length; i++) { + if (valueElements[i].innerHTML === "鏄�") { + valueElements[i].style.color = "yellow"; + } else if (valueElements[i].innerHTML === "鍚�") { + valueElements[i].style.color = "red"; + } } + }); + } + }, UPDATE_DELAY); + }; + + onMounted(() => { + // 鍒濆鍔犺浇鏁版嵁 + const initialData = store.state.homedata; + if (initialData && initialData.R_PP_Status !== undefined) { + ppData.value = processPPData(initialData); + } + + // 鐩戝惉鏁版嵁鍙樺寲锛屽彧澶勭悊PP鏁版嵁 + const unwatch = watch( + () => store.state.homedata, + (newData) => { + // 浠呭綋鏁版嵁鍖呭惈PP鐗瑰緛瀛楁鏃舵墠鏇存柊 + if (newData && newData.R_PP_Status !== undefined) { + delayedUpdatePPData(newData); } - }); + }, + { deep: true } // 娣卞害鐩戝惉瀵硅薄鍐呴儴鍙樺寲 + ); + + // 缁勪欢鍗歌浇鏃舵竻鐞嗚祫婧� + onUnmounted(() => { + unwatch(); + if (updateTimer) { + clearTimeout(updateTimer); + } }); }); return { - data, + ppData }; } }; @@ -501,3 +508,4 @@ border-radius: 10px; } </style> + \ No newline at end of file diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue" index f84be25..6a412b0 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue" @@ -1,168 +1,174 @@ <template> <div id="title"> <div id="bkuang" style="border-top: none"> + <!-- ZH浠撳爢鍨涙満鐘舵�侀潰鏉� --> <div class="skuang"> <div class="zhuname">闃荤剨浠撳爢鍨涙満</div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈虹姸鎬�:</div> - <div class="xzhi" :title="data.R_ZH_Status">{{ data.R_ZH_Status }}</div> + <div class="xzhi" :title="zhData.R_ZH_Status">{{ zhData.R_ZH_Status || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div> - <div class="xzhi" :title="data.R_ZH_AutoStatus">{{ data.R_ZH_AutoStatus }}</div> + <div class="xzhi" :title="zhData.R_ZH_AutoStatus">{{ zhData.R_ZH_AutoStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div> - <div class="xzhi" :title="data.R_ZH_TaskNum">{{ data.R_ZH_TaskNum }}</div> + <div class="xzhi" :title="zhData.R_ZH_TaskNum">{{ zhData.R_ZH_TaskNum || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div> - <div class="xzhi" :title="data.R_ZH_WorkStatus">{{ data.R_ZH_WorkStatus }}</div> + <div class="xzhi" :title="zhData.R_ZH_WorkStatus">{{ zhData.R_ZH_WorkStatus || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">浣滀笟绫诲瀷:</div> - <div class="xzhi" :title="data.R_ZH_WorkType">{{ data.R_ZH_WorkType }}</div> + <div class="xzhi" :title="zhData.R_ZH_WorkType">{{ zhData.R_ZH_WorkType || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鎵樼洏绫诲瀷:</div> - <div class="xzhi" :title="data.R_ZH_TrayType">{{ data.R_ZH_TrayType }}</div> + <div class="xzhi" :title="zhData.R_ZH_TrayType">{{ zhData.R_ZH_TrayType || '-' }}</div> </div> </div> + + <!-- ZH鍏宠仈绔欏彴锛堝叆搴�301+鍏ュ簱302锛� --> <div class="skuang"> <div class="zhuname">鍏ュ簱301绔欏彴</div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanPut1">{{ data.R_ZH_IsCanPut1 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanPut1">{{ zhData.R_ZH_IsCanPut1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanTake1">{{ data.R_ZH_IsCanTake1 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanTake1">{{ zhData.R_ZH_IsCanTake1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div> - <div class="xzhi" :title="data.R_ZH_TakePalletType1">{{ data.R_ZH_TakePalletType1 }}</div> + <div class="xzhi" :title="zhData.R_ZH_TakePalletType1">{{ zhData.R_ZH_TakePalletType1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutPalletType1">{{ data.W_ZH_PutPalletType1 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutPalletType1">{{ zhData.W_ZH_PutPalletType1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutRequest1">{{ data.W_ZH_PutRequest1 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutRequest1">{{ zhData.W_ZH_PutRequest1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutFinish1">{{ data.W_ZH_PutFinish1 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutFinish1">{{ zhData.W_ZH_PutFinish1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeRequest1">{{ data.W_ZH_TakeRequest1 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeRequest1">{{ zhData.W_ZH_TakeRequest1 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeFinish1">{{ data.W_ZH_TakeFinish1 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeFinish1">{{ zhData.W_ZH_TakeFinish1 || '-' }}</div> </div> + <div class="zhuname">鍏ュ簱302绔欏彴</div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanPut2">{{ data.R_ZH_IsCanPut2 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanPut2">{{ zhData.R_ZH_IsCanPut2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanTake2">{{ data.R_ZH_IsCanTake2 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanTake2">{{ zhData.R_ZH_IsCanTake2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div> - <div class="xzhi" :title="data.R_ZH_TakePalletType2">{{ data.R_ZH_TakePalletType2 }}</div> + <div class="xzhi" :title="zhData.R_ZH_TakePalletType2">{{ zhData.R_ZH_TakePalletType2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutPalletType2">{{ data.W_ZH_PutPalletType2 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutPalletType2">{{ zhData.W_ZH_PutPalletType2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutRequest2">{{ data.W_ZH_PutRequest2 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutRequest2">{{ zhData.W_ZH_PutRequest2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutFinish2">{{ data.W_ZH_PutFinish2 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutFinish2">{{ zhData.W_ZH_PutFinish2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeRequest2">{{ data.W_ZH_TakeRequest2 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeRequest2">{{ zhData.W_ZH_TakeRequest2 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeFinish2">{{ data.W_ZH_TakeFinish2 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeFinish2">{{ zhData.W_ZH_TakeFinish2 || '-' }}</div> </div> </div> - + + <!-- ZH鍏宠仈绔欏彴锛堝嚭搴�303+鍑哄簱304锛� --> <div class="skuang"> <div class="zhuname">鍑哄簱303绔欏彴</div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanPut3">{{ data.R_ZH_IsCanPut3 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanPut3">{{ zhData.R_ZH_IsCanPut3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanTake3">{{ data.R_ZH_IsCanTake3 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanTake3">{{ zhData.R_ZH_IsCanTake3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div> - <div class="xzhi" :title="data.R_ZH_TakePalletType3">{{ data.R_ZH_TakePalletType3 }}</div> + <div class="xzhi" :title="zhData.R_ZH_TakePalletType3">{{ zhData.R_ZH_TakePalletType3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutPalletType3">{{ data.W_ZH_PutPalletType3 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutPalletType3">{{ zhData.W_ZH_PutPalletType3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutRequest3">{{ data.W_ZH_PutRequest3 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutRequest3">{{ zhData.W_ZH_PutRequest3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutFinish3">{{ data.W_ZH_PutFinish3 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutFinish3">{{ zhData.W_ZH_PutFinish3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeRequest3">{{ data.W_ZH_TakeRequest3 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeRequest3">{{ zhData.W_ZH_TakeRequest3 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeFinish3">{{ data.W_ZH_TakeFinish3 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeFinish3">{{ zhData.W_ZH_TakeFinish3 || '-' }}</div> </div> + <div class="zhuname">鍑哄簱304绔欏彴</div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanPut4">{{ data.R_ZH_IsCanPut4 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanPut4">{{ zhData.R_ZH_IsCanPut4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div> - <div class="xzhi" :title="data.R_ZH_IsCanTake4">{{ data.R_ZH_IsCanTake4 }}</div> + <div class="xzhi" :title="zhData.R_ZH_IsCanTake4">{{ zhData.R_ZH_IsCanTake4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div> - <div class="xzhi" :title="data.R_ZH_TakePalletType4">{{ data.R_ZH_TakePalletType4 }}</div> + <div class="xzhi" :title="zhData.R_ZH_TakePalletType4">{{ zhData.R_ZH_TakePalletType4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutPalletType4">{{ data.W_ZH_PutPalletType4 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutPalletType4">{{ zhData.W_ZH_PutPalletType4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutRequest4">{{ data.W_ZH_PutRequest4 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutRequest4">{{ zhData.W_ZH_PutRequest4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鏀捐揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_PutFinish4">{{ data.W_ZH_PutFinish4 }}</div> + <div class="xzhi" :title="zhData.W_ZH_PutFinish4">{{ zhData.W_ZH_PutFinish4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣璇锋眰(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeRequest4">{{ data.W_ZH_TakeRequest4 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeRequest4">{{ zhData.W_ZH_TakeRequest4 || '-' }}</div> </div> <div class="zhankuang"> <div class="xname">鍙栬揣瀹屾垚(鍐�):</div> - <div class="xzhi" :title="data.W_ZH_TakeFinish4">{{ data.W_ZH_TakeFinish4 }}</div> + <div class="xzhi" :title="zhData.W_ZH_TakeFinish4">{{ zhData.W_ZH_TakeFinish4 || '-' }}</div> </div> </div> </div> @@ -170,7 +176,7 @@ </template> <script> -import { ref, nextTick } from "vue"; +import { ref, nextTick, watch, onUnmounted } from "vue"; import { useStore } from "vuex"; import { onMounted } from "vue"; @@ -180,14 +186,17 @@ xuan: 0 }; }, - methods: { - }, setup() { const store = useStore(); - const data = ref({}); + // 浠呭瓨鍌╖H鏁版嵁锛屼笌鍏朵粬鏁版嵁闅旂 + const zhData = ref({}); - // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯 - const statusMap = { + // 寤惰繜鏇存柊閰嶇疆锛岃В鍐抽棯鐑侀棶棰� + const UPDATE_DELAY = 300; // 寤惰繜300ms鏇存柊UI + let updateTimer = null; // 瀹氭椂鍣ㄥ疄渚� + + // ZH鏁版嵁鏄犲皠瑙勫垯 + const zhStatusMap = { R_ZH_Status: { 1: "姝e父", 2: "鏁呴殰", @@ -223,68 +232,109 @@ } }; - // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯 - const booleanFields = [ - "R_ZH_IsCanPut1", "R_ZH_IsCanTake1", - "W_ZH_PutRequest1", "W_ZH_PutFinish1", - "W_ZH_TakeRequest1", "W_ZH_TakeFinish1", - "R_ZH_IsCanPut2", "R_ZH_IsCanTake2", - "W_ZH_PutRequest2", "W_ZH_PutFinish2", - "W_ZH_TakeRequest2", "W_ZH_TakeFinish2", - "R_ZH_IsCanPut3", "R_ZH_IsCanTake3", - "W_ZH_PutRequest3", "W_ZH_PutFinish3", - "W_ZH_TakeRequest3", "W_ZH_TakeFinish3", - "R_ZH_IsCanPut4", "R_ZH_IsCanTake4", - "W_ZH_PutRequest4", "W_ZH_PutFinish4", - "W_ZH_TakeRequest4", "W_ZH_TakeFinish4", - ]; - const booleanMap = { - true: "鏄�", - false: "鍚�" + // ZH瀛楁鍒嗙粍 + const zhFieldGroups = { + permissionFields: { + keys: ["R_ZH_IsCanPut1", "R_ZH_IsCanTake1", "R_ZH_IsCanPut2", "R_ZH_IsCanTake2", + "R_ZH_IsCanPut3", "R_ZH_IsCanTake3", "R_ZH_IsCanPut4", "R_ZH_IsCanTake4"], + map: { true: "鏄�", false: "鍚�" } + }, + requestFields: { + keys: ["W_ZH_PutRequest1", "W_ZH_TakeRequest1", "W_ZH_PutRequest2", "W_ZH_TakeRequest2", + "W_ZH_PutRequest3", "W_ZH_TakeRequest3", "W_ZH_PutRequest4", "W_ZH_TakeRequest4"], + map: { true: "鏄�", false: "鍚�" } + }, + finishFields: { + keys: ["W_ZH_PutFinish1", "W_ZH_TakeFinish1", "W_ZH_PutFinish2", "W_ZH_TakeFinish2", + "W_ZH_PutFinish3", "W_ZH_TakeFinish3", "W_ZH_PutFinish4", "W_ZH_TakeFinish4"], + map: { true: "鏄�", false: "鍚�" } + }, + palletTypeFields: { + keys: ["R_ZH_TakePalletType1", "R_ZH_TakePalletType2", "R_ZH_TakePalletType3", "R_ZH_TakePalletType4", + "W_ZH_PutPalletType1", "W_ZH_PutPalletType2", "W_ZH_PutPalletType3", "W_ZH_PutPalletType4"], + map: { "-1": "绌虹(-1)", 1: "灏忔墭鐩�(1)", 2: "涓墭鐩�(2)", 3: "澶ф墭鐩�(3)", 4: "鐗瑰ぇ鎵樼洏(4)" } + } }; - // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁 - const processData = (rawData) => { + // 澶勭悊ZH鍘熷鏁版嵁 + const processZHData = (rawData) => { if (!rawData) return {}; - const processed = { ...rawData }; + const processedData = { ...rawData }; - // 澶勭悊鏅�氬瓧娈垫槧灏� - Object.keys(statusMap).forEach(key => { - if (processed.hasOwnProperty(key)) { - const map = statusMap[key]; - processed[key] = map[processed[key]] || processed[key]; + // 澶勭悊鏍稿績鐘舵�佸瓧娈� + Object.keys(zhStatusMap).forEach(key => { + if (processedData.hasOwnProperty(key)) { + processedData[key] = zhStatusMap[key][processedData[key]] || processedData[key]; } }); - // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈� - booleanFields.forEach(key => { - if (processed.hasOwnProperty(key)) { - processed[key] = booleanMap[processed[key]] || processed[key]; - } + // 澶勭悊鍒嗙粍瀛楁 + Object.values(zhFieldGroups).forEach(group => { + group.keys.forEach(key => { + if (processedData.hasOwnProperty(key)) { + processedData[key] = group.map[processedData[key]] || processedData[key]; + } + }); }); - return processed; + return processedData; + }; + + // 寤惰繜鏇存柊ZH鏁版嵁锛岄伩鍏嶉珮棰戝埛鏂� + const delayedUpdateZHData = (newRawData) => { + if (updateTimer) { + clearTimeout(updateTimer); + } + + updateTimer = setTimeout(() => { + // 鍙鐞嗗寘鍚玓H鐗瑰緛瀛楁鐨勬暟鎹� + if (newRawData && newRawData.R_ZH_Status !== undefined) { + zhData.value = processZHData(newRawData); + + // 鏇存柊鏍峰紡 + nextTick(() => { + const valueElements = document.getElementsByClassName("xzhi"); + for (let i = 0; i < valueElements.length; i++) { + if (valueElements[i].innerHTML === "鏄�") { + valueElements[i].style.color = "yellow"; + } else if (valueElements[i].innerHTML === "鍚�") { + valueElements[i].style.color = "red"; + } + } + }); + } + }, UPDATE_DELAY); }; onMounted(() => { - nextTick(() => { - setInterval(() => { - const rawData = store.state.homedata; - data.value = processData(rawData); - const xian = document.getElementsByClassName("xzhi"); - for (let i = 0; i < xian.length; i++) { - if (xian[i].innerHTML === "鏄�") { - xian[i].style.color = "yellow"; - } else if (xian[i].innerHTML === "鍚�") { - xian[i].style.color = "red"; - } + // 鍒濆鍔犺浇鏁版嵁 + const initialData = store.state.homedata; + if (initialData && initialData.R_ZH_Status !== undefined) { + zhData.value = processZHData(initialData); + } + + // 鐩戝惉鏁版嵁鍙樺寲锛屽彧澶勭悊ZH鏁版嵁 + const unwatch = watch( + () => store.state.homedata, + (newData) => { + if (newData && newData.R_ZH_Status !== undefined) { + delayedUpdateZHData(newData); } - }); + }, + { deep: true } + ); + + // 缁勪欢鍗歌浇鏃舵竻鐞� + onUnmounted(() => { + unwatch(); + if (updateTimer) { + clearTimeout(updateTimer); + } }); }); return { - data, + zhData }; } }; diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" index 7450c39..84a3914 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" @@ -31,5 +31,7 @@ List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode); WebResponseContent UpdateExpirationlabel(); + + Task T0DingTalkText(string webhookUrl,string secret); } } diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" index 0130abe..ac08ba2 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" @@ -1,10 +1,12 @@ 锘縰sing AutoMapper; using MailKit.Search; +using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.StockEnum; @@ -294,8 +296,11 @@ try { var today = DateTime.Today; - int batchSize = 1000; // 鎵规澶勭悊澶у皬 + int batchSize = 1000; + int totalUpdated = 0; + int skipCount = 0; + // 鍙煡璇㈤渶瑕佺殑瀛楁锛屽噺灏戞暟鎹紶杈撳拰鍐呭瓨鍗犵敤 var query = BaseDal.Db.Queryable<Dt_StockInfoDetail>() .InnerJoin<Dt_StockInfo>((detail, master) => detail.StockId == master.Id) .Select((detail, master) => new @@ -303,61 +308,82 @@ MasterId = master.Id, master.WarehouseId, detail.EffectiveDate, - CurrentExpirationlabel = master.Expirationlabel // 鐢ㄤ簬鍒ゆ柇鏄惁闇�瑕佹洿鏂� + CurrentExpirationlabel = master.Expirationlabel }); - - // 鍒嗘壒澶勭悊锛屼娇鐢═ake鍜孲kip瀹炵幇鍒嗛〉 - var totalUpdated = 0; - int skipCount = 0; while (true) { - // 浣跨敤Skip鍜孴ake瀹炵幇鍒嗛〉鑾峰彇鏁版嵁 var batchData = query.Skip(skipCount).Take(batchSize).ToList(); - if (!batchData.Any()) break; // 娌℃湁鏇村鏁版嵁鏃堕��鍑哄惊鐜� + if (!batchData.Any()) break; + var groupedData = batchData.GroupBy(item => item.MasterId) + .Select(g => new + { + MasterId = g.Key, + WarehouseId = g.First().WarehouseId, + // 鍙栨渶鏃╃殑鏈夋晥鏃ユ湡 + EarliestEffectiveDate = g.Min(item => + { + DateTime.TryParse(item.EffectiveDate, out DateTime date); + return date; + }), + CurrentExpirationlabel = g.First().CurrentExpirationlabel + }) + .ToList(); var updateDic = new Dictionary<long, int>(); - foreach (var item in batchData) + foreach (var group in groupedData) { - if (!DateTime.TryParse(item.EffectiveDate, out DateTime effectiveDate)) - continue; + DateTime effectiveDate = group.EarliestEffectiveDate; + if (effectiveDate == default(DateTime)) // 澶勭悊瑙f瀽澶辫触鐨勬儏鍐� + { + Console.WriteLine($"涓昏〃ID {group.MasterId} 涓嬫棤鏈夋晥鏃ユ湡锛岃烦杩�"); + continue; + } + int newLabel; if (effectiveDate < today) { newLabel = ExpirationlabelEnum.杩囨湡.ObjToInt(); } - else if (item.WarehouseId == 3) + else if (group.WarehouseId == 3) { int daysDiff = (effectiveDate - today).Days; - newLabel = daysDiff <= 60 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt(); + newLabel = daysDiff < 60 + ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() + : ExpirationlabelEnum.鏈复鏈�.ObjToInt(); } else { int daysDiff = (effectiveDate - today).Days; - newLabel = daysDiff <= 30 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt(); + newLabel = daysDiff < 30 + ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() + : ExpirationlabelEnum.鏈复鏈�.ObjToInt(); } - // 鍙洿鏂版湁鍙樺寲鐨勫�硷紝骞朵笖鍘婚噸 - if (newLabel != item.CurrentExpirationlabel && !updateDic.ContainsKey(item.MasterId)) + if (newLabel != group.CurrentExpirationlabel && !updateDic.ContainsKey(group.MasterId)) { - updateDic[item.MasterId] = newLabel; + updateDic[group.MasterId] = newLabel; } } if (updateDic.Any()) { - // 鏋勫缓鎵归噺鏇存柊璇彞 var updateBuilder = BaseDal.Db.Updateable<Dt_StockInfo>(); - foreach (var kvp in updateDic) - { - updateBuilder.SetColumns(m => m.Expirationlabel == kvp.Value) - .Where(m => m.Id == kvp.Key); - } - totalUpdated += updateBuilder.ExecuteCommand(); + var idsToUpdate = updateDic.Keys.ToList(); + int updateValue = updateDic.First().Value; + updateBuilder.SetColumns(m => m.Expirationlabel == updateValue) + .Where(m => idsToUpdate.Contains(m.Id)); + + int batchUpdated = updateBuilder.ExecuteCommand(); + totalUpdated += batchUpdated; + + Console.WriteLine($"鎵规鏇存柊锛歿batchUpdated} 鏉★紝绱鏇存柊锛歿totalUpdated} 鏉★紝鏇存柊鏉′欢锛歿JsonConvert.SerializeObject(idsToUpdate)}"); } - skipCount += batchSize; // 鍑嗗鑾峰彇涓嬩竴鎵规暟鎹� + + skipCount += batchSize; } + return WebResponseContent.Instance.OK($"鏇存柊鎴愬姛锛屽叡鏇存柊 {totalUpdated} 鏉¤褰�"); } catch (Exception ex) @@ -365,5 +391,62 @@ return WebResponseContent.Instance.Error("鏇存柊澶辫触锛岃鑱旂郴绠$悊鍛�"); } } + /// <summary> + /// 閽夐拤鏈哄櫒浜烘秷鎭帹閫佹祴璇� + /// </summary> + /// <returns></returns> + public async Task T0DingTalkText(string webhookUrl, string secret) + { + try + { + if (webhookUrl == null || secret == null) + { + webhookUrl = "https://oapi.dingtalk.com/robot/send?access_token=fbc3aaf4133ea650d8116fb86b3ebfd0c5e0d46775966ce87893a41886bdf9dc"; + secret = "SECf221842b26356f22ccac84c4e60714e5287408ee8332a8f63503791382c3f5fb"; + } + HttpClient httpClient = new HttpClient(); + ///鑾峰彇鏃堕棿鎴� + var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + ///鐢熸垚绛惧悕 + var sign = GenerateSign(timestamp,secret); + // 鏋勫缓璇锋眰URL + var url = $"{webhookUrl.Split('?')[0]}?access_token={new Uri(webhookUrl).Query.Split('=')[1]}×tamp={timestamp}&sign={sign}"; + var requestBody = new + { + msgtype = "text", + text = new { content = "灏忔磱涓讳汉璇�: 灏忔磱瑕佸拰灏忓澶╀笅绗竴鏈�鏈�濂�" }, + }; + var jsonBody = JsonConvert.SerializeObject(requestBody); + var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); + + // 鍙戦�丳OST璇锋眰 + var response = await httpClient.PostAsync(url, content); + if (!response.IsSuccessStatusCode) + { + // 澶勭悊璇锋眰澶辫触鐨勬儏鍐� + var errorContent = await response.Content.ReadAsStringAsync(); + throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝鐘舵�佺爜: {response.StatusCode}锛岄敊璇唴瀹�: {errorContent}"); + } + } + catch(Exception ex) + { + throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝閿欒鍐呭: {ex.Message}"); + } + } + + /// <summary> + /// 鐢熸垚鍔犵绛惧悕 + /// </summary> + /// <param name="timestamp">鏃堕棿鎴�</param> + /// <returns>绛惧悕</returns> + private string GenerateSign(long timestamp,string secret) + { + var stringToSign = $"{timestamp}\n{secret}"; + using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(secret))) + { + var hashBytes = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); + return Convert.ToBase64String(hashBytes).Replace("+", "%2B").Replace("/", "%2F"); + } + } } } diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" index 199d783..45db662 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" @@ -89,5 +89,16 @@ { return Service.UpdateExpirationlabel(); } + + /// <summary> + /// 閽夐拤鏈哄櫒浜烘秷鎭帹閫佹祴璇� + /// </summary> + /// <param name="saveModel"></param> + /// <returns></returns> + [HttpPost, HttpGet, Route("T0DingTalkText"), AllowAnonymous] + public Task T0DingTalkText(string webhookUrl, string secret) + { + return Service.T0DingTalkText(webhookUrl, secret); + } } } -- Gitblit v1.9.3