Merge remote-tracking branch 'origin/dev' into dev

tags/yfai-pcn-ext-v1.0
administrator 11 months ago
commit 099cb80f16

@ -36,8 +36,8 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取工序工艺信息")
MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取finishCode码")
MesProductionProcessContext finishCodeContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取生产过程控制全局密码")
MesProductionProcessContext productionPwdContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "验证组织模型有效性")
MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);

@ -103,8 +103,11 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//删除上下文扫/读信息:装配件条码
productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
//验证当前是否属于装配件跳过码
Boolean isSkip = checkIsSkip(productionProcessContext, equipVariableCollectContextList);
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
Boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, prodRuleContextList, equipVariableCollectContextList);
Boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip);
//验证是否存在待绑定数据
hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
@ -122,17 +125,25 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
if (!hasUnBindAssembly)
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), stepResult,
(CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() >= needQty) ? true : stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN).isCompleted(),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("上下文中的装配件条码%s匹配成功!当前上下文中的加工规则对应的装配件扫描项均匹配完毕!", assemblySn));
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("%s当前上下文中的加工规则对应的装配件扫描项均匹配完毕!", isSkip ? stepResult.getMsg() : String.format("上下文中的装配件条码%s匹配成功!", assemblySn)));
//单次匹配成功
if (result) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn),
stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("上下文中的装配件条码%s匹配成功!", assemblySn));
stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, isSkip ? stepResult.getMsg() : String.format("上下文中的装配件条码%s匹配成功!", assemblySn));
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn),
stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), String.format("上下文中的装配件条码%s匹配失败!%s", assemblySn, StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg()));
}
//验证当前是否属于装配件跳过码
private Boolean checkIsSkip(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
if (equipVariableCollectContextList.size() > 1) return false;
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) != 0) return false;
if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(productionProcessContext.getAssemblySkipCode())) return false;
return true;
}
//判断是否存在装配件清单
private Boolean checkIsNeedScanAssembly(List<MesProdRuleContext> prodRuleContextList) {
Optional<MesProdRuleContext> optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getAssemblyDataJson()))).findFirst();
@ -154,7 +165,9 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip) {
Boolean flag = false;
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
@ -165,8 +178,8 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
Boolean flag = false;
//遍历装配件清单
LOOP:
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
//已装配
@ -178,6 +191,23 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
//装配件跳过, 必须顺序扫描才生效
if (isSkip && !StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) {
//匹配成功
equipVariableCollectContext.isConsume();
flag = true;
//装配件清单该数据标记跳过
productionAssemblyNosortContext.assemblySkip();
stepResult.msg(String.format("装配件跳过码验证成功,已跳过当前装配项!"));
break LOOP;
}
//匹配规则
List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>)
numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList()));
@ -205,6 +235,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//匹配成功
equipVariableCollectContext.isConsume();
flag = true;
//装配件清单该数据标记已装配 (如果是自制件赋值productSnId)
@ -225,7 +256,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
}
return false;
return flag;
}

@ -91,7 +91,7 @@ public class MesProductSnScanNosortStepService extends BaseStepService {
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//验证扫描信息是否属于工艺强过码
Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo);
Boolean isCraftJumpCode = (!StringUtils.isEmpty(scanInfo) && scanInfo.equals(productionProcessContext.getCraftJumpCode())) ? true : false;
//不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList);
@ -201,14 +201,6 @@ public class MesProductSnScanNosortStepService extends BaseStepService {
return productionPsInContextList;
}
//验证扫描信息是否属于工艺强过码
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)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE;
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 cellEquipContext) {

@ -104,6 +104,8 @@ public class MesProductSnScanSortStepService extends BaseStepService {
//删除上下文扫/读信息:主条码
if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
//TODO 下面逻辑可能有问题 目前未处理
//验证是否匹配工艺强过码
if (equipVariableCollectContextList.size() != 1 || checkScanInfoMatchCraftJumpCode(reqBean, equipVariableCollectContextList.get(0).getEquipVariableValue())) {
String productSnStr = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString();

@ -87,8 +87,8 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
//生产过程上下文对象赋值工序工艺信息
if (StringUtils.isEmpty(productionProcessContext.getProcessCode()) || !productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) processContext(reqBean, productionProcessContext);
//生产过程上下文对象赋值工序工艺信息
if (StringUtils.isEmpty(productionProcessContext.getFinishCode())) finishCodeContext(reqBean, productionProcessContext);
//生产过程上下文对象赋值生产过程控制全局密码
if (StringUtils.isEmpty(productionProcessContext.getFinishCode()) || StringUtils.isEmpty(productionProcessContext.getCraftJumpCode()) || StringUtils.isEmpty(productionProcessContext.getAssemblySkipCode())) productionPwdContext(reqBean, productionProcessContext);
//验证组织模型有效性
return checkBaseData(reqBean, productionProcessContext);
@ -118,11 +118,14 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取finishCode
//获取生产过程控制全局密
@Override
public MesProductionProcessContext finishCodeContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
List<MesConfig> configList = configService.doCachedConfigList(MesPcnExtConstWords.CAVITY_FINISH_CODE, reqBean.getOrganizeCode());
return productionProcessContext.finishCode((!CollectionUtils.isEmpty(configList) && !StringUtils.isEmpty(configList.get(0).getCfgValue())) ? configList.get(0).getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE);
public MesProductionProcessContext productionPwdContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
List<MesConfig> configList = configService.doCachedConfigList(MesPcnExtConstWords.PRODUCTION_PWD_CFG, reqBean.getOrganizeCode());
Map<String, List<MesConfig>> cfgKeyMap = CollectionUtils.isEmpty(configList) ? null : configList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCfgKey()))).collect(Collectors.groupingBy(MesConfig::getCfgKey));
return productionProcessContext.finishCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CAVITY_FINISH_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CAVITY_FINISH_CODE).get(0).getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE).
craftJumpCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.CRAFT_JUMP_CODE).
assemblySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.ASSEMBLY_SKIP_CODE);
}
//验证组织模型有效性

