排序 匹配装配件工步

tags/yfai-pcn-ext-v2.3
王杰 8 months ago
parent b1905b75e3
commit 05038cf65c

@ -18,6 +18,9 @@ public interface IMesProdOrgExtService {
@ApiOperation(value = "根据生产线代码,工位代码查询工位信息")
MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode);
@ApiOperation(value = "根据生产线代码查询工位信息")
List<MesWorkCell> getWorkCellList(String organizeCode, String workCenterCode);
@ApiOperation(value = "根据子生产线代码,子工位代码,关系类型查询主子工位关系信息")
MesWorkCellExtendCfg getWorkCellExtendCfg(String organizeCode, String workCenterCodeBak, String workCellCodeBak, Integer extendType);

@ -3,13 +3,11 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
import cn.estsh.i3plus.pojo.mes.bean.MesAssemblyNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssemblyUnique;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly;
import cn.estsh.i3plus.pojo.mes.bean.*;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public interface IMesAssemblyExtService {
@ -17,7 +15,7 @@ public interface IMesAssemblyExtService {
List<MesProductionAssemblySortContext> getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【排序线】获取生产工单装配件绑定记录 [前道所有装配件]")
List<MesProductionAssemblySortContext> getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext);
List<MesProductionAssemblySortContext> getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map<String, MesWorkCell> workCellMap);
@ApiOperation(value = "【排序线】获取生产工单装配件清单")
List<MesWorkOrderAssembly> getWorkOrderAssemblyList(MesProdRuleContext prodRuleContext);

@ -2,9 +2,11 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public interface IMesProdRuleCfgExtService {
@ -24,7 +26,7 @@ public interface IMesProdRuleCfgExtService {
MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【排序线】获取产品加工规则 [前道所有装配件]")
MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext);
MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map<String, MesWorkCell> workCellMap);
@ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】")
MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id);

@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesScanMonitorContext;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -133,4 +134,7 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取生产线类型")
Integer getCenterType(StationRequestBean reqBean);
@ApiOperation(value = "获取生产线下的工位集合")
Map<String, MesWorkCell> dispatchWorkCellMap(StationRequestBean reqBean);
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService;
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.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCellExtendCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
@ -13,11 +14,13 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
@Slf4j
@ -56,6 +59,17 @@ public class MesProdOrgExtService implements IMesProdOrgExtService {
}
@Override
public List<MesWorkCell> getWorkCellList(String organizeCode, String workCenterCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null;
List<MesWorkCell> workCellList = workCellRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode});
if (!CollectionUtils.isEmpty(workCellList))
workCellList = workCellList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesWorkCell::getWorkCellCode))), ArrayList::new));
return workCellList;
}
@Override
public MesWorkCellExtendCfg getWorkCellExtendCfg(String organizeCode, String workCenterCodeBak, String workCellCodeBak, Integer extendType) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCodeBak) || StringUtils.isEmpty(workCellCodeBak) || StringUtils.isEmpty(extendType)) return null;
return workCellExtendCfgRepository.getByProperty(

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesAssemblyExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
@ -43,6 +44,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesFileRepository fileRepository;
//【排序线】获取生产工单装配件绑定记录
@ -71,7 +75,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
//【排序线】获取生产工单装配件绑定记录 [前道所有装配件]
@Override
public List<MesProductionAssemblySortContext> getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext) {
public List<MesProductionAssemblySortContext> getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map<String, MesWorkCell> workCellMap) {
if (null == prodRuleContext) return null;
@ -92,7 +96,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
List<MesProductionAssemblySortContext> productionAssemblySortContextList = new ArrayList<>();
workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId())).foreignKey(prodRuleContext.getForeignKey())));
workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId()), getWorkCell(workCellMap, o.getWorkCellCode())).foreignKey(prodRuleContext.getForeignKey())));
return productionAssemblySortContextList;
}
@ -280,4 +284,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
return CollectionUtils.isEmpty(productionAssemblyMap) ? null : productionAssemblyMap.get(id).get(0);
}
//获取工位
private MesWorkCell getWorkCell(Map<String, MesWorkCell> workCellMap, String workCellCode) {
return CollectionUtils.isEmpty(workCellMap) ? null : workCellMap.get(workCellCode);
}
}

