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

tags/yfai-pcn-ext-v1.0
administrator 11 months ago
commit 7065db38f2

@ -172,6 +172,32 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文产品加工规则信息集合")
void deleteProdRuleDataContext(StationRequestBean reqBean);
@ApiOperation(value = "获取上下文班次班组信息")
List<StationKvBean> getProdShiftDataContext(StationRequestBean reqBean, String workCenterCode);
@ApiOperation(value = "验证上下文班次班组信息是否存在")
Boolean checkProdShiftDataIsExistContext(StationRequestBean reqBean, String workCenterCode);
@ApiOperation(value = "保存上下文班次班组信息", notes = "[JSON]List<StationKvBean>")
Boolean saveProdShiftDataContext(StationRequestBean reqBean, String workCenterCode, List<StationKvBean> prodShiftDatList);
@ApiOperation(value = "删除上下文班次班组信息")
void deleteProdShiftDataContext(StationRequestBean reqBean, String workCenterCode);
@ApiOperation(value = "获取上下文工位加工数统计信息")
List<StationKvBean> getProductionStatisticsContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文工位加工数统计信息", notes = "[JSON]List<StationKvBean>")
Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List<StationKvBean> prodShiftDatList);
@ApiOperation(value = "删除上下文工位加工数统计信息")
void deleteProductionStatisticsContext(StationRequestBean reqBean);

@ -9,6 +9,7 @@ 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.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesJisShipping;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingList;
@ -23,10 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
@ -353,25 +352,33 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
DdlPackBean orderManagementDetailPackBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> orderManagementDetailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderManagementDetailPackBean);
List<MesShippingOrderManagementDetail> detailList = model.getDetailList();
Map<Long, List<MesShippingOrderManagementDetail>> custInfoSeqMap = detailList.stream().collect(Collectors.groupingBy(MesShippingOrderManagementDetail::getCustInfoSeq));
List<MesProduceSn> produceSnList = new ArrayList<>();
for (MesShippingOrderManagementDetail detail : orderManagementDetailList) {
//根据扫描的条码查询条码是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
if (orderManagement.getIsEnableMemory() == MesCommonConstant.TRUE_INTEGER) {
detail.setBarcode(StringUtil.isEmpty(detail.getBarcode()) ? model.getSn() : detail.getBarcode());
DdlPreparedPack.getStringEqualPack(StringUtil.isEmpty(detail.getBarcode()) ? model.getSn() : detail.getBarcode(), "productSn", packBean);
} else {
List<MesShippingOrderManagementDetail> mesShippingOrderManagementDetails = custInfoSeqMap.get(detail.getCustInfoSeq());
MesShippingOrderManagementDetail managementDetail = mesShippingOrderManagementDetails.get(0);
detail.setBarcode(StringUtil.isEmpty(managementDetail.getBarcode()) ? model.getSn() : detail.getBarcode());
DdlPreparedPack.getStringEqualPack(StringUtil.isEmpty(managementDetail.getBarcode()) ? model.getSn() : detail.getBarcode(), "productSn", packBean);
}
detail.setActualQty(1);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
detail.setBarcode(model.getSn());
ConvertBean.serviceModelUpdate(detail, AuthUtil.getSessionUser().getUserName());
//根据扫描的条码查询条码是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
ConvertBean.serviceModelUpdate(produceSn, AuthUtil.getSessionUser().getUserName());
produceSnList.add(produceSn);
}
//当前发运单明细 需要报工的数据

@ -0,0 +1,110 @@
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
//
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
//import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
//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 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.StringUtils;
//
//import java.util.Map;
//
///**
// * @Description : 展示组件:非排序生产(按钮 临时)
// * @Author :wangjie
// **/
//@Slf4j
//@Service("mesProductionNoSortFunctionModuleService")
//class MesProductionNoSortFunctionModuleService extends BaseModuleService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Override
// public boolean doFunction(StationRequestBean reqBean) {
//
// StationResultBean resultBean = new StationResultBean();
//
// String functionCmd = (String) reqBean.getDataMap().get(MesPcnExtConstWords.FUNCTION_CMD);
// ButtonDynamicModel buttonDynamicModel = !StringUtils.isEmpty(functionCmd) ? JSONObject.parseObject(functionCmd, ButtonDynamicModel.class) : null;
//
// if (null != buttonDynamicModel)
//
//
//
// this.sendMessage(reqBean, resultBean, "后端未获取到业务功能指令!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
//
//
//
//
//
// switch (command) {
// case MesPcnExtConstWords.CMD_WORK_ORDER :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "请选择启动状态的生产工单!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
//
// String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null);
// selectWorkOrderNo = (StringUtils.isEmpty(selectWorkOrderNo) || !selectWorkOrderNo.contains(MesPcnExtConstWords.COLON)) ? selectWorkOrderNo : selectWorkOrderNo.split(MesPcnExtConstWords.COLON)[1];
// if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result;
// reqBean.setForceJumpProcess(true);
// if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) result = true;
// else {
// this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试!", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// break;
// case MesPcnExtConstWords.CMD_BUSI_FLAG :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "请点击业务按钮!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
//
// String curBusiFlag = (String) doHandleBusiFlag(reqBean, 1, null);
// if (!StringUtils.isEmpty(curBusiFlag) && curBusiFlag.equals(value)) return result;
// reqBean.setTriggerAutoFsm(true);
// if (StringUtils.isEmpty(curBusiFlag)) {
// if ((Boolean) doHandleBusiFlag(reqBean, 2, value.toString())) result = true;
// else {
// this.sendMessage(reqBean, null, String.format("业务按钮[%s]缓存失败,请重试!", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// }
// break;
// case MesPcnExtConstWords.CMD_FORCE_CENTER_PASS :
// if (StringUtils.isEmpty(value)) {
// this.sendMessage(reqBean, null, "入参缺少产线强制放行的工步代码!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// String pwd = (String) dataMap.get(MesPcnExtConstWords.PWD);
// if (!jxProduceSnExtService.checkPorceCenterPassPwd(reqBean, pwd)) {
// this.sendMessage(reqBean, null, String.format("产线强制放行验证密码[%s]不正确!", pwd), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// return result;
// }
// reqBean.setForceSpecStepCode(value.toString());
// result = true;
// break;
// default:
// break;
// }
//
// if (!result) this.sendMessage(reqBean, null, "操作太频繁!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
// else {
// //跳过工序
// reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
// reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
// reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
// shippingDispatchService.doSendScanQueueNextExec(reqBean);
// }
// return result;
// }
//
//}

@ -1,50 +0,0 @@
//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
//
//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
//import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
//import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
//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 lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
///**
// * @Description : 展示组件:非排序生产
// * @Author :wangjie
// **/
//@Slf4j
//@Service("mesProductionNoSortModuleService")
//public class MesProductionNoSortModuleServiceBak extends BaseModuleService {
//
// @Autowired
// private IMesProductionProcessContextStepService productionProcessContextStepService;
//
// @Override
// public void init(StationRequestBean reqBean) {
// StationResultBean resultBean = new StationResultBean();
// resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
// resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
// resultBean.setCustomPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_DEFAULT);
// resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
// resultBean.setResultObj(StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean("shiftCode", "班次", "白班"), new StationKvBean("shiftGroup", "班组", "注塑")));
// resultBean.setResultList(productionProcessContextStepService.getModuleContentContext(reqBean));
//
// this.sendMessage(reqBean, resultBean);
// }
//
// @Override
// public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
// init(reqBean);
// return true;
// }
//
//}

@ -37,7 +37,9 @@ public class MesManyCellTriggerTabSwitchStepService extends BaseStepService {
BeanUtils.copyProperties(reqBean, stationRequestBean);
stationRequestBean.setScanInfo(clientInfo);
return execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("多工位页面切换,从[%s]切换到[%s]!", reqBean.getClientInfo(), clientInfo));
return clientInfo.equals(reqBean.getClientInfo()) ?
execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("客户端[%s]监听自动切换页面成功!", reqBean.getClientInfo())) :
execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("多工位页面切换,从客户端[%s]切换到客户端[%s]!", reqBean.getClientInfo(), clientInfo));
}

@ -1,19 +1,20 @@
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.*;
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.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.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 com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -22,7 +23,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -40,7 +41,7 @@ public class MesProductSnCheckStepService extends BaseStepService {
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IFsmCommonService fsmCommonService;
private IMesProduceSnExtService produceSnExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -58,35 +59,86 @@ public class MesProductSnCheckStepService extends BaseStepService {
//存储生产过程上下文对象
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);
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn(
reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "当前上下文中没有需要验证的主条码!");
//搜集主条码值
List<String> productSnList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, true);
//搜集空腔条码
List<String> finishCodeList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, false);
//验证上下文中主条码的有效性
Map<String, MesProduceSn> produceSnMap = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList);
//清除本次已完成验证的主条码信息
productionDispatchContextStepService.deleteScanProductSnContext(reqBean);
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, 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 -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList));
if (!CollectionUtils.isEmpty(finishCodeList)) finishCodeList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList));
//获取进料主条码数据信息
List<MesProductionPsInContext> productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean);
if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext);
//保存进料主条码数据
productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
return CollectionUtils.isEmpty(produceSnMap) ?
execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码[%s]验证条码状态成功!", productSnList)) :
execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码[%s]验证条码状态成功,进料零件主条码即将标记状态[未知]!", productSnList));
}
private List<String> filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean flag) {
return flag ? equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()) :
equipVariableCollectContextList.stream().filter(o -> (null != o && o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
}
return stepResult;
//获取进料主条码数据信息
private Map<String, 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.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o));
}
//获取进料主条码数据信息
private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProduceSn produceSn) {
String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + "; " : 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.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(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCell workCell, Map<String, MesProduceSn> produceSnMap, String productSn, List<MesProductionPsInContext> productionPsInContextList) {
MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(!CollectionUtils.isEmpty(produceSnMap) ? produceSnMap.get(productSn) : null, productSn);
if (!StringUtils.isEmpty(productionPsInContext.getId())) productionPsInContext.isCheckSeq(workCell.getIsCheckSeq()).isCheckCraft(workCell.getIsCheckCraft());
productionPsInContextList.add(productionPsInContext);
}
}

@ -0,0 +1,58 @@
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.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 : wangjie
**/
@Slf4j
@Service("mesProductSnMarkUnkonwStepService")
public class MesProductSnMarkUnkonwStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProduceSnExtService produceSnExtService;
//TODO 更新条码 未知 单独工步
//TODO 装配件工步 判断空腔条码
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
return stepResult;
}
}

@ -104,7 +104,7 @@ public class MesProductSnScanStepService extends BaseStepService {
if (scanedQty.compareTo(needQty) < 0 && StringUtils.isEmpty(scanInfo)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!");
//发送工步内容
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
//验证前期扫描数量是否已超过匹配腔数
checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext);

@ -104,11 +104,11 @@ public class MesSendInitializationCmdStepService extends BaseStepService {
equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfg, equipmentVariable, kepwareFlag);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
if (equipVariableRwResult.getIsSuccessed()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送成功!", cellEquipContext.getEquipmentCode()));
execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:[%s]", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage()));
execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:%s", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage()));
//每失败一次 睡眠
if (i != maxRetryTimes) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);

@ -92,13 +92,13 @@ public class MesSendProcessCmdStepService extends BaseStepService {
MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel()));
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
//保存设备当前一轮工序的发送允许加工指令, 写接口逻辑参考值
if (equipVariableRwResult.getIsSuccessed()) productionDispatchContextStepService.saveSendProcessCmdContext(reqBean, equipmentVariableCfgList.get(0).getValue());
if (!equipVariableRwResult.getIsSuccessed())
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("设备[%s]:允许加工指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())),
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("设备[%s]:允许加工指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送成功!", cellEquipContext.getEquipmentCode()));

@ -23,6 +23,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Description : BUSI
@ -34,6 +35,8 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); }
private String getContextKey(StationRequestBean reqBean, String busiCode) { return new StringJoiner(":").add(reqBean.getOrganizeCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); }
//发送设备质量信息
@Override
public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) {
@ -389,8 +392,52 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT);
}
//获取上下文班次班组信息
@Override
public List<StationKvBean> getProdShiftDataContext(StationRequestBean reqBean, String workCenterCode) {
String prodShiftJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
return !StringUtils.isEmpty(prodShiftJson) ? JSONObject.parseArray(prodShiftJson, StationKvBean.class) : null;
}
//验证上下文班次班组信息是否存在
@Override
public Boolean checkProdShiftDataIsExistContext(StationRequestBean reqBean, String workCenterCode) {
String prodShiftJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
return !StringUtils.isEmpty(prodShiftJson) ? true : false;
}
//保存上下文班次班组信息 [JSON]List<StationKvBean>
@Override
public Boolean saveProdShiftDataContext(StationRequestBean reqBean, String workCenterCode, List<StationKvBean> prodShiftDataList) {
if (CollectionUtils.isEmpty(prodShiftDataList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode, JSONObject.toJSONString(prodShiftDataList));
}
//删除上下文班次班组信息
@Override
public void deleteProdShiftDataContext(StationRequestBean reqBean, String workCenterCode) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode);
}
//获取上下文工位加工数统计信息
@Override
public List<StationKvBean> getProductionStatisticsContext(StationRequestBean reqBean) {
String productionStatisticsJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT);
return !StringUtils.isEmpty(productionStatisticsJson) ? JSONObject.parseArray(productionStatisticsJson, StationKvBean.class) : null;
}
//保存上下文工位加工数统计信息 [JSON]List<StationKvBean>
@Override
public Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List<StationKvBean> productionStatisticsList) {
if (CollectionUtils.isEmpty(productionStatisticsList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT, JSONObject.toJSONString(productionStatisticsList));
}
//删除上下文工位加工数统计信息
@Override
public void deleteProductionStatisticsContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT);
}

