Sfoglia il codice sorgente

大屏数据输入

liuwei 2 mesi fa
parent
commit
19d00e31e3

+ 14 - 0
db/mes_product_screen.sql

@@ -0,0 +1,14 @@
+-- 已有表 mes_product_screen 字段:people_num / machine_num / plan_output / create_by
+-- 为兼容 JeeSite 保存(字符串 id、时间戳),执行以下变更:
+
+ALTER TABLE `mes_product_screen`
+  MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '编号',
+  ADD COLUMN IF NOT EXISTS `create_date` datetime DEFAULT NULL COMMENT '创建时间' AFTER `create_by`,
+  ADD COLUMN IF NOT EXISTS `update_by` varchar(64) DEFAULT NULL COMMENT '更新者' AFTER `create_date`,
+  ADD COLUMN IF NOT EXISTS `update_date` datetime DEFAULT NULL COMMENT '更新时间' AFTER `update_by`;
+
+-- MySQL 5.7 若不支持 IF NOT EXISTS,可改用下面(已有列会报错可忽略):
+-- ALTER TABLE `mes_product_screen` MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '编号';
+-- ALTER TABLE `mes_product_screen` ADD COLUMN `create_date` datetime DEFAULT NULL COMMENT '创建时间' AFTER `create_by`;
+-- ALTER TABLE `mes_product_screen` ADD COLUMN `update_by` varchar(64) DEFAULT NULL COMMENT '更新者' AFTER `create_date`;
+-- ALTER TABLE `mes_product_screen` ADD COLUMN `update_date` datetime DEFAULT NULL COMMENT '更新时间' AFTER `update_by`;

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesProductScreenDao.java

@@ -0,0 +1,15 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesProductScreen;
+
+/**
+ * ´óÆÁչʾÅäÖÃDAO½Ó¿Ú
+ * @author mes
+ * @version 2026-08-12
+ */
+@MyBatisDao
+public interface MesProductScreenDao extends CrudDao<MesProductScreen> {
+
+}

+ 71 - 0
src/main/java/com/jeesite/modules/mes/entity/MesProductScreen.java