@ -8,6 +8,7 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.repository.MesProdRuleNoSortCfgRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@ -18,6 +19,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
@ -115,8 +117,8 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
//【排序线】获取产品加工规则 [前道所有装配件]
@Override
public MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext) {
return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortPreCraftContextList(prodRuleContext));
public MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map<String, MesWorkCell> workCellMap) {
return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortPreCraftContextList(prodRuleContext, workCellMap));
}

@ -252,16 +252,15 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//装配件跳过, 必须顺序扫描才生效
if (isSkip && !StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) {
//匹配成功
equipVariableCollectContext.isConsume();
flag = true;
//装配件清单该数据标记跳过
productionAssemblyNosortContext.assemblySkip();
//匹配成功
equipVariableCollectContext.isConsume();
stepResult.msg(String.format("装配件跳过码验证成功,已跳过当前装配项!"));
flag = true;
break LOOP;
}

@ -97,13 +97,13 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
//验证当前是否属于装配件跳过码
Boolean isSkip = checkIsSkip(productionProcessContext, equipVariableCollectContextList);
//验证当前是否属于装配件整腔跳过码
Boolean isCavitySkip = checkIsCavitySkip(productionProcessContext, equipVariableCollectContextList, prodRuleContextList, stepResult);
Boolean isCavitySkip = checkIsCavitySkip(productionProcessContext, equipVariableCollectContextList);
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
Boolean result = isCavitySkip ? true : doHandleMatchAssembly(reqBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip);
Boolean result = doHandleMatchAssembly(reqBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip, isCavitySkip);
//验证是否存在待绑定数据
hasUnBindAssembly = isCavitySkip ? true : hasUnBindAssembly(prodRuleContextList);
hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
//搜集装配件条码
String suffix = MesPcnExtConstWords.EMPTY;
@ -172,12 +172,10 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
}
//验证当前是否属于装配件整腔跳过码
private Boolean checkIsCavitySkip(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProdRuleContext> prodRuleContextList, StepResult stepResult) {
private Boolean checkIsCavitySkip(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.getAssemblyCavitySkipCode())) return false;
//TODO
return true;
}
@ -206,7 +204,7 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip) {
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip, Boolean isCavitySkip) {
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
@ -215,16 +213,16 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
List<MesProductionAssemblySortContext> productionAssemblySortContextList = prodRuleContext.getSortAssemblyDataContext();
Boolean flag = false;
//遍历装配件清单
LOOP:
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
for (MesProductionAssemblySortContext productionAssemblySortContext : productionAssemblySortContextList) {
//已装配
if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
if (null == productionAssemblySortContext || productionAssemblySortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
//遍历装配件条码
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {
@ -235,22 +233,43 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
//装配件跳过, 必须顺序扫描才生效
if (isSkip && !StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) {
//装配件清单该数据标记跳过
productionAssemblySortContext.assemblySkip();
//匹配成功
equipVariableCollectContext.isConsume();
stepResult.msg(String.format("装配件跳过码验证成功,已跳过当前装配项!"));
flag = true;
break LOOP;
}
//装配件整腔跳过
if (isCavitySkip) {
//装配件清单该数据标记跳过
productionAssemblyNosortContext.assemblySkip();
productionAssemblySortContext.assemblySkip();
stepResult.msg(String.format("装配件跳过码验证成功,已跳过当前装配项!"));
//判断当腔是否还存在待装配的数据
Optional<MesProductionAssemblySortContext> optional = productionAssemblySortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) {
//匹配成功 [整腔全部跳过后标记]
equipVariableCollectContext.isConsume();
stepResult.msg(String.format("装配件整腔跳过码验证成功,已跳过当腔装配项!"));
flag = true;
}
break LOOP;
}
//匹配规则
Map<String, Object> result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext);
Map<String, Object> result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblySortContext);
//匹配失败
if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) {
@ -262,17 +281,17 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA);
//前道防错
if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) {
if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) {
if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblySortContext.getPreCraftCode())) {
if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblySortContext.getPartNo(), productionAssemblySortContext.getPreCraftCode()))) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(),
String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode())));
String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblySortContext.getPartNo(), productionAssemblySortContext.getPreCraftCode())));
continue;
}
}
//时效性验证
if (!StringUtils.isEmpty(filter.getProductSnId())) {
result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue());
result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE10.getValue());
if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) {
stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE)));
@ -286,21 +305,20 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
flag = true;
//装配件清单该数据标记已装配 (如果是自制件赋值productSnId)
productionAssemblyNosortContext.assemblyStatus(equipVariableCollectContext.getEquipVariableValue()).productSnId(filter.getProductSnId());
productionAssemblySortContext.assemblyStatus(equipVariableCollectContext.getEquipVariableValue()).productSnId(filter.getProductSnId());
break;
}
//是否验证顺序装配
if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) &&
prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 &&
productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break;
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 &&
isCheckBindSeq(prodRuleContext, productionAssemblySortContext) && productionAssemblySortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break;
}
//存在匹配成功的数据
if (flag) prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList);
if (flag) prodRuleContext.assemblyDataJson(productionAssemblySortContextList);
if (flag && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 && equipVariableCollectContextList.size() == 1) return true;
}
@ -309,4 +327,10 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
}
private Boolean isCheckBindSeq(MesProdRuleContext prodRuleContext, MesProductionAssemblySortContext productionAssemblySortContext) {
if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) return true;
if (!StringUtils.isEmpty(productionAssemblySortContext.getIsSeqScan()) && productionAssemblySortContext.getIsSeqScan().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) return true;
return false;
}
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
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.util.PojoAttrUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -28,10 +30,11 @@ public class MesAssemblyShowSortPreCraftStepService extends MesAssemblyShowSortS
}
public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext) {
Map<String, MesWorkCell> workCellMap = productionProcessContextStepService.dispatchWorkCellMap(reqBean);
//不携带工位工序条件
MesProdRuleContext prodRuleContext = new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode())
.equipmentCode(cellEquipContext.getEquipmentCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.getForeignKey());
return prodRuleCfgExtService.getProdRuleSortPreCraftContext(prodRuleContext);
return prodRuleCfgExtService.getProdRuleSortPreCraftContext(prodRuleContext, workCellMap);
}
//装配件清单列表标题

