Quellcode durchsuchen

feat(record): 增加后段先扫开关 mes.record.autoInit

前段打二维码建档工序未上线时,允许后段扫码自动建档以先行开工。
- MesProductRecordService 新增 initRecordIfAbsent:sn 完全未建档时
  按 mes_line.product_cate 拉起整套模板 record 并建 mes_product 档
- updateRecordResult / updateRecord 在原"记录不存在"分支前插入开关判断
- 开关走 js_sys_config 参数表,默认 0,前段就绪后改回 0
wangxichen vor 1 Tag
Ursprung
Commit
51a2c4071c

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

@@ -374,6 +374,81 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 	}
 
 	/**
+	 * 后段先扫开关:sn 完全未建档时,按产线绑定的产品类型自动补建 record 和 mes_product 档案。
+	 * 用于前段(第一道打二维码工序)未上线,但需要让后段先扫起来的应急场景。
+	 * 通过配置 mes.record.autoInit=1 开启,前段就绪后应关闭。
+	 *
+	 * @param sn     工件码
+	 * @param lineSn 产线编号
+	 * @return true=完成自动建档;false=未启用/已有记录/建档失败
+	 */
+	@Transactional
+	public boolean initRecordIfAbsent(String sn, String lineSn){
+		// 开关未开:默认行为
+		if(!"1".equals(Global.getConfig("mes.record.autoInit"))){
+			return false;
+		}
+		if(StringUtils.isEmpty(sn) || StringUtils.isEmpty(lineSn)){
+			return false;
+		}
+		// 已有任意 record:说明前段建过档,交给上层原分支处理,不再补建
+		if(!ObjectUtils.isEmpty(findAnySameSnRecord(sn, lineSn))){
+			return false;
+		}
+		// 查产线绑定的产品类型
+		MesLine ml = new MesLine();
+		ml.setSn(lineSn);
+		ml.setStatus("0");
+		MesLine mesLine = mesLineService.findInfo(ml);
+		if(ObjectUtils.isEmpty(mesLine) || StringUtils.isEmpty(mesLine.getProductCate())){
+			logger.warn("autoInit 后段先扫:产线未绑定产品类型 lineSn={}", lineSn);
+			return false;
+		}
+		String cateSn = mesLine.getProductCate();
+		MesProductCate mesProductCate = mesProductCateService.findBySn(cateSn);
+		if(ObjectUtils.isEmpty(mesProductCate)){
+			logger.warn("autoInit 后段先扫:产品类型不存在 cateSn={}", cateSn);
+			return false;
+		}
+		List<MesTemplateItems> lists = mesTemplateItemsService.findListItems(mesProductCate.getTemplateId());
+		if(ListUtils.isEmpty(lists)){
+			logger.warn("autoInit 后段先扫:产品未设置生产模板 cateSn={}", cateSn);
+			return false;
+		}
+		Long cdate = Long.valueOf(CommonUitl.Date2TimeStamp(new Date()));
+		List<MesProductRecord> records = new ArrayList<>();
+		Integer serial = 1;
+		for(MesTemplateItems item : lists){
+			MesProductRecord mpr = new MesProductRecord();
+			mpr.setSn(sn);
+			mpr.setPid("0");
+			mpr.setCateSn(cateSn);
+			mpr.setLineSn(lineSn);
+			mpr.setCraft(item.getCraft());
+			mpr.setOprno(item.getOprno());
+			mpr.setSerial(serial++);
+			mpr.setTid(item.getId());
+			mpr.setTreeLevel(0);
+			mpr.setCdate(cdate);
+			mpr.setContent("UDF");
+			records.add(mpr);
+		}
+		Long ret = insertBatch(records, records.size());
+		if(!String.valueOf(ret).equals(String.valueOf(records.size()))){
+			logger.warn("autoInit 后段先扫:批量建档失败 sn={}", sn);
+			return false;
+		}
+		// 建产品档
+		MesProduct mesProduct = new MesProduct();
+		mesProduct.setSn(sn);
+		mesProduct.setState("0");
+		mesProduct.setCate(cateSn);
+		mesProductService.save(mesProduct);
+		logger.info("autoInit 后段先扫:自动建档成功 sn={} lineSn={} cateSn={} rows={}", sn, lineSn, cateSn, ret);
+		return true;
+	}
+
+	/**
 	 * 手动保存数据(插入或更新)
 	 * @param mesProductRecord
 	 */
