Explorar o código

大屏数据显示

liuwei hai 2 meses
pai
achega
e57456ff30

+ 147 - 2
src/main/java/com/jeesite/modules/mes/web/MesProductScreenController.java

@@ -3,10 +3,23 @@ package com.jeesite.modules.mes.web;
 import com.jeesite.common.config.Global;
 import com.jeesite.common.entity.Page;
 import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
 import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesDevice;
+import com.jeesite.modules.mes.entity.MesDeviceAlarm;
+import com.jeesite.modules.mes.entity.MesLineProcess;
+import com.jeesite.modules.mes.entity.MesProductRecord;
 import com.jeesite.modules.mes.entity.MesProductScreen;
 import com.jeesite.modules.mes.resp.CommonResp;
+import com.jeesite.modules.mes.service.MesDeviceAlarmService;
+import com.jeesite.modules.mes.service.MesDeviceService;
+import com.jeesite.modules.mes.service.MesLineProcessService;
+import com.jeesite.modules.mes.service.MesProductRecordService;
 import com.jeesite.modules.mes.service.MesProductScreenService;
+import com.jeesite.modules.mes.service.MesRepairService;
+import com.jeesite.modules.mes.service.MesScrapService;
+import com.jeesite.modules.sys.entity.EmpUser;
+import com.jeesite.modules.sys.service.EmpUserService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -19,11 +32,14 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
- * 大屏展示配置Controller
+ * 大屏展示配置Controller(含大屏专用只读接口,无权限注解)
  * @author mes
  * @version 2026-08-12
  */
