工步上料

uat-temp-nht-2506120000-jialiao
jason 4 weeks ago
parent 619a3d72b5
commit 6c1e758399

@ -271,4 +271,15 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "保存站点用于缺料时进行上料绑定")
void dispatchMatchStationContext(StationRequestBean reqBean, List<MesStation> stationList);
@ApiOperation(value = "获取站点用于缺料时进行上料扫描的条码")
String getMatchStationFeedScanSnContext(StationRequestBean reqBean);
@ApiOperation(value = "保存站点用于缺料时进行上料扫描的条码")
void dispatchMatchStationFeedScanSnContext(StationRequestBean reqBean, String sn);
@ApiOperation(value = "获取站点用于缺料时进行上料绑定的容器条码")
String getMatchStationFeedContainerSnContext(StationRequestBean reqBean);
@ApiOperation(value = "保存站点用于缺料时进行上料绑定的容器条码")
void dispatchMatchStationFeedContainerSnContext(StationRequestBean reqBean, String sn);
}

@ -0,0 +1,88 @@
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.ext.mes.pcn.pojo.model.MesContainerPartsModel;
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.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
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.MesContainerSnPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerSnStationRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerTypePartRepository;
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("mesStationFeedContainerPackageDetailStepService")
public class MesStationFeedContainerPackageDetailStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesContainerSnStationRepository containerSnStationRDao;
@Autowired
private MesContainerTypePartRepository containerTypePartRDao;
@Autowired
private MesContainerSnPartRepository containerSnPartRDao;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
//获取站点用于缺料时进行上料绑定
List<MesStation> stationList = productionDispatchContextStepService.getMatchStationContext(reqBean);
if (CollectionUtils.isEmpty(stationList)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "容器条码扣减装配件时验证设备未关联支持上料的站点");
}
final String organizeCode = reqBean.getOrganizeCode();
String containerSn = productionDispatchContextStepService.getMatchStationFeedScanSnContext(reqBean);
containerSn = "10002325002";
for (MesStation station : stationList) {
List<MesContainerSnStation> containerSnStations = getMesContainerSnStation(organizeCode, station.getStation());
if (CollectionUtils.isEmpty(containerSnStations)) {
continue;
}
for (MesContainerSnStation containerSnStation : containerSnStations) {
}
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "容器条码扣减装配件验证成功!");
}
private List<MesContainerSnStation> getMesContainerSnStation(String organizeCode, String station) {
List<MesContainerSnStation> containerSnStations = containerSnStationRDao.findByProperty(new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_VALID, MesConstWords.IS_DELETED, "station"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), station});
containerSnStations.removeIf(temp -> !Objects.equals(temp.getContainerSn(), temp.getTopContainerSn()));
return containerSnStations;
}
}

@ -0,0 +1,130 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesContainerPackageDetailContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
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.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerPackageDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerPackageRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerSnStationRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
* @Author : jason.niu
**/
@Slf4j
@Service("mesStationFeedContainerSnStepService")
public class MesStationFeedContainerSnStepService extends BaseStepService {
@Autowired
private MesContainerSnStationRepository mesContainerSnStationRepository;
@Autowired
private MesContainerPackageRepository containerPackageRDao;
@Autowired
private MesContainerPackageDetailRepository packageDetailRDao;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工位当前设备信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
}
//获取站点用于缺料时进行上料绑定
List<MesStation> stationList = productionDispatchContextStepService.getMatchStationContext(reqBean);
if (CollectionUtils.isEmpty(stationList)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "容器条码扣减装配件时验证设备未关联支持上料的站点");
}
MesStation station = null;
MesStation mixStation = null;
for (MesStation st : stationList) {
if (Objects.equals(st.getStationType(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_10.getValue()) ||
Objects.equals(st.getStationType(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_20.getValue())) {
station = st;
break;
}
if (mixStation == null && Objects.equals(st.getStationType(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue())) {
mixStation = st;
}
}
if (station == null) {
station = mixStation;
}
if (station == null) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "不存在站点类型为【原料站点】、【装配件站点】、【混料站点】的站点信息!");
}
String containerSn = productionDispatchContextStepService.getMatchStationFeedScanSnContext(reqBean);
final String organizeCode = reqBean.getOrganizeCode();
String topContainerSn = getTopContainerSn(organizeCode, containerSn);
if (!topContainerSn.equals(containerSn)) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("此容器已绑定容器条码【%s】请扫描容器条码【%s】!", containerSn, topContainerSn));
}
//校验容器条码的唯一性
DdlPackBean containerSnStationDdlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(containerSn, "topContainerSn", containerSnStationDdlPackBean);
MesContainerSnStation containerSnStation = mesContainerSnStationRepository.getByProperty(containerSnStationDdlPackBean);
if (containerSnStation != null) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("容器条码【%s】已绑定站点【%s】!", containerSn, containerSnStation.getStation()));
}
checkContainerPackage(reqBean, resultBean, organizeCode, containerSn);
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "容器条码扣减装配件验证成功!");
}
private void checkContainerPackage(StationRequestBean reqBean, StationResultBean resultBean, String organizeCode, String containerSn) {
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_VALID, MesConstWords.IS_DELETED, "containerSn"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), containerSn});
if (containerPackage == null) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("容器条码【%s】未绑定零件!", containerSn));
}
assert containerPackage != null;
if (!Objects.equals(containerPackage.getPackageStatus(), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue())) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("容器条码【%s】未关箱!", containerSn));
}
}
private String getTopContainerSn(String organizeCode, String containerSn) {
MesContainerPackageDetail packageDetail = packageDetailRDao.getByProperty(new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_VALID, MesConstWords.IS_DELETED, "barCode"},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), containerSn});
if (packageDetail != null) {
return getTopContainerSn(organizeCode, packageDetail.getContainerSn());
}
return containerSn;
}
}

