|
|
|
@ -1,13 +1,14 @@
|
|
|
|
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdRuleCfgExtService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
|
|
|
|
|
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.pojo.context.*;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
|
|
|
@ -19,9 +20,7 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -42,7 +41,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
private IMesProdRuleCfgExtService prodRuleCfgExtService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesProduceSnExtService produceSnExtService;
|
|
|
|
|
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public StepResult execute(StationRequestBean reqBean) {
|
|
|
|
@ -69,134 +68,183 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
//获取上下文产出零件数据信息集合
|
|
|
|
|
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
|
|
|
|
|
|
|
|
|
//获取上下文读/扫主条码信息集合
|
|
|
|
|
List<MesEquipVariableCollectContext> scanProductSnList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
|
|
|
|
//获取上下文进料零件条码信息集合
|
|
|
|
|
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
|
|
|
|
|
|
|
|
|
//根据现有数据【产出零件数据】【读/扫主条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
|
|
|
|
|
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
|
|
|
|
|
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
|
|
|
|
|
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, scanProductSnList);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return stepResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
|
|
|
|
|
//没有【产出零件数据】【读/扫主条码信息】,则直接跳过 【当前场景是直接匹配装配件规则来获取产品加工规则】
|
|
|
|
|
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(scanProductSnList)) return;
|
|
|
|
|
|
|
|
|
|
//如果已经通过主条码条件获取了产品加工规则数据,如果当前上下文没有【读/扫主条码信息】,则直接跳过
|
|
|
|
|
if (!CollectionUtils.isEmpty(prodRuleContextList) && !StringUtils.isEmpty(prodRuleContextList.get(0).getProductSn()) && CollectionUtils.isEmpty(scanProductSnList)) return;
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
|
|
|
|
//没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前场景是直接匹配装配件规则来获取产品加工规则】
|
|
|
|
|
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return;
|
|
|
|
|
|
|
|
|
|
//根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
if (CollectionUtils.isEmpty(productionPartContextList)) doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, scanProductSnList);
|
|
|
|
|
if (CollectionUtils.isEmpty(productionPartContextList)) doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPsInContextList);
|
|
|
|
|
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
|
|
|
|
|
else doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, scanProductSnList);
|
|
|
|
|
else doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
|
|
|
|
|
private void doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
|
|
|
|
|
|
|
|
|
//加工规则的数据已与产出零件的数量一致
|
|
|
|
|
if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return;
|
|
|
|
|
|
|
|
|
|
//已获取的加工规则数据根据关联键分组
|
|
|
|
|
Map<String, MesProdRuleContext> prodRuleContextMap = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o));
|
|
|
|
|
//拿到当前最大的foreignKey
|
|
|
|
|
Optional<MesProductionPartContext> maxForeignKeyOptional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPartContext::getForeignKey));
|
|
|
|
|
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
|
|
|
|
|
|
|
|
|
|
//上下文当前存在【读/扫主条码信息】, 后面匹配成功的信息会从scanProductSnList中remove掉,所以需要一个标志判断循环是否结束
|
|
|
|
|
Boolean isExistPs = CollectionUtils.isEmpty(scanProductSnList) ? false : true;
|
|
|
|
|
//搜集未匹配规则的产出零件
|
|
|
|
|
List<String> outPartNoList = productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
for (MesProductionPartContext productionPartContext : productionPartContextList) {
|
|
|
|
|
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
if (CollectionUtils.isEmpty(productionPsInContextList)) doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
|
|
|
|
|
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
|
|
|
|
|
else doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
|
|
|
|
|
|
|
|
|
|
if (null == productionPartContext) continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(productionPartContext.getForeignKey())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("上下文中的产出零件信息数据异常,缺失数据关联键! 数据详情:[%s]", JSONObject.toJSONString(productionPartContext)));
|
|
|
|
|
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
private void doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
|
|
|
|
|
|
|
|
|
|
//当前上下文中的【读/扫主条码信息】已经全部匹配完成
|
|
|
|
|
if (isExistPs && CollectionUtils.isEmpty(scanProductSnList)) break;
|
|
|
|
|
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty());
|
|
|
|
|
//根据产出零件分组数据
|
|
|
|
|
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
|
|
|
|
|
|
|
|
|
|
//当前产出零件已获取过加工规则
|
|
|
|
|
if (!CollectionUtils.isEmpty(prodRuleContextMap) && prodRuleContextMap.containsKey(productionPartContext.getForeignKey())) continue;
|
|
|
|
|
for (MesProductionPartContext productionPartContext : productionPartContextList) {
|
|
|
|
|
|
|
|
|
|
//根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
if (CollectionUtils.isEmpty(scanProductSnList)) doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContext);
|
|
|
|
|
//根据【读/扫主条码信息】获取匹配当前产出零件的加工规则数据
|
|
|
|
|
else doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContext, scanProductSnList);
|
|
|
|
|
//foreignKey有值代表已经匹配过产品加工规则
|
|
|
|
|
if (null == productionPartContext || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
List<MesProdRuleNosortCfg> filterList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
|
|
|
|
|
if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件[空]进料零件规则[空]的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
|
|
|
|
|
|
|
|
|
|
//【非排序线】获取产品加工规则对应的装配件信息
|
|
|
|
|
if (prodRuleNosortCfgList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(prodRuleNosortCfgList.get(0), productionPartContext.foreignKey(foreignKey += 1).getForeignKey()));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (prodRuleNosortCfgList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
|
|
|
|
|
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", prodRuleNosortCfgList.size(), JSONObject.toJSONString(productionPartContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
|
|
|
|
|
|
|
|
|
|
//根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
private void doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, MesProductionPartContext productionPartContext) {
|
|
|
|
|
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNo(productionPartContext.getPartNo()).inPartNoIsEmpty().inPartNoRuleIsEmpty());
|
|
|
|
|
if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件为空的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
|
|
|
|
|
if (prodRuleNosortCfgList.size() > 1) return;
|
|
|
|
|
//【非排序线】获取产品加工规则对应的装配件信息
|
|
|
|
|
MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleContext(prodRuleNosortCfgList.get(0), productionPartContext);
|
|
|
|
|
prodRuleContextList.add(prodRuleContext);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
//没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
|
|
|
|
|
private void doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> scanProductSnList) {
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
|
|
|
|
|
|
|
|
|
//查询【读/扫主条码信息】
|
|
|
|
|
Map<String, MesProduceSn> produceSnDataMap = produceSnExtService.getProduceSnMap(reqBean.getOrganizeCode(), scanProductSnList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()));
|
|
|
|
|
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null);
|
|
|
|
|
|
|
|
|
|
//拿到当前最大的foreignKey
|
|
|
|
|
Optional<MesProductionPsInContext> maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey));
|
|
|
|
|
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
|
|
|
|
|
|
|
|
|
|
for (MesEquipVariableCollectContext equipVariableCollectContext : scanProductSnList) {
|
|
|
|
|
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
|
|
|
|
|
|
|
|
|
|
if (null == equipVariableCollectContext) continue;
|
|
|
|
|
//foreignKey有值代表已经匹配过产品加工规则
|
|
|
|
|
if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
|
|
|
|
|
|
|
|
|
|
MesProduceSn produceSnData = CollectionUtils.isEmpty(produceSnDataMap) ? null : produceSnDataMap.get(equipVariableCollectContext.getEquipVariableValue());
|
|
|
|
|
List<MesProdRuleNosortCfg> filterList;
|
|
|
|
|
//搜集进料零件号匹配的产品加工规则
|
|
|
|
|
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) filterList = filterProdRuleNosortCfgList(prodRuleNosortCfgList, productionPsInContext.getPartNo());
|
|
|
|
|
//进料零件条码匹配进料零件规则
|
|
|
|
|
else filterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(prodRuleNosortCfgList));
|
|
|
|
|
|
|
|
|
|
if (null != produceSnData) {}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]进料零件%s的配置信息",
|
|
|
|
|
cellEquipContext.getEquipmentCode(), !StringUtils.isEmpty(productionPsInContext.getPartNo()) ? String.format("号匹配[%s]", productionPsInContext.getPartNo()) : String.format("规则匹配[%s]", productionPsInContext.getProductSn())));
|
|
|
|
|
|
|
|
|
|
//【非排序线】获取产品加工规则对应的装配件信息
|
|
|
|
|
if (filterList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(filterList.get(0), productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()));
|
|
|
|
|
|
|
|
|
|
if (filterList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
|
|
|
|
|
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", filterList.size(), JSONObject.toJSONString(productionPsInContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//【非排序线】获取产品加工规则
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()));
|
|
|
|
|
// if (CollectionUtils.isEmpty(prodRuleNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]进料零件为空的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo()));
|
|
|
|
|
if (prodRuleNosortCfgList.size() > 1) return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList) {
|
|
|
|
|
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件可能携带产出零件
|
|
|
|
|
List<String> inPartNoList = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList());
|
|
|
|
|
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && StringUtils.isEmpty(o.getPartNo()))).findFirst();
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(
|
|
|
|
|
!CollectionUtils.isEmpty(inPartNoList) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartNos(inPartNoList).outPartNos(outPartNoList) : null,
|
|
|
|
|
(null != optional && optional.isPresent()) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartRuleIsNotEmpty().outPartNos(outPartNoList) : null);
|
|
|
|
|
return prodRuleNosortCfgList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//搜集进料零件号匹配的产品加工规则
|
|
|
|
|
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList, String partNo) {
|
|
|
|
|
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNo()) && o.getInPartNo().equals(partNo))).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//搜集进料零件规则有值的产品加工规则
|
|
|
|
|
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
|
|
|
|
|
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNoRule()))).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据产出零件分组数据
|
|
|
|
|
private Map<String, List<MesProdRuleNosortCfg>> groupProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
|
|
|
|
|
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProdRuleNosortCfg::getOutPartNo));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据【读/扫主条码信息】获取匹配当前产出零件的加工规则数据
|
|
|
|
|
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
|
|
|
|
|
private void doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, MesProductionPartContext productionPartContext, List<MesEquipVariableCollectContext> scanProductSnList) {
|
|
|
|
|
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
|
|
|
|
|
|
|
|
|
|
for (MesEquipVariableCollectContext equipVariableCollectContext : scanProductSnList) {
|
|
|
|
|
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件
|
|
|
|
|
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList);
|
|
|
|
|
//根据产出零件分组数据
|
|
|
|
|
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
|
|
|
|
|
|
|
|
|
|
if (null == equipVariableCollectContext) continue;
|
|
|
|
|
for (MesProductionPartContext productionPartContext : productionPartContextList) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//foreignKey有值代表已经匹配过产品加工规则
|
|
|
|
|
if (null == productionPartContext || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
|
|
|
|
|
|
|
|
|
|
//获取匹配产出零件的所有加工规则
|
|
|
|
|
List<MesProdRuleNosortCfg> outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
|
|
|
|
|
|
|
|
|
|
MesProdRuleNosortCfg filter = null;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//foreignKey有值代表已经匹配过产品加工规则
|
|
|
|
|
if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
|
|
|
|
|
|
|
|
|
|
List<MesProdRuleNosortCfg> innerfilterList;
|
|
|
|
|
//搜集进料零件号匹配的产品加工规则
|
|
|
|
|
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) innerfilterList = filterProdRuleNosortCfgList(outPartNoProdRuleList, productionPsInContext.getPartNo());
|
|
|
|
|
//进料零件条码匹配进料零件规则
|
|
|
|
|
else innerfilterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(outPartNoProdRuleList));
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue;
|
|
|
|
|
|
|
|
|
|
productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey());
|
|
|
|
|
|
|
|
|
|
filter = innerfilterList.get(0);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (null == filter) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查非排序产品加工规则信息,未查询到设备[%s]产出零件[%s]匹配任意一个主条码的配置信息", cellEquipContext.getEquipmentCode(), productionPartContext.getPartName()));
|
|
|
|
|
|
|
|
|
|
//【非排序线】获取产品加工规则对应的装配件信息
|
|
|
|
|
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(filter, productionPartContext.getForeignKey()));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|