forked from I3-YF/i3plus-mes-pcn-yfai
step
parent
d42bba00d2
commit
7f6b9e8ece
@ -1,17 +1,29 @@
|
|||||||
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
||||||
|
|
||||||
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
|
||||||
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface IMesProduceSnExtService {
|
public interface IMesProduceSnExtService {
|
||||||
|
|
||||||
@ApiOperation(value = "根据零件条码查询零件条码信息")
|
@ApiOperation(value = "根据零件条码查询零件条码信息")
|
||||||
List<MesProduceSn> getProduceSnList(String organizeCode, List<String> productSnList);
|
List<MesProduceSn> getProduceSnList(String organizeCode, List<String> productSnList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据零件条码查询零件条码信息")
|
||||||
|
Map<String, List<MesProduceSn>> getProduceSnMap(String organizeCode, List<String> productSnList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据零件条码,生产线,工位查询工位队列信息")
|
||||||
|
List<MesQueueOrder> getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, List<String> productSnList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据零件条码,生产线,工位查询工位队列信息")
|
||||||
|
Map<String, List<MesQueueOrder>> getQueueOrderMap(String organizeCode, String workCenterCode, String workCellCode, List<String> productSnList);
|
||||||
|
|
||||||
@ApiOperation(value = "根据零件条码ID修改条码状态,工位")
|
@ApiOperation(value = "根据零件条码ID修改条码状态,工位")
|
||||||
void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList);
|
void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取生产过程上下文对象接口【BUSI】
|
||||||
|
*/
|
||||||
|
public interface IMesProductionCustomContextStepService {
|
||||||
|
|
||||||
|
@ApiOperation(value = "验证上下文工位加工锁是否存在")
|
||||||
|
Boolean checkProductionLockIsExistContext(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
@ApiOperation(value = "保存上下文加工锁")
|
||||||
|
Boolean saveProductionLockContext(StationRequestBean reqBean, String value);
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除上下文加工锁")
|
||||||
|
void deleteProductionLockContext(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
@ApiOperation(value = "发送设备质量信息")
|
||||||
|
void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext);
|
||||||
|
|
||||||
|
@ApiOperation(value = "存储上个扫描/读取信息")
|
||||||
|
Boolean saveLastScanContext(StationRequestBean reqBean, List<StationKvBean> dataList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取上个扫描/读取信息")
|
||||||
|
List<StationKvBean> getLastScanContext(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
@ApiOperation(value = "发送工步内容")
|
||||||
|
void doSendStepContextMessage(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
@ApiOperation(value = "发送工步内容")
|
||||||
|
void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source);
|
||||||
|
|
||||||
|
@ApiOperation(value = "发送工步内容")
|
||||||
|
void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> resultList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取手动选择的腔数及工单信息上下文")
|
||||||
|
List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
@ApiOperation(value = "保存手动选择的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]")
|
||||||
|
Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除手动选择的腔数及工单信息上下文")
|
||||||
|
void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,146 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
|
||||||
|
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.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 主条码验证工步 【非排序】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductSnCheckNosortStepService")
|
||||||
|
public class MesProductSnCheckNosortStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProduceSnExtService produceSnExtService;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取上下文扫/读信息:主条码
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//没有待验证的主条码, 并且存在已验证过的主条码,默认放行
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean))
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码,且存在已验证主条码信息,当前工步默认放行!");
|
||||||
|
|
||||||
|
//没有待验证的主条码
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码!");
|
||||||
|
|
||||||
|
//清除本次已获取得到的主条码信息
|
||||||
|
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//搜集主条码值
|
||||||
|
List<String> productSnList = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
|
||||||
|
//验证上下文中主条码的有效性
|
||||||
|
List<MesProduceSn> produceSnList = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
|
||||||
|
|
||||||
|
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg()));
|
||||||
|
|
||||||
|
//获取上下文的工位
|
||||||
|
MesWorkCell workCell = productionProcessContext.getWorkCell();
|
||||||
|
|
||||||
|
Map<String, MesProduceSn> produceSnMap = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o));
|
||||||
|
|
||||||
|
//封装 读/扫主条件信息到进料主条码数据信息中
|
||||||
|
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
|
||||||
|
if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(workCell, produceSnMap, o, productionPsInContextList));
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
List<MesProductionPsInContext> productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||||
|
if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext);
|
||||||
|
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("上下文中的主条码%s验证条码状态成功!", productSnList.toString()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
|
||||||
|
return equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
private List<MesProduceSn> checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<String> productSnList) {
|
||||||
|
|
||||||
|
//根据零件条码查询零件条码信息
|
||||||
|
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), productSnList);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(produceSnList)) return null;
|
||||||
|
|
||||||
|
//循环获取进料主条码数据信息
|
||||||
|
produceSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, o));
|
||||||
|
|
||||||
|
return !stepResult.isCompleted() ? null : produceSnList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProduceSn produceSn) {
|
||||||
|
|
||||||
|
String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY;
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSn.getQcStatus())
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus())));
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() < produceSn.getSnStatus() ||
|
||||||
|
(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && (!produceSn.getWorkCenterCode().equals(reqBean.getWorkCenterCode()) || !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode()))))
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus())));
|
||||||
|
|
||||||
|
return stepResult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装 读/扫主条件信息到进料主条码数据信息中
|
||||||
|
private void createProductionPsInContext(MesWorkCell workCell, Map<String, MesProduceSn> produceSnMap, String productSn, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(workCell,
|
||||||
|
(!CollectionUtils.isEmpty(produceSnMap) && !StringUtils.isEmpty(productSn) && produceSnMap.containsKey(productSn)) ? produceSnMap.get(productSn) : null, productSn);
|
||||||
|
|
||||||
|
productionPsInContextList.add(productionPsInContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,175 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
|
||||||
|
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.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 主条码验证工步 【排序】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductSnCheckSortStepService")
|
||||||
|
public class MesProductSnCheckSortStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProduceSnExtService produceSnExtService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取上下文扫/读信息:主条码
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//没有待验证的主条码, 并且存在已验证过的主条码,默认放行
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean))
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码,且存在已验证主条码信息,当前工步默认放行!");
|
||||||
|
|
||||||
|
//没有待验证的主条码
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码!");
|
||||||
|
|
||||||
|
//清除本次已获取得到的主条码信息
|
||||||
|
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//搜集主条码值
|
||||||
|
List<String> productSnList = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
|
||||||
|
//验证上下文中主条码的有效性
|
||||||
|
Map<String, List<MesProduceSn>> produceSnMap = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
|
||||||
|
|
||||||
|
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg()));
|
||||||
|
|
||||||
|
//验证上下文中主条码的工位队列的有效性
|
||||||
|
Map<String, List<MesQueueOrder>> queueOrderMap = checkQueueOrderValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
|
||||||
|
|
||||||
|
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg()));
|
||||||
|
|
||||||
|
//获取上下文的工位
|
||||||
|
MesWorkCell workCell = productionProcessContext.getWorkCell();
|
||||||
|
|
||||||
|
//封装 读/扫主条件信息到进料主条码数据信息中
|
||||||
|
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
|
||||||
|
if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> productionPsInContextList.add(new MesProductionPsInContext(workCell, produceSnMap.get(o).get(0), queueOrderMap.get(o).get(0).getId())));
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
List<MesProductionPsInContext> productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||||
|
if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext);
|
||||||
|
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("上下文中的主条码%s验证条码状态成功!", productSnList.toString()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
|
||||||
|
return equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证上下文中主条码的有效性
|
||||||
|
private Map<String, List<MesProduceSn>> checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<String> productSnList) {
|
||||||
|
|
||||||
|
//根据零件条码查询零件条码信息
|
||||||
|
Map<String, List<MesProduceSn>> produceSnMap = produceSnExtService.getProduceSnMap(reqBean.getOrganizeCode(), productSnList);
|
||||||
|
|
||||||
|
//循环获取进料主条码数据信息
|
||||||
|
productSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, produceSnMap, o));
|
||||||
|
|
||||||
|
return !stepResult.isCompleted() ? null : produceSnMap;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证上下文中主条码的有效性
|
||||||
|
private Map<String, List<MesQueueOrder>> checkQueueOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<String> productSnList) {
|
||||||
|
|
||||||
|
//根据零件条码查询工位队列信息
|
||||||
|
Map<String, List<MesQueueOrder>> queueOrderMap = produceSnExtService.getQueueOrderMap(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productSnList);
|
||||||
|
|
||||||
|
//循环获取进料主条码数据信息
|
||||||
|
productSnList.stream().filter(o -> null != o).forEach(o -> checkQueueOrderValid(reqBean, stepResult, productionProcessContext, queueOrderMap, o));
|
||||||
|
|
||||||
|
return !stepResult.isCompleted() ? null : queueOrderMap;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证上下文中主条码的有效性
|
||||||
|
private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, Map<String, List<MesProduceSn>> produceSnMap, String productSn) {
|
||||||
|
|
||||||
|
String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY;
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(produceSnMap) || !produceSnMap.containsKey(productSn))
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]信息不存在", suffixMsg, productSn));
|
||||||
|
|
||||||
|
if (produceSnMap.get(productSn).size() != 1)
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]信息存在重复", suffixMsg, productSn));
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSnMap.get(productSn).get(0).getQcStatus())
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSnMap.get(productSn).get(0).getQcStatus())));
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() <= produceSnMap.get(productSn).get(0).getSnStatus() || MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSnMap.get(productSn).get(0).getSnStatus())
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSnMap.get(productSn).get(0).getSnStatus())));
|
||||||
|
|
||||||
|
return stepResult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证工位队列有效性
|
||||||
|
private StepResult checkQueueOrderValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, Map<String, List<MesQueueOrder>> queueOrderMap, String productSn) {
|
||||||
|
|
||||||
|
String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY;
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(queueOrderMap) || !queueOrderMap.containsKey(productSn))
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列信息不存在", suffixMsg, productSn));
|
||||||
|
|
||||||
|
if (queueOrderMap.get(productSn).size() != 1)
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列信息存在重复", suffixMsg, productSn));
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrderMap.get(productSn).get(0).getStatus())
|
||||||
|
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列状态[%s]", suffixMsg, productSn, MesExtEnumUtil.QUEUE_ORDER_STATUS.valueOfDescription(queueOrderMap.get(productSn).get(0).getStatus())));
|
||||||
|
|
||||||
|
return stepResult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,261 @@
|
|||||||
|
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.*;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 扫描主条码工步 【非排序】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductSnScanNosortStepService")
|
||||||
|
public class MesProductSnScanNosortStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionCustomContextStepService productionCustomContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IFsmCommonService fsmCommonService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult guide(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionCustomContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//扫描信息置空
|
||||||
|
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
if (!StringUtils.isEmpty(scanInfo)) productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
//获取上下文产出零件信息
|
||||||
|
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||||
|
|
||||||
|
//获取上下文扫/读信息:主条码
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||||
|
|
||||||
|
//验证扫描信息是否属于工艺跳过码
|
||||||
|
Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo);
|
||||||
|
|
||||||
|
//不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据
|
||||||
|
if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList);
|
||||||
|
|
||||||
|
//先判断前期扫描数量
|
||||||
|
Integer scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList);
|
||||||
|
|
||||||
|
//根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量
|
||||||
|
Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipmentContext.getCavity();
|
||||||
|
|
||||||
|
//验证前期扫描数量是否已超过匹配腔数
|
||||||
|
checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext);
|
||||||
|
|
||||||
|
//验证是否支持跳过
|
||||||
|
Boolean isAllowJump = checkIsAllowJump(productionPsInContextList);
|
||||||
|
|
||||||
|
//当前不允许跳过
|
||||||
|
if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo));
|
||||||
|
|
||||||
|
//允许跳过,先更新数据
|
||||||
|
if (isCraftJumpCode && isAllowJump) updateProductionPsInContextList(reqBean, productionPsInContextList, scanInfo);
|
||||||
|
if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo));
|
||||||
|
|
||||||
|
//扫描信息为空 并且 判断当前是否必须要扫描
|
||||||
|
if (StringUtils.isEmpty(scanInfo) && (scanedQty.compareTo(needQty) < 0 || isAllowJump)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!");
|
||||||
|
|
||||||
|
//封装待验证的主条码信息
|
||||||
|
if (!scanInfo.equals(productionProcessContext.getFinishCode())) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, scanInfo, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
//验证是否存在重复主条码
|
||||||
|
if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中存在重复扫描的主条码!", scanInfo));
|
||||||
|
|
||||||
|
//保存上下文扫/读信息:主条码 或者 添加了finishCode后的主条码数据
|
||||||
|
if (!scanInfo.equals(productionProcessContext.getFinishCode())) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
|
||||||
|
else productionPsInContextList = saveProductionPsInContextList(reqBean, productionPsInContextList);
|
||||||
|
|
||||||
|
//前期扫描数量已等于腔数
|
||||||
|
scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList);
|
||||||
|
|
||||||
|
//是否支持混腔扫描[工位参数]
|
||||||
|
String cavityNosortCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG);
|
||||||
|
|
||||||
|
String scanInfoName = !scanInfo.equals(productionProcessContext.getFinishCode()) ? "主条码" : "空腔码";
|
||||||
|
|
||||||
|
if (scanedQty.compareTo(needQty) < 0 && !StringUtils.isEmpty(cavityNosortCfg))
|
||||||
|
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息%s[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfoName, scanInfo, needQty, needQty - equipVariableCollectContextList.size()));
|
||||||
|
|
||||||
|
//扫描场景 验证是否全部为空腔
|
||||||
|
if (!checkIsAllFinishCode(equipVariableCollectContextList, productionPartContextList))
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息%s[%s]%s!", scanInfoName, scanInfo, scanedQty.compareTo(needQty) == 0 ? String.format(",上下文中的主条码个数[%s]已满足腔数", scanedQty) : MesPcnExtConstWords.EMPTY));
|
||||||
|
|
||||||
|
//删除上下文扫/读信息:主条码
|
||||||
|
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
|
||||||
|
//删除进料主条码数据
|
||||||
|
productionDispatchContextStepService.deleteProductionPsInContext(reqBean);
|
||||||
|
|
||||||
|
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描的主条码信息全部为空腔,已清除当前的空腔数据!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer calcScanedQty(List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
return (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
//不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据
|
||||||
|
private List<MesProductionPsInContext> updateProductionPsInContextList(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
Integer sourceSize = productionPsInContextList.size();
|
||||||
|
productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList());
|
||||||
|
if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() == sourceSize) return productionPsInContextList;
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
return productionPsInContextList;
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装无需验证的finishCode空腔数据
|
||||||
|
private List<MesProductionPsInContext> saveProductionPsInContextList(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
if (CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = new ArrayList<>();
|
||||||
|
productionPsInContextList.add(new MesProductionPsInContext().isFinishCode());
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
return productionPsInContextList;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证是否支持跳过
|
||||||
|
private Boolean checkIsAllowJump(List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
Optional<MesProductionPsInContext> optional = CollectionUtils.isEmpty(productionPsInContextList) ? null :
|
||||||
|
productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst();
|
||||||
|
return (null != optional && optional.isPresent()) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更
|
||||||
|
private List<MesProductionPsInContext> updateProductionPsInContextList(StationRequestBean reqBean, List<MesProductionPsInContext> productionPsInContextList, String craftJumpCode) {
|
||||||
|
productionPsInContextList.forEach(o -> {
|
||||||
|
if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) {
|
||||||
|
o.setCraftJumpCode(craftJumpCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
return productionPsInContextList;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息是否属于工艺跳过码
|
||||||
|
private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) {
|
||||||
|
if (StringUtils.isEmpty(scanInfo)) return false;
|
||||||
|
String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE);
|
||||||
|
if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE;
|
||||||
|
return scanInfo.equals(craftJumpCode) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证前期扫描数量是否已超过匹配腔数
|
||||||
|
private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty,
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPartContext> productionPartContextList, MesCellEquipContext cellEquipmentContext) {
|
||||||
|
if (scanedQty.compareTo(needQty) <= 0) return;
|
||||||
|
String message = String.format("请检查相关数据,上下文中的主条码个数[%s]已满足腔数[%s],可重置工序解决!", scanedQty, needQty);
|
||||||
|
this.sendMessage(reqBean, resultBean, message +
|
||||||
|
" --- List<MesEquipVariableCollectContext> --- [" + getJsonMessage(equipVariableCollectContextList) + "]" +
|
||||||
|
" --- List<MesProductionPsInContext> --- [" + getJsonMessage(productionPsInContextList) + "]" +
|
||||||
|
" --- List<MesProductionPartContext> --- [" + getJsonMessage(productionPartContextList) + "]" +
|
||||||
|
" --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipmentContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
|
||||||
|
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//集合判空转JSON
|
||||||
|
private String getJsonMessage(List list) {
|
||||||
|
return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装扫/读信息:主条码信息
|
||||||
|
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, String scanInfo, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>();
|
||||||
|
|
||||||
|
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()));
|
||||||
|
|
||||||
|
return equipVariableCollectContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证是否存在重复主条码
|
||||||
|
private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
|
||||||
|
//扫描条码
|
||||||
|
List<String> filterList1 = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
//已验证条码 剔除finishCode信息
|
||||||
|
List<String> filterList2 = CollectionUtils.isEmpty(productionPsInContextList) ? null :
|
||||||
|
productionPsInContextList.stream().filter(o -> (null != o && !o.getProductSn().equals(productionProcessContext.getFinishCode()))).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<String> filterList = new ArrayList<>();
|
||||||
|
if (!CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1);
|
||||||
|
if (!CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2);
|
||||||
|
|
||||||
|
//验证是否存在重复条码
|
||||||
|
if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证是否全部为空腔
|
||||||
|
private Boolean checkIsAllFinishCode(List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList) {
|
||||||
|
Optional<MesProductionPartContext> optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
|
||||||
|
return ((null != optional && optional.isPresent()) || !CollectionUtils.isEmpty(equipVariableCollectContextList)) ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,153 @@
|
|||||||
|
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.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
|
||||||
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
|
||||||
|
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.impp.framework.boot.util.SpringContextsUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 扫描主条码工步 【排序】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductSnScanSortStepService")
|
||||||
|
public class MesProductSnScanSortStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionCustomContextStepService productionCustomContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IFsmCommonService fsmCommonService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult guide(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionCustomContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取上下文产出零件信息
|
||||||
|
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(productionPartContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中没有产出零件信息!");
|
||||||
|
|
||||||
|
//排序是否需要扫描主条码配置【工步参数】 默认不用配置, 目前排序 工单与条码一对一, 当一对多的时候需要配置
|
||||||
|
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
|
||||||
|
Boolean sortNeedScanPs = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.SORT_NEED_SCAN_PS)) ? true : false;
|
||||||
|
|
||||||
|
//需要扫描主条码配置存在 直接复用 非排序线 扫描主条码工步
|
||||||
|
if (sortNeedScanPs) return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanNosortStepService")).execute(reqBean);
|
||||||
|
|
||||||
|
//获取进料主条码数据信息
|
||||||
|
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
|
||||||
|
|
||||||
|
//保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】
|
||||||
|
if (CollectionUtils.isEmpty(productionPsInContextList)) return saveScanProductSnContextSort(reqBean, resultBean, stepResult, productionPartContextList);
|
||||||
|
|
||||||
|
//获取上下文扫/读信息:主条码 【工艺跳过码场景】
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中没有待验证的主条码信息!");
|
||||||
|
|
||||||
|
//删除上下文扫/读信息:主条码
|
||||||
|
if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
|
||||||
|
|
||||||
|
//验证是否匹配工艺跳过码
|
||||||
|
if (equipVariableCollectContextList.size() != 1 || checkScanInfoMatchCraftJumpCode(reqBean, equipVariableCollectContextList.get(0).getEquipVariableValue()))
|
||||||
|
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前上下文中待验证的主条码%s无效!",
|
||||||
|
equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()));
|
||||||
|
|
||||||
|
//验证是否支持跳过
|
||||||
|
if (!checkIsAllowJump(productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前不支持通过工艺跳过码[%s]执行跳过!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
|
||||||
|
|
||||||
|
return updateProductionPsInContextList(reqBean, resultBean, stepResult, productionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】
|
||||||
|
private StepResult saveScanProductSnContextSort(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProductionPartContext> productionPartContextList) {
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
|
||||||
|
productionPartContextList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o.getWorkOrderNo(), TimeTool.getNowTime(true), o.getMessageSource())));
|
||||||
|
productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
|
||||||
|
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "根据加工单生成待验证主条码信息执行成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息是否属于工艺跳过码
|
||||||
|
private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) {
|
||||||
|
if (StringUtils.isEmpty(scanInfo)) return false;
|
||||||
|
String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE);
|
||||||
|
if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE;
|
||||||
|
return scanInfo.equals(craftJumpCode) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证是否支持跳过
|
||||||
|
private Boolean checkIsAllowJump(List<MesProductionPsInContext> productionPsInContextList) {
|
||||||
|
Optional<MesProductionPsInContext> optional = CollectionUtils.isEmpty(productionPsInContextList) ? null :
|
||||||
|
productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst();
|
||||||
|
return (null != optional && optional.isPresent()) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更
|
||||||
|
private StepResult updateProductionPsInContextList(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProductionPsInContext> productionPsInContextList, String craftJumpCode) {
|
||||||
|
productionPsInContextList.forEach(o -> {
|
||||||
|
if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) {
|
||||||
|
o.setCraftJumpCode(craftJumpCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//保存进料主条码数据
|
||||||
|
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
|
||||||
|
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "已标记当前上下文中工艺防错验证失败的主条码信息!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,143 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringJoiner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 获取生产过程上下文对象接口实现【BUSI】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductionDispatchContextStepService")
|
||||||
|
public class MesProductionCustomContextStepService extends BaseStepService implements IMesProductionCustomContextStepService {
|
||||||
|
|
||||||
|
//发送设备质量信息
|
||||||
|
@Override
|
||||||
|
public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) {
|
||||||
|
StationResultBean resultBean = new StationResultBean()
|
||||||
|
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.QUALITY_MODULE.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.COLOR.getValue()).resultObj(MesExtEnumUtil.EQUIP_LOG_QUALITY.valueOfColor(cellEquipContext.getQuality()));
|
||||||
|
this.sendMessage(reqBean, resultBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
//工位加工锁KEY
|
||||||
|
private String getProductionLockContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT).toString()); }
|
||||||
|
|
||||||
|
//验证上下文工位加工锁是否存在
|
||||||
|
@Override
|
||||||
|
public Boolean checkProductionLockIsExistContext(StationRequestBean reqBean) {
|
||||||
|
String value = getFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean));
|
||||||
|
return !StringUtils.isEmpty(value) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//保存上下文加工锁
|
||||||
|
@Override
|
||||||
|
public Boolean saveProductionLockContext(StationRequestBean reqBean, String value) {
|
||||||
|
return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除上下文加工锁
|
||||||
|
@Override
|
||||||
|
public void deleteProductionLockContext(StationRequestBean reqBean) {
|
||||||
|
deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean));
|
||||||
|
}
|
||||||
|
|
||||||
|
//上个扫描/读取信息KEY
|
||||||
|
private String getLastScanContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.LAST_SCAN_INFO_CONTEXT).toString()); }
|
||||||
|
|
||||||
|
//存储上个扫描/读取信息
|
||||||
|
@Override
|
||||||
|
public Boolean saveLastScanContext(StationRequestBean reqBean, List<StationKvBean> dataList) {
|
||||||
|
return saveFsmBusiData(reqBean.getOrganizeCode(), getLastScanContextKey(reqBean), JSONObject.toJSONString(dataList));
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取上个扫描/读取信息
|
||||||
|
@Override
|
||||||
|
public List<StationKvBean> getLastScanContext(StationRequestBean reqBean) {
|
||||||
|
String lastScanContent = getFsmBusiData(reqBean.getOrganizeCode(), getLastScanContextKey(reqBean));
|
||||||
|
return StringUtils.isEmpty(lastScanContent) ? new ArrayList<>() : JSONObject.parseArray(lastScanContent, StationKvBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
@Override
|
||||||
|
public void doSendStepContextMessage(StationRequestBean reqBean) {
|
||||||
|
sendStepContextMessage(reqBean, getLastScanContext(reqBean));
|
||||||
|
}
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
@Override
|
||||||
|
public void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source) {
|
||||||
|
|
||||||
|
List<StationKvBean> lastScanContext = getLastScanContext(reqBean);
|
||||||
|
|
||||||
|
lastScanContext = StationKvBeanUtil.addStationKvBeanLimix100ThenHalf(lastScanContext, new StationKvBean().name(source.getDescription()).value(scanInfo));
|
||||||
|
|
||||||
|
saveLastScanContext(reqBean, lastScanContext);
|
||||||
|
|
||||||
|
sendStepContextMessage(reqBean, lastScanContext);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
@Override
|
||||||
|
public void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> lastScanContext) {
|
||||||
|
StationResultBean resultBean = new StationResultBean()
|
||||||
|
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.KEY_VALUE.getValue())
|
||||||
|
.resultList(StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(),
|
||||||
|
lastScanContext.size() > 1 ? lastScanContext.get(1).name("上次" + lastScanContext.get(1).getName()).key(MesPcnExtConstWords.LAST_SCAN_INFO) : null,
|
||||||
|
lastScanContext.size() > 0 ? lastScanContext.get(0).name("当前" + lastScanContext.get(0).getName()).key(MesPcnExtConstWords.SCAN_INFO) : null));
|
||||||
|
this.sendMessage(reqBean, resultBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//手选腔数及工单信息KEY
|
||||||
|
private String getChooseCavityOrderContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER).toString()); }
|
||||||
|
|
||||||
|
//获取手动选择的腔数及工单信息上下文
|
||||||
|
@Override
|
||||||
|
public List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
|
||||||
|
String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean));
|
||||||
|
return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//保存手动选择的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]
|
||||||
|
@Override
|
||||||
|
public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList) {
|
||||||
|
if (CollectionUtils.isEmpty(resultList)) return false;
|
||||||
|
return saveFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean), JSONObject.toJSONString(resultList));
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除手动选择的腔数及工单信息上下文
|
||||||
|
@Override
|
||||||
|
public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
|
||||||
|
deleteFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean));
|
||||||
|
}
|
||||||
|
|
||||||
|
//开班信息KEY 【PS:生产线级别】
|
||||||
|
private String getProdShiftContextKey(StationRequestBean reqBean) { return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(reqBean.getWorkCenterCode()).toString(); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue