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

tags/yfai-pcn-ext-v1.0
微笑着面对明天 11 months ago
commit 0a2bc86618

@ -27,5 +27,10 @@ public interface IMesAssemblyExtService {
@ApiOperation(value = "获取非排序装配件配置信息")
List<MesAssemblyNosortCfg> getAssemblyNosortCfgList(String organizeCode, Long pid);
@ApiOperation(value = "获取设备的装配件规则清单")
List<MesAssemblyNosortCfg> getAssemblyNosortCfgList(String organizeCode, String equipmentCode);
@ApiOperation(value = "获取设备的装配件规则清单")
List<MesProductionAssemblyNosortContext> getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode);
}

@ -21,7 +21,7 @@ public interface IMesEquipmentLogExtService {
void updateEquipmentLogList(String organizeCode, Integer equipId, List<Long> equipVariableIdList);
@ApiOperation(value = "获取设备数据变量对应的采集数据")
MesEquipLogDispatchContext doHandleEquipmentLogList(MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, List<MesEquipmentVariableCfg> equipmentVariableCfgList);
MesEquipLogDispatchContext doHandleEquipmentLogList(MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, List<MesEquipmentVariableCfg> equipmentVariableCfgList, Boolean isResetEquipVariable);
@ApiOperation(value = "验证设备通信质量")
Boolean checkEquipQuality(Integer quality);

@ -15,8 +15,15 @@ public interface IMesProdRuleCfgExtService {
List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(MesProdRuleContext... prodRuleContext);
@ApiOperation(value = "【非排序线】获取产品加工规则对应的装配件信息")
MesProdRuleContext getProdRuleContext(MesProdRuleContext prodRuleContext);
MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】")
MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单)")
MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext);
@ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】")
MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id);
}

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
@ -24,9 +25,6 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】")
Boolean saveProductionProcessContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "删除生产过程上下文对象")
void deleteProductionProcessContext(StationRequestBean reqBean);
@ApiOperation(value = "获取生产过程上下文对象")
MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean);
@ -97,4 +95,11 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "验证设备数据变量信息是否为空")
MesProductionProcessContext checkIsEmptyEquipmentVariableList(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE production, List<String> categoryLevelTwoList);
@ApiOperation(value = "查询工位设备装配件规则信息")
List<MesProductionAssemblyNosortContext> findAssemblyNosortCfgList(StationRequestBean reqBean);
@ApiOperation(value = "存储设备的装配件清单")
Boolean saveAssemblyNosortCfgContext(StationRequestBean reqBean, List<MesProductionAssemblyNosortContext> assemblyNosortCfgList);
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortConte
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
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.MesAssemblyNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
@ -125,6 +126,29 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
return assemblyNosortCfgRepository.findByHqlWhere(packBean);
}
@Override
public List<MesAssemblyNosortCfg> getAssemblyNosortCfgList(String organizeCode, String equipmentCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null;
return assemblyNosortCfgRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode});
}
@Override
public List<MesProductionAssemblyNosortContext> getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null;
List<MesAssemblyNosortCfg> assemblyNosortCfgList = getAssemblyNosortCfgList(organizeCode, equipmentCode);
if (CollectionUtils.isEmpty(assemblyNosortCfgList)) return null;
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = new ArrayList<>();
assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(new MesProductionAssemblyNosortContext().copy(o)));
return productionAssemblyNosortContextList;
}
//剔除解绑的数据
private List<MesProductionAssembly> filterProductionAssemblyList(List<MesProductionAssembly> productionAssemblyList) {
return CollectionUtils.isEmpty(productionAssemblyList) ? null : productionAssemblyList.stream().filter(o -> (null != o && MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue() != o.getAssemblyStatus())).collect(Collectors.toList());

@ -613,6 +613,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setPartInspectionId(model.getPartInspection().getId());
move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SUSPICIOUS_MOVE.getValue());
move.setProductSn(model.getSn());
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}

@ -477,6 +477,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
move.setPostTime(TimeTool.getTimeShortWithColon());
move.setMoveType(moveType.getValue());
move.setPartInspectionId(model.getPartInspection().getId());
move.setProductSn(model.getSn());
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}

