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

tags/yfai-pcn-ext-v1.0
administrator 11 months ago
commit 8e349da2f7

@ -55,7 +55,21 @@ public class MesProdShiftRecordServiceImpl implements IMesProdShiftRecordService
@Override
public void insertMesProdShiftRecord(MesProdShiftRecord item, String organizeCode) {
//唯一性校验
DdlPackBean packBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(item.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringEqualPack(item.getShiftGroup(), "shiftGroup", packBean);
DdlPreparedPack.getStringEqualPack(item.getShiftCode(), "shiftCode", packBean);
boolean flg = mesProdShiftRecordRDao.isExitByHql(packBean);
if (flg) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("开关班记录产线【%s】班组代码【%s】班次代码【%s】已经存在请检查数据",
item.getWorkCenterCode(),item.getShiftGroup(),item.getShiftCode())
.build();
}
ConvertBean.serviceModelInitialize(item, AuthUtil.getSessionUser().getUserName());
mesProdShiftRecordRDao.save(item);
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskRequestModel;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
@ -140,12 +141,15 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(AuthUtil.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(detailId, "partInspectionDetailId", packBean);
MesReworkTaskDetail mesReworkTaskDetail = mesReworkTaskDetailRepository.getByProperty(packBean);
if (mesReworkTaskDetail == null) {
List<MesReworkTaskDetail> mesReworkTaskDetailList = mesReworkTaskDetailRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(mesReworkTaskDetailList)) {
MesPcnException.throwFlowException("返工单详情不存在");
}
mesReworkTaskDetailList.forEach(mesReworkTaskDetail->{
mesReworkTaskDetail.setStatus(MesExtEnumUtil.REWORK_TASK_DETAIL_STATUS.REWORK_TASK_DETAIL_STATUS_20.getValue());
mesReworkTaskDetailRepository.save(mesReworkTaskDetail);
ConvertBean.serviceModelUpdate(mesReworkTaskDetail,AuthUtil.getSessionUser().getUserName());
});
mesReworkTaskDetailRepository.saveAll(mesReworkTaskDetailList);
}

@ -449,7 +449,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
private MesPackingDefine getMesPackingDefine(MesPackageDetail mesPackageDetail) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(mesPackageDetail.getScanType(), "scanType", packBean);
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getScanType(), "scanType", packBean);
MesPackingDefine packingDefine = mesPackingDefineRDao.getByProperty(packBean);
if (Objects.isNull(packingDefine)) {
MesPcnException.throwFlowException("客户条码规则在包装定义界面未维护");

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesReworkTaskService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesInputDefectRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
@ -16,6 +17,7 @@ import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspection;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask;
import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTaskDetail;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -83,6 +85,9 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
@Autowired
private MesDefectTypeRepository defectTypeRepository;
@Autowired
private MesReworkTaskDetailRepository mesReworkTaskDetailRDao;
@Override
public MesPartInspectionViewModel queryPartInspection(MesPartInspectionInputModel inputModel, String org) {
@ -125,7 +130,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
MesPartTypePicture partTypePicture = checkPartTypePicture(part, org);
//构造返回信息
MesPartInspectionViewModel model = getModel(partInspection, part, partTypePicture, inputModel.getFrontBack(), sourceType, org);
MesPartInspectionViewModel model = getModel(partInspection, part, partTypePicture, inputModel, sourceType, org);
model.setSourceType(sourceType);
model.setTransferFlg(inputModel.isTransferFlg());
@ -488,7 +493,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
//返修单 进行返修
inputModel.setTransferFlg(true);
}
return partInspection;
}
}
@ -585,6 +590,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
move.setZrsum(zrsum);
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SUSPICIOUS_MOVE.getValue());
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}
@ -698,14 +704,18 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
return alarmConfigList;
}
private MesPartInspectionViewModel getModel(MesPartInspection partInspection, MesPart part, MesPartTypePicture partTypePicture, Integer frontBack,
private MesPartInspectionViewModel getModel(MesPartInspection partInspection, MesPart part,MesPartTypePicture partTypePicture, MesPartInspectionInputModel inputModel ,
Integer sourceType, String org) {
Integer frontBack = inputModel.getFrontBack();
List<MesPartInspectionDetail> detailList = new ArrayList<>();
if (!StringUtils.isEmpty(partInspection) && partInspection.getInspectionStatus() != MesExtEnumUtil.PART_INSPECTION_STATUS.QUALIFIED.getValue()) {
detailList = checkPartInspectionDetail(partInspection, org);
if(!CollectionUtils.isEmpty(detailList)){
//判断是否返工完成
checkReworkFinished(org, detailList);
}
}
//位置
List<MesLocationConfig> locationConfigList = checkLocationConfig(org);
@ -721,23 +731,53 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
//根据不良类型+位置 若有数据,则表示需要标黄
Map<String, List<MesDefectWarnConfig>> alarmConfigMap = alarmConfigList.stream().collect(Collectors.groupingBy(MesDefectWarnConfig::getDefectLocation));
//返修完成需要标记绿色
Map<String, List<MesPartInspectionDetail>> detailMap = detailList.stream().collect(Collectors.groupingBy(t->t.getDefectLocation()+t.getFrontBack()));
locationConfigList.forEach(k -> {
k.setFrontBack(frontBack);
if (alarmConfigMap.containsKey(k.getDefectLocation())) {
k.setIsflg(true);
k.setColour(MesExtEnumUtil.COLOR.YELLOW.getValue());
}
if(detailMap.containsKey(k.getDefectLocation()+frontBack) &&
detailMap.get(k.getDefectLocation()+frontBack).stream().allMatch(MesPartInspectionDetail::getReworkFinished)){
k.setIsflg(true);
k.setColour(MesExtEnumUtil.COLOR.GREEN.getValue());
}
});
MesPartInspectionViewModel model = new MesPartInspectionViewModel();
model.setPart(part);
if (!StringUtils.isEmpty(partInspection) && partInspection.getInspectionStatus() == MesExtEnumUtil.PART_INSPECTION_STATUS.FAIL.getValue()
&& partInspection.getNcStatus() == MesExtEnumUtil.PART_INSPECTION_NC_STATUS.CREATE.getValue()) {
model.setPartInspectionDetailList(detailList);
}
model.setPartTypePicture(partTypePicture);
model.setLocationConfigList(locationConfigList);
model.setPartInspection(partInspection);
model.setMesDefectWarnConfigList(alarmConfigList);
return model;
}
private void checkReworkFinished(String org, List<MesPartInspectionDetail> detailList) {
List<Long> idList = detailList.stream().map(MesPartInspectionDetail::getId).collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getInPackList(idList, "partInspectionDetailId", packBean);
List<MesReworkTaskDetail> mesReworkTaskDetailList = mesReworkTaskDetailRDao.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(mesReworkTaskDetailList)){
Map<Long, List<MesReworkTaskDetail>> mesReworkTaskDetailMap = mesReworkTaskDetailList.stream().collect(Collectors.groupingBy(MesReworkTaskDetail::getPartInspectionDetailId));
detailList.forEach(d->{
if(mesReworkTaskDetailMap.containsKey(d.getId()) &&
mesReworkTaskDetailMap.get(d.getId()).stream().allMatch(t->MesExtEnumUtil.REWORK_TASK_STATUS.FINISH.getValue() == t.getStatus())){
d.setReworkFinished(true);
}
});
}
}
private List<MesPartInspectionDetail> checkPartInspectionDetail(MesPartInspection partInspection, String org) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(partInspection.getId(), "pid", packBean);

@ -166,14 +166,14 @@ public class MesNcProcessingService implements IMesNcProcessingService {
MesDefectType person = StringUtil.isEmpty(model.getPerson())?new MesDefectType():model.getPerson();
//保存数据
saveDate(model, model.getPart(), type, person, org,model.getAreaCode());
saveDate(model, model.getPart(), type, person, org,model.getInventoryLocationCode());
} else {
Integer type = model.getType();
MesDefectType person = StringUtil.isEmpty(model.getPerson())?new MesDefectType():model.getPerson();
//保存数据
saveDate(model, model.getPart(), type, person, org,model.getAreaCode());
saveDate(model, model.getPart(), type, person, org,model.getInventoryLocationCode());
}
}
@ -342,7 +342,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
//移库 转正常、放行8000移至2000
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org,MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
moveRepository.save(move);
} else if (type == MesExtEnumUtil.NC_TYPE.REWORK.getValue()) {
@ -390,7 +390,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
model.getPartInspection().setReworkTaskId(reworkTask.getId());
partInspectionRepository.save(model.getPartInspection());
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org,MesExtEnumUtil.MOVE_TYPE.RETURN_MOVE);
moveRepository.save(move);
} else if (type == MesExtEnumUtil.NC_TYPE.SCRAP.getValue()) {
@ -409,7 +409,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
partInspectionRepository.save(model.getPartInspection());
//移库 转报废 根据责任方库区对应关系的主数据选择哪个责任方就移动到哪个库区8000移至8002/8003
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org,MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE);
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "SCRAP"), org);
moveRepository.save(move);
@ -433,7 +433,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
//移库 转正常、放行8000移至2000
// MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org);
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org,MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
moveRepository.save(move);
}
@ -455,7 +455,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
return produceSn;
}
private MesMove createMove(MesNcProcessingInputModel model, String source, String target, String org) {
private MesMove createMove(MesNcProcessingInputModel model, String source, String target, String org,MesExtEnumUtil.MOVE_TYPE moveType) {
GenSerialNoModel serialNoModel = new GenSerialNoModel("INPUT_DEFECT_ZRSUM");
serialNoModel.setPartNo(model.getPart().getPartNo());
ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, AuthUtil.getSessionUser().getUserName(), org, 1);
@ -475,6 +475,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
move.setZrsum(zrsum);
move.setPostDate(TimeTool.getToday());
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(moveType.getValue());
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}

@ -152,6 +152,7 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
init(reqBean);
return true;
}

@ -33,7 +33,7 @@ public class MesFunctionProductionLockService extends BaseSwsService implements
if (StringUtils.isEmpty(buttonDynamicModel.getParamCode()) || !buttonDynamicModel.getParamCode().equals(MesPcnExtConstWords.ATUO_PRODUCTION_LOCK)) {
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, true);
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false, true);
}

@ -3,7 +3,9 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.MesCountDownShowStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -21,17 +23,27 @@ public class MesFunctionProductionUnlockService extends BaseSwsService implement
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//删除上下文加工锁
productionDispatchContextStepService.deleteProductionLockContext(reqBean);
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false);
((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false, false);
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
reqBean.setTriggerAutoFsm(true);
shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false);
return true;
}

@ -85,7 +85,16 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
//保存上下文产品加工规则信息集合
if (prodRuleContextList.size() != initSize) productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
if (prodRuleContextList.size() != initSize) {
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
if (!CollectionUtils.isEmpty(productionPartContextList)) {
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
}
if (!CollectionUtils.isEmpty(productionPsInContextList)) {
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
}
}
//显示装配件信息
showProductionAssembly(reqBean, resultBean, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList);
@ -213,9 +222,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//获取匹配产出零件的所有加工规则
List<MesProdRuleNosortCfg> outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
MesProdRuleNosortCfg filter = null;
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()))).findFirst();
if (null == optional || !optional.isPresent()) break;
@ -267,9 +274,8 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//显示装配件信息
private Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList) {
Map<Integer, MesProductionPartContext> productionPartMap = productionPartContextList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));
Map<Integer, MesProductionPartContext> productionPartMap = productionPartContextList.stream().filter(o -> null != o && o.getForeignKey() != null).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));
List<AttrBean> attrBeanList = null;
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
@ -282,7 +288,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
if (CollectionUtils.isEmpty(assemblyShowContextList)) continue;
//装配件清单列表标题
if (CollectionUtils.isEmpty(attrBeanList)) attrBeanList = dataAttrList(workOrderNo);
List<AttrBean> attrBeanList = dataAttrList(workOrderNo);
//封装多表格
resultBean.addStationResultBeans(new StationResultBean().dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue()).dataAttrList(attrBeanList).resultList(assemblyShowContextList));
@ -306,9 +312,11 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
private List<MesAssemblyShowContext> getAssemblyShowContextList(MesCellEquipContext cellEquipContext, List<MesProductionAssemblyContext> productionAssemblyContextList, MesProdRuleContext prodRuleContext, String workOrderNo) {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null;
List<MesAssemblyShowContext> assemblyShowContextList = new ArrayList<>();
int index = 0;
for (MesProductionAssemblyContext item : productionAssemblyContextList) {
if (null == item) continue;
assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo));
index ++ ;
assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo).index(index));
}
assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList());
return assemblyShowContextList;
@ -321,9 +329,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
if (!StringUtils.isEmpty(workOrderNo)) assemblyShowContext.setWorkOrderNo(workOrderNo);
assemblyShowContext.setPartNo(prodRuleContext.getOutPartNo());
if (StringUtils.isEmpty(assemblyShowContext.getRouteSeq())) assemblyShowContext.setRouteSeq(MesPcnExtConstWords.ZERO);
if (StringUtils.isEmpty(assemblyShowContext.getAssemblyStatus())) assemblyShowContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue());
if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() == assemblyShowContext.getAssemblyStatus() && (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == assemblyShowContext.getMatchType() ||
MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == assemblyShowContext.getMatchType())) assemblyShowContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue());
assemblyShowContext.setAssemblyStatusName(MesExtEnumUtil.ASSEMBLY_STATUS.valueOfDescription(o.getAssemblyStatus()));
assemblyShowContext.setAssemblyStatusName(MesExtEnumUtil.ASSEMBLY_STATUS.valueOfDescription(assemblyShowContext.getAssemblyStatus()));
if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() != assemblyShowContext.getAssemblyStatus())
assemblyShowContext.setColor(StringUtils.isEmpty(assemblyShowContext.getShowColor()) ? MesExtEnumUtil.COLOR.GREEN.getValue() : assemblyShowContext.getShowColor());
return assemblyShowContext;