@ -103,7 +103,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext) {
MesProdRuleContext prodRuleContext = new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).isCheckBindSeq(productionProcessContext.getWorkCell().getIsSeqScan())
.equipmentCode(cellEquipContext.getEquipmentCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.getForeignKey());
return prodRuleCfgExtService.getProdRuleSortContext(prodRuleContext);
}

@ -19,6 +19,7 @@ import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -52,7 +53,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString()); }
private String getContextKey(StationRequestBean reqBean) {
return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString());
}
private String getContextKey(String organizeCode, String workCenterCode, String workCellCode) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(organizeCode).add(workCenterCode).add(workCellCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString();
}
//清除上下文中的所有基础数据
@Override
@ -451,16 +458,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return !StringUtils.isEmpty(scanMonitorContextJson) ? JSONObject.parseObject(scanMonitorContextJson, MesScanMonitorContext.class) : null;
}
//获取上下文工位扫描监控信息的开模记录ID
@Override
public String getScanMonitorContextMouldRecordId(StationRequestBean reqBean) {
MesScanMonitorContext scanMonitorContext = getScanMonitorContext(reqBean);
return (null != scanMonitorContext && !StringUtils.isEmpty(scanMonitorContext.getMouldRecordId())) ? scanMonitorContext.getMouldRecordId().toString() : null;
}
private String getContextKey(String organizeCode, String workCenterCode, String workCellCode) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(organizeCode).add(workCenterCode).add(workCellCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString();
}
//获取上下文工位扫描监控信息
@Override
public MesScanMonitorContext getScanMonitorContext(String organizeCode, String workCenterCode, String workCellCode) {
@ -474,6 +478,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_MONITOR_CONTEXT);
}
//获取生产线类型
@Override
public Integer getCenterType(StationRequestBean reqBean) {
if (!StringUtils.isEmpty(reqBean.getCenterType())) return reqBean.getCenterType();
@ -484,4 +489,17 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
reqBean.setCenterType(productionProcessContext.getWorkCenter().getCenterType());
return reqBean.getCenterType();
}
//获取生产线下的工位集合
@Override
public Map<String, MesWorkCell> dispatchWorkCellMap(StationRequestBean reqBean) {
String workCellMapJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_CELL_MAP_CONTEXT);
if (!StringUtils.isEmpty(workCellMapJson)) return JSONObject.parseObject(workCellMapJson, new TypeReference<Map<String, MesWorkCell>>() {});
List<MesWorkCell> workCellList = prodOrgExtService.getWorkCellList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
Map<String, MesWorkCell> workCellMap = CollectionUtils.isEmpty(workCellList) ? null : workCellList.stream().filter(o -> null != o).collect(Collectors.toMap(MesWorkCell::getWorkCellCode, o -> o));
if (!CollectionUtils.isEmpty(workCellList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_CELL_MAP_CONTEXT, JSONObject.toJSONString(workCellMap));
return workCellMap;
}
}