@ -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.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.repository.MesProdRuleNoSortCfgRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@ -73,12 +74,36 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
//【非排序线】获取产品加工规则对应的装配件信息
@Override
public MesProdRuleContext getProdRuleContext(MesProdRuleContext prodRuleContext) {
public MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext) {
//获取非排序装配件配置信息
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == prodRuleContext.getIsHasBind()) prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblyNosortContextList(prodRuleContext));
return prodRuleContext;
}
//【非排序线】获取产品加工规则 【根据PID获取】
@Override
public MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext) {
if (StringUtils.isEmpty(prodRuleContext.getOrganizeCode()) || StringUtils.isEmpty(prodRuleContext.getPid())) return null;
MesProdRuleNosortCfg prodRuleNosortCfg = getProdRuleNosortCfg(prodRuleContext.getOrganizeCode(), prodRuleContext.getPid());
if (null == prodRuleNosortCfg) return null;
BeanUtils.copyProperties(prodRuleNosortCfg, prodRuleContext);
return prodRuleContext;
}
@Override
public MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null;
return prodRuleNoSortCfgRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ID},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id});
}
//【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单)
@Override
public MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext) {

@ -4,25 +4,30 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnPrintService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineDetailsRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
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.Objects;
import java.util.stream.Collectors;
@ -58,6 +63,9 @@ public class MesProduceSnPrintServiceImpl implements IMesProduceSnPrintService {
@Autowired
private IMesTemplateService mesTemplateService;
@Autowired
private MesCustomerPartRepository mesCustomerPartRDao;
@Override
public MesProduceSnPrintModel findMesPackingDefine(MesProduceSnPrintModel mesProduceSnPrintModel) {
//查询SAP下发物料信息
@ -91,36 +99,95 @@ public class MesProduceSnPrintServiceImpl implements IMesProduceSnPrintService {
@Override
public MesProduceSnPrintModel doPrint(MesProduceSnPrintModel mesProduceSnPrintModel) {
String organizeName = AuthUtil.getOrganize().getName();
//物料信息
MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), mesProduceSnPrintModel.getOrganizeCode());
//条码生成
if (StringUtils.isEmpty(mesProduceSnPrintModel.getProductSn())) {
ValidatorBean.checkNotNull(mesProduceSnPrintModel.getSnRule(), "条码规则不能为空");
ValidatorBean.checkNotNull(mesProduceSnPrintModel.getPrintTemplate(), "打印模板不能为空");
//生成条码
List<String> snList = getStringList(mesProduceSnPrintModel);
for (String sn : snList) {
mesProduceSnPrintModel.getMesProduceSnList().add(generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(),mesProduceSnPrintModel.getQty()));
//流水码
List<String> resultList = getStringList(mesProduceSnPrintModel);
//条码模板
StringBuilder template = getTemplate(mesProduceSnPrintModel);
List<MesProduceSn> mesMesProduceSnList = new ArrayList<>();
for (String no : resultList) {
String reportSn = no;
if (MesPcnEnumUtil.PRINT_TEMPLATE.GQXNY.getCode().equals(mesProduceSnPrintModel.getPrintTemplate())) {
no = no.replace(MesPcnEnumUtil.PRINT_TEMPLATE.GQXNY.getValue(), "");
reportSn = template.toString().replace("serialNo", no);
}
//保存条码信息
MesProduceSn produceSn = generateMesProduceSn(mesPart, reportSn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty());
mesMesProduceSnList.add(produceSn);
//封装打印信息
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, no, mesProduceSnPrintModel.getCustPartNo(),organizeName));
}
mesProduceSnRDao.saveAll(mesProduceSnPrintModel.getMesProduceSnList());
mesProduceSnRDao.saveAll(mesMesProduceSnList);
//条码补打
} else {
ValidatorBean.checkNotNull(mesPart.getProductLabelTemplate(), "打印模板不能为空");
mesProduceSnPrintModel.setPrintTemplate(mesPart.getProductLabelTemplate());
mesProduceSnPrintModel.getMesProduceSnList().add(findMesProduceSn(mesProduceSnPrintModel));
MesProduceSn mesProduceSn = findMesProduceSn(mesProduceSnPrintModel);
String no = "";
String custPartNo = "";
if (MesPcnEnumUtil.PRINT_TEMPLATE.GQXNY.getCode().equals(mesProduceSnPrintModel.getPrintTemplate())
&& !Objects.isNull(mesProduceSn.getProductSn())
&& mesProduceSn.getProductSn().length() >= 40) {
//获取客户零件号
custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo();
no = mesProduceSn.getProductSn().substring(36, 40);
}
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(mesProduceSn, no,custPartNo ,organizeName));
}
//获取打印模板信息
mesProduceSnPrintModel.setMesLabelTemplate(mesTemplateService.getMesLabelTemplate(mesProduceSnPrintModel.getPrintTemplate()));
return mesProduceSnPrintModel;
}
private StringBuilder getTemplate(MesProduceSnPrintModel mesProduceSnPrintModel) {
StringBuilder template = new StringBuilder();
//广乘 GQXNY.btw
if (MesPcnEnumUtil.PRINT_TEMPLATE.GQXNY.getCode().equals(mesProduceSnPrintModel.getPrintTemplate())) {
//获取客户零件号
MesCustomerPart mesCustomerPart = getMesCustomerPart(mesProduceSnPrintModel);
mesProduceSnPrintModel.setCustPartNo(mesCustomerPart.getCustPartNo());
//零件号17+扩展位2+供应商代码7+扩展位3+产线1+年月日6位+流水号4+扩展位4+"+"
template.append(stringFormat(mesCustomerPart.getCustPartNo(), 17)).append("00").append(stringFormat("VD501", 7)).append("000").append("1").append(TimeTool.getNowTime("yyMMdd")).append("serialNo").append("0000").append("+");
}
return template;
}
private MesProduceSnPrintDataModel getModel(MesProduceSn produceSn, String no,String custPartNo, String factoryName) {
MesProduceSnPrintDataModel mesProduceSnPrintDataModel = new MesProduceSnPrintDataModel();
mesProduceSnPrintDataModel.setFactoryName(factoryName);
mesProduceSnPrintDataModel.setPartNo(produceSn.getPartNo());
mesProduceSnPrintDataModel.setPartName(produceSn.getPartName());
mesProduceSnPrintDataModel.setNo(no);
mesProduceSnPrintDataModel.setBarcode(produceSn.getProductSn());
mesProduceSnPrintDataModel.setCustPartNo(custPartNo);
mesProduceSnPrintDataModel.setProductDate(TimeTool.getDateTimeShort());
return mesProduceSnPrintDataModel;
}
private List<String> getStringList(MesProduceSnPrintModel mesProduceSnPrintModel) {
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(mesProduceSnPrintModel.getSnRule());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getOrganizeCode(), mesProduceSnPrintModel.getPrintQty()).getResultList();
return resultList;
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName,Double qty) {
private MesCustomerPart getMesCustomerPart(MesProduceSnPrintModel mesProduceSnPrintModel) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getPartNo(), "erpPartNo", ddlPackBean);
MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesCustomerPart)) {
MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", mesProduceSnPrintModel.getPartNo());
}
return mesCustomerPart;
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName, Double qty) {
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setSerialNumber(snowflakeIdMaker.nextId() + "");
mesProduceSn.setProductSn(sn);
@ -140,4 +207,17 @@ public class MesProduceSnPrintServiceImpl implements IMesProduceSnPrintService {
ConvertBean.serviceModelInitialize(mesProduceSn, userName);
return mesProduceSn;
}
private String stringFormat(String data, Integer length) {
//数据长途大于填充位数直接返回
if (data.length() >= length) {
return data;
}
StringBuilder dataBuffer = new StringBuilder();
dataBuffer.append(data);
for (int i = 0; i < length - data.length(); i++) {
dataBuffer.append('*');
}
return dataBuffer.toString();
}
}

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesJisShippingService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesSortShippingCheckService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
@ -375,6 +376,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if(Objects.isNull(produceSn)){
MesPcnException.throwFlowException("【%s】此产品条码不存在请检查数据", detail.getBarcode());
}
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
ConvertBean.serviceModelUpdate(produceSn, AuthUtil.getSessionUser().getUserName());