@@ -0,0 +1,71 @@
+package com.jeesite.modules.mes.entity;
+
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.Table;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 大屏展示配置Entity(生产人数 / 设备数量 / 计划产量)
+ * 对应表 mes_product_screen
+ * @author mes
+ * @version 2026-08-12
+ */
+@Table(name="mes_product_screen", alias="a", label="大屏展示配置信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="people_num", attrName="peopleNum", label="生产人数"),
+		@Column(name="machine_num", attrName="machineNum", label="设备数量"),
+		@Column(name="plan_output", attrName="planOutput", label="计划产量"),
+		@Column(name="create_by", attrName="createBy", label="创建人", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建日期", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="update_by", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新日期", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.update_date DESC"
+)
+public class MesProductScreen extends DataEntity<MesProductScreen> {
+
+	private static final long serialVersionUID = 1L;
+	private String peopleNum;
+	private String machineNum;
+	private String planOutput;
+
+	public MesProductScreen() {
+		this(null);
+	}
+
+	public MesProductScreen(String id) {
+		super(id);
+	}
+
+	@NotBlank(message="生产人数不能为空")
+	@Size(min=0, max=255, message="生产人数长度不能超过 255 个字符")
+	public String getPeopleNum() {
+		return peopleNum;
+	}
+
+	public void setPeopleNum(String peopleNum) {
+		this.peopleNum = peopleNum;
+	}
+
+	@NotBlank(message="设备数量不能为空")
+	@Size(min=0, max=255, message="设备数量长度不能超过 255 个字符")
+	public String getMachineNum() {
+		return machineNum;
+	}
+
+	public void setMachineNum(String machineNum) {
+		this.machineNum = machineNum;
+	}
+
+	@NotBlank(message="计划产量不能为空")
+	@Size(min=0, max=255, message="计划产量长度不能超过 255 个字符")
+	public String getPlanOutput() {
+		return planOutput;
+	}
+
+	public void setPlanOutput(String planOutput) {
+		this.planOutput = planOutput;
+	}
+}

+ 52 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductScreenService.java

@@ -0,0 +1,52 @@
+package com.jeesite.modules.mes.service;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.ObjectUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesProductScreenDao;
+import com.jeesite.modules.mes.entity.MesProductScreen;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 大屏展示配置Service
+ * @author mes
+ * @version 2026-08-12
+ */
+@Service
+public class MesProductScreenService extends CrudService<MesProductScreenDao, MesProductScreen> {
+
+	@Override
+	public MesProductScreen get(MesProductScreen mesProductScreen) {
+		return super.get(mesProductScreen);
+	}
+
+	@Override
+	public Page<MesProductScreen> findPage(MesProductScreen mesProductScreen) {
+		return super.findPage(mesProductScreen);
+	}
+
+	@Override
+	public List<MesProductScreen> findList(MesProductScreen mesProductScreen) {
+		return super.findList(mesProductScreen);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesProductScreen mesProductScreen) {
+		super.save(mesProductScreen);
+	}
+
+	@Override
+	@Transactional
+	public void delete(MesProductScreen mesProductScreen) {
+		super.delete(mesProductScreen);
+	}
+
+	public MesProductScreen getLatest() {
+		List<MesProductScreen> list = findList(new MesProductScreen());
+		return ObjectUtils.isEmpty(list) ? null : list.get(0);
+	}
+}

+ 105 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductScreenController.java

@@ -0,0 +1,105 @@
+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.web.BaseController;
+import com.jeesite.modules.mes.entity.MesProductScreen;
+import com.jeesite.modules.mes.resp.CommonResp;
+import com.jeesite.modules.mes.service.MesProductScreenService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 大屏展示配置Controller
+ * @author mes
+ * @version 2026-08-12
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesProductScreen")
+public class MesProductScreenController extends BaseController {
+
+	@Autowired
+	private MesProductScreenService mesProductScreenService;
+
+	@ModelAttribute
+	public MesProductScreen get(String id, boolean isNewRecord) {
+		return mesProductScreenService.get(id, isNewRecord);
+	}
+
+	@RequiresPermissions("mes:mesProductScreen:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesProductScreen mesProductScreen, Model model) {
+		model.addAttribute("mesProductScreen", mesProductScreen);
+		return "modules/mes/mesProductScreenList";
+	}
+
+	@RequiresPermissions("mes:mesProductScreen:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesProductScreen> listData(MesProductScreen mesProductScreen,
+			HttpServletRequest request, HttpServletResponse response) {
+		mesProductScreen.setPage(new Page<>(request, response));
+		return mesProductScreenService.findPage(mesProductScreen);
+	}
+
+	@RequiresPermissions("mes:mesProductScreen:view")
+	@RequestMapping(value = "form")
+	public String form(MesProductScreen mesProductScreen, Model model) {
+		model.addAttribute("mesProductScreen", mesProductScreen);
+		return "modules/mes/mesProductScreenForm";
+	}
+
+	@RequiresPermissions("mes:mesProductScreen:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesProductScreen mesProductScreen) {
+		mesProductScreenService.save(mesProductScreen);
+		return renderResult(Global.TRUE, text("保存大屏展示配置成功!"));
+	}
+
+	@RequiresPermissions("mes:mesProductScreen:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesProductScreen mesProductScreen) {
+		mesProductScreenService.delete(mesProductScreen);
+		return renderResult(Global.TRUE, text("删除大屏展示配置成功!"));
+	}
+
+	@RequestMapping(value = "latestConfig")
+	@ResponseBody
+	public CommonResp<Map<String, Object>> latestConfig() {
+		CommonResp<Map<String, Object>> resp = new CommonResp<>();
+		MesProductScreen latest = mesProductScreenService.getLatest();
+		Map<String, Object> data = new HashMap<>();
+		data.put("peopleNums", parseIntSafe(latest == null ? null : latest.getPeopleNum()));
+		data.put("deviceNums", parseIntSafe(latest == null ? null : latest.getMachineNum()));
+		data.put("planNums", parseIntSafe(latest == null ? null : latest.getPlanOutput()));
+		resp.setData(data);
+		resp.setResult(Global.TRUE);
+		return resp;
+	}
+
+	private int parseIntSafe(String val) {
+		if (StringUtils.isBlank(val)) {
+			return 0;
+		}
+		try {
+			return Integer.parseInt(val.trim());
+		} catch (Exception e) {
+			return 0;
+		}
+	}
+}

+ 4 - 0
src/main/resources/mappings/modules/mes/MesProductScreenDao.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeesite.modules.mes.dao.MesProductScreenDao">
+</mapper>

+ 73 - 0
src/main/resources/views/modules/mes/mesProductScreenForm.html

@@ -0,0 +1,73 @@
+<% layout('/layouts/default.html', {title: '大屏展示配置', libs: ['validate']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-note"></i> ${text(mesProductScreen.isNewRecord ? '新增大屏展示配置' : '编辑大屏展示配置')}
+			</div>
+			<div class="box-tools pull-right">
+				<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
+			</div>
+		</div>
+		<#form:form id="inputForm" model="${mesProductScreen}" action="${ctx}/mes/mesProductScreen/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required ">*</span> ${text('生产人数')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="peopleNum" maxlength="255" class="form-control required digits"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required ">*</span> ${text('设备数量')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="machineNum" maxlength="255" class="form-control required digits"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required ">*</span> ${text('计划产量')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="planOutput" maxlength="255" class="form-control required digits"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesProductScreen:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
+					</div>
+				</div>
+			</div>
+		</#form:form>
+	</div>
+</div>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 69 - 0
src/main/resources/views/modules/mes/mesProductScreenList.html

@@ -0,0 +1,69 @@
+<% layout('/layouts/default.html', {title: '大屏展示配置', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header">
+			<div class="box-title">
+				<i class="fa icon-notebook"></i> ${text('大屏展示配置')}
+			</div>
+			<div class="box-tools pull-right">
+				<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
+				<a href="${ctx}/mes/mesProduct/screen" target="_blank" class="btn btn-default"><i class="fa fa-desktop"></i> ${text('总表大屏')}</a>
+				<% if(hasPermi('mes:mesProductScreen:edit')){ %>
+					<a href="${ctx}/mes/mesProductScreen/form" class="btn btn-default btnTool" title="${text('新增大屏展示配置')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
+				<% } %>
+				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
+			</div>
+		</div>
+		<div class="box-body">
+			<#form:form id="searchForm" model="${mesProductScreen}" action="${ctx}/mes/mesProductScreen/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<div class="form-group">
+					<label class="control-label">${text('生产人数')}:</label>
+					<div class="control-inline">
+						<#form:input path="peopleNum" maxlength="255" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('设备数量')}:</label>
+					<div class="control-inline">
+						<#form:input path="machineNum" maxlength="255" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('计划产量')}:</label>
+					<div class="control-inline">
+						<#form:input path="planOutput" maxlength="255" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
+					<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
+				</div>
+			</#form:form>
+			<table id="dataGrid"></table>
+			<div id="dataGridPage"></div>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("生产人数")}', name:'peopleNum', index:'a.people_num', width:150, align:"center"},
+		{header:'${text("设备数量")}', name:'machineNum', index:'a.machine_num', width:150, align:"center"},
+		{header:'${text("计划产量")}', name:'planOutput', index:'a.plan_output', width:150, align:"center"},
+		{header:'${text("操作人")}', name:'createBy', index:'a.create_by', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesProductScreen:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesProductScreen/form?id='+row.id+'" class="btnList" title="${text("编辑大屏展示配置")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesProductScreen/delete?id='+row.id+'" class="btnList" title="${text("删除大屏展示配置")}" data-confirm="${text("确认要删除该大屏展示配置吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	ajaxSuccess: function(data){
+	}
+});
+</script>

+ 16 - 66
src/main/resources/views/modules/mes/mesScreen3.html

@@ -1476,56 +1476,26 @@
 		});
 	}
 
-	function updateProductionPeopleByApi() {
+	/** 总览三卡:生产人数 / 设备数量 / 计划产量 ← mesProductScreen 最新配置 */
+	function updateScreenConfigByApi() {
 		$.ajax({
-			url: '${ctx}/sys/empUser/listData',
+			url: '${ctx}/mes/mesProductScreen/latestConfig',
 			type: 'POST',
 			dataType: 'json',
-			data: {
-				pageNo: 1,
-				pageSize: 5000,
-				'employee.office.officeName': '生产部'
-			},
-			success: function(resp) {
-				var peopleCount = 0;
-				var users = extractList(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++;
-					}
-				}
-				mockData.cards = mockData.cards || {};
-				mockData.cards.productionPeople = peopleCount;
-				var target = document.getElementById('productionPeople');
-				if (target) target.textContent = peopleCount;
-			}
-		});
-	}
-
-	function updateDeviceCountByApi() {
-		$.ajax({
-			url: '${ctx}/mes/mesDevice/listData',
-			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 {
-					deviceCount = extractList(resp).length;
-				}
+				if (!resp || resp.result !== 'true' || !resp.data) return;
+				var d = resp.data;
 				mockData.cards = mockData.cards || {};
-				mockData.cards.deviceCount = deviceCount;
-				var target = document.getElementById('deviceCount');
-				if (target) target.textContent = deviceCount;
+				mockData.cards.productionPeople = Number(d.peopleNums) || 0;
+				mockData.cards.deviceCount = Number(d.deviceNums) || 0;
+				mockData.cards.planProduction = Number(d.planNums) || 0;
+				var elPeople = document.getElementById('productionPeople');
+				var elDevice = document.getElementById('deviceCount');
+				var elPlan = document.getElementById('planProduction');
+				if (elPeople) elPeople.textContent = mockData.cards.productionPeople;
+				if (elDevice) elDevice.textContent = mockData.cards.deviceCount;
+				if (elPlan) elPlan.textContent = mockData.cards.planProduction;
+				syncAchieveRateWithPlan();
 			}
 		});
 	}
@@ -1560,23 +1530,6 @@
 		drawAllCharts();
 	}
 
