diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java new file mode 100644 index 0000000..c00d8e0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java @@ -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); +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java new file mode 100644 index 0000000..96c3c1e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java @@ -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 productionAssemblyNosortContextList, String organizeCode, String username); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java index 4f9f813..11e9ed1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java @@ -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; + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java index 881c836..8752bc1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java @@ -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 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 matchResult) { + private MesContainerPackageDetail createContainerPackageDetail(MesContainerType containerType, MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map 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; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java new file mode 100644 index 0000000..d63de98 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java @@ -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 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); + } + } + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java new file mode 100644 index 0000000..74627e8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -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 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(); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java index 273ab31..5ea49e6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java @@ -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; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java index abda7ed..bf8a992 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java @@ -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 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 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 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 prodRuleContextList) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + List 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 prodRuleContextList, String userName) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + List 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> 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 productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + double totalQty = productionAssemblyContextList.stream().mapToDouble(MesProductionAssemblyContext::getQty).sum(); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + Map.Entry 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(); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java new file mode 100644 index 0000000..005526e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java @@ -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 prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!"); + } + + //验证是否存在装配件容器匹配 + Optional 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 prodRuleContextList) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + List 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 prodRuleContextList, String barcode) { + + //遍历产品加工规则 + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + + //没有装配件的条件 + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + + //获取非排序装配件清单 + List 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 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 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 checkProductSnRule(String organizeCode, String barcode) { + Map 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index 5fa7aae..664aae2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -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 productSnIdList) { + //保存装配件绑定记录 + insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); + //写入调配原料剩余数量 + rawSnWeightRecordService.insertRawRemainWeightRecord(productionPsOutContext, productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java new file mode 100644 index 0000000..9ca8c90 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java @@ -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, "收集自动化线生产结果成功!"); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java new file mode 100644 index 0000000..83b17f5 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java @@ -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 prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!"); + } + Map> prodRuleContextMap = prodRuleContextList.stream().collect(Collectors.groupingBy(MesProdRuleContext::getForeignKey)); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + Map equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId()); + if (CollectionUtils.isEmpty(equipVariableIds)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备ID[%s]未匹配到设备变量参数,请检查数据!", cellEquipContext.getEquipId())); + } + List 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 variableMap = new HashMap<>(); + for (MesEquipVariableCollectContext context : variableContexts) { + String variableParamType = equipVariableIds.get(context.getEquipVariableId()); + if (!StringUtils.isEmpty(variableParamType)) { + variableMap.put(variableParamType, context.getEquipVariableValue()); + } + } + + //1. 获取上下文中生成的主条码 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + for (MesProductionPsOutContext sn : productionPsOutContextList) { + List 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 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 getEquipmentVariable(String organizeCode, Integer equipId) { + Map 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 variableParams = equipVarParamRDao.findByHqlWhere(packBean); + for (MesEquipmentVariableParam param : variableParams) { + result.put(param.getEquipVariableId().longValue(), param.getParamType()); + } + } + return result; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java index b1ce645..3fcb2b4 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java @@ -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; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 634bb25..e6da48b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -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); } //验证组织模型有效性 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java new file mode 100644 index 0000000..ed35bbb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java @@ -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); + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java index c14ea3e..2ef2efe 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java @@ -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(); + } + //---------------------- 生产线对象 --------------------------------------- diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java new file mode 100644 index 0000000..e9ca13b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java @@ -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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java new file mode 100644 index 0000000..645b6b5 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java @@ -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 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 getDetails() { + return details; + } + + public void setDetails(ArrayList details) { + this.details = details; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 0ddcc28..c9cface 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -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"; }