forked from I3-YF/i3plus-mes-pcn-yfai
step 读主条码工步
parent
af8decbd88
commit
d7fec1f617
@ -1,37 +1,217 @@
|
|||||||
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
//
|
|
||||||
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
|
||||||
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
||||||
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
|
||||||
//import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
//import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
||||||
//import lombok.extern.slf4j.Slf4j;
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
//import org.springframework.beans.factory.annotation.Autowired;
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||||
//import org.springframework.stereotype.Service;
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||||
//
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
///**
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
// * @Description : 扫描主条码工步
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
// * @Author : wangjie
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
// **/
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
//@Slf4j
|
import com.alibaba.fastjson.JSONObject;
|
||||||
//@Service("mesProductSnScanStepService")
|
import lombok.extern.slf4j.Slf4j;
|
||||||
//public class MesProductSnScanStepService extends BaseStepService {
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
//
|
import org.springframework.stereotype.Service;
|
||||||
// @Autowired
|
import org.springframework.util.CollectionUtils;
|
||||||
// private IMesProductionProcessContextStepService productionProcessContextStepService;
|
import org.springframework.util.StringUtils;
|
||||||
//
|
|
||||||
// @Autowired
|
import java.util.ArrayList;
|
||||||
// private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
import java.util.List;
|
||||||
//
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
//
|
import java.util.stream.Collectors;
|
||||||
//
|
|
||||||
// @Override
|
/**
|
||||||
// public StepResult execute(StationRequestBean reqBean) {
|
* @Description : 扫描主条码工步
|
||||||
//
|
* @Author : wangjie
|
||||||
// return null;
|
**/
|
||||||
//
|
@Slf4j
|
||||||
// }
|
@Service("mesProductSnScanStepService")
|
||||||
//
|
public class MesProductSnScanStepService extends BaseStepService {
|
||||||
//
|
|
||||||
//
|
@Autowired
|
||||||
//}
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IFsmCommonService fsmCommonService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult guide(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//扫描信息置空
|
||||||
|
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
//获取上下文产出零件信息
|
||||||
|
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||||
|
|
||||||
|
//获取上下文扫/读信息:主条码
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||||
|
|
||||||
|
//验证扫描信息是否属于工艺跳过码
|
||||||
|
Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo);
|
||||||
|
|
||||||
|
//不属于工艺跳过码时,剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj 为true
|
||||||
|
if (!isCraftJumpCode && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = removeCraftCheckFailureData(stepResult, productionPsInContextList);
|
||||||
|
|
||||||
|
//验证扫描信息属于工艺跳过码的情况下是否支持跳过
|
||||||
|
Boolean isAllowJump = checkIsAllowJump(reqBean, productionPsInContextList, isCraftJumpCode, scanInfo);
|
||||||
|
|
||||||
|
//封装待验证的主条码信息
|
||||||
|
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, equipVariableCollectContextList, scanInfo);
|
||||||
|
|
||||||
|
//先判断前期扫描数量
|
||||||
|
Integer scanedQty = (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size());
|
||||||
|
|
||||||
|
//根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量
|
||||||
|
Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipmentContext.getCavity();
|
||||||
|
|
||||||
|
//扫描信息为空
|
||||||
|
if (scanedQty.compareTo(needQty) < 0 && StringUtils.isEmpty(scanInfo)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!");
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
|
||||||
|
|
||||||
|
//验证前期扫描数量是否已超过匹配腔数
|
||||||
|
checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext);
|
||||||
|
|
||||||
|
//扫描信息匹配跳过码, 判断是否允许跳过
|
||||||
|
if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo));
|
||||||
|
|
||||||
|
//验证是否存在重复主条码
|
||||||
|
if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中存在重复扫描的主条码!", scanInfo));
|
||||||
|
|
||||||
|
//允许跳过码 或者 存在 stepResult.obj 则保存进料主条码数据到上下文中
|
||||||
|
if (isAllowJump || null != stepResult.getObj()) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
//不属于工艺跳过码时, 则保存上下文扫/读信息:主条码
|
||||||
|
if (!isCraftJumpCode) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
//属于工艺跳过码时并且允许跳过时,直接返回成功
|
||||||
|
if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo));
|
||||||
|
|
||||||
|
//前期扫描数量已等于腔数
|
||||||
|
if (scanedQty.compareTo(needQty) == 0)
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中的主条码个数[%s]已满足腔数!", scanInfo, scanedQty));
|
||||||
|
|
||||||
|
//是否支持混腔扫描[工位参数]
|
||||||
|
String cavityNosortCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG);
|
||||||
|
if (StringUtils.isEmpty(cavityNosortCfg)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s]!", scanInfo));
|
||||||
|
else return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息主条码[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfo, needQty, needQty - equipVariableCollectContextList.size()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj
|
||||||
|
private List<MesProductionPsInContext> removeCraftCheckFailureData(StepResult stepResult, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
Integer sourceSize = productionPsInContextList.size();
|
||||||
|
productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList());
|
||||||
|
if (CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() < sourceSize) stepResult.obj(true);
|
||||||
|
return productionPsInContextList;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息属于工艺跳过码的情况下是否支持跳过
|
||||||
|
private Boolean checkIsAllowJump(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList, Boolean isCraftJumpCode, String scanInfo) {
|
||||||
|
AtomicReference<Boolean> isAllowJump = new AtomicReference<>(false);
|
||||||
|
if (CollectionUtils.isEmpty(productionPsInContextList)) return isAllowJump.get();
|
||||||
|
//修改此前已标记工艺防错结果错误的数据, 标记跳过码
|
||||||
|
productionPsInContextList.forEach(o -> {
|
||||||
|
if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) {
|
||||||
|
o.setCraftJumpCode(scanInfo);
|
||||||
|
isAllowJump.set(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//不存在错误的数据则返回false
|
||||||
|
return isAllowJump.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息是否属于工艺跳过码
|
||||||
|
private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) {
|
||||||
|
if (StringUtils.isEmpty(scanInfo)) return false;
|
||||||
|
String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE);
|
||||||
|
if (StringUtils.isEmpty(craftJumpCode)) return false;
|
||||||
|
return scanInfo.equals(craftJumpCode) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证前期扫描数量是否已超过匹配腔数
|
||||||
|
private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty,
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPartContext> productionPartContextList, MesCellEquipContext cellEquipmentContext) {
|
||||||
|
if (scanedQty.compareTo(needQty) <= 0) return;
|
||||||
|
String message = String.format("请检查相关数据,上下文中的主条码个数[%s]已满足腔数[%s],可重置工位解决!", scanedQty, needQty);
|
||||||
|
this.sendMessage(reqBean, resultBean, message +
|
||||||
|
" --- List<MesEquipVariableCollectContext> --- [" + getJsonMessage(equipVariableCollectContextList) + "]" +
|
||||||
|
" --- List<MesProductionPsInContext> --- [" + getJsonMessage(productionPsInContextList) + "]" +
|
||||||
|
" --- List<MesProductionPartContext> --- [" + getJsonMessage(productionPartContextList) + "]" +
|
||||||
|
" --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipmentContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
|
||||||
|
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//集合判空转JSON
|
||||||
|
private String getJsonMessage(List list) {
|
||||||
|
return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装扫/读信息:主条码信息
|
||||||
|
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, List<MesEquipVariableCollectContext> equipVariableCollectContextList, String scanInfo) {
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>();
|
||||||
|
|
||||||
|
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true)));
|
||||||
|
|
||||||
|
return equipVariableCollectContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证是否存在重复主条码
|
||||||
|
private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
|
||||||
|
//剔除finishCode信息
|
||||||
|
List<String> filterList1 = equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
//剔除finishCode信息
|
||||||
|
List<String> filterList2 = productionPsInContextList.stream().filter(o -> (null != o && !o.getProductSn().equals(productionProcessContext.getFinishCode()))).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<String> filterList = new ArrayList<>();
|
||||||
|
if (CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1);
|
||||||
|
if (CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2);
|
||||||
|
|
||||||
|
//验证是否存在重复条码
|
||||||
|
if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue