Merge remote-tracking branch 'origin/uat-temp-nht-2506120000-jialiao' into mes-uat-changshu0609-temp-wj-250616-xisu-merge-nht

mes-uat-changshu0609^2
王杰 3 weeks ago
commit 431c38f550

@ -0,0 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel;
public interface IMesEquipmentProductionResultService {
void doCreateEquipmentProductionResult(MesAutoLineInterfaceModel info);
}

@ -0,0 +1,12 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import java.util.List;
public interface IMesRawSnWeightRecordService {
void insertRawRemainWeightRecord(MesProductionPsOutContext productionPsOutContext, MesProductionAssemblyContext context, String organizeCode, String username);
void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList, String organizeCode, String username);
}

@ -21,6 +21,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.config;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.DcsForEquipmentServer;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerAutoLineInterface;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerSPS;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerSPS200;
import org.apache.cxf.Bus;
@ -72,4 +73,11 @@ public class WebServiceConfig {
endpoint.publish("/mes-service-spsEqu200");
return endpoint;
}
@Bean
public Endpoint endpointAutoLineInterface() {
EndpointImpl endpoint = new EndpointImpl(bus, new WebServiceServerAutoLineInterface());
endpoint.publish("/mes-service-autoLineInterface");
return endpoint;
}
}

@ -58,6 +58,8 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
protected MesContainerPackageDetailFeedingRepository packageDetailFeedingRDao;
@Autowired
private MesRawSnWeightRecordRepository rawSnWeightRecordRDao;
private MesContainerPackage getContainerPackage(MesContainerSnBindModel model, String containerSn) {
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(
@ -467,7 +469,7 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService
containerPart.setContainerType(containerType.getContainerType());
containerPart.setContainerPackage(containerPackage);
MesContainerPackageDetail packageDetail = createContainerPackageDetail(model, containerPackage, containerPart, matchResult);
MesContainerPackageDetail packageDetail = createContainerPackageDetail(containerType, model, containerPackage, containerPart, matchResult);
List<MesContainerPackageDetail> combPackageDetails = new ArrayList<>(oldPackageDetails);
if (CollectionUtils.isEmpty(bottomPackageDetails)) {
combPackageDetails.add(packageDetail);
@ -531,11 +533,6 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService
containerPackageRDao.save(containerPackage);
}
if (!CollectionUtils.isEmpty(model.getPackageDetails())) {
// if (containerPackage != null) {
// for (MesContainerPackageDetail packageDetail : model.getPackageDetails()) {
// packageDetail.setPid(containerPackage.getId());
// }
// }
containerPackageDetailRDao.saveAll(model.getPackageDetails());
}
if (!CollectionUtils.isEmpty(model.getBindingList())) {
@ -697,7 +694,7 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService
return containerPackage;
}
private MesContainerPackageDetail createContainerPackageDetail(MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map<String, Object> matchResult) {
private MesContainerPackageDetail createContainerPackageDetail(MesContainerType containerType, MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map<String, Object> matchResult) {
Object qty = matchResult.get(MesPcnExtConstWords.QTY);
Object dataType = matchResult.get(MesPcnExtConstWords.DATA_TYPE);
MesContainerPackageDetail detail = new MesContainerPackageDetail();
@ -715,6 +712,14 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService
detail.setSnStatus(MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_10.getValue());
ConvertBean.serviceModelInitialize(detail, model.getUserName());
if (Objects.equals(containerType.getContainerType(), MesExtEnumUtil.CONTAINER_TYPE.CONTAINER_TYPE_50.getValue())) {
MesRawSnWeightRecord rawSnWeightRecord = rawSnWeightRecordRDao.getByProperty(new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "barCode"},
new Object[]{containerPackage.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), model.getBarCode()});
if (rawSnWeightRecord != null) {
detail.setCreateDatetime(rawSnWeightRecord.getCreateDatetime());
}
}
return detail;
}

@ -0,0 +1,88 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentProductionResultService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
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.MesConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProductionResult;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProductionResultDetail;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.repository.MesConfigRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProductionResultDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProductionResultRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.List;
@Service
public class MesEquipmentProductionResultServiceImpl implements IMesEquipmentProductionResultService {
public static final Logger log = LoggerFactory.getLogger(MesEquipmentProductionResultServiceImpl.class);
@Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private MesConfigRepository configRao;
@Autowired
private MesEquipmentProductionResultRepository resultRDao;
@Autowired
private MesEquipmentProductionResultDetailRepository resultDetailRDao;
@Override
public void doCreateEquipmentProductionResult(MesAutoLineInterfaceModel info) {
String organizeCode = "";
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(MesPcnExtConstWords.CHANG_SHU_AUTO_LINE_INTERFACE,"cfgCode",packBean);
List<MesConfig> configList = configRao.findByHqlWhere(packBean);
for (MesConfig mesConfig : configList) {
if (mesConfig.getCfgKey().equals(MesPcnExtConstWords.CHANG_SHU_ORGANIZE_CODE)){
organizeCode = mesConfig.getCfgValue();
}
}
if (StringUtils.isEmpty(organizeCode)) {
log.error("没有配置表mes_config,cfg_code为CHANG_SHU_AUTO_LINE_INTERFACE,key为CHANG_SHU_ORGANIZE_CODE没有配置");
return;
}
StationRequestBean reqBean = new StationRequestBean(organizeCode, info.getWorkCenterCode(), info.getWorkCellCode(), "webservices");
reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setScanInfo(info.getProductSn());
shippingDispatchService.sendScanQueueNextExec(reqBean);
MesEquipmentProductionResult result = new MesEquipmentProductionResult();
result.setOrganizeCode(organizeCode);
result.setWorkCenterCode(info.getWorkCenterCode());
result.setWorkCellCode(info.getWorkCellCode());
result.setProductSn(info.getProductSn());
result.setQty(info.getQty());
result.setResult(info.getResult());
ConvertBean.serviceModelInitialize(result, "webservices");
resultRDao.insert(result);
if (!CollectionUtils.isEmpty(info.getDetails())) {
for (MesAutoLineInterfaceDetailModel detailModel : info.getDetails()) {
MesEquipmentProductionResultDetail detail = new MesEquipmentProductionResultDetail();
detail.setOrganizeCode(organizeCode);
detail.setResultId(result.getId());
detail.setBarCode(detailModel.getBarCode());
detail.setWorkCellCode(detailModel.getWorkCellCode());
detail.setType(detailModel.getType());
detail.setParamName(detailModel.getParamName());
detail.setParamValue(detailModel.getParamValue());
ConvertBean.serviceModelInitialize(detail, "webservices");
resultDetailRDao.insert(detail);
}
}
}
}

@ -0,0 +1,131 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesRawSnWeightRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
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.*;
import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordLogRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawWeightCfgRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
@Service
public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordService {
@Autowired
private MesRawSnWeightRecordRepository rawSnWeightRecordRDao;
@Autowired
private MesRawWeightCfgRepository rawWeightCfgRDao;
@Autowired
private MesRawMixCfgDetailRepository rawMixCfgDetailRDao;
@Autowired
private IMesPartService partService;
@Autowired
private MesRawSnWeightRecordLogRepository rawSnWeightRecordLogRDao;
@Override
public void insertRawRemainWeightRecord(MesProductionPsOutContext productionPsOutContext, MesProductionAssemblyContext context, String organizeCode, String username) {
MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty(
new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getPartNo(), context.getAssemblyPartNo()});
if (detail == null) {
return;
}
MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getAssemblyPartNo()});
if (weightCfg == null) {
return;
}
double remainQty = getRemainQty(organizeCode, context.getAssemblyPartNo(), context.getAssemblySn());
double weightQty = context.getQty() != null ? context.getQty() : 0;
// 保留两位小数,四舍五入
MathContext mc = new MathContext(8, RoundingMode.HALF_UP);
BigDecimal decimalRemainQty = new BigDecimal(remainQty, mc);
BigDecimal decimalWeight = new BigDecimal(weightQty, mc);
MesRawSnWeightRecord record = new MesRawSnWeightRecord();
record.setOrganizeCode(organizeCode);
record.setBarCode(context.getAssemblySn());
record.setPartNo(context.getAssemblyPartNo());
record.setPartName(context.getAssemblyPartName());
// record.setNetWeight(remainQty - context.getQty());
record.setNetWeight(decimalRemainQty.subtract(decimalWeight).doubleValue());
record.setNetUnit(weightCfg.getNetUnit());
record.setRawType(detail.getRawType());
ConvertBean.serviceModelInitialize(record, username);
rawSnWeightRecordRDao.insert(record);
MesRawSnWeightRecordLog recordLog = new MesRawSnWeightRecordLog();
recordLog.setOrganizeCode(organizeCode);
recordLog.setProductSn(productionPsOutContext.getProductSn());
recordLog.setPartNo(productionPsOutContext.getPartNo());
recordLog.setPartName(productionPsOutContext.getPartName());
recordLog.setAssemblySn(context.getAssemblySn());
recordLog.setAssemblyPartNo(context.getAssemblyPartNo());
recordLog.setAssemblyPartName(context.getAssemblyPartName());
recordLog.setOriginWeight(remainQty);
recordLog.setDeductionWeight(context.getQty());
recordLog.setRemainWeight(record.getNetWeight());
ConvertBean.serviceModelInitialize(recordLog, username);
rawSnWeightRecordLogRDao.insert(recordLog);
}
@Override
public void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList, String organizeCode, String username) {
MesPart mesPart = partService.getMesPartByPartNo(productionPsOutContext.getPartNo(), organizeCode);
if (mesPart == null) {
return;
}
double totalWeight = 0.0;
for (MesProductionAssemblyNosortContext context : productionAssemblyNosortContextList) {
if (Objects.equals(context.getMatchType(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_90.getValue())) {
totalWeight += context.getQty();
}
}
MesRawSnWeightRecord record = new MesRawSnWeightRecord();
record.setOrganizeCode(organizeCode);
record.setBarCode(productionPsOutContext.getProductSn());
record.setPartNo(mesPart.getPartNo());
record.setPartName(mesPart.getPartName());
record.setNetWeight(totalWeight);
record.setNetUnit(mesPart.getWeightUom());
record.setRawType(MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue());
ConvertBean.serviceModelInitialize(record, username);
rawSnWeightRecordRDao.insert(record);
}
private double getRemainQty(String organizeCode, String partNo, String barcode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(barcode, "barCode", ddlPackBean);
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean);
MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(ddlPackBean);
if (record != null) {
return record.getNetWeight();
}
MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), partNo});
if (weightCfg == null) {
return 0.0;
}
return weightCfg.getNetWeight();
}
}