@ -68,7 +68,7 @@ public class MesEquipmentLogExtService implements IMesEquipmentLogExtService {
}
@Override
public MesEquipLogDispatchContext doHandleEquipmentLogList(MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, List<MesEquipmentVariableCfg> equipmentVariableCfgList) {
public MesEquipLogDispatchContext doHandleEquipmentLogList(MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, List<MesEquipmentVariableCfg> equipmentVariableCfgList, Boolean isResetEquipVariable) {
MesEquipLogDispatchContext equipLogDispatchContext = new MesEquipLogDispatchContext(cellEquipContext.getOrganizeCode());
@ -83,8 +83,11 @@ public class MesEquipmentLogExtService implements IMesEquipmentLogExtService {
Map<Long, MesEquipmentLog> needNewValue2Collect = getEquipmentLog(equipLogDispatchContext, cellEquipContext, collectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue());
Map<Long, MesEquipmentLog> unNeedNewValue2Collect = getEquipmentLog(equipLogDispatchContext, cellEquipContext, collectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue());
//修改常变值配置对应的设备ID分表的采集数据的状态为1
if (!CollectionUtils.isEmpty(needNewValue2Collect) && checkEquipQuality(cellEquipContext.getQuality())) updateEquipmentLogList(cellEquipContext.getOrganizeCode(), cellEquipContext.getEquipId(), new ArrayList<>(needNewValue2Collect.keySet()));
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态 【修改常变值配置对应的设备ID分表的采集数据的状态为1】 【isResetEquipVariable = false 标记需要修改的设备数据变量ID, 后续匹配成功后再调用updateEquipmentLogList进行修改】
if (!CollectionUtils.isEmpty(needNewValue2Collect) && checkEquipQuality(cellEquipContext.getQuality())) {
if (isResetEquipVariable) updateEquipmentLogList(cellEquipContext.getOrganizeCode(), cellEquipContext.getEquipId(), new ArrayList<>(needNewValue2Collect.keySet()));
else equipLogDispatchContext.resetEquipVariableIdList(new ArrayList<>(needNewValue2Collect.keySet()));
}
String equipVariableReadtime = TimeTool.getNowTime(true);
for (MesEquipVariableCfgCollectContext equipVariableCfgCollectContext : collectContextList) {

@ -0,0 +1,217 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
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.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
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;
import java.util.stream.Stream;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblyGeneratePartNoStepService")
public class MesAssemblyGeneratePartNoStepService extends BaseStepService {
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
@Autowired
private MesAssemblyShowNosortStepService assemblyShowNosortStepService;
@Autowired
private IMesAssemblyExtService assemblyExtService;
@Autowired
private IMesProdRuleCfgExtService prodRuleCfgExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete().nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
if (productionDispatchContextStepService.checkProdRuleDataIsExistContext(reqBean)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中存在非排序加工规则数据,不支持执行当前工步,请重置工序!");
if (productionDispatchContextStepService.checkProductionPartIsExistContext(reqBean)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中存在产出零件数据,不支持执行当前工步,请重置工序!");
if (productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中存在进料主条码数据,不支持执行当前工步,请重置工序!");
//获取上下文生产扫/读信息:装配件条码
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中不存在装配件条码!");
//删除上下文扫/读信息:装配件条码
productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//未知腔数配置【工位参数】, 不验证装配件条码的个数
String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG);
//非未知腔数,验证装配件条码个数是否匹配 腔数*每腔个数
if (StringUtils.isEmpty(cavityUnknownCfg) && equipVariableCollectContextList.size() != cellEquipContext.getCavity() * cellEquipContext.getBindQty())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前上下文中装配件条码个数[%s]不满足腔数[%s]每腔个数[%s]配置!", equipVariableCollectContextList.size(), cellEquipContext.getCavity(), cellEquipContext.getBindQty()));
//获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组
Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext);
//删除上下文扫/读信息:装配件条码
productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
//生成零件号业务处理
List<MesProdRuleContext> prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, cavityUnknownCfg, assemblyNosortCfgMap, equipVariableCollectContextList);
//搜集装配件条码
String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString();
//判断是否存在未消费的装配件条码
Optional<MesEquipVariableCollectContext> optional = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
if (CollectionUtils.isEmpty(prodRuleContextList) || (null != optional && optional.isPresent()))
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("上下文中的装配件条码%s匹配失败!", assemblySn));
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(null), String.format("上下文中的装配件条码%s匹配成功!", assemblySn));
}
//获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组
private Map<Long, List<MesProductionAssemblyNosortContext>> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) {
//查询工位设备装配件规则信息
List<MesProductionAssemblyNosortContext> assemblyNosortCfgList = productionProcessContextStepService.findAssemblyNosortCfgList(reqBean);
//获取设备的装配件规则清单
if (CollectionUtils.isEmpty(assemblyNosortCfgList) || !assemblyNosortCfgList.get(0).getEquipmentCode().equals(cellEquipContext.getEquipmentCode())) {
assemblyNosortCfgList = assemblyExtService.getProductionAssemblyNosortContextList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode());
if (CollectionUtils.isEmpty(assemblyNosortCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean,
String.format("生产线[%s]工位[%s]设备[%s]未维护含有装配件规则信息的非排序加工规则信息", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode()));
//存储设备的装配件清单
productionProcessContextStepService.saveAssemblyNosortCfgContext(reqBean, assemblyNosortCfgList);
}
//根据非排序加工规则ID分组
return assemblyNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).collect(Collectors.groupingBy(MesProductionAssemblyNosortContext::getPid));
}
//生成零件号业务处理
private List<MesProdRuleContext> doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, String cavityUnknownCfg, Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
Integer foreignKey = 0;
List<MesProdRuleContext> prodRuleContextList = null;
//遍历非排序加工规则ID
for (Map.Entry<Long, List<MesProductionAssemblyNosortContext>> entry : assemblyNosortCfgMap.entrySet()) {
if (null == entry) continue;
//判断是否存在未消费的装配件条码
Optional<MesEquipVariableCollectContext> optional = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) break;
//剔除不扫描/仅目视的数据
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = entry.getValue().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) &&
o.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue()) != 0 && o.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue()) != 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(productionAssemblyNosortContextList)) continue;
//没有未知腔数配置, 剔除装配件规则个数不等于每腔个数的数据
if (StringUtils.isEmpty(cavityUnknownCfg) && cellEquipContext.getBindQty().compareTo(productionAssemblyNosortContextList.size()) != 0) continue;
//遍历非排序加工规则ID对应的装配件规则清单
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
if (null == productionAssemblyNosortContext) continue;
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
//匹配规则
List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>)
numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList()));
//匹配失败
if (CollectionUtils.isEmpty(filterList)) continue;
//装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue());
}
//判断当前装配件规则是否被成功匹配条码
if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break;
}
//判断当前装配件规则清单是否完全匹配剩余未消费的条码
Optional<MesProductionAssemblyNosortContext> optionalRule = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
if (null != optional && !optional.isPresent()) continue;
//验证加工规则是否有效
MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).pid(productionAssemblyNosortContextList.get(0).getPid()));
//根据PID获取非排序加工规则 数据无效
if (null == prodRuleContext) continue;
//装配件条码标记被消费状态
productionAssemblyNosortContextList.forEach(o -> equipVariableCollectContextList.stream().filter(v -> (null != v && v.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && v.getEquipVariableValue().equals(o.getAssemblySn()))).findFirst().get().isConsume());
//加工规则赋值装配件数据
prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList).foreignKey(foreignKey += 1);
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
prodRuleContextList.add(prodRuleContext);
}
return prodRuleContextList;
}
}