@ -52,7 +52,7 @@ public class MesCountDownShowStepService extends BaseStepService {
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
if (!productionProcessContext.getSuccess()) return stepResult.msg(productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
@ -63,13 +63,15 @@ public class MesCountDownShowStepService extends BaseStepService {
//不用显示倒计时, 客户端默认显示绿色无数字
if (StringUtils.isEmpty(workCell.getIsShowTime()) || CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == workCell.getIsShowTime()) return stepResult;
Boolean isInit = reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE) ? true : false;
reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE);
//工位开启时间锁, 验证当前是否存在加工锁定状态
Boolean isOpenTimeLock = (!StringUtils.isEmpty(workCell.getIsOpenTimeLock()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == workCell.getIsOpenTimeLock()) ? true : false;
if (isOpenTimeLock) checkCellProductionLockIsExist(reqBean, resultBean, true, true);
if (isOpenTimeLock && checkCellProductionLockIsExist(reqBean, resultBean, isInit, true, true))
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]已被锁定!请扫描解除锁定验证码!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
String isInit = (String) reqBean.getDataMap().get(MesPcnConstWords.WS_CMD_INIT_MODULE);
reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE);
// if (!StringUtils.isEmpty(isInit)) return stepResult;
if (isInit) return stepResult;
//解析工位参数
String countDownTime = doCalcCountDownCfg(reqBean, isOpenTimeLock);
@ -79,9 +81,9 @@ public class MesCountDownShowStepService extends BaseStepService {
}
//验证当前是否存在加工锁定状态
public void checkCellProductionLockIsExist(StationRequestBean reqBean, StationResultBean resultBean, Boolean isNeedCheck, Boolean isLock) {
public Boolean checkCellProductionLockIsExist(StationRequestBean reqBean, StationResultBean resultBean, Boolean isInit, Boolean isNeedCheck, Boolean isLock) {
if (isNeedCheck && !productionDispatchContextStepService.checkProductionLockIsExistContext(reqBean)) return;
if (isNeedCheck && !productionDispatchContextStepService.checkProductionLockIsExistContext(reqBean)) return false;
List<StationKvBean> resultList = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesExtEnumUtil.COLOR.RED.getValue(), "已经超时", MesPcnExtConstWords.ZERO_STR));
@ -91,7 +93,7 @@ public class MesCountDownShowStepService extends BaseStepService {
stationResultBean.setResultMap(functionPoductionUnlock());
this.sendMessage(reqBean, stationResultBean);
if (isNeedCheck) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]已被锁定!请扫描解除锁定验证码!"));
return true;
}