@ -59,6 +59,8 @@ public class MesContainerBindProductSnService extends MesAbstractContainerBindDi
if (Objects.equals(model.getContainerType(), MesExtEnumUtil.CONTAINER_TYPE.CONTAINER_TYPE_50.getValue())) {
Double netWeight = getRawSnWeightQty(organizeCode, barcode);
result.put(MesPcnExtConstWords.QTY, netWeight);
} else {
result.put(MesPcnExtConstWords.QTY, produceSn.getQty());
}
result.put(MesPcnExtConstWords.RESULT, true);
return result;

@ -1,17 +1,36 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
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.apiservice.serviceimpl.step.MesAssemblyShowNosortStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
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.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.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
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.ButtonDynamicModel;
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.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.*;
/**
* @Description :
@ -26,20 +45,211 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService;
private IShippingDispatchService shippingDispatchService;
@Autowired
private IShippingDispatchService shippingDispatchService;
private MesRawMixCfgDetailRepository rawMixCfgDetailRDao;
@Autowired
private MesRawSnWeightRecordRepository rawSnWeightRecordRDao;
@Autowired
private MesRawWeightCfgRepository rawWeightCfgRDao;
@Autowired
private MesAssemblyShowNosortStepService assemblyShowNosortStepService;
@Override
public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//页面渲染数据集
final String organizeCode = reqBean.getOrganizeCode();
StepResult stepResult = StepResult.getSuccessComplete();
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
String.format("生产线[%s]工位[%s]原料调配弹框提交成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()),
String.format("生产线[%s]工位[%s]调配原料数量弹框提交成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
final double inputQty = new Double(buttonDynamicModel.getFunctionValue());
if (inputQty <= 0) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
String.format("输入数量[%s]不能小于等于0", inputQty),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
productionProcessContext.getMessage(),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
"当前不存在产品加工规则信息,请重置工序解决!",
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
boolean bOverCapacity = false;
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
if (doHandleProductionAssemblyContext(organizeCode, workCenter, prodRuleContextList, buttonDynamicModel.getFunctionValue(), stepResult)) {
if (isAllAssemblyMatchRawMix(workCenter, prodRuleContextList)) {
if (!checkRawMixWeight(organizeCode, workCenter, prodRuleContextList, reqBean.getUserInfo())) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
"输入数量超出了容差范围",
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
bOverCapacity = true;
}
}
} else {
bOverCapacity = true;
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
stepResult.getMsg(),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
}
productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList);
if (bOverCapacity) {
assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList);
}
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setButtonCode(buttonDynamicModel.getButtonCode());
reqBean.setStepDialogStatus(true);
shippingDispatchService.sendScanQueueNextExec(reqBean);
return !bOverCapacity;
}
private boolean doHandleProductionAssemblyContext(String organizeCode, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, String qty, StepResult stepResult) {
final double rawWeight = new Double(qty);
stepResult.setCompleted(true);
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) {
continue;
}
MesProductionAssemblyContext findAssemblyContext = null;
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix()) && Objects.equals(productionAssemblyContext.getAssemblyStatus(), MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue())) {
double remainQty = getRemainQty(organizeCode, productionAssemblyContext.getAssemblyPartNo(), productionAssemblyContext.getAssemblySn());
if (rawWeight > remainQty) {
productionAssemblyContext.setIsCheckedRawMix(null);
productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue());
productionAssemblyContext.setAssemblySn(null);
stepResult.setCompleted(false);
stepResult.setMsg(String.format("零件号[%s], 输入数量[%s], 剩余数量[%s]不足!", productionAssemblyContext.getAssemblyPartNo(), rawWeight, remainQty));
} else {
productionAssemblyContext.setQty(rawWeight);
productionAssemblyContext.setIsCheckedRawMix("1");
}
findAssemblyContext = productionAssemblyContext;
break;
}
}
//存在匹配成功的数据
if (findAssemblyContext != null) {
prodRuleContext.assemblyDataJson(productionAssemblyContextList);
return stepResult.isCompleted();
}
}
stepResult.setCompleted(false);
stepResult.setMsg("未匹配到装配原料,请重新扫描装配件原料!");
return false;
}
private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) {
continue;
}
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix())) {
return false;
}
}
}
return true;
}
private boolean checkRawMixWeight(String organizeCode, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, String userName) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) {
continue;
}
List<MesRawMixCfgDetail> rawMixCfgDetailList = rawMixCfgDetailRDao.findByProperty(
new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), prodRuleContext.getOutPartNo()});
if (CollectionUtils.isEmpty(rawMixCfgDetailList)) {
continue;
}
Map<String, Map.Entry<Double, Double>> partWeightPercent = new HashMap<>();
for (MesRawMixCfgDetail rawMixCfgDetail : rawMixCfgDetailList) {
if (StringUtils.isEmpty(rawMixCfgDetail.getPartNo()) || rawMixCfgDetail.getPercent() == null) {
continue;
}
double percent = rawMixCfgDetail.getPercent();
double rangeRate = rawMixCfgDetail.getRangeRate() != null ? rawMixCfgDetail.getRangeRate() : 0.0;
partWeightPercent.put(rawMixCfgDetail.getPartNo(), new AbstractMap.SimpleEntry<>(percent - rangeRate, percent + rangeRate));
}
boolean flag = true;
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
double totalQty = productionAssemblyContextList.stream().mapToDouble(MesProductionAssemblyContext::getQty).sum();
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
Map.Entry<Double, Double> rangeRate = partWeightPercent.get(productionAssemblyContext.getAssemblyPartNo());
if (null == rangeRate) {
continue;
}
double curPercent = productionAssemblyContext.getQty() / totalQty;
curPercent = curPercent * 100;
if (curPercent < rangeRate.getKey() || curPercent > rangeRate.getValue()) {
flag = false;
break;
}
}
if (!flag) {
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
productionAssemblyContext.setIsCheckedRawMix(null);
productionAssemblyContext.setQty(0.0);
productionAssemblyContext.setAssemblySn(null);
productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue());
}
prodRuleContext.assemblyDataJson(productionAssemblyContextList);
return false;
}
prodRuleContext.setEachCavityQty(totalQty);
}
return true;
}
private double getRemainQty(String organizeCode, String partNo, String barcode) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(barcode, "barCode", ddlPackBean);
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean);
MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(ddlPackBean);
if (record != null) {
return record.getNetWeight();
}
MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), partNo});
if (weightCfg == null) {
return 0.0;
}
return weightCfg.getNetWeight();
}
}

@ -0,0 +1,242 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesTimeEfficientCfgMatchService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesRawSnWeightRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
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.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordRepository;
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.*;
/**
* @Description :
* @Author : jason.niu
**/
@Slf4j
@Service("mesAssemblyMatchRawMixStepService")
public class MesAssemblyMatchRawMixStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
@Autowired
private MesAssemblyShowNosortStepService assemblyShowNosortStepService;
@Autowired
private MesProduceSnRepository produceSnRDao;
@Autowired
private IMesTimeEfficientCfgMatchService timeEfficientCfgMatchService;
@Autowired
private MesRawSnWeightRecordRepository rawSnWeightRecordRDao;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
final String organizeCode = reqBean.getOrganizeCode();
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!");
}
//验证是否存在装配件容器匹配
Optional<MesProdRuleContext> optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsMatchRawMix()))).findFirst();
if (!optional.isPresent()) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true,
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "验证每腔不存在装配件原料调配的装配件,默认跳过调配原料装配件!");
}
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
// 是否所有装配件均已扫描过
if (isAllAssemblyMatchRawMix(workCenter, prodRuleContextList)) {
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "调配原料装配成功!");
}
// 扫描内容去除前后空格并且转为大写。
reqBean.trimScanInfo();
//扫描信息置空
String barcode = reqBean.resetScanInfo(reqBean.getScanInfo());
if (StringUtils.isEmpty(barcode)) {
stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描调配原料条码!");
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, prodRuleContextList, barcode);
if (result) {
productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList);
assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList);
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "请输入原料重量!");
}
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), StringUtils.isEmpty(stepResult.getMsg()) ? "当前不存在装配件条码!" : stepResult.getMsg());
}
private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList) {
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) {
continue;
}
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix())) {
return false;
}
}
}
return true;
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList, String barcode) {
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
//没有装配件的条件
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
boolean flag = false;
//遍历装配件清单
LOOP:
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
//已装配
if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblyNosortContext.getMatchType()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblyNosortContext.getMatchType())));
Map<String, Object> result;
// 未维护匹配规则,则按自制件进行校验。
if (StringUtils.isEmpty(productionAssemblyNosortContext.getMatchRule())) {
result = checkProductSnRule(reqBean.getOrganizeCode(), barcode);
} else {
//匹配规则
result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), barcode, productionAssemblyNosortContext);
}
//匹配失败
if (!Objects.equals(result.get(MesPcnExtConstWords.RESULT), true)) {
String msg = (String) result.get(MesPcnExtConstWords.MESSAGE);
stepResult.setMsg(msg);
continue;
}
MesContainerPackageDetailContext containerPackageDetailContext = new MesContainerPackageDetailContext();
containerPackageDetailContext.setPartNo(productionAssemblyNosortContext.getAssemblyPartNo());
containerPackageDetailContext.setBarCode(barcode);
String firstOpenTime = getRawSnWeightRecordFirstOpenTime(reqBean.getOrganizeCode(), barcode);
containerPackageDetailContext.setCreateDatetime(firstOpenTime);
//验证时效性
Map<String, Object> timeEfficientResult = timeEfficientCfgMatchService.checkSnTimelinessContainerMatch(reqBean.getOrganizeCode(), containerPackageDetailContext, productionAssemblyNosortContext.getSourceId());
if (!(Boolean)timeEfficientResult.get(MesPcnExtConstWords.RESULT)) {
String msg = (String) timeEfficientResult.get(MesPcnExtConstWords.MESSAGE);
stepResult.setMsg(msg);
return false;
}
//验证返回result里面是否存在assemblySn,存在特殊的规则会转换成新的条码
String assemblySn = !result.containsKey(MesPcnExtConstWords.ASSEMBLY_SN) ? barcode : (String) result.get(MesPcnExtConstWords.ASSEMBLY_SN);
MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA);
//装配件清单该数据标记已装配 (如果是自制件赋值productSnId)
productionAssemblyNosortContext.assemblyStatus(assemblySn);
if (filter != null) {
productionAssemblyNosortContext.productSnId(filter.getProductSnId());
}
flag = true;
break;
}
//存在匹配成功的数据
if (flag) {
prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList);
return true;
}
}
return false;
}
/**
*
* @param organizeCode
* @param barCode
* @return
*/
private String getRawSnWeightRecordFirstOpenTime(String organizeCode, String barCode) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(barCode, "barCode", packBean);
DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean);
MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(packBean);
return record != null ? record.getCreateDatetime() : TimeTool.getNowTime(true);
}
private Map<String, Object> checkProductSnRule(String organizeCode, String barcode) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, false);
MesProduceSn produceSn = produceSnRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "productSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), barcode});
if (produceSn == null) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】在条码表不存在, 请检查数据!", barcode));
return result;
}
if (!Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) &&
!Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】的条码状态必须为“创建”或“已完成”, 请检查数据!", barcode));
return result;
}
if (!Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) &&
!Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue())) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】的质量状态必须为“合格”或“可疑转正常”, 请检查数据!", barcode));
return result;
}
result.put(MesPcnExtConstWords.RESULT, true);
return result;
}
}

