sunxianglong 3 日 前
親
コミット
c04d21bc50

+ 11 - 11
src/main/java/com/jeesite/modules/mes/entity/MesQuality.java

@@ -24,7 +24,6 @@ import java.util.List;
 		@Column(name="oprno", attrName="oprno", label="工位"),
 		@Column(name="type", attrName="type", label="类型"),
 		@Column(name="result", attrName="result", label="检查结果"),
-		@Column(name="standard_value", attrName="standardValue", label="标准值"),
 		@Column(name="line_sn", attrName="lineSn", label="产线编号"),
 		@Column(name="items", attrName="items", label="问题清单"),
 		@Column(name="remark", attrName="remark", label="备注"),
@@ -35,7 +34,7 @@ import java.util.List;
 	}, orderBy="a.update_date DESC"
 )
 public class MesQuality extends DataEntity<MesQuality> {
-	
+
 	private static final long serialVersionUID = 1L;
 	private String sn;		// 工件号
 	private String oprno;		// 工位
@@ -62,11 +61,11 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public MesQuality() {
 		this(null);
 	}
-	
+
 	public MesQuality(String id){
 		super(id);
 	}
-	
+
 	@NotBlank(message="工件号不能为空")
 	@Size(min=0, max=50, message="工件号长度不能超过 50 个字符")
 	public String getSn() {
@@ -76,17 +75,18 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setSn(String sn) {
 		this.sn = sn;
 	}
-	
+
 	@NotBlank(message="工位不能为空")
 	@Size(min=0, max=20, message="工位长度不能超过 20 个字符")
 	public String getOprno() {
 		return oprno;
 	}
 
+	
 	public void setOprno(String oprno) {
 		this.oprno = oprno;
 	}
-	
+
 	@NotBlank(message="类型不能为空")
 	@Size(min=0, max=1, message="类型长度不能超过 1 个字符")
 	public String getType() {
@@ -96,7 +96,7 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setType(String type) {
 		this.type = type;
 	}
-	
+
 	@NotBlank(message="检查结果不能为空")
 	@Size(min=0, max=255, message="检查结果长度不能超过 255 个字符")
 	public String getResult() {
@@ -115,7 +115,7 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setItems(String items) {
 		this.items = items;
 	}
-	
+
 	@Size(min=0, max=255, message="备注长度不能超过 255 个字符")
 	public String getRemark() {
 		return remark;
@@ -124,7 +124,7 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setRemark(String remark) {
 		this.remark = remark;
 	}
-	
+
 	public Date getUpdateDate_gte() {
 		return sqlMap.getWhere().getValue("update_date", QueryType.GTE);
 	}
@@ -132,7 +132,7 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setUpdateDate_gte(Date updateDate) {
 		sqlMap.getWhere().and("update_date", QueryType.GTE, updateDate);
 	}
-	
+
 	public Date getUpdateDate_lte() {
 		return sqlMap.getWhere().getValue("update_date", QueryType.LTE);
 	}
@@ -164,4 +164,4 @@ public class MesQuality extends DataEntity<MesQuality> {
 	public void setImgs(List<FileUpload> imgs) {
 		this.imgs = imgs;
 	}
-}
+}

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

@@ -1381,7 +1381,7 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 	}
 
 	/**
-	 * 实际产能(当天产能):统计今天 00:00 ~ 次日 00:00 之间,指定产线、各工位的产能
+	 * 实际产能(当天产能):统计今天 08:00 ~ 次日 08:00(即到明天 07:59:59)之间,指定产线、各工位的产能
 	 * 统计口径与“小时产能”一致(craft=100000 且结果不为 UDF)
 	 */
 	public Map<String, Integer> getCurrentDayCapacityStats(String lineSn, List<String> oprnos) {
@@ -1390,13 +1390,13 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 			return ret;
 		}
 		Calendar calendar = Calendar.getInstance();
-		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.HOUR_OF_DAY, 8);
 		calendar.set(Calendar.MINUTE, 0);
 		calendar.set(Calendar.SECOND, 0);
 		calendar.set(Calendar.MILLISECOND, 0);
-		Date startTime = calendar.getTime();        // 今天 00:00:00
+		Date startTime = calendar.getTime();        // 今天 08:00:00
 		calendar.add(Calendar.DAY_OF_MONTH, 1);
-		Date endTime = calendar.getTime();          // 次日 00:00:00
+		Date endTime = calendar.getTime();          // 次日 08:00:00(不含,即到明天 07:59:59)
 		for (String oprno : oprnos) {
 			if (StringUtils.isBlank(oprno)) {
 				continue;

+ 25 - 14
src/main/java/com/jeesite/modules/mes/web/MesOrderJjllController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jeesite.common.config.Global;
 import com.jeesite.common.collect.ListUtils;
 import com.jeesite.common.entity.Page;
@@ -55,7 +56,7 @@ public class MesOrderJjllController extends BaseController {
 	private MesMaterialBlService mesMaterialBlService;
 	@Autowired
 	private MesProductService mesProductService;
-	
+
 	/**
 	 * 获取数据
 	 */
@@ -67,17 +68,20 @@ public class MesOrderJjllController extends BaseController {
 	/**
 	 * 机加订单领料显示列表:
 	 * mes_product_order 中 lineSn 以 B0106 开头;
-	 * 返回订单编号、备料表 erpSn 以 B0110 开头的确认数量合计、MesOrderJjll 绑定记录数。
+	 * 返回订单编号、备料表 erpSn 以 B0110 开头的确认数量合计、MesOrderJjll 绑定记录数;
+	 * 支持 pageNo、pageSize 分页,并在返回 data 中带回。
 	 */
 	@RequestMapping(value = "orderDisplayList")
 	@ResponseBody
-	public String orderDisplayList() {
+	public String orderDisplayList(HttpServletRequest request, HttpServletResponse response) {
 		MesProductOrder orderQuery = new MesProductOrder();
 		orderQuery.getSqlMap().getWhere().and("a.line_sn", QueryType.RIGHT_LIKE, "B0106");
-		List<MesProductOrder> orders = mesProductOrderService.findList(orderQuery);
-		List<Map<String, Object>> data = new ArrayList<>();
-		if (orders != null) {
-			for (MesProductOrder order : orders) {
+		Page<MesProductOrder> page = new Page<>(request, response);
+		orderQuery.setPage(page);
+		page = mesProductOrderService.findPage(orderQuery);
+		List<Map<String, Object>> list = new ArrayList<>();
+		if (page.getList() != null) {
+			for (MesProductOrder order : page.getList()) {
 				if (order == null || StringUtils.isBlank(order.getSn())) {
 					continue;
 				}
@@ -87,10 +91,17 @@ public class MesOrderJjllController extends BaseController {
 				MesOrderJjll jjllQuery = new MesOrderJjll();
 				jjllQuery.setOrderJj(order.getSn());
 				item.put("jjllCount", mesOrderJjllService.findCount(jjllQuery));
-				data.add(item);
+				list.add(item);
 			}
 		}
-		return renderResult(Global.TRUE, text("查询成功!"), data);
+		JSONObject resp = new JSONObject();
+		resp.put("result", Global.TRUE);
+		resp.put("message", text("查询成功!"));
+		resp.put("data", list);
+		resp.put("pageNo", page.getPageNo());
+		resp.put("pageSize", page.getPageSize());
+		resp.put("count", page.getCount());
+		return resp.toJSONString();
 	}
 
 	/**
@@ -172,7 +183,7 @@ public class MesOrderJjllController extends BaseController {
 		}
 		return total;
 	}
-	
+
 	/**
 	 * 查询列表
 	 */
@@ -182,7 +193,7 @@ public class MesOrderJjllController extends BaseController {
 		model.addAttribute("mesOrderJjll", mesOrderJjll);
 		return "modules/mes/mesOrderJjllList";
 	}
-	
+
 	/**
 	 * 查询列表数据
 	 */
@@ -257,7 +268,7 @@ public class MesOrderJjllController extends BaseController {
 			return renderResult(Global.FALSE, "posfull:"+ex.getMessage());
 		}
 	}
-	
+
 	/**
 	 * 删除数据
 	 */
@@ -268,5 +279,5 @@ public class MesOrderJjllController extends BaseController {
 		mesOrderJjllService.delete(mesOrderJjll);
 		return renderResult(Global.TRUE, text("删除机加订单领料工件绑定成功!"));
 	}
-	
-}
+
+}

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

@@ -428,7 +428,7 @@ public class MesProductRecordController extends BaseController {
 	}
 
 	/**
-	 * 实际产能(当天产能):统计今天 00:00 至次日 00:00 指定产线、各工位的产能
+	 * 实际产能(当天产能):统计今天 08:00 至次日 08:00(到明天 07:59)指定产线、各工位的产能
 	 */
 	@RequestMapping(value = "dayCapacityData")
 	@ResponseBody

+ 22 - 16
src/main/resources/views/modules/mes/mesScreen4.html

@@ -643,11 +643,24 @@
 		}
 	}
 
-	// 近12小时上下线双柱:纵轴 0–4,横坐标/柱顶数值与柱组中心对齐
+	// 近12小时上下线双柱:纵轴默认 0–10,超过 10 后按数据最大值自适应(向上取整到 4 的倍数便于刻度)
+	function resolveHourlyYMax(a, b) {
+		var dataMax = 0;
+		var n = a && a.length ? a.length : 0;
+		for (var i = 0; i < n; i++) {
+			var v1 = Number(a[i]) || 0;
+			var v2 = Number(b && b[i] != null ? b[i] : 0) || 0;
+			if (v1 > dataMax) dataMax = v1;
+			if (v2 > dataMax) dataMax = v2;
+		}
+		if (dataMax <= 10) return 10;
+		var step = Math.ceil(dataMax / 4);
+		return step * 4;
+	}
 	function drawHourlyDoubleBar(id, a, b, labels) {
 		var p = prepareCanvas(id); if (!p) return;
 		var ctx = p.ctx, w = p.w, h = p.h;
-		var maxV = 4;
+		var maxV = resolveHourlyYMax(a, b);
 		var padL = 36, padR = 10, padT = 18, padB = 28;
 		var cw = w - padL - padR, ch = h - padT - padB;
 		ctx.clearRect(0, 0, w, h);
@@ -1225,25 +1238,18 @@
 		renderAlerts();
 	}
 
-	function sumPlanMap(map) {
-		var total = 0;
-		if (!map) return 0;
-		for (var k in map) {
-			if (!map.hasOwnProperty(k)) continue;
-			total += Number(map[k]) || 0;
-		}
-		return total;
-	}
 	function refreshOverviewPlanProduction() {
-		var dayTotal = sumPlanMap(mockData.opPlansDay);
-		var nightTotal = sumPlanMap(mockData.opPlansNight);
+		// 每日计划 = 下线工位 OP100 当日白班计划 + 夜班计划
+		var offlineOp = (HOURLY_API_CFG && HOURLY_API_CFG.offlineOprno) ? HOURLY_API_CFG.offlineOprno : 'OP100';
+		var dayPlan = lookupOpPlan(offlineOp, mockData.opPlansDay);
+		var nightPlan = lookupOpPlan(offlineOp, mockData.opPlansNight);
 		mockData.cards = mockData.cards || {};
-		mockData.cards.planProduction = dayTotal + nightTotal;
+		mockData.cards.planProduction = dayPlan + nightPlan;
 		var elPlan = document.getElementById('planProduction');
 		if (elPlan) elPlan.textContent = mockData.cards.planProduction;
 	}
 
-	/** 总览:生产人数 / 设备数量;每日计划=当日白班计划合计+夜班计划合计 */
+	/** 总览:生产人数 / 设备数量;每日计划=OP100 白班计划+夜班计划 */
 	function updateScreenConfigByApi() {
 		$.ajax({
 			url: '${ctx}/mes/mesProductScreen/latestConfig',
@@ -1291,7 +1297,7 @@
 		if (el) el.textContent = mockData.cards.actualProduction;
 	}
 
-	/** 实际产量:当日(0点–24点)末工位 OP100 OK 数 */
+	/** 实际产量:当日 08:00–次日 08:00(到明天 07:59)下线工位 OP100 产能 */
 	function updateActualProductionByApi() {
 		var oprno = HOURLY_API_CFG.offlineOprno || 'OP100';
 		$.ajax({

+ 22 - 16
src/main/resources/views/modules/mes/mesScreen5.html

@@ -709,11 +709,24 @@
 		}
 	}
 
-	// 近12小时上下线双柱:纵轴 0–4,横坐标/柱顶数值与柱组中心对齐
+	// 近12小时上下线双柱:纵轴默认 0–10,超过 10 后按数据最大值自适应(向上取整到 4 的倍数便于刻度)
+	function resolveHourlyYMax(a, b) {
+		var dataMax = 0;
+		var n = a && a.length ? a.length : 0;
+		for (var i = 0; i < n; i++) {
+			var v1 = Number(a[i]) || 0;
+			var v2 = Number(b && b[i] != null ? b[i] : 0) || 0;
+			if (v1 > dataMax) dataMax = v1;
+			if (v2 > dataMax) dataMax = v2;
+		}
+		if (dataMax <= 10) return 10;
+		var step = Math.ceil(dataMax / 4);
+		return step * 4;
+	}
 	function drawHourlyDoubleBar(id, a, b, labels) {
 		var p = prepareCanvas(id); if (!p) return;
 		var ctx = p.ctx, w = p.w, h = p.h;
-		var maxV = 4;
+		var maxV = resolveHourlyYMax(a, b);
 		var padL = 32, padR = 8, padT = 16, padB = 26;
 		var cw = w - padL - padR, ch = h - padT - padB;
 		ctx.clearRect(0, 0, w, h);
@@ -1244,25 +1257,18 @@
 		renderAlerts();
 	}
 
-	function sumPlanMap(map) {
-		var total = 0;
-		if (!map) return 0;
-		for (var k in map) {
-			if (!map.hasOwnProperty(k)) continue;
-			total += Number(map[k]) || 0;
-		}
-		return total;
-	}
 	function refreshOverviewPlanProduction() {
-		var dayTotal = sumPlanMap(mockData.opPlansDay);
-		var nightTotal = sumPlanMap(mockData.opPlansNight);
+		// 每日计划 = 下线工位 OP160 当日白班计划 + 夜班计划
+		var offlineOp = (HOURLY_API_CFG && HOURLY_API_CFG.offlineOprno) ? HOURLY_API_CFG.offlineOprno : 'OP160';
+		var dayPlan = lookupOpPlan(offlineOp, mockData.opPlansDay);
+		var nightPlan = lookupOpPlan(offlineOp, mockData.opPlansNight);
 		mockData.cards = mockData.cards || {};
-		mockData.cards.planProduction = dayTotal + nightTotal;
+		mockData.cards.planProduction = dayPlan + nightPlan;
 		var elPlan = document.getElementById('planProduction');
 		if (elPlan) elPlan.textContent = mockData.cards.planProduction;
 	}
 
-	/** 总览:生产人数 / 设备数量;每日计划=当日白班计划合计+夜班计划合计 */
+	/** 总览:生产人数 / 设备数量;每日计划=OP160 白班计划+夜班计划 */
 	function updateScreenConfigByApi() {
 		$.ajax({
 			url: '${ctx}/mes/mesProductScreen/latestConfig',
@@ -1310,7 +1316,7 @@
 		if (el) el.textContent = mockData.cards.actualProduction;
 	}
 
-	/** 实际产量:取本阶段末工位当天 OK 数(机加 OP160) */
+	/** 实际产量:当日 08:00–次日 08:00(到明天 07:59)下线工位 OP160 产能 */
 	function updateActualProductionByApi() {
 		var oprno = HOURLY_API_CFG.offlineOprno || 'OP160';
 		$.ajax({

+ 22 - 16
src/main/resources/views/modules/mes/mesScreen7.html

@@ -709,11 +709,24 @@
 		}
 	}
 
-	// 近12小时上下线双柱:纵轴 0–4,横坐标/柱顶数值与柱组中心对齐
+	// 近12小时上下线双柱:纵轴默认 0–10,超过 10 后按数据最大值自适应(向上取整到 4 的倍数便于刻度)
+	function resolveHourlyYMax(a, b) {
+		var dataMax = 0;
+		var n = a && a.length ? a.length : 0;
+		for (var i = 0; i < n; i++) {
+			var v1 = Number(a[i]) || 0;
+			var v2 = Number(b && b[i] != null ? b[i] : 0) || 0;
+			if (v1 > dataMax) dataMax = v1;
+			if (v2 > dataMax) dataMax = v2;
+		}
+		if (dataMax <= 10) return 10;
+		var step = Math.ceil(dataMax / 4);
+		return step * 4;
+	}
 	function drawHourlyDoubleBar(id, a, b, labels) {
 		var p = prepareCanvas(id); if (!p) return;
 		var ctx = p.ctx, w = p.w, h = p.h;
-		var maxV = 4;
+		var maxV = resolveHourlyYMax(a, b);
 		var padL = 32, padR = 8, padT = 16, padB = 26;
 		var cw = w - padL - padR, ch = h - padT - padB;
 		ctx.clearRect(0, 0, w, h);
@@ -1244,25 +1257,18 @@
 		renderAlerts();
 	}
 
-	function sumPlanMap(map) {
-		var total = 0;
-		if (!map) return 0;
-		for (var k in map) {
-			if (!map.hasOwnProperty(k)) continue;
-			total += Number(map[k]) || 0;
-		}
-		return total;
-	}
 	function refreshOverviewPlanProduction() {
-		var dayTotal = sumPlanMap(mockData.opPlansDay);
-		var nightTotal = sumPlanMap(mockData.opPlansNight);
+		// 每日计划 = 下线工位 OP400 当日白班计划 + 夜班计划
+		var offlineOp = (HOURLY_API_CFG && HOURLY_API_CFG.offlineOprno) ? HOURLY_API_CFG.offlineOprno : 'OP400';
+		var dayPlan = lookupOpPlan(offlineOp, mockData.opPlansDay);
+		var nightPlan = lookupOpPlan(offlineOp, mockData.opPlansNight);
 		mockData.cards = mockData.cards || {};
-		mockData.cards.planProduction = dayTotal + nightTotal;
+		mockData.cards.planProduction = dayPlan + nightPlan;
 		var elPlan = document.getElementById('planProduction');
 		if (elPlan) elPlan.textContent = mockData.cards.planProduction;
 	}
 
-	/** 总览:生产人数 / 设备数量;每日计划=当日白班计划合计+夜班计划合计 */
+	/** 总览:生产人数 / 设备数量;每日计划=OP400 白班计划+夜班计划 */
 	function updateScreenConfigByApi() {
 		$.ajax({
 			url: '${ctx}/mes/mesProductScreen/latestConfig',
@@ -1310,7 +1316,7 @@
 		if (el) el.textContent = mockData.cards.actualProduction;
 	}
 
-	/** 实际产量:取本阶段末工位当天 OK 数(装配 OP400) */
+	/** 实际产量:当日 08:00–次日 08:00(到明天 07:59)下线工位 OP400 产能 */
 	function updateActualProductionByApi() {
 		var oprno = HOURLY_API_CFG.offlineOprno || 'OP400';
 		$.ajax({

+ 11 - 1
src/main/resources/views/modules/mes/mesScreenRotate.html

@@ -78,8 +78,18 @@
 		}
 
 		function next() {
-			index = (index + 1) % COUNT;
+			var from = index;
 			startedAt = Date.now();
+			// 装配大屏(最后一屏)结束:直接跳到综合大屏,不做回滑动画
+			if (from === COUNT - 1) {
+				index = 0;
+				track.style.transition = 'none';
+				applyIndex();
+				void track.offsetWidth;
+				track.style.transition = '';
+				return;
+			}
+			index = from + 1;
 			applyIndex();
 		}