@ -0,0 +1,74 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
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.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
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.MesContainerPackageRepository;
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.StringUtils;
import java.util.Objects;
/**
* @Description : //
* @Author : jason.niu
**/
@Slf4j
@Service("mesStationFeedScanSnStepService")
public class MesStationFeedScanSnStepService extends BaseStepService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesConfigService configService;
@Autowired
private MesContainerPackageRepository containerPackageRDao;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//扫描信息置空
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
if (StringUtils.isEmpty(scanInfo)) stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描装配件条码!");
// 判断是否为关箱条码
MesConfig mesConfig = configService.getCfgValueByCode(reqBean.getOrganizeCode(), MesPcnExtConstWords.MATCH_STATION_FEED_CLOSE_PACKAGE);
if (mesConfig != null && Objects.equals(scanInfo, mesConfig.getCfgValue())) {
String containerSn = productionDispatchContextStepService.getMatchStationFeedContainerSnContext(reqBean);
if (StringUtils.isEmpty(containerSn)) {
stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "不存在需要关箱的容器条码!");
}
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_VALID, MesConstWords.IS_DELETED, "containerSn"},
new Object[]{reqBean.getOrganizeCode(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), containerSn});
if (containerPackage == null) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("容器条码【%s】未绑定零件!", containerSn));
}
assert containerPackage != null;
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue());
ConvertBean.serviceModelUpdate(containerPackage, reqBean.getUserInfo());
containerPackageRDao.update(containerPackage);
}
//保存扫描条码用于缺料时进行上料绑定
productionDispatchContextStepService.dispatchMatchStationFeedScanSnContext(reqBean, scanInfo);
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult,
String.format("当前扫描信息装配件条码[%s]", scanInfo));
}
}

@ -410,12 +410,12 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
@Override
public void dispatchContainerSnAtomicity(String organizeCode, List<MesContainerPackageDetailContext> containerSnStationList) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerSnStationList)) return;
containerSnStationList.stream().forEach(o -> {
String key = getContainerSnAtomicityKey(organizeCode, o);
Boolean success = dispatchFsmBusiDataAtomicity(organizeCode, key, o.getQty().toString(), MesPcnEnumUtil.EXPIRE_TIME.DEFAULT.getValue());
if (success) o.remainQty(o.getQty());
else o.remainQty(getFsmBusiData(organizeCode, key));
});
// containerSnStationList.stream().forEach(o -> {
// String key = getContainerSnAtomicityKey(organizeCode, o);
// Boolean success = dispatchFsmBusiDataAtomicity(organizeCode, key, o.getQty().toString(), MesPcnEnumUtil.EXPIRE_TIME.DEFAULT.getValue());
// if (success) o.remainQty(o.getQty());
// else o.remainQty(getFsmBusiData(organizeCode, key));
// });
}
}

@ -616,4 +616,27 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_CONTEXT, JSONObject.toJSONString(stationList));
}
//获取站点用于缺料时进行上料绑定
@Override
public String getMatchStationFeedScanSnContext(StationRequestBean reqBean) {
return getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_SCAN_SN_CONTEXT);
}
//保存站点用于缺料时进行上料绑定
@Override
public void dispatchMatchStationFeedScanSnContext(StationRequestBean reqBean, String sn) {
if (StringUtils.isEmpty(sn)) return;
dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_SCAN_SN_CONTEXT, sn);
}
@Override
public String getMatchStationFeedContainerSnContext(StationRequestBean reqBean) {
return getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_CONTAINER_SN_CONTEXT);
}
@Override
public void dispatchMatchStationFeedContainerSnContext(StationRequestBean reqBean, String sn) {
if (StringUtils.isEmpty(sn)) return;
dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_CONTAINER_SN_CONTEXT, sn);
}
}

@ -744,6 +744,12 @@ public class MesPcnExtConstWords {
public static final String ORDER_QTY_DIALOG_CONTEXT = "ORDER_QTY_DIALOG_CONTEXT";
// 用于缺料时进行上料绑定的站点
public static final String MATCH_STATION_CONTEXT = "MATCH_STATION_CONTEXT";
// 用于缺料时进行上料扫描上料条码
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

Loading…
Cancel
Save