Преглед на файлове

拆包,NG定时任务,生产订单定时任务

sunxianglong преди 3 дни
родител
ревизия
30eba74fef

+ 10 - 11
src/main/java/com/jeesite/modules/mes/api/MesUnpackControllerApi.java

@@ -32,16 +32,16 @@ public class MesUnpackControllerApi {
     @ResponseBody
     public CommonResp save(@Validated MesUnpack mesUnpack, HttpServletRequest request, HttpServletResponse response) {
         CommonResp<MesUnpack> resp = new CommonResp<>();
-        if(mesUnpack.getNumber()<=0){
-            resp.setResult(Global.FALSE);
-            resp.setMessage("数量不能小于0!");
-            return resp;
-        }
-        if(mesUnpack.getNumber() == null){
-            resp.setResult(Global.FALSE);
-            resp.setMessage("请填写数量!");
-            return resp;
-        }
+//        if(mesUnpack.getNumber()<=0){
+//            resp.setResult(Global.FALSE);
+//            resp.setMessage("数量不能小于0!");
+//            return resp;
+//        }
+//        if(mesUnpack.getNumber() == null){
+//            resp.setResult(Global.FALSE);
+//            resp.setMessage("请填写数量!");
+//            return resp;
+//        }
         if(mesUnpack.getBatchSn() == null){
             resp.setResult(Global.FALSE);
             resp.setMessage("请扫拆包新批次码!");
@@ -51,7 +51,6 @@ public class MesUnpackControllerApi {
         mesUnpackService.save(mesUnpack);
 
         resp.setResult(Global.TRUE);
-        resp.setData(mesUnpack);
         resp.setMessage("操作成功!");
         return resp;
     }

+ 15 - 15
src/main/java/com/jeesite/modules/mes/entity/MesUnpack.java

@@ -16,7 +16,7 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
 		@Column(name="id", attrName="id", label="id", isPK=true),
 		@Column(name="old_batch_sn", attrName="oldBatchSn", label="原批次码"),
 		@Column(name="batch_sn", attrName="batchSn", label="批次码"),
-		@Column(name="number", attrName="number", label="数量", isUpdateForce=true),
+//		@Column(name="number", attrName="number", label="数量", isUpdateForce=true),
 		@Column(name="create_by", attrName="createBy", label="创建者", isUpdate=false, isQuery=false),
 		@Column(name="create_date", attrName="createDate", label="创建时间", isUpdate=false, isQuery=false),
 		@Column(name="update_by", attrName="updateBy", label="更新者", isQuery=false),
@@ -25,20 +25,20 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
 	}, orderBy="a.update_date DESC"
 )
 public class MesUnpack extends DataEntity<MesUnpack> {
-	
+
 	private static final long serialVersionUID = 1L;
 	private String oldBatchSn;		// 原批次码
 	private String batchSn;		// 批次码
-	private Long number;		// 数量
+//	private Long number;		// 数量
 
 	public MesUnpack() {
 		this(null);
 	}
-	
+
 	public MesUnpack(String id){
 		super(id);
 	}
-	
+
 	@Size(min=0, max=255, message="原批次码长度不能超过 255 个字符")
 	public String getOldBatchSn() {
 		return oldBatchSn;
@@ -47,7 +47,7 @@ public class MesUnpack extends DataEntity<MesUnpack> {
 	public void setOldBatchSn(String oldBatchSn) {
 		this.oldBatchSn = oldBatchSn;
 	}
-	
+
 	@Size(min=0, max=255, message="批次码长度不能超过 255 个字符")
 	public String getBatchSn() {
 		return batchSn;
@@ -56,13 +56,13 @@ public class MesUnpack extends DataEntity<MesUnpack> {
 	public void setBatchSn(String batchSn) {
 		this.batchSn = batchSn;
 	}
-	
-	public Long getNumber() {
-		return number;
-	}
 
-	public void setNumber(Long number) {
-		this.number = number;
-	}
-	
-}
+//	public Long getNumber() {
+//		return number;
+//	}
+//
+//	public void setNumber(Long number) {
+//		this.number = number;
+//	}
+
+}

+ 105 - 0
src/main/java/com/jeesite/modules/scheduling/ProductNgScrapScheduling.java

@@ -0,0 +1,105 @@
+package com.jeesite.modules.scheduling;
+
+import com.jeesite.common.lang.ObjectUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.modules.mes.entity.MesProduct;
+import com.jeesite.modules.mes.entity.MesProductRecord;
+import com.jeesite.modules.mes.entity.MesScrap;
+import com.jeesite.modules.mes.service.MesProductRecordService;
+import com.jeesite.modules.mes.service.MesProductService;
+import com.jeesite.modules.mes.service.MesScrapService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * NG超时报废:
+ * 每小时查找最近74小时内的总结果NG记录,若NG时间已超过72小时,
+ * 则将对应工件状态改为报废(3),并写入报废记录。
+ */
+@Configuration
+@EnableScheduling
+public class ProductNgScrapScheduling {
+
+	private static final Logger logger = LoggerFactory.getLogger(ProductNgScrapScheduling.class);
+
+	private static final String SCRAP_REASON = "NG超过72小时系统自动报废";
+
+	@Autowired
+	private MesProductRecordService mesProductRecordService;
+
+	@Autowired
+	private MesProductService mesProductService;
+
+	@Autowired
+	private MesScrapService mesScrapService;
+
+//	@Scheduled(fixedRate = 3600000)
+	public void scrapOverdueNgProducts() {
+		try {
+			LocalDateTime now = LocalDateTime.now();
+			Date from74h = Date.from(now.minusHours(74).atZone(ZoneId.systemDefault()).toInstant());
+
+			MesProductRecord query = new MesProductRecord();
+			query.getSqlMap().getWhere()
+					.and("craft", QueryType.EQ, "100000")
+					.and("content", QueryType.EQ, "NG")
+					.and("update_date", QueryType.GTE, from74h);
+			List<MesProductRecord> ngList = mesProductRecordService.findList(query);
+			if (ngList == null || ngList.isEmpty()) {
+				return;
+			}
+
+			Set<String> handledSn = new HashSet<>();
+			for (MesProductRecord record : ngList) {
+				if (record == null || StringUtils.isBlank(record.getSn()) || record.getUpdateDate() == null) {
+					continue;
+				}
+				String sn = record.getSn().trim();
+				if (!handledSn.add(sn)) {
+					continue;
+				}
+
+				LocalDateTime ngTime = record.getUpdateDate().toInstant()
+						.atZone(ZoneId.systemDefault())
+						.toLocalDateTime();
+				long hours = ChronoUnit.HOURS.between(ngTime, now);
+				if (hours < 72) {
+					continue;
+				}
+
+				MesProduct productQuery = new MesProduct();
+				productQuery.setSn(sn);
+				MesProduct product = mesProductService.findInfo(productQuery);
+				if (ObjectUtils.isEmpty(product) || "3".equals(product.getState())) {
+					continue;
+				}
+
+				product.setState("3");
+				mesProductService.update(product);
+
+				MesScrap scrap = new MesScrap();
+				scrap.setSn(sn);
+				scrap.setReason(SCRAP_REASON);
+				scrap.setProductCate(product.getCate());
+				mesScrapService.save(scrap);
+
+				logger.warn("NG超72小时自动报废:sn={}, ngTime={}, hours={}", sn, ngTime, hours);
+			}
+		} catch (Exception e) {
+			logger.error("NG超时报废定时任务异常", e);
+		}
+	}
+}

+ 102 - 0
src/main/java/com/jeesite/modules/scheduling/ProductOrderExpireScheduling.java

@@ -0,0 +1,102 @@
+package com.jeesite.modules.scheduling;
+
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.modules.erp.entity.MesProductOrder;
+import com.jeesite.modules.erp.service.MesProductOrderService;
+import com.jeesite.modules.mes.entity.MesProcessAlarm;
+import com.jeesite.modules.mes.service.MesProcessAlarmService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 生产订单交货日期检测:
+ * 每小时检查 mes_product_order:若没有任何「交货日期(年月日) ≥ 今天」的未完成订单,
+ * 则写入一次工序报警:当前生产系统暂无订单
+ * (今天有交货的未完成订单时不报警;仅历史超期单不会单独触发)
+ */
+@Configuration
+@EnableScheduling
+public class ProductOrderExpireScheduling {
+
+	private static final Logger logger = LoggerFactory.getLogger(ProductOrderExpireScheduling.class);
+
+	private static final String ALARM_MSG = "当前生产系统暂无订单";
+	private static final String ALARM_OPRNO = "SYSTEM";
+	private static final String ALARM_LINE_SN = "SYSTEM";
+	private static final String ALARM_SN = "ORDER";
+
+	@Autowired
+	private MesProductOrderService mesProductOrderService;
+
+	@Autowired
+	private MesProcessAlarmService mesProcessAlarmService;
+
+//	@Scheduled(fixedRate = 3600000)
+	public void checkDeliveryDate() {
+		try {
+			Date todayStart = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
+
+			// 有效订单:未完成,且交货日期 ≥ 今天(含当天)
+			MesProductOrder validQuery = new MesProductOrder();
+			validQuery.getSqlMap().getWhere()
+					.and("delivery_date", QueryType.GTE, todayStart)
+					.and("state", QueryType.NE, "2");
+			Long validCount = mesProductOrderService.findCount(validQuery);
+
+			if (validCount == null || validCount == 0) {
+				raiseAlarmOnce();
+			} else {
+				clearAlarmIfNeeded();
+			}
+		} catch (Exception e) {
+			logger.error("生产订单交货日期检测任务异常", e);
+		}
+	}
+
+	/** 条件成立时只写入一条未处理报警,避免每小时重复插入 */
+	private void raiseAlarmOnce() {
+		MesProcessAlarm existQuery = new MesProcessAlarm();
+		existQuery.setRemark(ALARM_MSG);
+		existQuery.setState("0");
+		existQuery.setOprno(ALARM_OPRNO);
+		Long existCount = mesProcessAlarmService.findCount(existQuery);
+		if (existCount != null && existCount > 0) {
+			return;
+		}
+
+		MesProcessAlarm alarm = new MesProcessAlarm();
+		alarm.setOprno(ALARM_OPRNO);
+		alarm.setLineSn(ALARM_LINE_SN);
+		alarm.setSn(ALARM_SN);
+		alarm.setRemark(ALARM_MSG);
+		alarm.setState("0");
+		mesProcessAlarmService.save(alarm);
+		logger.warn("无交货日期≥今天的未完成订单,触发报警:{}", ALARM_MSG);
+	}
+
+	/** 已有有效订单时,自动关闭本任务产生的未处理报警 */
+	private void clearAlarmIfNeeded() {
+		MesProcessAlarm existQuery = new MesProcessAlarm();
+		existQuery.setRemark(ALARM_MSG);
+		existQuery.setState("0");
+		existQuery.setOprno(ALARM_OPRNO);
+		List<MesProcessAlarm> list = mesProcessAlarmService.findList(existQuery);
+		if (list == null || list.isEmpty()) {
+			return;
+		}
+		for (MesProcessAlarm alarm : list) {
+			alarm.setState("1");
+			alarm.setContent("自动关闭:已存在交货日期≥今天的未完成订单");
+			mesProcessAlarmService.save(alarm);
+		}
+	}
+}