@ -5,7 +5,6 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepSer
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -33,9 +32,6 @@ import java.util.stream.Stream;
public class MesAssemblyMatchNosortStepService extends BaseStepService {
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
@ -118,7 +114,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
if (result) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(),
stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("上下文中的装配件条码%s匹配成功!", assemblySn));
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), String.format("上下文中的装配件条码%s匹配失败!", assemblySn));
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), String.format("上下文中的装配件条码%s匹配失败!", assemblySn));
}

@ -117,7 +117,7 @@ public class MesAssemblyReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -127,7 +127,12 @@ public class MesAssemblyReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配读取的装配件的有效性
return matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
return stepResult;
}
@ -151,7 +156,7 @@ public class MesAssemblyReadStepService extends BaseStepService {
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的装配件条码,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//保存设备当前一轮工序待验证的装配件条码信息
productionDispatchContextStepService.saveScanAssemblySnContext(reqBean, equipVariableCollectContextList);

@ -156,7 +156,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
"请检查非排序产品加工规则信息,根据设备[%s]产出零件[%s]进料零件[空]进料零件规则[空]查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo(), CollectionUtils.isEmpty(filterList) ? MesPcnExtConstWords.ZERO : filterList.size()));
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(new MesProdRuleContext(
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(prodRuleNosortCfgList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())));
@ -190,7 +190,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
"请检查非排序产品加工规则信息,根据设备[%s]进料零件条码[%s]查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentCode(), productionPsInContext.getProductSn(), CollectionUtils.isEmpty(filterList) ? MesPcnExtConstWords.ZERO : filterList.size()));
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(new MesProdRuleContext(
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
.copy(prodRuleNosortCfgList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())));
@ -263,7 +263,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
CollectionUtils.isEmpty(innerfilterList) ? MesPcnExtConstWords.ZERO : innerfilterList.size()));
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(new MesProdRuleContext(
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(innerfilterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).productSn(productSn)).foreignKey(productionPartContext.getForeignKey()));