@@ -33,6 +49,20 @@ public class MesProductScreenController extends BaseController {
 
 	@Autowired
 	private MesProductScreenService mesProductScreenService;
+	@Autowired
+	private MesDeviceAlarmService mesDeviceAlarmService;
+	@Autowired
+	private MesRepairService mesRepairService;
+	@Autowired
+	private MesScrapService mesScrapService;
+	@Autowired
+	private MesLineProcessService mesLineProcessService;
+	@Autowired
+	private MesProductRecordService mesProductRecordService;
+	@Autowired
+	private MesDeviceService mesDeviceService;
+	@Autowired
+	private EmpUserService empUserService;
 
 	@ModelAttribute
 	public MesProductScreen get(String id, boolean isNewRecord) {
@@ -92,6 +122,121 @@ public class MesProductScreenController extends BaseController {
 		return resp;
 	}
 
+	/** 大屏:待处理设备报警列表(替代 mesDeviceAlarm/listData) */
+	@RequestMapping(value = "alertList")
+	@ResponseBody
+	public Page<MesDeviceAlarm> alertList(MesDeviceAlarm mesDeviceAlarm,
+			HttpServletRequest request, HttpServletResponse response) {
+		if (StringUtils.isBlank(mesDeviceAlarm.getState())) {
+			mesDeviceAlarm.setState("0");
+		}
+		mesDeviceAlarm.setPage(new Page<>(request, response));
+		return mesDeviceAlarmService.findPage(mesDeviceAlarm);
+	}
+
+	/** 大屏:当天返修/报废数量(替代 mesRepair/listData + mesScrap/listData 计数) */
+	@RequestMapping(value = "repairScrapCount")
+	@ResponseBody
+	public CommonResp<Map<String, Object>> repairScrapCount() {
+		CommonResp<Map<String, Object>> resp = new CommonResp<>();
+		LocalDate today = LocalDate.now();
+		DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+		String start = today.format(fmt) + " 00:00:00";
+		String end = today.plusDays(1).format(fmt) + " 00:00:00";
+		Map<String, Object> data = new HashMap<>();
+		try {
+			Long repair = mesRepairService.countByDateRange(start, end);
+			Long scrap = mesScrapService.countByDateRange(start, end);
+			data.put("repairCount", repair == null ? 0 : repair);
+			data.put("scrapCount", scrap == null ? 0 : scrap);
+			resp.setData(data);
+			resp.setResult(Global.TRUE);
+		} catch (Exception e) {
+			data.put("repairCount", 0);
+			data.put("scrapCount", 0);
+			resp.setData(data);
+			resp.setResult(Global.FALSE);
+			resp.setMessage(e.getMessage());
+		}
+		return resp;
+	}
+
+	/** 大屏:工序列表(替代 mesLineProcess/listData) */
+	@RequestMapping(value = "lineProcessList")
+	@ResponseBody
+	public Page<MesLineProcess> lineProcessList(MesLineProcess mesLineProcess,
+			HttpServletRequest request, HttpServletResponse response) {
+		mesLineProcess.getSqlMap().getWhere().and("a.pid", QueryType.IS_NULL, "");
+		mesLineProcess.setPage(new Page<>(request, response));
+		return mesLineProcessService.findPage(mesLineProcess);
+	}
+
+	/** 大屏:生产记录分页(替代 mesProductRecord/listData) */
+	@RequestMapping(value = "recordList")
+	@ResponseBody
+	public Page<MesProductRecord> recordList(MesProductRecord mesProductRecord,
+			HttpServletRequest request, HttpServletResponse response) {
+		mesProductRecord.setPage(new Page<>(request, response));
+		mesProductRecord.getSqlMap().getOrder().setOrderBy("a.id DESC");
+		return mesProductRecordService.findPage(mesProductRecord);
+	}
+
+	/** 大屏:生产部人数(替代 sys/empUser/listData) */
+	@RequestMapping(value = "peopleCount")
+	@ResponseBody
+	public CommonResp<Map<String, Object>> peopleCount() {
+		CommonResp<Map<String, Object>> resp = new CommonResp<>();
+		Map<String, Object> data = new HashMap<>();
+		int peopleCount = 0;
+		try {
+			List<EmpUser> users = empUserService.findUserList(new EmpUser());
+			if (users != null) {
+				for (EmpUser u : users) {
+					if (u == null || u.getEmployee() == null || u.getEmployee().getOffice() == null) {
+						continue;
+					}
+					String officeName = u.getEmployee().getOffice().getOfficeName();
+					if (officeName == null) {
+						continue;
+					}
+					String normalized = officeName.replaceAll("\\s", "");
+					if ("生产部".equals(normalized) || normalized.matches(".*[/\\\\>]+生产部$")) {
+						peopleCount++;
+					}
+				}
+			}
+			data.put("peopleCount", peopleCount);
+			resp.setData(data);
+			resp.setResult(Global.TRUE);
+		} catch (Exception e) {
+			data.put("peopleCount", 0);
+			resp.setData(data);
+			resp.setResult(Global.FALSE);
+			resp.setMessage(e.getMessage());
+		}
+		return resp;
+	}
+
+	/** 大屏:设备数量(替代 mesDevice/listData 计数) */
+	@RequestMapping(value = "deviceCount")
+	@ResponseBody
+	public CommonResp<Map<String, Object>> deviceCount() {
+		CommonResp<Map<String, Object>> resp = new CommonResp<>();
+		Map<String, Object> data = new HashMap<>();
+		try {
+			Long count = mesDeviceService.findCount(new MesDevice());
+			data.put("deviceCount", count == null ? 0 : count);
+			resp.setData(data);
+			resp.setResult(Global.TRUE);
+		} catch (Exception e) {
+			data.put("deviceCount", 0);
+			resp.setData(data);
+			resp.setResult(Global.FALSE);
+			resp.setMessage(e.getMessage());
+		}
+		return resp;
+	}
+
 	private int parseIntSafe(String val) {
 		if (StringUtils.isBlank(val)) {
 			return 0;
@@ -102,4 +247,4 @@ public class MesProductScreenController extends BaseController {
 			return 0;
 		}
 	}
-}
+}

+ 20 - 0
src/main/resources/config/application.yml

@@ -754,6 +754,26 @@ shiro:
     ${adminPath}/mes/mesProductCncParam/batchsave= anon
     ${adminPath}/mes/mesProductCncToolGeo/saveToolGeo= anon
     
+    ${adminPath}/mes/mesProduct/screen = anon
+    ${adminPath}/mes/mesProduct/screen3 = anon
+    ${adminPath}/mes/mesProduct/screen5 = anon
+    ${adminPath}/mes/mesProduct/screen6 = anon
+    ${adminPath}/mes/mesProduct/hourlyUpDownOkData = anon
+    ${adminPath}/mes/mesProduct/defectTypeData = anon
+    ${adminPath}/mes/mesProductScreen/latestConfig = anon
+    ${adminPath}/mes/mesProductScreen/alertList = anon
+    ${adminPath}/mes/mesProductScreen/repairScrapCount = anon
+    ${adminPath}/mes/mesProductScreen/lineProcessList = anon
+    ${adminPath}/mes/mesProductScreen/recordList = anon
+    ${adminPath}/mes/mesProductScreen/peopleCount = anon
+    ${adminPath}/mes/mesProductScreen/deviceCount = anon
+    ${adminPath}/mes/mesProductRecord/dayCapacityData = anon
+    ${adminPath}/mes/mesProductRecord/shiftCapacityData = anon
+    ${adminPath}/mes/mesProductRecord/weekQualityData = anon
+    ${adminPath}/mes/mesProductRecord/monthlyProductData = anon
+    ${adminPath}/mes/mesPlan/latestPlanNums = anon
+
+    
     
   
     

+ 53 - 77
src/main/resources/views/modules/mes/mesScreen3.html

@@ -809,6 +809,21 @@
 <script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
 <script>
 (function() {
+	var __screenFail = 0, __screenReloadAt = 0;
+	$(document).ajaxError(function(e, xhr) {
+		if (!xhr) return;
+		var text = xhr.responseText || '';
+		if (xhr.status === 0 || xhr.status === 401 || xhr.status === 403 || xhr.status === 502 || xhr.status === 503
+			|| text.indexOf('login') >= 0 || text.indexOf('登录') >= 0) {
+			__screenFail++;
+			if (__screenFail >= 3 && Date.now() - __screenReloadAt > 60000) {
+				__screenReloadAt = Date.now();
+				location.reload();
+			}
+		}
+	});
+	$(document).ajaxSuccess(function() { __screenFail = 0; });
+
 	function pad(n) { return n < 10 ? '0' + n : '' + n; }
 
 	function updateClock() {
@@ -1473,7 +1488,7 @@
 
 	function updateDeviceAlarmAlertsByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDeviceAlarm/listData',
+			url: '${ctx}/mes/mesProductScreen/alertList',
 			type: 'POST',
 			dataType: 'json',
 			data: {
@@ -1602,57 +1617,18 @@
 		return list.length;
 	}
 
-	// 中间卡:返修数量 <- mesRepair/listData;报废数量 <- mesScrap/listData(按当天 updateDate)
+	// 中间卡:返修/报废数量 <- mesProductScreen/repairScrapCount
 	function updateRepairScrapCountByApi() {
-		var dayRange = getCalendarDayUpdateDateRange();
-		var pending = 2;
-		var repairCount = 0;
-		var scrapCount = 0;
-
-		function done() {
-			pending--;
-			if (pending > 0) return;
-			mockData.cards = mockData.cards || {};
-			mockData.cards.repairCount = repairCount;
-			mockData.cards.scrapCount = scrapCount;
-			renderTextData();
-		}
-
 		$.ajax({
-			url: '${ctx}/mes/mesRepair/listData',
+			url: '${ctx}/mes/mesProductScreen/repairScrapCount',
 			type: 'POST',
 			dataType: 'json',
-			data: {
-				pageNo: 1,
-				pageSize: 1,
-				updateDate_gte: dayRange.gte,
-				updateDate_lte: dayRange.lte
-			},
 			success: function(resp) {
-				repairCount = extractPageCount(resp);
-				done();
-			},
-			error: function() {
-				done();
-			}
-		});
-
-		$.ajax({
-			url: '${ctx}/mes/mesScrap/listData',
-			type: 'POST',
-			dataType: 'json',
-			data: {
-				pageNo: 1,
-				pageSize: 1,
-				updateDate_gte: dayRange.gte,
-				updateDate_lte: dayRange.lte
-			},
-			success: function(resp) {
-				scrapCount = extractPageCount(resp);
-				done();
-			},
-			error: function() {
-				done();
+				if (!resp || resp.result !== 'true' || !resp.data) return;
+				mockData.cards = mockData.cards || {};
+				mockData.cards.repairCount = Number(resp.data.repairCount) || 0;
+				mockData.cards.scrapCount = Number(resp.data.scrapCount) || 0;
+				renderTextData();
 			}
 		});
 	}
@@ -1763,39 +1739,39 @@
 
 		function fetchPage() {
 			$.ajax({
-				url: '${ctx}/mes/mesProductRecord/listData',
-				type: 'POST',
-				dataType: 'json',
-				data: {
-					pageNo: pageNo,
-					pageSize: pageSize,
-					oprno: OP_OFFLINE,
-					content: 'OK',
-					updateDate_gte: dayRange.gte,
-					updateDate_lte: dayRange.lte
-				},
-				success: function(resp) {
-					var list = extractList(resp);
-					for (var i = 0; i < list.length; i++) {
-						var r = list[i] || {};
-						if (isOprOfflineFamily(r.oprno) && isRecordContentOk(r.content) && isRecordWithinToday(r, dayRange)) {
-							totalOk++;
-						}
-					}
-					if (list.length === pageSize && pageNo < maxPages) {
-						pageNo++;
-						fetchPage();
-					} else {
-						applyActualProductionCount(totalOk);
+			url: '${ctx}/mes/mesProductScreen/recordList',
+			type: 'POST',
+			dataType: 'json',
+			data: {
+				pageNo: pageNo,
+				pageSize: pageSize,
+				oprno: OP_OFFLINE,
+				content: 'OK',
+				updateDate_gte: dayRange.gte,
+				updateDate_lte: dayRange.lte
+			},
+			success: function(resp) {
+				var list = extractList(resp);
+				for (var i = 0; i < list.length; i++) {
+					var r = list[i] || {};
+					if (isOprOfflineFamily(r.oprno) && isRecordContentOk(r.content) && isRecordWithinToday(r, dayRange)) {
+						totalOk++;
 					}
-				},
-				error: function() {
+				}
+				if (list.length === pageSize && pageNo < maxPages) {
+					pageNo++;
+					fetchPage();
+				} else {
 					applyActualProductionCount(totalOk);
 				}
-			});
-		}
-		fetchPage();
+			},
+			error: function() {
+				applyActualProductionCount(totalOk);
+			}
+		});
 	}
+	fetchPage();
+}
 
 	function matchesOfflineOkRecord(r) {
 		var t = parseRecordDateMs(r.updateDate || r.update_date);
@@ -1835,7 +1811,7 @@
 
 		function fetchPage() {
 			$.ajax({
-				url: '${ctx}/mes/mesProductRecord/listData',
+				url: '${ctx}/mes/mesProductScreen/recordList',
 				type: 'POST',
 				dataType: 'json',
 				data: {

+ 17 - 2
src/main/resources/views/modules/mes/mesScreen4.html

@@ -391,6 +391,21 @@
 <script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
 <script>
 (function() {
+	var __screenFail = 0, __screenReloadAt = 0;
+	$(document).ajaxError(function(e, xhr) {
+		if (!xhr) return;
+		var text = xhr.responseText || '';
+		if (xhr.status === 0 || xhr.status === 401 || xhr.status === 403 || xhr.status === 502 || xhr.status === 503
+			|| text.indexOf('login') >= 0 || text.indexOf('登录') >= 0) {
+			__screenFail++;
+			if (__screenFail >= 3 && Date.now() - __screenReloadAt > 60000) {
+				__screenReloadAt = Date.now();
+				location.reload();
+			}
+		}
+	});
+	$(document).ajaxSuccess(function() { __screenFail = 0; });
+
 	function pad(n) { return n < 10 ? '0' + n : '' + n; }
 
 	function updateClock() {
@@ -867,7 +882,7 @@
 
 	function updateLineProcessTableByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesLineProcess/listData',
+			url: '${ctx}/mes/mesProductScreen/lineProcessList',
 			type: 'POST',
 			dataType: 'json',
 			data: {
@@ -992,7 +1007,7 @@
 
 	function updateDeviceAlarmAlertsByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDeviceAlarm/listData',
+			url: '${ctx}/mes/mesProductScreen/alertList',
 			type: 'POST',
 			dataType: 'json',
 			data: {

+ 17 - 2
src/main/resources/views/modules/mes/mesScreen5.html

@@ -409,6 +409,21 @@
 <script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
 <script>
 (function() {
+	var __screenFail = 0, __screenReloadAt = 0;
+	$(document).ajaxError(function(e, xhr) {
+		if (!xhr) return;
+		var text = xhr.responseText || '';
+		if (xhr.status === 0 || xhr.status === 401 || xhr.status === 403 || xhr.status === 502 || xhr.status === 503
+			|| text.indexOf('login') >= 0 || text.indexOf('登录') >= 0) {
+			__screenFail++;
+			if (__screenFail >= 3 && Date.now() - __screenReloadAt > 60000) {
+				__screenReloadAt = Date.now();
+				location.reload();
+			}
+		}
+	});
+	$(document).ajaxSuccess(function() { __screenFail = 0; });
+
 	function pad(n) { return n < 10 ? '0' + n : '' + n; }
 
 	/** 工位表:每页条数与自动翻页间隔(毫秒) */
@@ -944,7 +959,7 @@
 
 	function updateLineProcessTableByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesLineProcess/listData',
+			url: '${ctx}/mes/mesProductScreen/lineProcessList',
 			type: 'POST',
 			dataType: 'json',
 			data: {
@@ -1073,7 +1088,7 @@
 
 	function updateDeviceAlarmAlertsByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDeviceAlarm/listData',
+			url: '${ctx}/mes/mesProductScreen/alertList',
 			type: 'POST',
 			dataType: 'json',
 			data: {

+ 24 - 35
src/main/resources/views/modules/mes/mesScreen6.html

@@ -398,6 +398,21 @@
 <script src="${ctxStatic}/jquery-1.11.3.min.js"></script>
 <script>
 (function() {
+	var __screenFail = 0, __screenReloadAt = 0;
+	$(document).ajaxError(function(e, xhr) {
+		if (!xhr) return;
+		var text = xhr.responseText || '';
+		if (xhr.status === 0 || xhr.status === 401 || xhr.status === 403 || xhr.status === 502 || xhr.status === 503
+			|| text.indexOf('login') >= 0 || text.indexOf('登录') >= 0) {
+			__screenFail++;
+			if (__screenFail >= 3 && Date.now() - __screenReloadAt > 60000) {
+				__screenReloadAt = Date.now();
+				location.reload();
+			}
+		}
+	});
+	$(document).ajaxSuccess(function() { __screenFail = 0; });
+
 	function pad(n) { return n < 10 ? '0' + n : '' + n; }
 
 	/** 工位表:每页条数与自动翻页间隔(毫秒) */
@@ -968,7 +983,7 @@
 
 	function updateLineProcessTableByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesLineProcess/listData',
+			url: '${ctx}/mes/mesProductScreen/lineProcessList',
 			type: 'POST',
 			dataType: 'json',
 			data: {
@@ -1166,7 +1181,7 @@
 
 	function updateDeviceAlarmAlertsByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDeviceAlarm/listData',
+			url: '${ctx}/mes/mesProductScreen/alertList',
 			type: 'POST',
 			dataType: 'json',
 			data: {
@@ -1195,29 +1210,12 @@
 
 	function updateProductionPeopleByApi() {
 		$.ajax({
-			url: '${ctx}/sys/empUser/listData',
+			url: '${ctx}/mes/mesProductScreen/peopleCount',
 			type: 'POST',
 			dataType: 'json',
-			data: {
-				pageNo: 1,
-				pageSize: 5000,
-				'employee.office.officeName': '生产部'
-			},
 			success: function(resp) {
-				var peopleCount = 0;
-				var users = extractUserList(resp);
-				for (var i = 0; i < users.length; i++) {
-					var u = users[i] || {};
-					var office = (u.employee && u.employee.office) ? u.employee.office : {};
-					var officeName = office.officeName || '';
-					var normalizedOfficeName = (officeName + '').replace(/\s/g, '');
-					if (
-						normalizedOfficeName === '生产部' ||
-						/[/\\>]+生产部$/.test(normalizedOfficeName)
-					) {
-						peopleCount++;
-					}
-				}
+				if (!resp || resp.result !== 'true' || !resp.data) return;
+				var peopleCount = Number(resp.data.peopleCount) || 0;
 				mockData.cards = mockData.cards || {};
 				mockData.cards.productionPeople = peopleCount;
 				var target = document.getElementById('productionPeople');
@@ -1228,21 +1226,12 @@
 
 	function updateDeviceCountByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDevice/listData',
+			url: '${ctx}/mes/mesProductScreen/deviceCount',
 			type: 'POST',
 			dataType: 'json',
-			data: {
-				pageNo: 1,
-				pageSize: 1
-			},
 			success: function(resp) {
-				var deviceCount = 0;
-				if (resp && typeof resp.count === 'number') {
-					deviceCount = resp.count;
-				} else {
-					var devices = extractUserList(resp);
-					deviceCount = devices.length;
-				}
+				if (!resp || resp.result !== 'true' || !resp.data) return;
+				var deviceCount = Number(resp.data.deviceCount) || 0;
 				mockData.cards = mockData.cards || {};
 				mockData.cards.deviceCount = deviceCount;
 				var target = document.getElementById('deviceCount');
@@ -1313,7 +1302,7 @@
 		var totalOk = 0;
 		function fetchPage() {
 			$.ajax({
-				url: '${ctx}/mes/mesProductRecord/listData',
+				url: '${ctx}/mes/mesProductScreen/recordList',
 				type: 'POST',
 				dataType: 'json',
 				data: {