@ -61,6 +61,21 @@ public class MesEndStepService extends BaseStepService {
mesProductionDispatchContextStepService.deleteProductResultContext(reqBean);
mesProductionDispatchContextStepService.deleteReadySignalContext(reqBean);
mesProductionDispatchContextStepService.deleteMesRawPartChargingDataContext(reqBean);
mesProductionDispatchContextStepService.deletePartDataContext(reqBean);
mesProductionDispatchContextStepService.deleteProdRuleDataContext(reqBean);
mesProductionDispatchContextStepService.deleteProductionLockContext(reqBean);
mesProductionDispatchContextStepService.deleteProductionPartContext(reqBean);
mesProductionDispatchContextStepService.deleteProductionPartNoContext(reqBean);
mesProductionDispatchContextStepService.deleteProductionPsInContext(reqBean);
mesProductionDispatchContextStepService.deleteProductionPsOutContext(reqBean);
mesProductionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
mesProductionDispatchContextStepService.deleteSendProcessCmdContext(reqBean);
mesProductionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
mesProductionDispatchContextStepService.deleteScanProductSnContext(reqBean);
mesProductionDispatchContextStepService.deleteFunctionChooseCavityOrderContext(reqBean);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "完成工步执行成功");
}

@ -106,6 +106,7 @@ public class MesMouldRecordGenerateStepService extends BaseStepService {
mesProdMouldRecord.setEquipId(mesCellEquipContext.getEquipId());
mesProdMouldRecord.setMeterName(mesMouldMappingCfg.getMeterName());
mesProdMouldRecord.setAssetNum(mesMouldMappingCfg.getAssetNum());
mesProdMouldRecord.setMouldNo(mouldNo);
mesProdMouldRecord.setEquipmentCode(mesCellEquipContext.getEquipmentCode());
return mesProdMouldRecord;
}