@@ -617,6 +692,12 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 			if(ListUtils.isEmpty(lists)){
 				throw new ServiceException(text("创建记录失败!"));
 			}
+		} else if(initRecordIfAbsent(sn, lineSn)) {
+			// ===== 后段先扫开关:sn 未建档,按产线自动补档,再重查继续原流程 =====
+			lists = findList(mesProductRecord1);
+			if(ListUtils.isEmpty(lists)){
+				throw new ServiceException(text("自动建档后仍无当前工位记录,请检查生产模板!"));
+			}
 		} else {
 			throw new ServiceException(text("记录不存在!"));
 		}
@@ -1036,6 +1117,13 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 			logger.info("自动创建OP330记录: sn={}, oprno={}, craft={}", sn, oldOprno, craft);
 		}
 		// ===== 特殊处理结束 =====
+		else if(initRecordIfAbsent(sn, lineSn)) {
+			// 后段先扫开关:sn 未建档,按产线自动补档,再重查
+			mesProductRecord = findByUpdateCate(sn,oprno,craft,cateParam);
+			if(ObjectUtils.isEmpty(mesProductRecord)){
+				throw new ServiceException(text("自动建档后仍无当前工位记录,请检查生产模板!"));
+			}
+		}
 		else {
 			throw new ServiceException(text("记录不存在!"));
 		}

+ 50 - 44
src/main/java/com/jeesite/modules/mes/web/MesProductGp12Controller.java

