// ===== 仓库/端口 IP 映射 ===== var warehouseIpMap = { "02": "http://172.19.40.46:10012", // 二联 "01": "http://172.19.50.70:10012" // 三联 }; // ===== 从 localStorage 读取配置,默认二联/入库端 ===== var warehouseId = localStorage.getItem("warehouseId") || "02"; var type = localStorage.getItem("type") || "1"; var ip = warehouseIpMap[warehouseId]; function getData() { $.ajax({ url: ip+"/api/stock/all", type: "GET", dataType: "JSON", success: function(res) { shuzi(res.data) liebiao(res.data) } }) } function getData2() { $.ajax({ url: ip+"/api/stock/cargoSpace/pie", type: "GET", dataType: "JSON", success: function(res) { pieCharts(res.data.pie) $("#total").html(res.data.totalCargoSpace) } }) $.ajax({ url: ip+"/api/stock/inout/stat", type: "GET", dataType: "JSON", success: function(res) { tiaoxintu(res.data.drrk,res.data.drck) zhuzhuangzhexiantu(res.data.statistic) zhexiantu('bzrk', 'rgb(5, 243, 255)', 'rgb(3, 148, 153)', 'rgb(1, 77, 80)', res.data.bzrk) zhexiantu('bzck','rgb(25, 255, 236)', 'rgb(16, 171, 158)', 'rgb(6, 62, 57)' , res.data.bzck) } }) } function shuzi(res){ let totalQuantity=res.totalQuantity+"" let dom='' for (let i = 0; i < totalQuantity.length; i++) { dom+='
'+totalQuantity[i]+'
' } dom+='
件
' $("#shuzi").html(dom) } // 饼图 function pieCharts(data) { var chartDom = document.getElementById('middleDiv'); var myChart = echarts.init(chartDom); var option; option = { color: myColor1, legend: { bottom: 60, itemWidth: 30, itemHeight: 20, // itemGap:100, textStyle: { fontSize: 20, color: '#fff', padding: [0, 10] } }, series: [{ name: 'Nightingale Chart', type: 'pie', radius: [160, 260], center: ['50%', '43%'], // roseType: 'area', itemStyle: { borderRadius: 8 }, label: { show: true, textStyle: { fontSize: 24, color: "#fff", }, formatter: '{b}{c}\n{d}%' }, data: data }] }; option && myChart.setOption(option); } // 条形图 function tiaoxintu(a,b) { var chartDom1 = document.getElementById('drcrk'); var myChart = echarts.init(chartDom1); var option; const builderJson = { all: Number(a)+Number(b), charts: { 出库量: b, 入库量: a, } }; var myColor = ["#19ffec", "#19ffec"] const canvas = document.createElement('canvas'); option = { backgroundColor: { type: 'pattern', image: canvas, repeat: 'repeat' }, tooltip: {}, title: [{ subtext: '总计 ' + builderJson.all + ' 件', left: 'center', subtextStyle: { color: '#ffb742', fontSize: 20 } }], grid: [{ top: 40, left: 80, bottom: 110 }], xAxis: [{ type: 'value', max: builderJson.all, axisLabel: { color: '#00fff9', fontSize: 20 }, splitLine: { show: false } }], yAxis: [{ type: 'category', data: Object.keys(builderJson.charts), axisLabel: { interval: 0, color: '#00fff9', fontSize: 20, rotate: 30 }, splitLine: { show: false } }], series: [{ type: 'bar', stack: 'chart', z: 3, label: { color: '#fff', position: 'right', show: true, fontSize: 20 }, itemStyle: { barBorderRadius: 5, // 修改每个柱子的颜色 color: function(params) { var num = myColor.length; return myColor[params.dataIndex % num] }, }, // 修改柱子的距离 barCategoryGap: 0, // 柱子的宽度 barWidth: 10, data: Object.keys(builderJson.charts).map(function(key) { return builderJson.charts[key]; }) }, { type: 'bar', stack: 'chart', silent: true, itemStyle: { barBorderRadius: 2, color: '#0b4a54' }, data: Object.keys(builderJson.charts).map(function(key) { return builderJson.all - builderJson.charts[key]; }) } ] }; option && myChart.setOption(option); } // 柱状图折现图 function zhuzhuangzhexiantu(data) { var chartDom = document.getElementById('dycrk'); var myChart = echarts.init(chartDom); var option; var labelOption labelOption = { show: true, position: "top", verticalAlign: 'middle', fontSize: 15, color: "#ffffff" }; option = { legend: { left: "65%", textStyle: { fontSize: 15, color: "#19ffec" }, }, tooltip: {}, dataset: { dimensions: ['mouth', '入库', '出库'], source: data }, grid: { top: "20%", left: '5%', right: '5%', bottom: '5%', show: false, //显示边框 borderColor: "#012f4a", //边框颜色 containLabel: true //包含刻度文字在内 }, xAxis: { type: 'category', axisLabel: { color: '#00f2f1', //文本颜色 fontSize: 15 } }, yAxis: { axisLabel: { color: '#00f2f1', //文本颜色 fontSize: 15 }, splitLine: { lineStyle: { color: "rgba(25,255,255,.3)" } } }, series: [{ type: "bar", showBackground: false, barWidth: '50%', label: labelOption, itemStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#19ffec' }, { offset: 0.6, color: '#07554e' }, { offset: 1, color: '#04252b' } ]) } }, { type: "line", showBackground: true, label: labelOption, itemStyle: { color: '#ffb742' } }] }; option && myChart.setOption(option); } // 折线图 function zhexiantu(a, b, c, d, e) { var chartDom = document.getElementById(a); var myChart = echarts.init(chartDom); var option; var labelOption = { show: true, position: "top", verticalAlign: 'middle', fontSize: 15, color: "#ffb742" }; option = { xAxis: { type: 'category', boundaryGap: false, //坐标轴两边不留白 axisLabel: { color: '#00f2f1', //文本颜色 fontSize: 15 }, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value', axisLabel: { color: '#00f2f1', //文本颜色 fontSize: 15 }, splitLine: { lineStyle: { // 设置背景横线 color: "#097176", } } }, grid: { left: '5%', top: '10%', // right: '4%', bottom: '5%', containLabel: true }, series: [{ data: e, type: 'line', smooth: 0.2, itemStyle: { color: b }, label: labelOption, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: c }, { offset: 1, color: d } ]) } }] }; option && myChart.setOption(option); } var biaoshi = 0 function info() { var tr = $("#aa ul>li:eq(1)").clone(); var height = $("#kcxx").innerHeight(); var allheight = $("#box").innerHeight() if (height > allheight) { $("#aa ul>li:eq(1)").animate({ marginTop: "-1.8rem" }, 500, function() { $("#aa ul>li:eq(1)").remove(); }) biaoshi = 1 } else { biaoshi = 2 } } function liebiao(res) { let data = res.stockMsg let dom = ""; if (biaoshi == 2) { $(".tt").remove() for (var i = 0; i < data.length; i++) { if (i % 2 == 0) { dom += "
  • " + data[i].productId + "

    " + data[i].productName + "

    " + data[i].lotNo + "

    " + data[i].quantity + "

  • " } else { dom += "
  • " + data[i].productId + "

    " + data[i].productName + "

    " + data[i].lotNo + "

    " + data[i].quantity + "

  • " } } $("#kcxx").append(dom) } } // 时间 var t = null; $(document).ready(function() { time() // 初始化巷道标题 updateLaneHeaders(); getAlarmData(); window.setInterval(getAlarmData, 1500); getLaneData(); window.setInterval(getLaneData, 1500); // window.setInterval(scrollAlarmList, 1000); }) function getAlarmData() { $.ajax({ url: ip + "/api/screen/selectFaultRecord?warehouseId="+warehouseId+"&type="+type, type: "GET", dataType: "JSON", success: function(res) { if (res.code === 200) { renderAlarmData(res.data); } }, error: function(err) { console.log("Error fetching alarm data", err); } }) } function renderAlarmData(data) { var dom = ""; // Ensure we have data if (!data || data.length === 0) { $(".alarm-items").html(""); return; } for (var i = 0; i < data.length; i++) { var item = data[i]; var bg = i % 2 == 0 ? "#046566" : "#05383c"; // Map fields // Time: Extract HH:mm:ss from startTime "yyyy-MM-dd HH:mm:ss" var timeStr = item.startTime ? item.startTime.split(' ')[1] : ""; // Type: Default to "故障" var type = "故障"; var color = "#ff4d4d"; // Red for fault // Detail: deviceName + fault description var faultDesc = item.fault; /*if (item.deviceType === "ddj") { faultDesc = faultDesc; } else if (item.deviceType === "ssj") { faultDesc = faultDesc; }*/ var detail = (item.deviceName || "") + " " + (faultDesc || ""); // Task No var taskNo = item.taskNo || ""; dom += "
  • " + "

    " + taskNo + "

    " + "

    " + timeStr + "

    " + "

    " + type + "

    " + "

    " + detail + "

    " + "
  • "; } $(".alarm-items").html(dom); } function getLaneData() { $.ajax({ url: ip + "/api/screen/selectJobListByWarehouseIdAndType?warehouseId="+warehouseId+"&type="+type, type: "GET", dataType: "JSON", success: function(res) { if (res.code === 200) { renderLaneData(res.data); } }, error: function(err) { console.log("Error fetching lane data", err); } }) } function renderLaneData(data) { // 根据仓库ID动态设置巷道编号 let laneIds; if (warehouseId === "02") { laneIds = ['4', '5', '6']; //二联:4、5、6巷道 } else { laneIds = ['1', '2', '3']; //三联:1、2、3巷道 } console.log(laneIds); // 前端dom固定 lane1/lane2/lane3,依次渲染三个巷道 const domIdList = ["lane1", "lane2", "lane3"]; // 同步更新页面顶部巷道标题 updateLaneHeaders(); laneIds.forEach(function(key, idx) { var list = data[key] || []; var content = ""; content += ""; // 依次填充 lane1/lane2/lane3 $("#" + domIdList[idx]).html(content); }); } function getTaskTypeName(code) { // 空值/假值直接返回空字符串(保留原逻辑) if (!code) return ""; // 将编码转为数字(兼容字符串/数字类型入参),判断大小后返回对应名称 const numCode = Number(code); return numCode >= 20 ? "出库" : "入库"; } function getTaskStatusName(code) { if (!code) return ""; if (code === "4") return "完成"; if (code === "0") return "创建"; if (code === "1" || code == "2" || code == "3") return "执行中"; return code; } function getDdjFaultDescription(value) { if (value === "0") return "待机"; if (value === "1") return "工作"; if (value === "1031") return "急停"; if (value === "1032") return "货叉不在中位"; if (value === '1033') return "行走变频报警"; if (value === "1034") return "升降变频报警"; if (value === "1035") return "货叉变频报警"; if (value === "1036") return "货叉变频报警"; if (value === "1037") return "运行限位故障"; if (value === "1038") return "升降限位故障"; if (value === "1039") return "运行不能纠偏"; if (value === "1040") return "升降不能纠偏"; if (value === "1041") return "水平测距出错"; if (value === "1042") return "垂直BPS出错"; if (value === "1043") return "超速保护"; if (value === "1044") return "前边超宽"; if (value === "1045") return "后边超宽"; if (value === "1046") return "左边歪斜"; if (value === "1047") return "右边歪斜"; if (value === "1048") return "超高1"; if (value === "1049") return "超高2"; if (value === "1050") return "放货完毕货叉有货"; if (value === "1051") return "取货时货叉有货"; if (value === "1052") return "放货目标有货"; if (value === "1053") return "取货完毕无货"; if (value === "1054") return "放货时货叉无货"; if (value === "1055") return "货叉动作超时"; if (value === "1056") return "货叉不能纠偏"; if (value === "1057") return "微升降超时"; if (value === "1058") return "松绳过载"; if (value === "1059") return "设定超限"; if (value === "1060") return "取双伸时单伸有货"; if (value === "1061") return "放双伸时单伸有货"; if (value === "1062") return "入库输送机任务不符"; if (value === "1063") return "安全门打开"; if (value === "9999") return "设备未联机"; return value; } function getSsjFaultDescription(value) { if (value == 101) return "前超长"; if (value == 102) return "后超长"; if (value == 103) return "左超宽"; if (value == 104) return "右超宽"; if (value == 105) return "超高"; if (value == 106) return "称重异常"; return value; } function time() { clearTimeout(t); dt = new Date(); var y = dt.getFullYear(); var mt = dt.getMonth() + 1; var day = dt.getDate(); var h = dt.getHours(); var m = dt.getMinutes(); var s = dt.getSeconds(); var a = new Date().getDay(); var b = ""; switch (a) { case 0: b = "日"; break; case 1: b = "一"; break; case 2: b = "二"; break; case 3: b = "三"; break; case 4: b = "四"; break; case 5: b = "五"; break; default: b = "六"; } document.querySelector(".riqi").innerHTML = "星期" + b + "
    " + y + "年" + mt + "月" + day + "日"; document.querySelector(".shijian").innerHTML = jialing(h) + ":" + jialing(m); t = setTimeout(time, 1000); } function jialing(m) { if (m < 10) { m = "0" + m return m; } else { return m; } } function mockAlarmData() { var alarms = [ { time: "10:00:01", type: "故障", detail: "1号堆垛机通信中断", status: "未处理" }, { time: "10:05:23", type: "警告", detail: "2号入库口货物堆积", status: "处理中" }, { time: "10:15:11", type: "故障", detail: "3号出库口光电异常", status: "未处理" }, { time: "10:20:45", type: "提示", detail: "系统自动备份完成", status: "已完成" }, { time: "10:30:00", type: "警告", detail: "库位占用率过高", status: "处理中" }, { time: "10:35:12", type: "故障", detail: "1号巷道急停按下", status: "未处理" }, { time: "10:40:00", type: "提示", detail: "入库任务下发成功", status: "已完成" }, { time: "10:45:30", type: "警告", detail: "网络延迟较高", status: "处理中" } ]; var dom = ""; for (var i = 0; i < alarms.length; i++) { var bg = i % 2 == 0 ? "#046566" : "#05383c"; var color = alarms[i].type === "故障" ? "#ff4d4d" : (alarms[i].type === "警告" ? "#ffb742" : "#fff"); dom += "
  • " + "

    " + alarms[i].time + "

    " + "

    " + alarms[i].type + "

    " + "

    " + alarms[i].detail + "

    " + "

    " + alarms[i].status + "

    " + "
  • "; } $(".alarm-items").html(dom); } function scrollAlarmList() { var list = $(".alarm-items"); var firstItem = list.find("li:first"); if (firstItem.length === 0) return; var height = firstItem.outerHeight(true); // Default to some height if 0 (e.g. if hidden) if (height === 0) height = 44; if (list.children().length >= 1) { firstItem.animate({ marginTop: -height + "px" }, 600, function() { firstItem.css("marginTop", 0).appendTo(list); }); } } function mockLaneData() { // Generate mock data for 3 lanes (merged inbound/outbound) var laneIds = ['lane1', 'lane2', 'lane3']; laneIds.forEach(function(id) { var content = ""; // Create a list structure content += ""; $("#" + id).html(content); }); } // ===== 服务器设置弹窗 ===== // 临时选中状态(未保存前不生效) var _pendingWarehouse = warehouseId; var _pendingType = type; function openSettingModal() { _pendingWarehouse = warehouseId; _pendingType = type; // 初始化选中状态 $("#warehouseOptions .setting-option").each(function() { $(this).toggleClass("active", $(this).data("value") === _pendingWarehouse); }); $("#typeOptions .setting-option").each(function() { $(this).toggleClass("active", $(this).data("value") + "" === _pendingType + ""); }); updatePreview(); $("#settingModalMask").fadeIn(200); $("#settingModal").fadeIn(200); } function closeSettingModal() { $("#settingModalMask").fadeOut(200); $("#settingModal").fadeOut(200); } function selectOption(group, el) { var val = $(el).data("value") + ""; if (group === "warehouse") { _pendingWarehouse = val; $("#warehouseOptions .setting-option").removeClass("active"); } else { _pendingType = val; $("#typeOptions .setting-option").removeClass("active"); } $(el).addClass("active"); updatePreview(); } function updatePreview() { var whName = _pendingWarehouse === "02" ? "二联" : "三联"; var typeName = _pendingType === "1" ? "入库端" : "出库端"; var previewIp = warehouseIpMap[_pendingWarehouse]; $("#settingPreview").html( "仓库:" + whName + " 端口:" + typeName + "
    " + "IP:" + previewIp ); } function updateLaneHeaders() { var laneIds = (warehouseId === "02") ? ['4', '5', '6'] : ['1', '2', '3']; var laneHeaders = document.querySelectorAll(".lane-header"); laneIds.forEach(function(key, idx) { if (laneHeaders[idx]) { laneHeaders[idx].textContent = key + "巷道"; } }); } function saveSettings() { // 更新全局变量 warehouseId = _pendingWarehouse; type = _pendingType; ip = warehouseIpMap[warehouseId]; // 持久化到 localStorage localStorage.setItem("warehouseId", warehouseId); localStorage.setItem("type", type); // 立即更新巷道标题 updateLaneHeaders(); closeSettingModal(); // 立即刷新数据 getAlarmData(); getLaneData(); }