@ -88,7 +88,7 @@ public class MesProductSnCheckStepService extends BaseStepService {
//封装 读/扫主条件信息到进料主条码数据信息中
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList));
if (!CollectionUtils.isEmpty(finishCodeList)) finishCodeList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList));
if (!CollectionUtils.isEmpty(finishCodeList)) finishCodeList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, null, productionPsInContextList));
//获取进料主条码数据信息
List<MesProductionPsInContext> productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean);
@ -142,7 +142,8 @@ public class MesProductSnCheckStepService extends BaseStepService {
//封装 读/扫主条件信息到进料主条码数据信息中
private void createProductionPsInContext(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCell workCell, Map<String, MesProduceSn> produceSnMap, String productSn, List<MesProductionPsInContext> productionPsInContextList) {
MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(!CollectionUtils.isEmpty(produceSnMap) ? produceSnMap.get(productSn) : null, productSn);
MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(
(!CollectionUtils.isEmpty(produceSnMap) && !StringUtils.isEmpty(productSn) && produceSnMap.containsKey(productSn)) ? produceSnMap.get(productSn) : null, productSn);
if (!StringUtils.isEmpty(productionPsInContext.getId())) productionPsInContext.isCheckSeq(workCell.getIsCheckSeq()).isCheckCraft(workCell.getIsCheckCraft());
productionPsInContextList.add(productionPsInContext);
}

@ -163,7 +163,7 @@ public class MesProductSnScanStepService extends BaseStepService {
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;
if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE;
return scanInfo.equals(craftJumpCode) ? true : false;
}

@ -10,6 +10,7 @@ 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.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
@ -26,6 +27,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
@ -64,7 +66,7 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService {
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中缺失待验证的加工单信息!");
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中缺失待验证的加工单信息!");
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
@ -82,6 +84,10 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService {
//扫描场景下合并历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
//非扫描场景 验证是否全部为空腔
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && checkIsAllFinishCode(productionPartContextList))
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s信息全部为空腔!", MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource())));
//保存上下文产出零件信息
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
@ -98,8 +104,20 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!",
equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size()));
//扫描场景 验证是否全部为空腔
if (!checkIsAllFinishCode(productionPartContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size()));
//删除上下文产出零件信息
productionDispatchContextStepService.deleteProductionPartContext(reqBean);
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描信息全部为空腔!");
}
private Boolean checkIsAllFinishCode(List<MesProductionPartContext> productionPartContextList) {
Optional<MesProductionPartContext> optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
return (null != optional && optional.isPresent()) ? false : true;
}
//验证工单的有效性
@ -108,25 +126,33 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService {
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());
//获取生产工单信息
Map<String, MesWorkOrder> workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList);
if (!CollectionUtils.isEmpty(workOrderNoList)) {
for (String workOrderNo : workOrderNoList) {
if (StringUtils.isEmpty(workOrderNo)) continue;
MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo);
if (null == workOrderDb) return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo));
if (null == workOrderDb)
return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo));
if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workOrderDb.getWorkOrderStatus())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus())));
if (!MesExtEnumUtil.ORDER_STATUS.checkNosortAllowStatus(workOrderDb.getWorkOrderStatus()))
return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus())));
if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode()));
if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode()))
return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode()));
}
}
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(new MesProductionPartContext().copyPartNo(workOrderMap.get(o.getEquipVariableValue()))));
//封装产出零件信息
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(
new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()) : null)));
return stepResult.obj(filterList);
@ -140,9 +166,20 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService {
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
List<List<StationKvBean>> dataList = new ArrayList<>();
productionPartContextList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(),
List<MesProductionPartContext> orderList = filterProductionPartContext(productionPartContextList, true);
List<MesProductionPartContext> finishCodeList = filterProductionPartContext(productionPartContextList, false);
if (!CollectionUtils.isEmpty(orderList))
orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue()))));
if (!CollectionUtils.isEmpty(finishCodeList))
StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size())));
return dataList;
}
//根据是否空腔搜集数据
private List<MesProductionPartContext> filterProductionPartContext(List<MesProductionPartContext> productionPartContextList, Boolean flag) {
return flag ? productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()) :
productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList());
}
}