@@ -199,43 +199,47 @@ public class MesProductGp12Controller extends BaseController {
 		if (StringUtils.isBlank(lineSn))
 			return renderResult(Global.FALSE, "缺少必要参数");
 
-		// 兼容老 APK:GP12 拍照固定为 OP390(OP400 已是镭雕工位)
-		if ("OP400".equals(oprno)) {
-			oprno = "OP390";
-			mesProductGp12.setOprno(oprno);
-		}
+		// T09 GP12 下线:工位号固定 OP250A(覆盖 APK 传入的任何值)
+		oprno = "OP250A";
+		mesProductGp12.setOprno(oprno);
+
+		// 计件模式开关(参数设置:mes.gp12.pieceOnly = 1 时启用)
+		// 启用后:跳过返修校验、不写过站 record,仅落拍照记录作为计件明细
+		boolean pieceOnly = "1".equals(Global.getConfig("mes.gp12.pieceOnly"));
 
-		// 根据工件码查询是否已存在该数据
+		// 根据工件码查询是否已存在该数据(去重:同 sn 只能拍一次,计件也不允许拆分扫)
 		mesProductGp12.getSqlMap().getWhere().and("a.sn", QueryType.EQ, sn);
 		List<MesProductGp12> list = mesProductGp12Service.findList(mesProductGp12);
 		if (list.size() > 0){return renderResult(Global.FALSE, "该记录已存在");}
 
-		// ==================== 新增: 检查工件返修状态 ====================
-		// 检查工件是否处于返修状态
-		MesProduct mesProduct = new MesProduct();
-		mesProduct.setSn(sn);
-		MesProduct productInfo = mesProductService.findInfo(mesProduct);
-
-		// 如果工件存在,检查是否处于返修状态
-		if (!ObjectUtils.isEmpty(productInfo)) {
-			// state = "2" 表示返修中, state = "4" 表示待处理
-			if ("2".equals(productInfo.getState()) || "4".equals(productInfo.getState())) {
-				return renderResult(Global.FALSE, "该工件处于返修状态,无法拍照");
+		// ==================== 返修状态校验(计件模式跳过) ====================
+		if (!pieceOnly) {
+			// 检查工件是否处于返修状态
+			MesProduct mesProduct = new MesProduct();
+			mesProduct.setSn(sn);
+			MesProduct productInfo = mesProductService.findInfo(mesProduct);
+
+			// 如果工件存在,检查是否处于返修状态
+			if (!ObjectUtils.isEmpty(productInfo)) {
+				// state = "2" 表示返修中, state = "4" 表示待处理
+				if ("2".equals(productInfo.getState()) || "4".equals(productInfo.getState())) {
+					return renderResult(Global.FALSE, "该工件处于返修状态,无法拍照");
+				}
 			}
-		}
 
-		// 进一步检查是否存在未完成的返修记录
-		MesRepair mesRepair = new MesRepair();
-		mesRepair.setSn(sn);
-		// 排除已修复的(state=3),查询是否有进行中的返修
-		mesRepair.getSqlMap().getWhere().and("a.state", QueryType.NE, "3");
-		MesRepair repairInfo = mesRepairService.findInfo(mesRepair);
+			// 进一步检查是否存在未完成的返修记录
+			MesRepair mesRepair = new MesRepair();
+			mesRepair.setSn(sn);
+			// 排除已修复的(state=3),查询是否有进行中的返修
+			mesRepair.getSqlMap().getWhere().and("a.state", QueryType.NE, "3");
+			MesRepair repairInfo = mesRepairService.findInfo(mesRepair);
 
-		if (!ObjectUtils.isEmpty(repairInfo)) {
-			// state = "1" 离线返修中, state = "2" 在线返修中
-			return renderResult(Global.FALSE, "该工件存在未完成的返修记录,无法拍照");
+			if (!ObjectUtils.isEmpty(repairInfo)) {
+				// state = "1" 离线返修中, state = "2" 在线返修中
+				return renderResult(Global.FALSE, "该工件存在未完成的返修记录,无法拍照");
+			}
 		}
-		// ==================== 检查结束 ====================
+		// ==================== 校验结束 ====================
 
 		// 向数据库添加数据
 		MesProductGp12 entry = new MesProductGp12();
@@ -247,20 +251,22 @@ public class MesProductGp12Controller extends BaseController {
 
 		FileUploadUtils.saveFileUpload(entry, entry.getId(), "mesProductGp12_image");
 
-		// GP12 拍照即过站:把 mes_product_record 里 OP390/100000 总结果置为 OK(最小改动,不触发其它副作用)
-		try {
-			MesProductRecord record = mesProductRecordService.findByUpdateCate(sn, oprno, "100000", lineSn);
-			if (!ObjectUtils.isEmpty(record)
-					&& !"OK".equals(record.getContent())
-					&& !"NG".equals(record.getContent())) {
-				record.setContent("OK");
-				record.setUpdateBy("system");
-				record.setUpdateDate(new Date());
-				record.setRemark("GP12拍照过站");
-				mesProductRecordService.save(record);
+		// 过站写 record(计件模式跳过:只做计件,不污染质量数据)
+		if (!pieceOnly) {
+			try {
+				MesProductRecord record = mesProductRecordService.findByUpdateCate(sn, oprno, "100000", lineSn);
+				if (!ObjectUtils.isEmpty(record)
+						&& !"OK".equals(record.getContent())
+						&& !"NG".equals(record.getContent())) {
+					record.setContent("OK");
+					record.setUpdateBy("system");
+					record.setUpdateDate(new Date());
+					record.setRemark("GP12拍照过站");
+					mesProductRecordService.save(record);
+				}
+			} catch (Exception e) {
+				logger.error("GP12拍照过站更新record失败 sn=" + sn + " oprno=" + oprno, e);
 			}
-		} catch (Exception e) {
-			logger.error("GP12拍照过站更新record失败 sn=" + sn + " oprno=" + oprno, e);
 		}
 
 		return renderResult(Global.TRUE, "操作成功");
@@ -314,9 +320,9 @@ public class MesProductGp12Controller extends BaseController {
 		// 构造图片访问的基础URL
 		String host = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/js";
 
-		// 兼容老 APK:查询 OP400 重定向到 OP390(OP400 已是镭雕工位
-		if ("OP400".equals(mesProductGp12.getOprno())) {
-			mesProductGp12.setOprno("OP390");
+		// T09 GP12 下线:APK 传入的 oprno 一律重定向到 OP250A(库里就这一个工位号
+		if (StringUtils.isNotBlank(mesProductGp12.getOprno())) {
+			mesProductGp12.setOprno("OP250A");
 		}
 
 		// 从 request 获取并设置分页参数