@ -135,6 +135,13 @@ public class MesProdRuleContext implements Serializable {
return this;
}
//非排序无须使用工位的字段,直接使用非排序产品加工规则的字段;
//排序使用工位的字段, 如果是显示前道所有装配件场景下在装配件清单中单独标记各个工位的装配件是否需要顺序扫描
public MesProdRuleContext isCheckBindSeq(Integer isSeqScan) {
if (!StringUtils.isEmpty(isSeqScan)) this.isCheckBindSeq = isSeqScan;
return this;
}
public MesProdRuleContext workOrderNo(String workOrderNo) {
this.workOrderNo = workOrderNo;
return this;
@ -237,7 +244,7 @@ public class MesProdRuleContext implements Serializable {
//排序装配件清单
public List<MesProductionAssemblySortContext> getSortAssemblyDataContext() {
List<MesProductionAssemblySortContext> sortAssemblyList = !StringUtils.isEmpty(this.assemblyDataJson) ? JSONObject.parseArray(this.assemblyDataJson, MesProductionAssemblySortContext.class) : null;
return CollectionUtils.isEmpty(sortAssemblyList) ? null : sortAssemblyList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProductionAssemblySortContext::getRouteSeq)).collect(Collectors.toList());
return CollectionUtils.isEmpty(sortAssemblyList) ? null : sortAssemblyList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProductionAssemblySortContext::getProcessSeq).thenComparing(MesProductionAssemblySortContext::getRouteSeq)).collect(Collectors.toList());
}
}

@ -3,6 +3,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.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam;
@ -112,6 +113,9 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
@ApiParam(value = "装配件记录表创建人")
public String createUser;
@ApiParam(name = "是否顺序扫描")
private Integer isSeqScan;
public MesProductionAssemblySortContext() {}
public MesProductionAssemblySortContext copy(MesWorkOrderAssembly workOrderAssembly) {
@ -130,7 +134,7 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
return this;
}
public MesProductionAssemblySortContext copy(MesWorkOrderAssembly workOrderAssembly, MesProductionAssembly productionAssembly) {
public MesProductionAssemblySortContext copy(MesWorkOrderAssembly workOrderAssembly, MesProductionAssembly productionAssembly, MesWorkCell workCell) {
if (null != workOrderAssembly) {
BeanUtils.copyProperties(workOrderAssembly, this, MesPcnExtConstWords.BASE_BEAN_FIELDS);
@ -143,6 +147,8 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
this.createUser = productionAssembly.getCreateUser();
}
if (null != workCell && !StringUtils.isEmpty(workCell.getIsSeqScan())) this.isSeqScan = workCell.getIsSeqScan();
if (StringUtils.isEmpty(this.routeSeq)) this.routeSeq = MesPcnExtConstWords.ZERO;
if (StringUtils.isEmpty(this.processSeq)) this.processSeq = MesPcnExtConstWords.ZERO;
@ -160,13 +166,20 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
return this;
}
public MesProductionAssemblySortContext assemblyStatus() {
public MesProductionAssemblySortContext assemblyStatus(String assemblySn) {
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
this.assemblySn = assemblySn;
return this;
}
public MesProductionAssemblySortContext assemblySn(String assemblySn) {
this.assemblySn = assemblySn;
public MesProductionAssemblySortContext assemblySkip() {
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_40.getValue();
this.isSkip = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
public MesProductionAssemblySortContext productSnId(Long productSnId) {
this.productSnId = productSnId;
return this;
}

@ -403,6 +403,8 @@ public class MesPcnExtConstWords {
public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";
// 上下文: 工位扫描监控信息
public static final String SCAN_MONITOR_CONTEXT = "SCAN_MONITOR_CONTEXT";
// 上下文: 工位集合
public static final String WORK_CELL_MAP_CONTEXT = "WORK_CELL_MAP_CONTEXT";
// 上下文: 加工结果
public static final String PRODUCT_RESULT_CONTEXT = "PRODUCT_RESULT_CONTEXT";
// 上下文: 就绪信号

Loading…
Cancel
Save