hfy пре 3 дана
родитељ
комит
5e59e69576

+ 4 - 1
src/main/java/com/jeesite/modules/mes/dao/MesProductRecordDao.java

@@ -6,6 +6,7 @@ import com.jeesite.modules.mes.entity.MesProduct;
 import com.jeesite.modules.mes.entity.MesProductRecord;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Map;
 import java.util.List;
 
 /**
@@ -26,4 +27,6 @@ public interface MesProductRecordDao extends CrudDao<MesProductRecord> {
 
     List<MesProductRecord> selectByOprno(MesProductRecord mesProductRecord);
 
-}
+    List<Map<String, Object>> findRecordCountByOprnos(@Param("oprnos") List<String> oprnos);
+
+}

+ 5 - 1
src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java

@@ -223,6 +223,10 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		return mesProductRecordDao.selectByOprno(mesProductRecord);
 	}
 
+	public List<Map<String, Object>> findRecordCountByOprnos(List<String> oprnos) {
+		return mesProductRecordDao.findRecordCountByOprnos(oprnos);
+	}
+
 
 	/**
 	 * 保存数据(插入或更新)
@@ -1252,4 +1256,4 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		query.getSqlMap().getWhere().and("oprno", QueryType.LIKE, fOprno);
 		return findList(query);
 	}
-}
+}

+ 108 - 1
src/main/java/com/jeesite/modules/mes/web/MesProductController.java

@@ -298,6 +298,113 @@ public class MesProductController extends BaseController {
 		return "modules/mes/mesScreen4";
 	}
 
+	@RequestMapping(value = "screen5")
+	public String screen5(Model model) {
+		return "modules/mes/mesScreen5";
+	}
+
+	@RequestMapping(value = "screen6")
+	public String screen6(Model model) {
+		return "modules/mes/mesScreen6";
+	}
+
+	@RequestMapping(value = "screen7")
+	public String screen7(Model model) {
+		return "modules/mes/mesScreen7";
+	}
+
+	@RequestMapping(value = "screen8")
+	public String screen8(Model model) {
+		return "modules/mes/mesScreen8";
+	}
+
+	@RequestMapping(value = "screen9")
+	public String screen9(Model model) {
+		return "modules/mes/mesScreen9";
+	}
+
+	@RequestMapping(value = "screenOprnoRecordCount")
+	@ResponseBody
+	public CommonResp screenOprnoRecordCount(HttpServletRequest req) {
+		CommonResp<List<Map<String, Object>>> resp = new CommonResp<>();
+		String oprnosParam = req.getParameter("oprnos");
+		if (StringUtils.isEmpty(oprnosParam)) {
+			oprnosParam = req.getParameter("oprno");
+		}
+
+		LinkedHashSet<String> oprnoSet = new LinkedHashSet<>();
+		if (StringUtils.isNotEmpty(oprnosParam)) {
+			String[] oprnoArr = oprnosParam.split("[,,;;\\s]+");
+			for (String item : oprnoArr) {
+				if (item == null) {
+					continue;
+				}
+				String oprno = item.trim();
+				if (StringUtils.isEmpty(oprno)) {
+					continue;
+				}
+				oprnoSet.add(oprno.toUpperCase(Locale.ROOT));
+			}
+		}
+
+		if (oprnoSet.isEmpty()) {
+			resp.setResult(Global.FALSE);
+			resp.setMessage("请传入工位号");
+			resp.setData(ListUtils.newArrayList());
+			return resp;
+		}
+
+		List<String> oprnoList = new ArrayList<>(oprnoSet);
+		List<Map<String, Object>> countRows = mesProductRecordService.findRecordCountByOprnos(oprnoList);
+		Map<String, Long> countMap = MapUtils.newHashMap();
+		for (Map<String, Object> row : countRows) {
+			if (row == null) {
+				continue;
+			}
+			Object oprnoValue = row.get("oprno");
+			if (oprnoValue == null) {
+				oprnoValue = row.get("OPRNO");
+			}
+			if (oprnoValue == null) {
+				continue;
+			}
+			Object countValue = row.get("recordCount");
+			if (countValue == null) {
+				countValue = row.get("RECORDCOUNT");
+			}
+			Long count = 0L;
+			if (countValue instanceof Number) {
+				count = ((Number) countValue).longValue();
+			} else if (countValue != null) {
+				count = Long.valueOf(countValue.toString());
+			}
+			countMap.put(oprnoValue.toString().toUpperCase(Locale.ROOT), count);
+		}
+
+		List<Map<String, Object>> data = ListUtils.newArrayList();
+		long total = 0L;
+		for (String oprno : oprnoList) {
+			Long count = countMap.get(oprno);
+			if (count == null) {
+				count = 0L;
+			}
+			total += count;
+			Map<String, Object> item = MapUtils.newHashMap();
+			item.put("oprno", oprno);
+			item.put("recordCount", count);
+			data.add(item);
+		}
+
+		Map<String, Object> totalItem = MapUtils.newHashMap();
+		totalItem.put("oprno", "合计");
+		totalItem.put("recordCount", total);
+		data.add(totalItem);
+
+		resp.setData(data);
+		resp.setResult(Global.TRUE);
+		return resp;
+	}
+
 	@RequestMapping(value = "alarmData")
 	@ResponseBody
 	public CommonResp alarmData() {
@@ -715,4 +822,4 @@ public class MesProductController extends BaseController {
 		resp.setData(map);
 		return resp;
 	}
-}
+}

+ 10 - 1
src/main/resources/mappings/modules/mes/MesProductRecordDao.xml

@@ -40,6 +40,15 @@
         WHERE a.oprno != b.oprno AND (a.create_date BETWEEN "2025-03-01 00:00:00" AND "2025-04-01 00:00:00")  AND a.oprno IN("OP220","OP230","OP240","OP280","OP290","OP300")
             LIMIT 20000
     </select>
+    <select id="findRecordCountByOprnos" resultType="java.util.HashMap">
+        SELECT oprno, COUNT(1) AS recordCount
+        FROM mes_product_record
+        WHERE oprno IN
+        <foreach collection="oprnos" item="oprno" open="(" separator="," close=")">
+            #{oprno}
+        </foreach>
+        GROUP BY oprno
+    </select>
     <update id="updateAll">
        update mes_product_record
        set content=#{content},materiel_sn=#{materielSn}
@@ -49,4 +58,4 @@
         update mes_product_record set content =#{content}
         where sn = #{sn} and oprno = #{oprno} and line_sn = #{lineSn} and craft = #{craft}
     </update>
-</mapper>
+</mapper>

+ 278 - 0
src/main/resources/static/screen/oprno-record-screen.css

@@ -0,0 +1,278 @@
+html,
+body {
+	width: 100%;
+	height: 100%;
+	margin: 0;
+	overflow: hidden;
+	background: #061326;
+	font-family: "Microsoft YaHei", Arial, sans-serif;
+}
+
+.screen-page {
+	position: relative;
+	width: 1920px;
+	height: 1080px;
+	color: #fff;
+	overflow: hidden;
+}
+
+.screen-page .bg {
+	position: absolute;
+	inset: 0;
+	width: 100%;
+	height: 100%;
+	object-fit: cover;
+	z-index: 0;
+}
+
+.screen-content {
+	position: relative;
+	z-index: 1;
+	height: 100%;
+	padding: 32px 48px 42px;
+	box-sizing: border-box;
+}
+
+.screen-header {
+	display: grid;
+	grid-template-columns: 1fr auto 1fr;
+	align-items: center;
+	height: 86px;
+}
+
+.screen-title-new {
+	grid-column: 2;
+	color: #fff;
+	font-size: 34px;
+	font-weight: 700;
+	text-align: center;
+	letter-spacing: 0;
+	text-shadow: 0 0 18px rgba(0, 246, 255, 0.45);
+}
+
+.screen-time {
+	justify-self: end;
+	font-size: 20px;
+	color: #9ad8ff;
+}
+
+.summary-row {
+	display: grid;
+	grid-template-columns: repeat(3, 1fr);
+	gap: 20px;
+	margin-top: 12px;
+}
+
+.summary-item {
+	height: 116px;
+	padding: 18px 24px;
+	border: 1px solid rgba(64, 222, 120, 0.28);
+	border-radius: 6px;
+	background: linear-gradient(180deg, rgba(5, 37, 78, 0.88), rgba(5, 25, 54, 0.76));
+	box-shadow: inset 0 0 30px rgba(0, 143, 253, 0.12);
+	box-sizing: border-box;
+}
+
+.summary-label {
+	font-size: 20px;
+	color: #9ad8ff;
+}
+
+.summary-value {
+	margin-top: 12px;
+	color: #40de78;
+	font-size: 42px;
+	font-weight: 700;
+	line-height: 1;
+}
+
+.main-grid {
+	display: grid;
+	grid-template-columns: 470px 1fr;
+	gap: 22px;
+	height: 770px;
+	margin-top: 22px;
+}
+
+.panel {
+	border: 1px solid rgba(0, 143, 253, 0.34);
+	border-radius: 6px;
+	background: rgba(4, 20, 45, 0.78);
+	box-shadow: inset 0 0 36px rgba(0, 143, 253, 0.14);
+	overflow: hidden;
+}
+
+.panel-title {
+	height: 52px;
+	line-height: 52px;
+	padding: 0 18px;
+	color: #00f6ff;
+	font-size: 20px;
+	font-weight: 700;
+	background: rgba(20, 55, 120, 0.74);
+	box-sizing: border-box;
+}
+
+.control-panel {
+	display: flex;
+	flex-direction: column;
+}
+
+.oprno-input {
+	display: block;
+	width: calc(100% - 36px);
+	height: 122px;
+	margin: 18px;
+	padding: 12px;
+	resize: none;
+	border: 1px solid rgba(0, 246, 255, 0.35);
+	border-radius: 4px;
+	outline: none;
+	background: rgba(3, 15, 34, 0.88);
+	color: #fff;
+	font-size: 18px;
+	line-height: 1.45;
+	box-sizing: border-box;
+}
+
+.input-row {
+	display: grid;
+	grid-template-columns: 1fr 96px;
+	gap: 10px;
+	margin: 0 18px;
+}
+
+.add-input {
+	height: 42px;
+	padding: 0 12px;
+	border: 1px solid rgba(0, 246, 255, 0.35);
+	border-radius: 4px;
+	outline: none;
+	background: rgba(3, 15, 34, 0.88);
+	color: #fff;
+	font-size: 18px;
+	box-sizing: border-box;
+}
+
+.action-row {
+	display: grid;
+	grid-template-columns: 1fr 1fr;
+	gap: 10px;
+	margin: 12px 18px 0;
+}
+
+.screen-btn {
+	height: 42px;
+	border: 1px solid rgba(0, 246, 255, 0.5);
+	border-radius: 4px;
+	background: rgba(0, 143, 253, 0.22);
+	color: #eaf9ff;
+	font-size: 18px;
+	cursor: pointer;
+}
+
+.screen-btn.primary {
+	border-color: rgba(64, 222, 120, 0.76);
+	background: rgba(64, 222, 120, 0.2);
+}
+
+.screen-btn:hover {
+	background: rgba(0, 143, 253, 0.36);
+}
+
+.tag-list {
+	display: flex;
+	flex-wrap: wrap;
+	align-content: flex-start;
+	gap: 10px;
+	margin: 18px;
+	padding: 0;
+	min-height: 210px;
+	overflow: hidden;
+}
+
+.tag-item {
+	display: inline-flex;
+	align-items: center;
+	height: 34px;
+	padding: 0 10px;
+	border: 1px solid rgba(64, 222, 120, 0.38);
+	border-radius: 4px;
+	background: rgba(64, 222, 120, 0.1);
+	color: #e9fff1;
+	font-size: 16px;
+}
+
+.tag-remove {
+	margin-left: 8px;
+	color: #ff8ca1;
+	font-size: 20px;
+	line-height: 1;
+	cursor: pointer;
+}
+
+.hint {
+	margin: auto 18px 18px;
+	color: #75a7c8;
+	font-size: 14px;
+	line-height: 1.6;
+}
+
+.data-panel {
+	display: grid;
+	grid-template-rows: 52px 350px 1fr;
+}
+
+.chart-box {
+	min-height: 0;
+}
+
+.table-wrap {
+	padding: 0 18px 18px;
+	overflow: hidden;
+}
+
+.record-table {
+	width: 100%;
+	border-collapse: collapse;
+	table-layout: fixed;
+	text-align: center;
+}
+
+.record-table th {
+	height: 48px;
+	color: #00f6ff;
+	font-size: 20px;
+	font-weight: 700;
+	border-bottom: 1px solid rgba(0, 246, 255, 0.24);
+}
+
+.record-table td {
+	height: 50px;
+	color: #fff;
+	font-size: 22px;
+	border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.record-table tr:nth-child(even) td {
+	background: rgba(0, 143, 253, 0.08);
+}
+
+.record-table .oprno-cell {
+	color: #40de78;
+	font-weight: 700;
+}
+
+.record-table .count-cell {
+	font-size: 26px;
+	font-weight: 700;
+}
+
+.empty-row {
+	height: 300px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	color: #75a7c8;
+	font-size: 22px;
+}

+ 256 - 0
src/main/resources/static/screen/oprno-record-screen.js

@@ -0,0 +1,256 @@
+(function () {
+	var config = window.screenOprnoConfig || {};
+	var state = {
+		oprnos: normalizeOprnos(config.defaultOprnos || []),
+		data: [],
+		chart: null
+	};
+
+	$(function () {
+		changeZoom();
+		initPage();
+		refreshData();
+		setInterval(updateTime, 1000);
+		setInterval(refreshData, 1000 * 60);
+		$(window).resize(function () {
+			changeZoom();
+			if (state.chart) {
+				state.chart.resize();
+			}
+		});
+	});
+
+	function initPage() {
+		$("#screenTitle").text(config.title || "工位加工记录统计大屏");
+		updateTime();
+		renderInput();
+		renderTags();
+
+		$("#addBtn").on("click", addOprno);
+		$("#addOprno").on("keydown", function (e) {
+			if (e.keyCode === 13) {
+				addOprno();
+			}
+		});
+		$("#queryBtn").on("click", function () {
+			state.oprnos = normalizeOprnos($("#oprnoInput").val());
+			renderInput();
+			renderTags();
+			refreshData();
+		});
+		$("#clearBtn").on("click", function () {
+			state.oprnos = [];
+			state.data = [];
+			renderInput();
+			renderTags();
+			renderData();
+		});
+	}
+
+	function changeZoom() {
+		var wb = $(window).width() / 1920;
+		var hb = $(window).height() / 1080;
+		var scale = wb >= hb ? hb : wb;
+		$(".screen-page").css({
+			transform: "scale(" + scale + ")",
+			transformOrigin: "top left",
+			marginLeft: Math.max(0, ($(window).width() - 1920 * scale) / 2) + "px",
+			marginTop: Math.max(0, ($(window).height() - 1080 * scale) / 2) + "px"
+		});
+	}
+
+	function updateTime() {
+		var now = new Date();
+		var text = pad(now.getFullYear()) + "-" + pad(now.getMonth() + 1) + "-" + pad(now.getDate()) +
+			" " + pad(now.getHours()) + ":" + pad(now.getMinutes()) + ":" + pad(now.getSeconds());
+		$("#screenTime").text(text);
+	}
+
+	function pad(num) {
+		return num < 10 ? "0" + num : "" + num;
+	}
+
+	function addOprno() {
+		var value = $("#addOprno").val();
+		var addList = normalizeOprnos(value);
+		if (!addList.length) {
+			return;
+		}
+		state.oprnos = normalizeOprnos(state.oprnos.concat(addList));
+		$("#addOprno").val("");
+		renderInput();
+		renderTags();
+		refreshData();
+	}
+
+	function removeOprno(oprno) {
+		state.oprnos = state.oprnos.filter(function (item) {
+			return item !== oprno;
+		});
+		renderInput();
+		renderTags();
+		refreshData();
+	}
+
+	function renderInput() {
+		$("#oprnoInput").val(state.oprnos.join("\n"));
+	}
+
+	function renderTags() {
+		var html = "";
+		state.oprnos.forEach(function (oprno) {
+			html += '<span class="tag-item">' + escapeHtml(oprno) +
+				'<span class="tag-remove" data-oprno="' + escapeHtml(oprno) + '">×</span></span>';
+		});
+		$("#tagList").html(html);
+		$(".tag-remove").on("click", function () {
+			removeOprno($(this).data("oprno"));
+		});
+		$("#oprnoTotal").text(state.oprnos.length);
+	}
+
+	function refreshData() {
+		if (!state.oprnos.length) {
+			state.data = [];
+			renderData();
+			return;
+		}
+		$.post("/js/a/mes/mesProduct/screenOprnoRecordCount", {
+			oprnos: state.oprnos.join(",")
+		}, function (ret) {
+			if (ret && ret.result === "true") {
+				state.data = ret.data || [];
+			} else {
+				state.data = [];
+			}
+			renderData();
+		});
+	}
+
+	function renderData() {
+		var rows = state.data.filter(function (item) {
+			return item.oprno !== "合计";
+		});
+		var total = 0;
+		rows.forEach(function (item) {
+			total += Number(item.recordCount || 0);
+		});
+
+		$("#recordTotal").text(total);
+		$("#maxOprno").text(getMaxText(rows));
+		renderTable(rows);
+		renderChart(rows);
+	}
+
+	function renderTable(rows) {
+		if (!rows.length) {
+			$("#recordBody").html('<tr><td colspan="3"><div class="empty-row">暂无工位数据</div></td></tr>');
+			return;
+		}
+		var html = "";
+		rows.forEach(function (item, index) {
+			html += "<tr>";
+			html += "<td>" + (index + 1) + "</td>";
+			html += '<td class="oprno-cell">' + escapeHtml(item.oprno) + "</td>";
+			html += '<td class="count-cell">' + Number(item.recordCount || 0) + "</td>";
+			html += "</tr>";
+		});
+		$("#recordBody").html(html);
+	}
+
+	function renderChart(rows) {
+		var chartDom = document.getElementById("recordChart");
+		if (!state.chart) {
+			state.chart = echarts.init(chartDom);
+		}
+		var names = rows.map(function (item) { return item.oprno; });
+		var values = rows.map(function (item) { return Number(item.recordCount || 0); });
+		state.chart.setOption({
+			tooltip: {
+				trigger: "axis",
+				axisPointer: { type: "shadow" },
+				backgroundColor: "rgba(20, 55, 120, 0.9)",
+				borderColor: "#008ffd",
+				textStyle: { color: "#fff" }
+			},
+			grid: {
+				left: "4%",
+				right: "4%",
+				top: "12%",
+				bottom: "10%",
+				containLabel: true
+			},
+			xAxis: {
+				type: "category",
+				data: names,
+				axisLine: { lineStyle: { color: "#2a7db8" } },
+				axisTick: { show: false },
+				axisLabel: { color: "#fff", fontSize: 16, interval: 0 }
+			},
+			yAxis: {
+				type: "value",
+				axisLine: { lineStyle: { color: "#2a7db8" } },
+				axisTick: { show: false },
+				axisLabel: { color: "#fff", fontSize: 14 },
+				splitLine: { lineStyle: { color: "rgba(255,255,255,0.08)" } }
+			},
+			series: [{
+				name: "加工记录数",
+				type: "bar",
+				barMaxWidth: 46,
+				data: values,
+				itemStyle: {
+					color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+						{ offset: 0, color: "#40de78" },
+						{ offset: 1, color: "#008ffd" }
+					]),
+					barBorderRadius: [4, 4, 0, 0]
+				},
+				label: {
+					show: true,
+					position: "top",
+					color: "#fff",
+					fontSize: 16
+				}
+			}]
+		}, true);
+	}
+
+	function getMaxText(rows) {
+		if (!rows.length) {
+			return "--";
+		}
+		var max = rows[0];
+		rows.forEach(function (item) {
+			if (Number(item.recordCount || 0) > Number(max.recordCount || 0)) {
+				max = item;
+			}
+		});
+		return max.oprno + " / " + Number(max.recordCount || 0);
+	}
+
+	function normalizeOprnos(input) {
+		var source = Array.isArray(input) ? input.join(",") : String(input || "");
+		var items = source.split(/[,,;;\s]+/);
+		var map = {};
+		var ret = [];
+		items.forEach(function (item) {
+			var oprno = $.trim(item || "").toUpperCase();
+			if (!oprno || map[oprno]) {
+				return;
+			}
+			map[oprno] = true;
+			ret.push(oprno);
+		});
+		return ret;
+	}
+
+	function escapeHtml(value) {
+		return String(value == null ? "" : value)
+			.replace(/&/g, "&amp;")
+			.replace(/</g, "&lt;")
+			.replace(/>/g, "&gt;")
+			.replace(/"/g, "&quot;")
+			.replace(/'/g, "&#39;");
+	}
+})();

+ 62 - 0
src/main/resources/views/modules/mes/mesScreen5.html

@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="zh-CN">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title>MES工位加工记录统计大屏</title>
+	<link rel="stylesheet" href="${ctxStatic}/screen/oprno-record-screen.css">
+</head>
+<body>
+<div class="screen-page">
+	<img class="bg" src="${ctxStatic}/screen/imgs/bg3.png" alt="">
+	<div class="screen-content">
+		<div class="screen-header">
+			<div></div>
+			<div class="screen-title-new" id="screenTitle"></div>
+			<div class="screen-time" id="screenTime"></div>
+		</div>
+		<div class="summary-row">
+			<div class="summary-item"><div class="summary-label">工位数量</div><div class="summary-value" id="oprnoTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">加工记录总数</div><div class="summary-value" id="recordTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">最高工位</div><div class="summary-value" id="maxOprno">--</div></div>
+		</div>
+		<div class="main-grid">
+			<div class="panel control-panel">
+				<div class="panel-title">工位号</div>
+				<textarea class="oprno-input" id="oprnoInput"></textarea>
+				<div class="input-row">
+					<input class="add-input" id="addOprno" type="text" placeholder="新增工位号">
+					<button class="screen-btn primary" id="addBtn">添加</button>
+				</div>
+				<div class="action-row">
+					<button class="screen-btn primary" id="queryBtn">查询</button>
+					<button class="screen-btn" id="clearBtn">清空</button>
+				</div>
+				<div class="tag-list" id="tagList"></div>
+				<div class="hint">支持逗号、空格、换行分隔工位号。</div>
+			</div>
+			<div class="panel data-panel">
+				<div class="panel-title">各工位加工记录数</div>
+				<div class="chart-box" id="recordChart"></div>
+				<div class="table-wrap">
+					<table class="record-table">
+						<thead><tr><th>序号</th><th>工位</th><th>加工记录数</th></tr></thead>
+						<tbody id="recordBody"></tbody>
+					</table>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
+<script src="${ctxStatic}/echarts/4.2/echarts.min.js"></script>
+<script>
+	window.screenOprnoConfig = {
+		title: "一号工位加工记录统计大屏",
+		defaultOprnos: ["OP040A", "OP060", "OP070", "OP080", "OP090", "OP100", "OP110", "OP120", "OP130", "OP140"]
+	};
+</script>
+<script src="${ctxStatic}/screen/oprno-record-screen.js"></script>
+</body>
+</html>

+ 47 - 0
src/main/resources/views/modules/mes/mesScreen6.html

@@ -0,0 +1,47 @@
+<!doctype html>
+<html lang="zh-CN">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title>MES工位加工记录统计大屏</title>
+	<link rel="stylesheet" href="${ctxStatic}/screen/oprno-record-screen.css">
+</head>
+<body>
+<div class="screen-page">
+	<img class="bg" src="${ctxStatic}/screen/imgs/bg3.png" alt="">
+	<div class="screen-content">
+		<div class="screen-header"><div></div><div class="screen-title-new" id="screenTitle"></div><div class="screen-time" id="screenTime"></div></div>
+		<div class="summary-row">
+			<div class="summary-item"><div class="summary-label">工位数量</div><div class="summary-value" id="oprnoTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">加工记录总数</div><div class="summary-value" id="recordTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">最高工位</div><div class="summary-value" id="maxOprno">--</div></div>
+		</div>
+		<div class="main-grid">
+			<div class="panel control-panel">
+				<div class="panel-title">工位号</div>
+				<textarea class="oprno-input" id="oprnoInput"></textarea>
+				<div class="input-row"><input class="add-input" id="addOprno" type="text" placeholder="新增工位号"><button class="screen-btn primary" id="addBtn">添加</button></div>
+				<div class="action-row"><button class="screen-btn primary" id="queryBtn">查询</button><button class="screen-btn" id="clearBtn">清空</button></div>
+				<div class="tag-list" id="tagList"></div>
+				<div class="hint">支持逗号、空格、换行分隔工位号。</div>
+			</div>
+			<div class="panel data-panel">
+				<div class="panel-title">各工位加工记录数</div>
+				<div class="chart-box" id="recordChart"></div>
+				<div class="table-wrap"><table class="record-table"><thead><tr><th>序号</th><th>工位</th><th>加工记录数</th></tr></thead><tbody id="recordBody"></tbody></table></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
+<script src="${ctxStatic}/echarts/4.2/echarts.min.js"></script>
+<script>
+	window.screenOprnoConfig = {
+		title: "二号工位加工记录统计大屏",
+		defaultOprnos: ["OP150", "OP160", "OP170", "OP180", "OP190", "OP200", "OP210", "OP220", "OP230", "OP240"]
+	};
+</script>
+<script src="${ctxStatic}/screen/oprno-record-screen.js"></script>
+</body>
+</html>

+ 47 - 0
src/main/resources/views/modules/mes/mesScreen7.html

@@ -0,0 +1,47 @@
+<!doctype html>
+<html lang="zh-CN">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title>MES工位加工记录统计大屏</title>
+	<link rel="stylesheet" href="${ctxStatic}/screen/oprno-record-screen.css">
+</head>
+<body>
+<div class="screen-page">
+	<img class="bg" src="${ctxStatic}/screen/imgs/bg3.png" alt="">
+	<div class="screen-content">
+		<div class="screen-header"><div></div><div class="screen-title-new" id="screenTitle"></div><div class="screen-time" id="screenTime"></div></div>
+		<div class="summary-row">
+			<div class="summary-item"><div class="summary-label">工位数量</div><div class="summary-value" id="oprnoTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">加工记录总数</div><div class="summary-value" id="recordTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">最高工位</div><div class="summary-value" id="maxOprno">--</div></div>
+		</div>
+		<div class="main-grid">
+			<div class="panel control-panel">
+				<div class="panel-title">工位号</div>
+				<textarea class="oprno-input" id="oprnoInput"></textarea>
+				<div class="input-row"><input class="add-input" id="addOprno" type="text" placeholder="新增工位号"><button class="screen-btn primary" id="addBtn">添加</button></div>
+				<div class="action-row"><button class="screen-btn primary" id="queryBtn">查询</button><button class="screen-btn" id="clearBtn">清空</button></div>
+				<div class="tag-list" id="tagList"></div>
+				<div class="hint">支持逗号、空格、换行分隔工位号。</div>
+			</div>
+			<div class="panel data-panel">
+				<div class="panel-title">各工位加工记录数</div>
+				<div class="chart-box" id="recordChart"></div>
+				<div class="table-wrap"><table class="record-table"><thead><tr><th>序号</th><th>工位</th><th>加工记录数</th></tr></thead><tbody id="recordBody"></tbody></table></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
+<script src="${ctxStatic}/echarts/4.2/echarts.min.js"></script>
+<script>
+	window.screenOprnoConfig = {
+		title: "三号工位加工记录统计大屏",
+		defaultOprnos: ["OP250", "OP260", "OP270", "OP281", "OP282", "OP283", "OP284", "OP290", "OP300", "OP310"]
+	};
+</script>
+<script src="${ctxStatic}/screen/oprno-record-screen.js"></script>
+</body>
+</html>

+ 47 - 0
src/main/resources/views/modules/mes/mesScreen8.html

@@ -0,0 +1,47 @@
+<!doctype html>
+<html lang="zh-CN">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title>MES工位加工记录统计大屏</title>
+	<link rel="stylesheet" href="${ctxStatic}/screen/oprno-record-screen.css">
+</head>
+<body>
+<div class="screen-page">
+	<img class="bg" src="${ctxStatic}/screen/imgs/bg3.png" alt="">
+	<div class="screen-content">
+		<div class="screen-header"><div></div><div class="screen-title-new" id="screenTitle"></div><div class="screen-time" id="screenTime"></div></div>
+		<div class="summary-row">
+			<div class="summary-item"><div class="summary-label">工位数量</div><div class="summary-value" id="oprnoTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">加工记录总数</div><div class="summary-value" id="recordTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">最高工位</div><div class="summary-value" id="maxOprno">--</div></div>
+		</div>
+		<div class="main-grid">
+			<div class="panel control-panel">
+				<div class="panel-title">工位号</div>
+				<textarea class="oprno-input" id="oprnoInput"></textarea>
+				<div class="input-row"><input class="add-input" id="addOprno" type="text" placeholder="新增工位号"><button class="screen-btn primary" id="addBtn">添加</button></div>
+				<div class="action-row"><button class="screen-btn primary" id="queryBtn">查询</button><button class="screen-btn" id="clearBtn">清空</button></div>
+				<div class="tag-list" id="tagList"></div>
+				<div class="hint">支持逗号、空格、换行分隔工位号。</div>
+			</div>
+			<div class="panel data-panel">
+				<div class="panel-title">各工位加工记录数</div>
+				<div class="chart-box" id="recordChart"></div>
+				<div class="table-wrap"><table class="record-table"><thead><tr><th>序号</th><th>工位</th><th>加工记录数</th></tr></thead><tbody id="recordBody"></tbody></table></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
+<script src="${ctxStatic}/echarts/4.2/echarts.min.js"></script>
+<script>
+	window.screenOprnoConfig = {
+		title: "四号工位加工记录统计大屏",
+		defaultOprnos: ["OP320", "OP330", "OP340", "OP350", "OP360", "OP370", "OP380", "OP390", "OP400", "OP410"]
+	};
+</script>
+<script src="${ctxStatic}/screen/oprno-record-screen.js"></script>
+</body>
+</html>

+ 47 - 0
src/main/resources/views/modules/mes/mesScreen9.html

@@ -0,0 +1,47 @@
+<!doctype html>
+<html lang="zh-CN">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title>MES工位加工记录统计大屏</title>
+	<link rel="stylesheet" href="${ctxStatic}/screen/oprno-record-screen.css">
+</head>
+<body>
+<div class="screen-page">
+	<img class="bg" src="${ctxStatic}/screen/imgs/bg3.png" alt="">
+	<div class="screen-content">
+		<div class="screen-header"><div></div><div class="screen-title-new" id="screenTitle"></div><div class="screen-time" id="screenTime"></div></div>
+		<div class="summary-row">
+			<div class="summary-item"><div class="summary-label">工位数量</div><div class="summary-value" id="oprnoTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">加工记录总数</div><div class="summary-value" id="recordTotal">0</div></div>
+			<div class="summary-item"><div class="summary-label">最高工位</div><div class="summary-value" id="maxOprno">--</div></div>
+		</div>
+		<div class="main-grid">
+			<div class="panel control-panel">
+				<div class="panel-title">工位号</div>
+				<textarea class="oprno-input" id="oprnoInput"></textarea>
+				<div class="input-row"><input class="add-input" id="addOprno" type="text" placeholder="新增工位号"><button class="screen-btn primary" id="addBtn">添加</button></div>
+				<div class="action-row"><button class="screen-btn primary" id="queryBtn">查询</button><button class="screen-btn" id="clearBtn">清空</button></div>
+				<div class="tag-list" id="tagList"></div>
+				<div class="hint">支持逗号、空格、换行分隔工位号。</div>
+			</div>
+			<div class="panel data-panel">
+				<div class="panel-title">各工位加工记录数</div>
+				<div class="chart-box" id="recordChart"></div>
+				<div class="table-wrap"><table class="record-table"><thead><tr><th>序号</th><th>工位</th><th>加工记录数</th></tr></thead><tbody id="recordBody"></tbody></table></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
+<script src="${ctxStatic}/echarts/4.2/echarts.min.js"></script>
+<script>
+	window.screenOprnoConfig = {
+		title: "五号工位加工记录统计大屏",
+		defaultOprnos: ["OP420", "OP430", "OP440", "OP450", "OP460", "OP470", "OP480", "OP490", "OP320A"]
+	};
+</script>
+<script src="${ctxStatic}/screen/oprno-record-screen.js"></script>
+</body>
+</html>