@ -56,6 +56,9 @@ public class MesAssemblySaveStepService extends BaseStepService {
@Autowired
private IMesStationContainerSnExtService stationContainerSnExtService;
@Autowired
private IMesRawSnWeightRecordService rawSnWeightRecordService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -129,12 +132,15 @@ public class MesAssemblySaveStepService extends BaseStepService {
//容器匹配, 一个装配件信息可能对应多条原料条码
if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getValue()) == 0) {
insertMesProductionAssembly80(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList);
} else if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_90.getValue()) == 0) {
insertMesProductionAssembly90(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList);
} else {
//一对一
insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList);
}
}
//写入调配产出物重量记录
rawSnWeightRecordService.insertOutPartNoWeightRecord(productionPsOutContext, productionAssemblyNosortContextList, reqBean.getOrganizeCode(), reqBean.getUserInfo());
}
//保存装配件绑定记录
@ -216,4 +222,13 @@ public class MesAssemblySaveStepService extends BaseStepService {
}
//调配原料, 记录原料的剩余数量及胶水总重量。
private void insertMesProductionAssembly90(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
MesProdRuleContext prodRuleContext, MesProductionPsOutContext productionPsOutContext,
MesProductionAssemblyNosortContext productionAssemblyNosortContext, MesScanMonitorContext scanMonitorContext, List<Long> productSnIdList) {
//保存装配件绑定记录
insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList);
//写入调配原料剩余数量
rawSnWeightRecordService.insertRawRemainWeightRecord(productionPsOutContext, productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo());
}
}