@ -1,100 +1,211 @@
//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.IMesProductionProcessContextStepService;
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
//import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
//import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
//import cn.estsh.i3plus.pojo.mes.model.StepResult;
//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 java.util.ArrayList;
//import java.util.List;
//
///**
// * @Description : 加工单验证工步【排序】
// * @Author : wangjie
// **/
//@Slf4j
//@Service("mesWorkOrderCheckSortStepService")
//public class MesWorkOrderCheckSortStepService extends BaseStepService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Autowired
// private IMesProductionDispatchContextStepService productionDispatchContextStepService;
//
// @Autowired
// private IMesWorkOrderExtService workOrderExtService;
//
// @Override
// public StepResult execute(StationRequestBean reqBean) {
//
// StationResultBean resultBean = new StationResultBean();
//
// StepResult stepResult = StepResult.getSuccessComplete();
//
// //获取上下文信息
// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//
// //配置错误 抛出异常
// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//
// //存储生产过程上下文对象
// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//
// //获取上下文生产扫/读信息:加工单
// List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
//
// if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中缺失待验证的加工单信息!");
//
// //获取上下文产出零件信息
// List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//
// //清除本次已获取得到的加工单信息
// productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
//
// //非扫描场景 清除历史产出零件信息
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean);
//
// //验证工单的有效性
// List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
// if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//
// //扫描场景下合并历史产出零件信息
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
//
// //保存上下文产出零件信息
// productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
//
// //更新展示组件MODULE_CONTENT内容
// doCacheMoudleContext(reqBean, productionPartContextList);
//
// if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString()));
//
//
//
//
//
//
//
//
//
//
// return stepResult;
//
// }
//
//
//
//
//}
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.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
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.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
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.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderCheckSortStepService")
public class MesWorkOrderCheckSortStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Autowired
private IFsmCommonService fsmCommonService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中缺失待验证的加工单信息!");
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//清除本次已获取得到的加工单信息
productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
//扫描场景下验证是否匹配工艺跳过码, 验证通过则 保存到上下文扫/读信息:主条码, 传送到下个工步 主条码验证工步, 避免后续排序工单的数量不是1的情况下, 扫描工艺跳过码只能在扫描主条码工步中使用
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && matchCraftJumpCode(reqBean, equipVariableCollectContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
//非扫描场景 清除历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean);
//验证工单的有效性
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//扫描场景下合并历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
//非扫描场景 验证是否全部为空腔
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && checkIsAllFinishCode(productionPartContextList))
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s信息全部为空腔!", MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource())));
//保存上下文产出零件信息
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
//更新展示组件MODULE_CONTENT内容
doCacheMoudleContext(reqBean, productionPartContextList);
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString()));
//当前工位使用的设备
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
if (cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0)
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!",
equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size()));
//扫描场景 验证是否全部为空腔
if (!checkIsAllFinishCode(productionPartContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size()));
//删除上下文产出零件信息
productionDispatchContextStepService.deleteProductionPartContext(reqBean);
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描信息全部为空腔!");
}
//验证是否匹配工艺跳过码
private Boolean matchCraftJumpCode(StationRequestBean reqBean, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(getCraftJumpCode(reqBean))) return false;
//保存上下文扫/读信息:主条码, 传送到下个工步 主条码验证工步, 避免后续排序工单的数量不是1的情况下, 扫描工艺跳过码只能在扫描主条码工步中使用
productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
return true;
}
private Boolean checkIsAllFinishCode(List<MesProductionPartContext> productionPartContextList) {
Optional<MesProductionPartContext> optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
return (null != optional && optional.isPresent()) ? false : true;
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList) {
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());
//获取生产工单信息
Map<String, MesWorkOrder> workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList);
if (!CollectionUtils.isEmpty(workOrderNoList)) {
for (String workOrderNo : workOrderNoList) {
if (StringUtils.isEmpty(workOrderNo)) continue;
MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo);
if (null == workOrderDb)
return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo));
if (!MesExtEnumUtil.ORDER_STATUS.checkSortAllowStatus(workOrderDb.getWorkOrderStatus()))
return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus())));
if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode()))
return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode()));
}
}
//封装产出零件信息
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(
new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()) : null)));
return stepResult.obj(filterList);
}
//工艺跳过码
private String getCraftJumpCode(StationRequestBean reqBean) {
Map<String, String> wcpcMap = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean);
return wcpcMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE) ? wcpcMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE) : MesPcnExtConstWords.CRAFT_JUMP_CODE;
}
private void doCacheMoudleContext(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
}
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
List<List<StationKvBean>> dataList = new ArrayList<>();
List<MesProductionPartContext> orderList = filterProductionPartContext(productionPartContextList, true);
List<MesProductionPartContext> finishCodeList = filterProductionPartContext(productionPartContextList, false);
if (!CollectionUtils.isEmpty(orderList))
orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue()))));
if (!CollectionUtils.isEmpty(finishCodeList))
StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size())));
return dataList;
}
//根据是否空腔搜集数据
private List<MesProductionPartContext> filterProductionPartContext(List<MesProductionPartContext> productionPartContextList, Boolean flag) {
return flag ? productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()) :
productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
}
}