@ -84,7 +84,7 @@ public class MesEquipByPassReadStepService extends BaseStepService {
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, true);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//匹配BYPASS有效性

@ -116,7 +116,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -126,12 +126,12 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//验证头道模具号的有效性
return checkFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
return doCheckFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
//验证头道模具号的有效性
private StepResult checkFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
private StepResult doCheckFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
@ -144,7 +144,10 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
//默认只需要配置一个点位
String firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue();

@ -110,7 +110,7 @@ public class MesMouldNoReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -120,7 +120,7 @@ public class MesMouldNoReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//验证模具号的有效性
checkMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
doCheckMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//保存设备当前一轮工序的模具号
if (null != stepResult.getObj()) productionDispatchContextStepService.saveMouldNoContext(reqBean, (MesEquipVariableCollectContext) stepResult.getObj());
@ -129,7 +129,7 @@ public class MesMouldNoReadStepService extends BaseStepService {
}
private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
private StepResult doCheckMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//模具号读一模多腔配置[工步参数]
String isReadMultiCavityCfg = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.READ_MULTI_CAVITY_CFG)) ? stepParamMap.get().get(MesPcnExtConstWords.READ_MULTI_CAVITY_CFG).getParamValue() : null;
@ -147,10 +147,13 @@ public class MesMouldNoReadStepService extends BaseStepService {
//没有有效的数据: 设置常变值 或者 当前没有头道模具号或生产工单信息
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && (equipLogDispatchContext.getNeedNewValue() || !StringUtils.isEmpty(isReadMultiCavityCfg)))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的模具号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
else if (CollectionUtils.isEmpty(equipVariableCollectContextList)) //非常变值 没有有效的数据 也无需再读
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,接口逻辑设置只读一次,当前读取模具号直接跳过!", cellEquipContext.getEquipmentCode()));
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
//默认只需要配置一个点位
String mouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue();