-	function updateLatestPlanProductionByApi() {
-		$.ajax({
-			url: '${ctx}/mes/mesPlan/latestPlanNums',
-			type: 'POST',
-			dataType: 'json',
-			success: function(resp) {
-				if (!resp || resp.result !== 'true' || !resp.data) {
-					return;
-				}
-				var planNums = Number(resp.data.nums) || 0;
-				mockData.cards = mockData.cards || {};
-				mockData.cards.planProduction = planNums;
-				syncAchieveRateWithPlan();
-			}
-		});
-	}
-
 	function isOprOfflineFamily(oprno) {
 		var op = (oprno || '').replace(/\s/g, '').toUpperCase();
 		var prefix = OP_OFFLINE;
@@ -1861,12 +1814,9 @@
 	}
 
 	function refreshData() {
-		// 暂未修改后台接口,直接使用 mock 数据
 		generateMockData();
 		renderTextData();
-		updateProductionPeopleByApi();
-		updateDeviceCountByApi();
-		updateLatestPlanProductionByApi();
+		updateScreenConfigByApi();
 		updateActualProductionByApi();
 		updateProductTrend7DaysByApi();
 		updateDeviceAlarmAlertsByApi();

+ 15 - 51
src/main/resources/views/modules/mes/mesScreen4.html

@@ -916,8 +916,6 @@
 		});
 	}
 