@ -46,6 +46,7 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
this.partNo = prodRuleContext.getOutPartNo();
if (StringUtils.isEmpty(this.routeSeq)) this.routeSeq = MesPcnExtConstWords.ZERO;
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue();
this.isSkip = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == this.matchType || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == this.matchType)
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
if (!StringUtils.isEmpty(assemblySn)) {
@ -61,6 +62,12 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
return this;
}
public MesProductionAssemblyNosortContext assemblySkip() {
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_40.getValue();
this.isSkip = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
public MesProductionAssemblyNosortContext assemblySn(String assemblySn) {
this.assemblySn = assemblySn;
return this;

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -106,6 +107,7 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
if (null != workOrderAssembly) BeanUtils.copyProperties(workOrderAssembly, this);
if (null != productionAssembly) BeanUtils.copyProperties(productionAssembly, this);
if (StringUtils.isEmpty(this.routeSeq)) this.routeSeq = MesPcnExtConstWords.ZERO;
if (StringUtils.isEmpty(this.isSkip)) this.isSkip = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
if (this.assemblyStatus.compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0 &&
(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == this.matchType || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == this.matchType))
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();

@ -38,6 +38,12 @@ public class MesProductionProcessContext implements Serializable {
@ApiParam("finishCode码")
private String finishCode;
@ApiParam("工艺强过码")
private String craftJumpCode;
@ApiParam("装配件跳过码")
private String assemblySkipCode;
@ApiParam("生产线信息([Json]MesWorkCenter)")
private String workCenterJson;
@ -107,7 +113,7 @@ public class MesProductionProcessContext implements Serializable {
return this;
}
//---------------------- finishCode码赋值 ---------------------------------------
//---------------------- 生产过程控制全局密码 ---------------------------------------
//上下文赋值finishCode码
public MesProductionProcessContext finishCode(String finishCode) {
@ -115,6 +121,18 @@ public class MesProductionProcessContext implements Serializable {
return this.isNeedCache();
}
//上下文赋值工艺强过码
public MesProductionProcessContext craftJumpCode(String craftJumpCode) {
this.craftJumpCode = craftJumpCode;
return this.isNeedCache();
}
//上下文赋值装配件跳过码
public MesProductionProcessContext assemblySkipCode(String assemblySkipCode) {
this.assemblySkipCode = assemblySkipCode;
return this.isNeedCache();
}
//---------------------- 生产线对象 ---------------------------------------

@ -165,8 +165,14 @@ public class MesPcnExtConstWords {
//写设备日志KEY
public static final String WRITE_DB_LOG_EXT_ACTOR = "writeDbLogExtActor";
// 生产过程控制全局密码
public static final String PRODUCTION_PWD_CFG = "PRODUCTION_PWD_CFG";
// 空腔码
public static final String CAVITY_FINISH_CODE = "CAVITY_FINISH_CODE";
// 工艺强过码(前后防错/顺序防错)
public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE";
// 装配件跳过码
public static final String ASSEMBLY_SKIP_CODE = "ASSEMBLY_SKIP_CODE";
// 设备代码[工步参数]
public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE";
// 模具号读一模多腔配置[工步参数]
@ -182,8 +188,7 @@ public class MesPcnExtConstWords {
// 排序需要扫描主条码配置[工步参数]
public static final String SORT_NEED_SCAN_PS = "SORT_NEED_SCAN_PS";
// 工艺强过码(前后防错/顺序防错)[工位参数]
public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE";
// 未知腔数[工位参数]
public static final String CAVITY_UNKNOWN_CFG = "CAVITY_UNKNOWN_CFG";
// 支持混腔扫描[工位参数]

Loading…
Cancel
Save