@ -107,7 +107,7 @@ public class MesProductResultReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -117,7 +117,12 @@ public class MesProductResultReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配加工结果
return matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
return stepResult;
}
@ -164,9 +169,9 @@ public class MesProductResultReadStepService extends BaseStepService {
String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey())));
}
//加工结果匹配失败
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("读取设备[%s]加工结果的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("读取设备[%s]加工结果的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取设备[%s]加工结果,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return stepResult.isCompleted(false);

@ -9,9 +9,11 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate;
import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplateParam;
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.repository.MesLabelTemplateParamRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesLabelTemplateRepository;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
@ -38,14 +40,19 @@ public class MesProductSnPrintStepService extends BaseStepService {
@Autowired
private MesLabelTemplateRepository labelTemplateRao;
@Autowired
private MesLabelTemplateParamRepository labelTemplateParamRao;
@Override
public StepResult execute(StationRequestBean reqBean) {
/**
* List<Map<String,Object>>
* Map<String,Object>
* String:
* content :
* data : List<Map<String,Object>> map
* Map<String,Object>
* valueList:List<Map<String,Object>>
* paramInfo:{
* templateContent:xxxx,
* labelTemplateParamList: List<Map<String,Object>>
* }
*
*/
String organizeCode = reqBean.getOrganizeCode();
StationResultBean resultBean = new StationResultBean();
@ -90,15 +97,27 @@ public class MesProductSnPrintStepService extends BaseStepService {
resultData.put(labelTemplate.getTemplateCode(), printData);
}
}
/** Map<String,Object>
* valueList:List<Map<String,Object>>
* paramInfo:{
* templateContent:xxxx,
* labelTemplateParamList: List<Map<String,Object>>
* }
*
*/
List<Map<String, Object>> printData = new ArrayList<>();
Set<String> labelKeys = labelTemplateMap.keySet();
for (String labelKey : labelKeys) {
Map<String,Object> paramInfo = new HashMap<>();
List<Map<String, Object>> dataMaps = resultData.get(labelKey);
MesLabelTemplate mesLabelTemplate = labelTemplateMap.get(labelKey);
String templateContent = mesLabelTemplate.getTemplateContent();
paramInfo.put("templateContent",templateContent);
paramInfo.put("labelTemplateParamList",mesLabelTemplate.getLabelTemplateParamList());
Map<String, Object> data = new HashMap<>();
data.put("templateContent", templateContent);
data.put("data", dataMaps);
data.put("paramInfo", paramInfo);
data.put("valueList", dataMaps);
printData.add(data);
}
//前端接收到busiTyep是customComponent并且 dataType是file类型的消息就需要打印后续消息里的数据一个模板对应多个打印数据
@ -122,6 +141,15 @@ public class MesProductSnPrintStepService extends BaseStepService {
DdlPackBean templatePackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(templateCode, "templateCode", templatePackBean);
List<MesLabelTemplate> mesLabelTemplateList = labelTemplateRao.findByHqlWhere(templatePackBean);
return mesLabelTemplateList.isEmpty() ? null : mesLabelTemplateList.get(0);
MesLabelTemplate mesLabelTemplate = null;
if (!mesLabelTemplateList.isEmpty()){
mesLabelTemplate = mesLabelTemplateList.get(0);
//级联获取labelTemplateParam
DdlPackBean templateParamPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(mesLabelTemplate.getId(), "templateId", templatePackBean);
List<MesLabelTemplateParam> params = labelTemplateParamRao.findByHqlWhere(templateParamPackBean);
mesLabelTemplate.setLabelTemplateParamList(params);
}
return mesLabelTemplate;
}
}

@ -110,7 +110,7 @@ public class MesProductSnReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -120,12 +120,12 @@ public class MesProductSnReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配读取的主条码的有效性
return matchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
return doMatchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
//匹配读取的主条码的有效性
private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
private StepResult doMatchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
@ -138,7 +138,10 @@ public class MesProductSnReadStepService extends BaseStepService {
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的主条码,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
//读取主条码前置验证
checkReadProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList);

@ -112,7 +112,7 @@ public class MesProductionPartNoReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -122,12 +122,12 @@ public class MesProductionPartNoReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//验证产出零件号的有效性
return checkProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
return doCheckProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
}
//验证产出零件号的有效性
private StepResult checkProductionPartNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
private StepResult doCheckProductionPartNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
@ -140,7 +140,10 @@ public class MesProductionPartNoReadStepService extends BaseStepService {
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
//发送工步内容
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));