-	function updateLatestPlanProductionByApi() {}
-
 	// 近七日产品质检:产出=OP100 OK,不良=返工 OP070–OP100
 	function updateWeekQualityByApi() {
 		$.ajax({
@@ -997,60 +995,25 @@
 		});
 	}
 
-	function updateProductionPeopleByApi() {
-		$.ajax({
-			url: '${ctx}/sys/empUser/listData',
-			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++;
-					}
-				}
-				mockData.cards = mockData.cards || {};
-				mockData.cards.productionPeople = peopleCount;
-				var target = document.getElementById('productionPeople');
-				if (target) target.textContent = peopleCount;
-			}
-		});
-	}
-
-	function updateDeviceCountByApi() {
+	/** 总览三卡:生产人数 / 设备数量 / 计划产量 ← mesProductScreen 最新配置 */
+	function updateScreenConfigByApi() {
 		$.ajax({
-			url: '${ctx}/mes/mesDevice/listData',
+			url: '${ctx}/mes/mesProductScreen/latestConfig',
 			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 d = resp.data;
 				mockData.cards = mockData.cards || {};
-				mockData.cards.deviceCount = deviceCount;
-				var target = document.getElementById('deviceCount');
-				if (target) target.textContent = deviceCount;
+				mockData.cards.productionPeople = Number(d.peopleNums) || 0;
+				mockData.cards.deviceCount = Number(d.deviceNums) || 0;
+				mockData.cards.planProduction = Number(d.planNums) || 0;
+				var elPeople = document.getElementById('productionPeople');
+				var elDevice = document.getElementById('deviceCount');
+				var elPlan = document.getElementById('planProduction');
+				if (elPeople) elPeople.textContent = mockData.cards.productionPeople;
+				if (elDevice) elDevice.textContent = mockData.cards.deviceCount;
+				if (elPlan) elPlan.textContent = mockData.cards.planProduction;
 			}
 		});
 	}