@ -71,12 +71,6 @@ public class MesProductionProcessContext implements Serializable {
@ApiParam("设备变量集合信息([Json]List<MesEquipmentVariable>)")
private String equipVariableJson;
@ApiParam("腔组明细信息")
private String cavityGroupDetailJson;
@ApiParam("腔组明细加工参数信息")
private String cavityGroupProdParamJson;
//---------------------- 构造方法 ---------------------------------------

@ -2,8 +2,10 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
@ -63,5 +65,28 @@ public class MesProductionPsInContext implements Serializable {
return this;
}
public MesProductionPsInContext isCheckSeq(Integer isCheckSeq) {
this.isCheckSeq = isCheckSeq;
return this;
}
public MesProductionPsInContext isCheckCraft(Integer isCheckCraft) {
this.isCheckCraft = isCheckCraft;
return this;
}
public MesProductionPsInContext checkSeqResult(Integer checkSeqResult) {
this.checkSeqResult = checkSeqResult;
return this;
}
public MesProductionPsInContext checkCraftResult(Integer checkCraftResult) {
this.checkCraftResult = checkCraftResult;
return this;
}
public MesProductionPsInContext(MesProduceSn produceSn, String productSn) {
if (null == produceSn) this.productSn = productSn;
else BeanUtils.copyProperties(produceSn, this);
}
}

@ -128,7 +128,7 @@ public class MesPcnExtConstWords {
// 读取失败睡眠毫秒数[工步参数]
public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP";
// 读取失败睡眠默认毫秒数
public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 1000L;
public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 500L;
// 最大重试次数[工步参数]
public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES";
// 最大重试次数[工步参数]
@ -141,6 +141,26 @@ public class MesPcnExtConstWords {
// 支持混腔扫描[工位参数]
public static final String CAVITY_NOSORT_CFG = "CAVITY_NOSORT_CFG";
// 工位/工步 参数按钮事件
public static final String FUNCTION_CMD = "FUNCTION_CMD";
// 工位/工步 参数按钮事件值
public static final String FUNCTION_VALUE = "FUNCTION_VALUE";
// 工位参数按钮事件: 跳过工序
public static final String FUNCTION_JUMP_PROCESS = "FUNCTION_JUMP_PROCESS";
// 工位参数按钮事件: 强过状态点(工步集)
public static final String FUNCTION_JUMP_STATE = "FUNCTION_JUMP_STATE";
// 工位参数按钮事件: 重置工位上下文
public static final String FUNCTION_RESET_CELL_CONTEXT = "FUNCTION_RESET_CELL_CONTEXT";
// 工位参数按钮事件: 选择工单
public static final String FUNCTION_CHOOSE_WORK_ORDER = "FUNCTION_CHOOSE_WORK_ORDER";
// 工位参数按钮事件: 切换工位
public static final String FUNCTION_SWITCH_CELL = "FUNCTION_SWITCH_CELL";
// 0
public static final Integer ZERO = 0;
// 1
@ -166,6 +186,8 @@ public class MesPcnExtConstWords {
// 生产过程控制上下文目录名
public static final String PRODUCTION_PROCESS_CONTEXT = "PRODUCTION_PROCESS_CONTEXT";
// 上下文: 班次班组信息
public static final String PROD_SHIFT_DATA_CONTEXT = "PROD_SHIFT_DATA_CONTEXT";
// 上下文: 基础数据
public static final String BASE_DATA_CONTEXT = "BASE_DATA_CONTEXT";
// 上下文: 展示组件数据
@ -198,16 +220,16 @@ public class MesPcnExtConstWords {
public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT";
// 上下文: 产出条码数据信息
public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT";
// 上下文: 加工统计信息
public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT";
/***
* OPC
*/
public static final String OPC_LINK_URL="OPC_LINK_URL";
public static final String VALUE="value";
public static final String CLIENT_HANDLE="clientHandle";
public static final String CHANNEL="channel";
public static final String EQUIPMENT_ID="equipmentId";
@Deprecated
public static final String OPC_WRITE_VARIABLE="/api/OPCService/WriteVariable";
@Deprecated
public static final String OPC_READ_VARIABLE="/api/OPCService/ReadVariable";

Loading…
Cancel
Save