@ -103,7 +103,7 @@ public class MesReadySignalReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -113,7 +113,12 @@ public class MesReadySignalReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配就绪信号有效性
return matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
return stepResult;
}
@ -127,8 +132,11 @@ public class MesReadySignalReadStepService extends BaseStepService {
//匹配就绪信号有效性
Boolean result = (Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
if (!result) execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("读取设备[%s]就绪信号的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
if (!result) {
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("读取设备[%s]就绪信号的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]就绪信号,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
//匹配成功发送工步内容
productionCustomContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);

@ -107,7 +107,7 @@ public class MesWorkOrderReadStepService extends BaseStepService {
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList, false);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//验证设备通信质量
@ -117,7 +117,12 @@ public class MesWorkOrderReadStepService extends BaseStepService {
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配读取的加工单的有效性
return matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//根据设备ID,设备数据变量ID集合 修改设备ID分表采集数据的状态
equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), cellEquipContext.getEquipId(), equipLogDispatchContext.getResetEquipVariableIdList());
return stepResult;
}
@ -135,7 +140,7 @@ public class MesWorkOrderReadStepService extends BaseStepService {
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的加工单,持续监听中...", cellEquipContext.getEquipmentCode())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//保存设备当前一轮工序的待验证的加工单信息
productionDispatchContextStepService.saveScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);

@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
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.IFsmRouteDataService;
@ -57,9 +58,6 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.BASE_DATA_CONTEXT, JSONObject.toJSONString(productionProcessContext));
}
@Override
public void deleteProductionProcessContext(StationRequestBean reqBean) { deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean)); }
//获取生产过程上下文对象
@Override
public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) {
@ -331,6 +329,17 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return productionProcessContext.message(String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), variableType.getDescription(), categoryLevelTwoList.toString()));
}
//查询工位设备装配件规则信息
@Override
public List<MesProductionAssemblyNosortContext> findAssemblyNosortCfgList(StationRequestBean reqBean) {
String assemblyNosortCfgJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ASSEMBLY_NOSORT_CFG_CONTEXT);
return !StringUtils.isEmpty(assemblyNosortCfgJson) ? JSONObject.parseArray(assemblyNosortCfgJson, MesProductionAssemblyNosortContext.class) : null;
}
//存储设备的装配件清单
@Override
public Boolean saveAssemblyNosortCfgContext(StationRequestBean reqBean, List<MesProductionAssemblyNosortContext> assemblyNosortCfgList) {
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ASSEMBLY_NOSORT_CFG_CONTEXT, JSONObject.toJSONString(assemblyNosortCfgList));
}
}