@ -71,8 +71,8 @@ public class MesWorkOrderScanStepService extends BaseStepService {
//如果没有扫描信息, 取手选工单信息, 封装扫/读信息:加工单信息
List<MesEquipVariableCollectContext> equipVariableCollectContextList;
if (!StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, scanInfo);
else equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult);
if (!StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanWorkOrderNoContext(reqBean, stepResult, scanInfo);
else equipVariableCollectContextList = doHandleScanWorkOrderNoContext(reqBean, stepResult);
//扫描信息为空
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描加工单!");
@ -86,7 +86,7 @@ public class MesWorkOrderScanStepService extends BaseStepService {
//封装扫/读信息:加工单信息 (扫描)
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, String scanInfo) {
private List<MesEquipVariableCollectContext> doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult, String scanInfo) {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
@ -102,7 +102,7 @@ public class MesWorkOrderScanStepService extends BaseStepService {
}
//封装扫/读信息:加工单信息 (选择)
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult) {
private List<MesEquipVariableCollectContext> doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult) {
List<StationKvBean> chooseCavityOrder = productionDispatchContextStepService.getFunctionChooseCavityOrderContext(reqBean);

@ -46,4 +46,13 @@ public class MesAssemblyShowContext implements Serializable {
@ApiParam("装配零件状态")
private String assemblyStatusName;
@ApiParam("序号")
private Integer index;
public MesAssemblyShowContext index(Integer index){
this.index = index;
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.MesMouldMultiCavity;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import io.swagger.annotations.ApiParam;
@ -47,6 +48,10 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("模具代码")
private String mouldNo;
//默认否
@ApiParam("是否空腔")
private Integer isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
//根据一模多腔赋值
public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) {
BeanUtils.copyProperties(mouldMultiCavity, this, MesPcnExtConstWords.ID);
@ -63,7 +68,8 @@ public class MesProductionPartContext implements Serializable {
//根据工单信息赋值
public MesProductionPartContext copyPartNo(MesWorkOrder workOrder) {
BeanUtils.copyProperties(workOrder, this);
if (null != workOrder) BeanUtils.copyProperties(workOrder, this);
else this.isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
@ -45,6 +46,10 @@ public class MesProductionPsInContext implements Serializable {
private String craftJumpCode;
//默认否
@ApiParam("是否空腔")
private Integer isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
//默认否
@ApiParam("是否顺序防错")
private Integer isCheckSeq = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
@ -86,7 +91,10 @@ public class MesProductionPsInContext implements Serializable {
}
public MesProductionPsInContext(MesProduceSn produceSn, String productSn) {
if (null == produceSn) this.productSn = productSn;
else BeanUtils.copyProperties(produceSn, this);
if (null != produceSn) BeanUtils.copyProperties(produceSn, this);
else {
if (!StringUtils.isEmpty(productSn)) this.productSn = productSn;
else this.isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
}
}
}

@ -30,7 +30,7 @@ public class MesNcProcessingInputModel {
private MesDefectType person;
@ApiParam("区域代码")
private String areaCode;
private String inventoryLocationCode;
@ApiParam("物料")
private MesPartSap part;

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesDefectWarnConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesLocationConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPartTypePicture;
@ -31,6 +32,9 @@ public class MesPartInspectionViewModel {
@ApiParam("NC-零件检测详情")
private List<MesPartInspectionDetail> partInspectionDetailList;
@ApiParam("缺陷告警配置")
private List<MesDefectWarnConfig> mesDefectWarnConfigList;
@ApiParam("图片")
private MesPartTypePicture partTypePicture;

Loading…
Cancel
Save