@ -0,0 +1,45 @@
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.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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description : 线
* @Author : jason.niu
**/
@Slf4j
@Service("mesEquipmentLProductionResultStepService")
public class MesEquipmentLProductionResultStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
final String organizeCode = reqBean.getOrganizeCode();
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "收集自动化线生产结果成功!");
}
}

@ -0,0 +1,170 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
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.*;
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.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.hutool.json.JSONUtil;
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.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : jason.niu
**/
@Slf4j
@Service("mesGlueSprayedAmountStepService")
public class MesGlueSprayedAmountStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesEquipmentLogExtService equipmentLogExtService;
@Autowired
private MesEquipmentVariableParamRepository equipVarParamRDao;
@Autowired
private MesRawMixCfgDetailRepository rawMixCfgDetailRDao;
@Autowired
private MesEquipmentVariableParamLogRepository equipVarParamLogRDao;
@Autowired
private MesPartRepository mesPartRDao;
@Autowired
private MesProductionRecordRepository productionRecordRDao;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
final String organizeCode = reqBean.getOrganizeCode();
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!");
}
Map<Integer, List<MesProdRuleContext>> prodRuleContextMap = prodRuleContextList.stream().collect(Collectors.groupingBy(MesProdRuleContext::getForeignKey));
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
Map<Long, String> equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId());
if (CollectionUtils.isEmpty(equipVariableIds)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备ID[%s]未匹配到设备变量参数,请检查数据!", cellEquipContext.getEquipId()));
}
List<MesEquipVariableCollectContext> variableContexts = equipmentLogExtService.getEquipmentLogCollectList(organizeCode, cellEquipContext.getEquipId(), MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue(), new ArrayList<>(equipVariableIds.keySet()));
if (CollectionUtils.isEmpty(variableContexts)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备ID[%s]未获取到设备数据,请检查数据!", cellEquipContext.getEquipId()));
}
Map<String, String> variableMap = new HashMap<>();
for (MesEquipVariableCollectContext context : variableContexts) {
String variableParamType = equipVariableIds.get(context.getEquipVariableId());
if (!StringUtils.isEmpty(variableParamType)) {
variableMap.put(variableParamType, context.getEquipVariableValue());
}
}
//1. 获取上下文中生成的主条码
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
for (MesProductionPsOutContext sn : productionPsOutContextList) {
List<MesProdRuleContext> mesProdRuleContexts = prodRuleContextMap.get(sn.getForeignKey());
MesProdRuleContext prodRuleContext = CollectionUtils.isEmpty(mesProdRuleContexts) ? null : mesProdRuleContexts.get(0);
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) {
stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的加工规则丢失,请配置!", sn.getPartNo()));
}
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
MesEquipmentVariableParamLog paramLog = new MesEquipmentVariableParamLog();
paramLog.setOrganizeCode(reqBean.getOrganizeCode());
paramLog.setPartNo(prodRuleContext.getOutPartNo());
MesPart mesPart = mesPartRDao.getByProperty(new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), prodRuleContext.getOutPartNo()});
if (mesPart != null) {
paramLog.setPartName(mesPart.getPartName());
}
paramLog.setProductSn(sn.getProductSn());
paramLog.setWorkCellCode(reqBean.getWorkCellCode());
paramLog.setWorkCenterCode(reqBean.getWorkCenterCode());
paramLog.setEquipId(cellEquipContext.getEquipId());
paramLog.setEquipmentCode(cellEquipContext.getEquipmentCode());
paramLog.setEquipmentName(cellEquipContext.getEquipmentName());
if (prodRuleContext.getProductionRecordId() != null) {
MesProductionRecord productionRecord = productionRecordRDao.getById(prodRuleContext.getProductionRecordId());
if (productionRecord != null) {
paramLog.setStartDateTime(productionRecord.getStartDateTime());
paramLog.setCompleteDateTime(productionRecord.getCompleteDateTime());
}
}
//遍历装配件清单
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
String assemblyPartNo = productionAssemblyNosortContext.getAssemblyPartNo();
MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty(
new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), prodRuleContext.getOutPartNo(), productionAssemblyNosortContext.getAssemblyPartNo()});
if (detail == null) {
continue;
}
Integer rawType = detail.getRawType();
if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue())) {
paramLog.setGluePartNo(assemblyPartNo);
} else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_20.getValue())) {
paramLog.setCuringPartNo(assemblyPartNo);
} else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_30.getValue())) {
paramLog.setAdhesivePartNo(assemblyPartNo);
} else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_40.getValue())) {
paramLog.setInkPartNo(assemblyPartNo);
} else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_50.getValue())) {
paramLog.setDiluentPartNo(assemblyPartNo);
}
}
paramLog.setParamValue(JSONUtil.toJsonStr(variableMap));
ConvertBean.serviceModelInitialize(paramLog, reqBean.getUserInfo());
equipVarParamLogRDao.insert(paramLog);
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "统计每模自动喷胶量!");
}
// 获取设备变量ID对应的变量参数类型
private Map<Long, String> getEquipmentVariable(String organizeCode, Integer equipId) {
Map<Long, String> result = new HashMap<>();
if (equipId != null) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(equipId, "equipId", packBean);
DdlPreparedPack.getIsNotNull("equipVariableId", packBean);
DdlPreparedPack.getIsNotNull("paramType", packBean);
List<MesEquipmentVariableParam> variableParams = equipVarParamRDao.findByHqlWhere(packBean);
for (MesEquipmentVariableParam param : variableParams) {
result.put(param.getEquipVariableId().longValue(), param.getParamType());
}
}
return result;
}
}