@ -26,6 +26,9 @@ public class MesEquipLogDispatchContext implements Serializable {
@ApiParam("数据变量接口逻辑信息集合")
private List<MesEquipVariableCfgCollectContext> equipVariableCfgCollectContextList;
@ApiParam("需要重置设备变量ID集合")
private List<Long> resetEquipVariableIdList;
public MesEquipLogDispatchContext() {}
public MesEquipLogDispatchContext(String organizeCode) {
@ -46,4 +49,10 @@ public class MesEquipLogDispatchContext implements Serializable {
this.equipVariableCfgCollectContextList = equipVariableCfgCollectContextList;
return this;
}
public MesEquipLogDispatchContext resetEquipVariableIdList(List<Long> resetEquipVariableIdList) {
this.resetEquipVariableIdList = resetEquipVariableIdList;
return this;
}
}

@ -228,7 +228,7 @@ public class MesProdRuleContext implements Serializable {
}
//非排序装配件清单
public List<MesProductionAssemblyNosortContext> /**/getNosortAssemblyDataContext() {
public List<MesProductionAssemblyNosortContext> getNosortAssemblyDataContext() {
List<MesProductionAssemblyNosortContext> nosortAssemblyList = !StringUtils.isEmpty(this.assemblyDataJson) ? JSONObject.parseArray(this.assemblyDataJson, MesProductionAssemblyNosortContext.class) : null;
return CollectionUtils.isEmpty(nosortAssemblyList) ? null : nosortAssemblyList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProductionAssemblyNosortContext::getRouteSeq)).collect(Collectors.toList());
}

@ -54,4 +54,13 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
return this;
}
public MesProductionAssemblyNosortContext copy(MesAssemblyNosortCfg assemblyNosortCfg) {
BeanUtils.copyProperties(assemblyNosortCfg, this);
if (StringUtils.isEmpty(this.routeSeq)) this.routeSeq = MesPcnExtConstWords.ZERO;
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue();
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == this.matchType || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == this.matchType)
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
return this;
}
}

@ -62,6 +62,14 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("信息来源")
private Integer messageSource;
@ApiParam("客户订单号【用于发送设备加工参数】")
private String custOrderNo;
@ApiParam("vin号【用于发送设备加工参数】")
private String vinCode;
@ApiParam("工单序号【用于发送设备加工参数】")
private String workOrderSeq;
//根据一模多腔赋值
public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) {

@ -43,6 +43,9 @@ public class MesProductionPsInContext implements Serializable {
@ApiParam("客户条码")
private String custSn;
@ApiParam("零件条码状态【用于发送设备加工参数】")
private Integer snStatus;
@ApiParam("零件号")
private String partNo;

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/20 11:40
* @Modify:
**/
@Data
@NoArgsConstructor
public class MesProduceSnPrintDataModel {
@ApiParam("物料号")
private String partNo;
@ApiParam("物料名称")
private String partName;
@ApiParam("生产厂家名称")
private String factoryName;
@ApiParam("流水号")
private String no;
@ApiParam("二维码")
private String barcode;
@ApiParam("生产日期")
private String productDate;
@ApiParam("供应商代码")
private String supplierCode;
@ApiParam("客户物料号")
private String custPartNo;
}

@ -2,7 +2,6 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@ -52,6 +51,9 @@ public class MesProduceSnPrintModel {
@ApiParam(value = "打印机")
private String printer;
@ApiParam("客户物料号")
private String custPartNo;
@ApiParam(name = "包装定义维护")
List<MesPackingDefine> mesPackingDefineList;
@ -59,7 +61,7 @@ public class MesProduceSnPrintModel {
private MesLabelTemplate mesLabelTemplate;
@ApiParam(name = "产品条码信息")
private List<MesProduceSn> mesProduceSnList = new ArrayList<>();
private List<MesProduceSnPrintDataModel> mesProduceSnPrintDataModelList = new ArrayList<>();
public Double getQty() {
return qty == null || qty <= 0d ? 1d : qty;

@ -240,6 +240,8 @@ public class MesPcnExtConstWords {
// 上下文: 定制数据
public static final String CUSTOM_DATA_CONTEXT = "CUSTOM_DATA_CONTEXT";
// 上下文: 非排序装配件规则信息
public static final String ASSEMBLY_NOSORT_CFG_CONTEXT = "ASSEMBLY_NOSORT_CFG_CONTEXT";
// 生产过程控制工位加工锁
public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT";
// 生产过程控制工位加工锁

Loading…
Cancel
Save