@@ -1163,6 +1126,7 @@
 		generateMockData();
 		renderAlerts();
 		renderTable();
+		updateScreenConfigByApi();
 		updateLineProcessTableByApi();
 		updateDeviceAlarmAlertsByApi();
 		updateHourlyUpDownByApi();

+ 15 - 49
src/main/resources/views/modules/mes/mesScreen5.html

@@ -1076,60 +1076,25 @@
 		});
 	}
 
-	function updateProductionPeopleByApi() {
+	/** 总览三卡:生产人数 / 设备数量 / 计划产量 ← mesProductScreen 最新配置 */
+	function updateScreenConfigByApi() {
 		$.ajax({
-			url: '${ctx}/sys/empUser/listData',
+			url: '${ctx}/mes/mesProductScreen/latestConfig',
 			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++;
-					}
-				}
-				mockData.cards = mockData.cards || {};
-				mockData.cards.productionPeople = peopleCount;
-				var target = document.getElementById('productionPeople');
-				if (target) target.textContent = peopleCount;
-			}
-		});
-	}
-
-	function updateDeviceCountByApi() {
-		$.ajax({
-			url: '${ctx}/mes/mesDevice/listData',
-			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 d = resp.data;
 				mockData.cards = mockData.cards || {};
-				mockData.cards.deviceCount = deviceCount;
-				var target = document.getElementById('deviceCount');
-				if (target) target.textContent = deviceCount;
+				mockData.cards.productionPeople = Number(d.peopleNums) || 0;
+				mockData.cards.deviceCount = Number(d.deviceNums) || 0;
+				mockData.cards.planProduction = Number(d.planNums) || 0;
+				var elPeople = document.getElementById('productionPeople');
+				var elDevice = document.getElementById('deviceCount');
+				var elPlan = document.getElementById('planProduction');
+				if (elPeople) elPeople.textContent = mockData.cards.productionPeople;
+				if (elDevice) elDevice.textContent = mockData.cards.deviceCount;
+				if (elPlan) elPlan.textContent = mockData.cards.planProduction;
 			}
 		});
 	}
@@ -1244,6 +1209,7 @@
 		renderAlerts();
 		renderTable();
 		startOpTablePageRotate();
+		updateScreenConfigByApi();
 		updateLineProcessTableByApi();
 		updateDeviceAlarmAlertsByApi();
 		updateHourlyUpDownByApi();