@ -70,6 +70,8 @@ public class MesStationFeedContainerPackageDetailStepService extends BaseStepSer
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
// 扫描内容去除前后空格并且转为大写。
reqBean.trimScanInfo();
//扫描信息置空
String barcode = reqBean.resetScanInfo(reqBean.getScanInfo());
if (StringUtils.isEmpty(barcode)) stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描原料条码!");
@ -134,7 +136,7 @@ public class MesStationFeedContainerPackageDetailStepService extends BaseStepSer
return false;
}
String closeSn = config.getCfgValue();
if (StringUtils.isEmpty(closeSn) || !Objects.equals(closeSn, barcode)) {
if (StringUtils.isEmpty(closeSn) || !Objects.equals(closeSn.toUpperCase(), barcode)) {
return false;
}

@ -165,7 +165,8 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
.craftJumpCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.CRAFT_JUMP_CODE)
.assemblySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)
.assemblyCavitySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE)
.sortSuspiciousCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.SORT_SUSPICIOUS_CODE);
.sortSuspiciousCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.SORT_SUSPICIOUS_CODE)
.containerBindClosePackage((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE)) ? cfgKeyMap.get(MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE);
}
//验证组织模型有效性

@ -0,0 +1,22 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentProductionResultService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace = "http://tempuri.org/services/SyncSPSForEquipmentService")
public class WebServiceServerAutoLineInterface {
public static final Logger log = LoggerFactory.getLogger(WebServiceServerAutoLineInterface.class);
@WebMethod(action = "sendMessage", operationName = "sendMessage")
public void sendMessage(@WebParam(name = "info") MesAutoLineInterfaceModel info) {
IMesEquipmentProductionResultService service = SpringContextsUtil.getBean(IMesEquipmentProductionResultService.class);
service.doCreateEquipmentProductionResult(info);
}
}

