@ -3,12 +3,15 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService ;
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.MesEquipVariableCollectContext ;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesPartDataMapSaveStepService ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext ;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords ;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService ;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil ;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil ;
import cn.estsh.i3plus.pojo.mes.bean.Mes WorkCenter ;
import cn.estsh.i3plus.pojo.mes.bean.Mes Part ;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean ;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean ;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean ;
@ -23,6 +26,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
import java.util.Map ;
import java.util.stream.Collectors ;
/ * *
@ -42,6 +46,9 @@ public class MesProductionPartNoScanStepService extends BaseStepService {
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService ;
@Autowired
private MesPartDataMapSaveStepService partDataMapSaveStepService ;
@Override
public StepResult guide ( StationRequestBean reqBean ) {
@ -58,9 +65,6 @@ public class MesProductionPartNoScanStepService extends BaseStepService {
StepResult stepResult = StepResult . getSuccessComplete ( ) ;
//扫描信息置空
String scanInfo = reqBean . resetScanInfo ( reqBean . getScanInfo ( ) ) ;
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService . dispatchCurCellEquipment ( reqBean ) ;
@ -70,68 +74,99 @@ public class MesProductionPartNoScanStepService extends BaseStepService {
//存储生产过程上下文对象
productionProcessContextStepService . dispatchProductionProcessContext ( reqBean , productionProcessContext ) ;
// 从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext . getWorkCenter ( ) ;
// 扫描信息置空
String scanInfo = reqBean . resetScanInfo ( reqBean . getScanInfo ( ) ) ;
//如果没有扫描信息, 取手选工单信息, 封装扫/读信息:加工单信息
List < MesEquipVariableCollectContext > equipVariableCollectContextList ;
//优先验证扫描加工单
if ( ! StringUtils . isEmpty ( scanInfo ) ) equipVariableCollectContextList = doHandleScanWorkOrderNoContext ( reqBean , stepResult , scanInfo ) ;
//选择加工单
else equipVariableCollectContextList = doHandleScanWorkOrderNoContext ( reqBean , stepResult , workCenter ) ;
//获取手动选择的腔数及零件信息上下文
List < StationKvBean > chooseCavityPart = productionProcessContextStepService . getFunctionChooseCavityPartContext ( reqBean ) ;
//扫描信息为空
if ( CollectionUtils . isEmpty ( equipVariableCollectContextList ) ) stepSendGuideAndThrowEx ( reqBean , resultBean . writeDbLog ( MesPcnEnumUtil . WORK_CELL_SCAN_MONITOR_LOG_TYPE . PROCESS . getValue ( ) ) , "请扫描加工单!" ) ;
if ( CollectionUtils . isEmpty ( chooseCavityPart ) & & StringUtils . isEmpty ( scanInfo ) ) stepSendGuideAndThrowEx ( reqBean , resultBean . writeDbLog ( MesPcnEnumUtil . WORK_CELL_SCAN_MONITOR_LOG_TYPE . PROCESS . getValue ( ) ) , "请扫描产成零件!" ) ;
//保存上下文扫/读信息:加工单
productionDispatchContextStepService . dispatchScanWorkOrderNoContext ( reqBean , equipVariableCollectContextList ) ;
List < MesProductionPartContext > productionPartContextList = null ;
List < String > readList ;
List < String > partNoList ;
String cellMessageSorce = null ;
String suffix = null ;
return stepSuccessCompleteAndSendMsgReturn ( reqBean , resultBean . writeDbLog ( MesPcnEnumUtil . WORK_CELL_SCAN_MONITOR_LOG_TYPE . SCAN . getValue ( ) ) . scanInfo ( scanInfo ) , stepResult , stepResult . getMsg ( ) ) ;
if ( ! CollectionUtils . isEmpty ( chooseCavityPart ) ) {
}
//工位信息来源
cellMessageSorce = chooseCavityPart . stream ( ) . filter ( o - > ( null ! = o & & o . getKey ( ) . equals ( MesPcnExtConstWords . CELL_MESSAGE_SOURCE ) ) ) . findFirst ( ) . get ( ) . getValue ( ) ;
//封装扫/读信息:加工单信息 (扫描)
private List < MesEquipVariableCollectContext > doHandleScanWorkOrderNoContext ( StationRequestBean reqBean , StepResult stepResult , String scanInfo ) {
//搜集读取的产成零件编码
readList = new ArrayList < > ( Arrays . asList ( chooseCavityPart . stream ( ) . filter ( o - > ( null ! = o & & o . getKey ( ) . equals ( MesPcnExtConstWords . PART_NO ) ) ) . findFirst ( ) . get ( ) . getValue ( ) . split ( MesPcnExtConstWords . SEMICOLON ) ) ) ;
List < MesEquipVariableCollectContext > equipVariableCollectContextList = new ArrayList < > ( ) ;
//发送工步内容
scanInfo = chooseCavityPart . stream ( ) . filter ( o - > ( null ! = o & & ! o . getKey ( ) . equals ( MesPcnExtConstWords . CELL_MESSAGE_SOURCE ) ) ) . map ( o - > o . getName ( ) + MesPcnExtConstWords . SQUARE_BRACKETS_L + o . getValue ( ) + MesPcnExtConstWords . SQUARE_BRACKETS_R ) . collect ( Collectors . joining ( MesPcnExtConstWords . SEMICOLON ) ) ;
productionCustomContextStepService . sendStepContextMessage ( reqBean , scanInfo , MesExtEnumUtil . CELL_MESSAGE_SOURCE . getByValue ( Integer . valueOf ( cellMessageSorce ) ) ) ;
equipVariableCollectContextList . add ( new MesEquipVariableCollectContext ( reqBean . getOrganizeCode ( ) , scanInfo , MesExtEnumUtil . CELL_MESSAGE_SOURCE . SCAN . getValue ( ) ) ) ;
//零件编码去重
partNoList = readList . stream ( ) . filter ( o - > ( ! StringUtils . isEmpty ( o ) & & ! o . equals ( productionProcessContext . getFinishCode ( ) ) ) ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
//发送工步内容
productionCustomContextStepService . sendStepContextMessage ( reqBean , scanInfo , MesExtEnumUtil . CELL_MESSAGE_SOURCE . SCAN ) ;
//验证零件编码有效性
if ( ! CollectionUtils . isEmpty ( partNoList ) ) partDataMapSaveStepService . savePartDataMap ( reqBean , resultBean , stepResult , partNoList , true , false ) ;
stepResult . msg ( String . format ( "当前扫描信息加工单[%s]!" , scanInfo ) ) ;
//验证失败,删除手动选择的腔数及零件信息上下文
if ( CollectionUtils . isEmpty ( partNoList ) | | ! stepResult . isCompleted ( ) ) productionProcessContextStepService . removeFunctionChooseCavityPartContext ( reqBean ) ;
else suffix = String . format ( "%s:%s" , MesExtEnumUtil . CELL_MESSAGE_SOURCE . valueOfDescription ( Integer . valueOf ( cellMessageSorce ) ) , scanInfo ) ;
return equipVariableCollectContextList ;
} else {
}
//发送工步内容
productionCustomContextStepService . sendStepContextMessage ( reqBean , scanInfo , MesExtEnumUtil . CELL_MESSAGE_SOURCE . SCAN ) ;
//获取上下文产成零件信息
productionPartContextList = productionDispatchContextStepService . getProductionPartContext ( reqBean ) ;
//搜集上下文产成零件编码
readList = CollectionUtils . isEmpty ( productionPartContextList ) ? new ArrayList < > ( ) : productionPartContextList . stream ( ) . filter ( o - > ! StringUtils . isEmpty ( o ) ) . map ( MesProductionPartContext : : getPartNo ) . collect ( Collectors . toList ( ) ) ;
//合并当前扫描的零件编码
readList . add ( scanInfo ) ;
//零件编码去重
partNoList = readList . stream ( ) . filter ( o - > ( ! StringUtils . isEmpty ( o ) & & ! o . equals ( productionProcessContext . getFinishCode ( ) ) ) ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
//验证零件编码有效性
if ( ! CollectionUtils . isEmpty ( partNoList ) ) partDataMapSaveStepService . savePartDataMap ( reqBean , resultBean , stepResult , partNoList , true , true ) ;
if ( stepResult . isCompleted ( ) ) suffix = String . format ( "%s:%s[%s]" , MesExtEnumUtil . CELL_MESSAGE_SOURCE . SCAN . getDescription ( ) , ! scanInfo . equals ( productionProcessContext . getFinishCode ( ) ) ? "零件编码" : "空腔嘛" , scanInfo ) ;
//封装扫/读信息:加工单信息 (选择)
private List < MesEquipVariableCollectContext > doHandleScanWorkOrderNoContext ( StationRequestBean reqBean , StepResult stepResult , MesWorkCenter workCenter ) {
}
//排序线不支持选择加工单
if ( workCenter . getCenterType ( ) . compareTo ( MesExtEnumUtil . WORK_CENTER_TYPE . NOSORT . getValue ( ) ) ! = 0 ) return null ;
// 验证失败
if ( ! stepResult . isCompleted ( ) ) return stepNonCompleteAndSendMsgReturn ( reqBean , resultBean . writeDbLog ( ) , stepResult , stepResult . getMsg ( ) ) ;
//获取手动选择的腔数及工单信息上下文, 扫描的加工单也会存入其中
List < StationKvBean > chooseCavityOrder = productionProcessContextStepService . getFunctionChooseCavityOrderContext ( reqBean ) ;
// 封装产出零件信息信息
productionPartContextList = partDataMapSaveStepService . getProductionPartContext ( reqBean , productionProcessContext , new ArrayList < > ( ) , ( Map < String , MesPart > ) stepResult . getObj ( ) , readList ) ;
if ( CollectionUtils . isEmpty ( chooseCavityOrder ) ) return null ;
//验证是否全部为空腔
if ( partDataMapSaveStepService . checkIsAllFinishCode ( productionPartContextList ) ) return stepNonCompleteAndSendMsgReturn ( reqBean , resultBean . writeDbLog ( ) , stepResult , "当前产成零件信息全部为空腔,已清除当前的空腔数据!" ) ;
String cellMessageSorce = chooseCavityOrder . stream ( ) . filter ( o - > ( null ! = o & & o . getKey ( ) . equals ( MesPcnExtConstWords . CELL_MESSAGE_SOURCE ) ) ) . findFirst ( ) . get ( ) . getValue ( ) ;
String isConsume = chooseCavityOrder . stream ( ) . filter ( o - > ( null ! = o & & o . getKey ( ) . equals ( MesPcnExtConstWords . CRAFT_JUMP_CODE ) ) ) . findFirst ( ) . get ( ) . getValue ( ) ;
List < String > chooseList = new ArrayList < > ( Arrays . asList ( chooseCavityOrder . stream ( ) . filter ( o - > ( null ! = o & & o . getKey ( ) . equals ( MesPcnExtConstWords . WORK_ORDER_NO ) ) ) . findFirst ( ) . get ( ) . getValue ( ) . split ( MesPcnExtConstWords . SEMICOLON ) ) ) ;
//保存设备当前一轮工序的产出零件信息
productionDispatchContextStepService . dispatchProductionPartContext ( reqBean , productionPartContextList ) ;
List < MesEquipVariableCollectContext > equipVariableCollectContextList = new ArrayList < > ( ) ;
chooseList . stream ( ) . filter ( o - > ! StringUtils . isEmpty ( o ) ) . forEach ( o - >
equipVariableCollectContextList . add ( new MesEquipVariableCollectContext ( reqBean . getOrganizeCode ( ) , o , Integer . valueOf ( cellMessageSorce ) ) . isConsume ( Integer . valueOf ( isConsume ) ) ) ) ;
//扫描模式下判断当前是否满足设备腔数
if ( CollectionUtils . isEmpty ( chooseCavityPart ) ) {
MesCellEquipContext cellEquipContext = productionProcessContext . getCurCellEquip ( ) ;
if ( cellEquipContext . getCavity ( ) . compareTo ( productionPartContextList . size ( ) ) > 0 ) return stepDynamicsCompleteAndSendMsgReturn (
reqBean , resultBean . writeDbLog ( ) . scanInfo ( scanInfo ) ,
stepResult , false , MesPcnEnumUtil . STATION_BUSI_TYPE . MESSAGE , MesPcnEnumUtil . STATION_DATA_TYPE . TEXT ,
String . format ( "当前%s验证成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!" , suffix , cellEquipContext . getCavity ( ) , cellEquipContext . getCavity ( ) - productionPartContextList . size ( ) ) ) ;
}
//发送工步内容
String scanInfo = chooseCavityOrder . stream ( ) . filter ( o - > ( null ! = o & & ! o . getKey ( ) . equals ( MesPcnExtConstWords . CELL_MESSAGE_SOURCE ) ) ) . map ( o - > o . getName ( ) + MesPcnExtConstWords . SQUARE_BRACKETS_L + o . getValue ( ) + MesPcnExtConstWords . SQUARE_BRACKETS_R ) . collect ( Collectors . joining ( MesPcnExtConstWords . SEMICOLON ) ) ;
productionCustomContextStepService . sendStepContextMessage ( reqBean , scanInfo , MesExtEnumUtil . CELL_MESSAGE_SOURCE . getByValue ( Integer . valueOf ( cellMessageSorce ) ) ) ;
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService . dispatchModuleContentContext ( reqBean , partDataMapSaveStepService . getModuleContextData2PartNo ( reqBean , productionPartContextList ) ) ;
stepResult . msg ( String . format ( "当前%s%s!" , MesExtEnumUtil . CELL_MESSAGE_SOURCE . valueOfDescription ( Integer . valueOf ( cellMessageSorce ) ) , scanInfo ) ) ;
//缓存产成零件编码到上下文得基础信息中, 下次开模即可无须再次选择或者扫描产成零件编码
if ( CollectionUtils . isEmpty ( chooseCavityPart ) | | ! cellMessageSorce . equals ( MesExtEnumUtil . CELL_MESSAGE_SOURCE . READ . getValueStr ( ) ) ) {
productionProcessContextStepService . dispatchFunctionChooseCavityPartContext ( reqBean , StationKvBeanUtil . addStationKvBeanList ( new ArrayList < > ( ) ,
new StationKvBean ( MesPcnExtConstWords . CAVITY , "腔数" , String . valueOf ( productionPartContextList . size ( ) ) ) ,
new StationKvBean ( MesPcnExtConstWords . CELL_MESSAGE_SOURCE , "工位信息来源" , MesExtEnumUtil . CELL_MESSAGE_SOURCE . READ . getValueStr ( ) ) ,
new StationKvBean ( MesPcnExtConstWords . PART_NO , "零件编码" , productionPartContextList . stream ( ) . filter ( o - > null ! = o ) . map ( MesProductionPartContext : : getPartNo ) . collect ( Collectors . joining ( MesPcnExtConstWords . SEMICOLON ) ) ) ) ) ;
}
return equipVariableCollectContextList ;
return stepSuccessCompleteAndSendMsgReturn( reqBean , resultBean . writeDbLog ( ) . scanInfo ( scanInfo ) , stepResult , String . format ( "当前%s验证成功!" , suffix ) ) ;
}