@ -57,6 +57,9 @@ public class MesProductionProcessContext implements Serializable {
@ApiParam("排序线可疑码")
private String sortSuspiciousCode;
@ApiParam("工步上料关箱码")
private String containerBindClosePackage;
@ApiParam("生产线信息([Json]MesWorkCenter)")
private String workCenterJson;
@ -162,6 +165,12 @@ public class MesProductionProcessContext implements Serializable {
return this.isNeedCache();
}
//工步上料关箱码
public MesProductionProcessContext containerBindClosePackage(String containerBindClosePackage) {
this.containerBindClosePackage = containerBindClosePackage;
return this.isNeedCache();
}
//---------------------- 生产线对象 ---------------------------------------

@ -0,0 +1,74 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import javax.xml.bind.annotation.XmlElement;
/**
* @author jason
*/
//@Getter
//@Setter
//@NoArgsConstructor // 显式生成无参构造函数(关键)
//@AllArgsConstructor // 同时保留带参构造函数
public class MesAutoLineInterfaceDetailModel {
@ApiParam("类型")
private Integer type;
@ApiParam(value = "工位代码")
private String workCellCode;
@ApiParam(value = "条码")
private String barCode;
@ApiParam(value = "参数值")
private String paramValue;
@ApiParam(value = "参数名")
private String paramName;
@XmlElement(name = "Type")
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
@XmlElement(name = "Location")
public String getWorkCellCode() {
return workCellCode;
}
public void setWorkCellCode(String workCellCode) {
this.workCellCode = workCellCode;
}
@XmlElement(name = "Barcode")
public String getBarCode() {
return barCode;
}
public void setBarCode(String barCode) {
this.barCode = barCode;
}
@XmlElement(name = "ParamValue")
public String getParamValue() {
return paramValue;
}
public void setParamValue(String paramValue) {
this.paramValue = paramValue;
}
@XmlElement(name = "ParamName")
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
}

@ -0,0 +1,90 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
// 必须添加 @XmlRootElement指定 XML 根节点名称
//@XmlRootElement(name = "info")
public class MesAutoLineInterfaceModel {
public MesAutoLineInterfaceModel() {
}
@ApiParam("生产线代码")
private String workCenterCode;
@ApiParam(value = "工位代码")
private String workCellCode;
@ApiParam("零件条码")
private String productSn;
@ApiParam(value = "数量")
private Double qty;
@ApiParam("结果")
private Integer result;
private ArrayList<MesAutoLineInterfaceDetailModel> details = new ArrayList<>();
@XmlElement(name = "AssemblyLine")
public String getWorkCenterCode() {
return workCenterCode;
}
public void setWorkCenterCode(String workCenterCode) {
this.workCenterCode = workCenterCode;
}
@XmlElement(name = "Location")
public String getWorkCellCode() {
return workCellCode;
}
public void setWorkCellCode(String workCellCode) {
this.workCellCode = workCellCode;
}
@XmlElement(name = "Barcode")
public String getProductSn() {
return productSn;
}
public void setProductSn(String productSn) {
this.productSn = productSn;
}
@XmlElement(name = "Qty")
public Double getQty() {
return qty;
}
public void setQty(Double qty) {
this.qty = qty;
}
@XmlElement(name = "Result")
public Integer getResult() {
return result;
}
public void setResult(Integer result) {
this.result = result;
}
@XmlElementWrapper(name = "SubParams") // 包装集合的父节点
@XmlElement(name = "SubParam") // 集合中每个元素的节点名称
public ArrayList<MesAutoLineInterfaceDetailModel> getDetails() {
return details;
}
public void setDetails(ArrayList<MesAutoLineInterfaceDetailModel> details) {
this.details = details;
}
}

@ -463,6 +463,8 @@ public class MesPcnExtConstWords {
public static final String ASSEMBLY_CAVITY_SKIP_CODE = "ASSEMBLY_CAVITY_SKIP_CODE";
// 排序线可疑码
public static final String SORT_SUSPICIOUS_CODE = "SORT_SUSPICIOUS_CODE";
// 工步上料关箱码
public static final String MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE = "MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE";
// 设备代码[工步参数]
public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE";
// 模具号读一模多腔配置[工步参数]
@ -760,8 +762,6 @@ public class MesPcnExtConstWords {
public static final String MATCH_STATION_FEED_SCAN_SN_CONTEXT = "MATCH_STATION_FEED_SCAN_SN_CONTEXT";
// 用于缺料时进行上料扫描上料绑定的容器条码
public static final String MATCH_STATION_FEED_CONTAINER_SN_CONTEXT = "MATCH_STATION_FEED_CONTAINER_SN_CONTEXT";
// 工步上料关箱码
public static final String MATCH_STATION_FEED_CLOSE_PACKAGE = "MATCH_STATION_FEED_CLOSE_PACKAGE";
//OPC_API_PARAM
public static final String OPC_LINK_URL = "OPC_LINK_URL";
@ -976,4 +976,7 @@ public class MesPcnExtConstWords {
//向PLC点位发送用户自定义指令的变量类别
public static final String USER_DEFINED_EQUIP_VARIABLE_CFG_CATEGORY = "USER_DEFINED_EQUIP_VARIABLE_CFG_CATEGORY";
//常熟自动化线接口工厂代码配置
public static final String CHANG_SHU_AUTO_LINE_INTERFACE ="CHANG_SHU_AUTO_LINE_INTERFACE";
public static final String CHANG_SHU_ORGANIZE_CODE ="CHANG_SHU_ORGANIZE_CODE";
}

Loading…
Cancel
Save