pcn 工步 获取加工结果工步

tags/yfai-pcn-ext-v1.0
王杰 1 year ago
parent 15774bac0a
commit 991ab57dfd

@ -0,0 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import io.swagger.annotations.ApiOperation;
import java.util.List;
public interface IEquipmentExtService {
@ApiOperation(value = "根据生产线代码,工位代码查询工位设备集合")
List<MesCellEquipContext> getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode);
@ApiOperation(value = "根据设备代码,变量类型,二级变量查询设备数据变量集合")
List<MesEquipmentVariable> getEquipmentVariableList(MesCellEquipContext cellEquipmentContext, Integer variableType, List<String> categoryLevelTwoList);
@ApiOperation(value = "根据设备变量配置类型,二级变量查询设备数据变量集合")
List<MesEquipmentVariableCfg> getEquipmentVariableCfgList(MesCellEquipContext cellEquipmentContext, List<String> categoryLevelTwoList);
}

@ -0,0 +1,20 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog;
import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import java.util.List;
public interface IEquipmentLogExtService {
@ApiOperation(value = "根据设备ID 查询设备ID分表所有采集数据")
List<MesEquipmentLog> getEquipmentLogList(String organizeCode, Integer equipId);
@ApiOperation(value = "根据设备ID,是否常变值状态,OPC注册ID集合 查询设备ID分表采集数据")
List<MesEquipmentLog> getEquipmentLogList(String organizeCode, Integer equipId, Integer needNewValue, List<Integer> clientHandleList);
@ApiOperation(value = "根据设备ID,OPC注册ID集合 修改设备ID分表采集数据的状态")
void updateEquipmentLogList(String organizeCode, Integer equipId, List<Integer> clientHandleList);
}

@ -0,0 +1,20 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import io.swagger.annotations.ApiOperation;
import java.util.List;
public interface IProdOrgExtService {
@ApiOperation(value = "根据生产线代码查询工位集合")
List<MesWorkCell> findWorkCell(String organizeCode, String workCenterCode);
@ApiOperation(value = "根据生产线代码查询生产线信息")
MesWorkCenter getWorkCenterDb(String organizeCode, String workCenterCode);
@ApiOperation(value = "根据生产线代码,工位代码查询工位信息")
MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode);
}

@ -1,24 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @author yumingxing
* @version 1.0
* @date 2021/1/29 13:24
**/
public interface ISxOrganizeExtService {
/**
* 线
* @param organizeCode
* @param workCenterCode 线
* @return
*/
@ApiOperation(value = "根据生产线代码查询工位集合", notes = "根据生产线代码查询工位集合")
List<MesWorkCell> findWorkCell(String organizeCode, String workCenterCode);
}

@ -0,0 +1,62 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取生产过程上下文对象")
MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean);
@ApiOperation(value = "获取工序工艺信息")
MesProductionProcessContext processContext(StationRequestBean reqBean);
@ApiOperation(value = "获取工序工艺信息")
MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "验证组织模型有效性")
MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取工位设备集合信息")
MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean);
@ApiOperation(value = "获取工位设备集合信息")
MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取工位当前设备信息")
MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean);
@ApiOperation(value = "获取工位当前设备信息")
MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取设备数据变量信息")
MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, Integer variableType, String... categoryLevelTwo);
@ApiOperation(value = "获取设备数据变量信息")
MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo);
@ApiOperation(value = "获取设备数据变量接口逻辑信息")
MesProductionProcessContext getEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "对设备数据变量信息进行必要性验证")
MesProductionProcessContext checkNecessaryEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo);
@ApiOperation(value = "对设备数据变量接口逻辑信息进行必要性验证")
MesProductionProcessContext checkNecessaryEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "获取设备分表采集数据")
MesProductionProcessContext doHandleEquipmentLogListByIds(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "设备数据变量接口逻辑信息数据分组")
Map<String, List<MesEquipmentVariableCfg>> getEquipmentVariableCfgMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "根据设备数据变量接口逻辑信息匹配结果")
MesEquipmentVariableCfg execMatchEquipmentVariableCfgValue(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
MesEquipVariableCollectContext collectContext, Map<String, List<MesEquipmentVariableCfg>> equipmentVariableCfgMap, Boolean isNeedVariableCfgValue);
}

@ -1,6 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxOrganizeExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
@ -24,14 +24,14 @@ import java.util.List;
* @Description:
**/
@RestController
@RequestMapping(CommonConstWords.BASE_URL_MES_PCN + "/ext")
@Api(tags = "SX_组织")
public class SxOrganizeExtController extends MesPcnBaseController {
@RequestMapping(CommonConstWords.BASE_URL_MES_PCN)
@Api(tags = "组织")
public class ProdOrgExtController extends MesPcnBaseController {
@Autowired
private ISxOrganizeExtService organizeService;
private IProdOrgExtService organizeService;
@GetMapping({"/query-work-cell-by-center"})
@GetMapping({"/ext/query-work-cell-by-center"})
@ApiOperation(
value = "查询工作单元",
notes = "查询工作单元"

@ -1,4 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
public class TestBaseController {
}

@ -0,0 +1,87 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipment;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWcEquipment;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
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;
@Slf4j
@Service
public class EquipmentExtService implements IEquipmentExtService {
@Autowired
private MesWcEquipmentRepository wcEquipmentRepository;
@Autowired
private MesEquipmentRepository equipmentRepository;
@Autowired
private MesEquipmentVariableRepository equipmentVariableRepository;
@Autowired
private MesEquipmentVariableCfgRepository equipmentVariableCfgRepository;
@Override
public List<MesCellEquipContext> getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null;
List<MesWcEquipment> wcEquipmentDbList = wcEquipmentRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode});
if (CollectionUtils.isEmpty(wcEquipmentDbList)) return null;
List<MesCellEquipContext> cellEquipmentContextList = null;
for (MesWcEquipment wcEquipmentDb : wcEquipmentDbList) {
if (null == wcEquipmentDb) continue;
MesEquipment equipmentDb = equipmentRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), wcEquipmentDb.getEquipmentCode()});
if (null == equipmentDb) continue;
if (CollectionUtils.isEmpty(cellEquipmentContextList)) cellEquipmentContextList = new ArrayList<>();
MesCellEquipContext cellEquipmentContext = new MesCellEquipContext();
BeanUtils.copyProperties(wcEquipmentDb, cellEquipmentContext);
BeanUtils.copyProperties(equipmentDb, cellEquipmentContext);
cellEquipmentContextList.add(cellEquipmentContext);
}
return cellEquipmentContextList;
}
@Override
public List<MesEquipmentVariable> getEquipmentVariableList(MesCellEquipContext cellEquipmentContext, Integer variableType, List<String> categoryLevelTwoList) {
if (StringUtils.isEmpty(variableType) || null == cellEquipmentContext) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(cellEquipmentContext.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(cellEquipmentContext.getEquipmentCode(), MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
DdlPreparedPack.getNumEqualPack(variableType, MesPcnExtConstWords.VARIABLE_TYPE, packBean);
if (!CollectionUtils.isEmpty(categoryLevelTwoList) && categoryLevelTwoList.size() == 1) DdlPreparedPack.getStringEqualPack(categoryLevelTwoList.get(0), MesPcnExtConstWords.VARIABLE_TYPE, packBean);
else DdlPreparedPack.getInPackList(categoryLevelTwoList, MesPcnExtConstWords.VARIABLE_TYPE, packBean);
return equipmentVariableRepository.findByHqlWhere(packBean);
}
@Override
public List<MesEquipmentVariableCfg> getEquipmentVariableCfgList(MesCellEquipContext cellEquipmentContext, List<String> categoryLevelTwoList) {
if (null == cellEquipmentContext || StringUtils.isEmpty(cellEquipmentContext.getVariableCfgType()) || CollectionUtils.isEmpty(categoryLevelTwoList)) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(cellEquipmentContext.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(cellEquipmentContext.getVariableCfgType(), MesPcnExtConstWords.VARIABLE_CFG_TYPE, packBean);
if (!CollectionUtils.isEmpty(categoryLevelTwoList) && categoryLevelTwoList.size() == 1) DdlPreparedPack.getStringEqualPack(categoryLevelTwoList.get(0), MesPcnExtConstWords.VARIABLE_TYPE, packBean);
else DdlPreparedPack.getInPackList(categoryLevelTwoList, MesPcnExtConstWords.VARIABLE_TYPE, packBean);
return equipmentVariableCfgRepository.findByHqlWhere(packBean);
}
}

@ -0,0 +1,49 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentLogRepository;
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 java.util.List;
@Slf4j
@Service
public class EquipmentLogExtService implements IEquipmentLogExtService {
@Autowired
private MesEquipmentLogRepository equipmentLogRepository;
@Override
public List<MesEquipmentLog> getEquipmentLogList(String organizeCode, Integer equipId) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean);
return equipmentLogRepository.findByHqlWhere(packBean);
}
@Override
public List<MesEquipmentLog> getEquipmentLogList(String organizeCode, Integer equipId, Integer needNewValue, List<Integer> clientHandleList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean);
if (!CollectionUtils.isEmpty(clientHandleList) && clientHandleList.size() == 1) DdlPreparedPack.getNumEqualPack(clientHandleList.get(0), MesPcnExtConstWords.ID, packBean);
else DdlPreparedPack.getInPackList(clientHandleList, MesPcnExtConstWords.ID, packBean);
if (MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue() == needNewValue) DdlPreparedPack.getNumEqualPack(MesPcnExtConstWords.ZERO, MesPcnExtConstWords.EQUIP_VARIABLE_STATUS, packBean);
return equipmentLogRepository.findByHqlWhere(packBean);
}
@Override
public void updateEquipmentLogList(String organizeCode, Integer equipId, List<Integer> clientHandleList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean);
if (!CollectionUtils.isEmpty(clientHandleList) && clientHandleList.size() == 1) DdlPreparedPack.getNumEqualPack(clientHandleList.get(0), MesPcnExtConstWords.ID, packBean);
else DdlPreparedPack.getInPackList(clientHandleList, MesPcnExtConstWords.ID, packBean);
equipmentLogRepository.updateByProperties(new String[]{MesPcnExtConstWords.EQUIP_VARIABLE_STATUS}, new Object[]{MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue()}, packBean);
}
}

@ -0,0 +1,55 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkCenterRepository;
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.List;
@Slf4j
@Service
public class ProdOrgExtService implements IProdOrgExtService {
@Autowired
private MesWorkCenterRepository workCenterRepository;
@Autowired
private MesWorkCellRepository workCellRepository;
@Override
public List<MesWorkCell> findWorkCell(String organizeCode, String workCenterCode) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean);
DdlPreparedPack.getNumNOEqualPack(MesPcnEnumUtil.MES_WORK_CELL_TYPE.REWORK.getValue(), "workCellType", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{1}, new String[]{"seq"}, packBean);
return this.workCellRepository.findByHqlWhere(packBean);
}
@Override
public MesWorkCenter getWorkCenterDb(String organizeCode, String workCenterCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null;
return workCenterRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode});
}
@Override
public MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null;
return workCellRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CENTER_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode});
}
}

@ -1,36 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxOrganizeExtService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/13 9:28
**/
@Slf4j
@Service
public class SxOrganizeExtService implements ISxOrganizeExtService {
@Autowired
private MesWorkCellRepository workCellRepository;
@Override
public List<MesWorkCell> findWorkCell(String organizeCode, String workCenterCode) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean);
DdlPreparedPack.getNumNOEqualPack(MesPcnEnumUtil.MES_WORK_CELL_TYPE.REWORK.getValue(), "workCellType", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{1}, new String[]{"seq"}, packBean);
return this.workCellRepository.findByHqlWhere(packBean);
}
}

@ -0,0 +1,340 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
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.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionProcessContextStepService")
public class MesProductionProcessContextStepService extends BaseStepService implements IMesProductionProcessContextStepService {
@Autowired
private IProdOrgExtService prodOrgExtService;
@Autowired
private IEquipmentExtService equipmentExtService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Autowired
private IEquipmentLogExtService equipmentLogExtService;
@Override
public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) {
//获取缓存的生产过程上下文对象
MesProductionProcessContext productionProcessContext = (MesProductionProcessContext) getFsmBusiData(reqBean.getOrganizeCode(), getFsmBusikey(reqBean, MesProductionProcessContext.class.getSimpleName()), MesProductionProcessContext.class);
if (null == productionProcessContext) productionProcessContext = new MesProductionProcessContext(reqBean.getOrganizeCode());
//生产过程上下文对象结果初始化
productionProcessContext.success();
//生产过程上下文对象赋值生产线信息
if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) productionProcessContext.workCenterJson(prodOrgExtService.getWorkCenterDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()));
//生产过程上下文对象赋值工位信息
if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) productionProcessContext.workCellJson(prodOrgExtService.getWorkCellDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
//生产过程上下文对象赋值工序工艺信息
if (StringUtils.isEmpty(productionProcessContext.getProcessCode()) || !productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) processContext(reqBean, productionProcessContext);
//验证组织模型有效性
return checkBaseData(reqBean, productionProcessContext);
}
@Override
public MesProductionProcessContext processContext(StationRequestBean reqBean) {
return processContext(reqBean, getProductionProcessContext(reqBean));
}
@Override
public MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
if (!StringUtils.isEmpty(productionProcessContext.getProcessCode()) && productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) return productionProcessContext;
MesProcess process = fsmRouteDataService.doCachedFsmProcessData(reqBean, reqBean.getProcessCode());
MesProcessCraftCfg processCraftCfg = fsmRouteDataService.getProcessCraftCfg(reqBean.getOrganizeCode(), reqBean.getProcessCode());
//生产过程上下文对象赋值当前工艺工序,未配置默认赋值工序代码,不强验证
productionProcessContext.processCode(reqBean.getProcessCode(), null != process ? process.getProcessName() : reqBean.getProcessCode());
return productionProcessContext.craftCode(null != processCraftCfg ? processCraftCfg.getCraftCode() : reqBean.getProcessCode(), (null != processCraftCfg) ? productionProcessContext.getProcessCode() : productionProcessContext.getProcessName());
}
@Override
public MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) return productionProcessContext.message(String.format("请检查组织模型生产线[%s]信息的有效性!", reqBean.getWorkCenterCode()));
if (StringUtils.isEmpty(productionProcessContext.getWorkCellJson())) return productionProcessContext.message(String.format("请检查组织模型生产线[%s]工位[%s]信息的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
if (StringUtils.isEmpty(productionProcessContext.getProcessCode())) return productionProcessContext.message(String.format("请检查工序信息,生产线[%s]工位[%s]对应工序代码[%s]的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode()));
return productionProcessContext;
}
@Override
public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean) {
return getCellEquipmentList(reqBean, getProductionProcessContext(reqBean));
}
@Override
public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
//生产过程上下文对象赋值设备信息
if (StringUtils.isEmpty(productionProcessContext.getCellEquipListJson())) productionProcessContext.cellEquipListJson(equipmentExtService.getCellEquipmentList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
return productionProcessContext;
}
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean) {
return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean));
}
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
//获取当前工步的参数集合
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取当前工步的设备参数
String equipmentCode = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.EQUIPMENT_CODE_UC)) ? stepParamMap.get().get(MesPcnExtConstWords.EQUIPMENT_CODE_UC).getParamValue() : null;
//判断生产过程上下文对象是否存在当前设备信息
if (!StringUtils.isEmpty(productionProcessContext.getCurCellEquipJson()) && (StringUtils.isEmpty(equipmentCode) || equipmentCode.equals(productionProcessContext.getCurCellEquip().getEquipmentCode()))) return productionProcessContext;
//从工位设备集合信息中获取当前设备信息
MesCellEquipContext cellEquipmentContext = productionProcessContext.filterCurCellEquip(equipmentCode);
//生产过程上下文对象赋值当前设备代码
if (null != cellEquipmentContext) return productionProcessContext.curCellEquipJson(cellEquipmentContext);
return StringUtils.isEmpty(equipmentCode) ? productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护设备信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())) :
productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护工步参数[%s]配置的设备[%s]!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.EQUIPMENT_CODE_UC, equipmentCode));
}
@Override
public MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, Integer variableType, String... categoryLevelTwo) {
return getEquipmentVariable(reqBean, getCurCellEquipment(reqBean), variableType, categoryLevelTwo);
}
@Override
public MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
//判断生产过程上下文对象是否存在数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContext.getEquipVariableList();
List<String> categoryLevelTwoList = null != categoryLevelTwo ? Arrays.asList(categoryLevelTwo) : null;
if (!CollectionUtils.isEmpty(equipmentVariableList) && !CollectionUtils.isEmpty(equipmentVariableList.stream().filter(o ->
(null != o && o.getEquipmentCode().equals(cellEquipmentContext.getEquipmentCode()) && o.getVariableType().compareTo(variableType) == 0 &&
((CollectionUtils.isEmpty(categoryLevelTwoList) && StringUtils.isEmpty(o.getCategoryLevelTwo())) ||
(!CollectionUtils.isEmpty(categoryLevelTwoList) && !StringUtils.isEmpty(o.getCategoryLevelTwo()) && categoryLevelTwoList.contains(o.getCategoryLevelTwo()))))).collect(Collectors.toList())
)) return productionProcessContext;
List<MesEquipmentVariable> equipmentVariableDbList = equipmentExtService.getEquipmentVariableList(cellEquipmentContext, variableType, categoryLevelTwoList);
//生产过程上下文对象赋值设备数据变量信息
if (null != equipmentVariableDbList) return productionProcessContext.equipVariableJson(equipmentVariableDbList);
return productionProcessContext.message(String.format("请检查设备[%s]的数据变量信息,变量类型[%s:%s],二级变量%s!",
cellEquipmentContext.getEquipmentCode(), variableType, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.valueOfDescription(variableType), !CollectionUtils.isEmpty(equipmentVariableList) ? equipmentVariableList.toString() : MesPcnExtConstWords.SQUARE_BRACKETS));
}
@Override
public MesProductionProcessContext getEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
//判断生产过程上下文对象是否存在数据变量接口逻辑信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContext.getEquipVariableList();
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgList();
List<String> categoryLevelTwoList = (equipmentVariableList.stream().filter(o -> null != o).map(MesEquipmentVariable::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (!CollectionUtils.isEmpty(equipmentVariableCfgList) && !CollectionUtils.isEmpty(equipmentVariableCfgList.stream().filter(o ->
(null != o && o.getVariableCfgType().equals(cellEquipmentContext.getVariableCfgType()) && CollectionUtils.isEmpty(categoryLevelTwoList) && !StringUtils.isEmpty(o.getCategoryLevelTwo()) && categoryLevelTwoList.contains(o.getCategoryLevelTwo()))).collect(Collectors.toList())
)) return productionProcessContext;
List<MesEquipmentVariableCfg> equipmentVariableCfgDbList = equipmentExtService.getEquipmentVariableCfgList(cellEquipmentContext, categoryLevelTwoList);
//生产过程上下文对象赋值设备数据变量接口逻辑信息
if (null != equipmentVariableCfgDbList) return productionProcessContext.equipVariableCfgJson(equipmentVariableCfgDbList);
return productionProcessContext.message(String.format("请检查设备[%s]的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量%s!",
cellEquipmentContext.getEquipmentCode(), cellEquipmentContext.getVariableCfgType(), !CollectionUtils.isEmpty(equipmentVariableList) ? equipmentVariableList.toString() : MesPcnExtConstWords.SQUARE_BRACKETS));
}
@Override
public MesProductionProcessContext checkNecessaryEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo) {
List<MesEquipmentVariable> equipmentVariableList = productionProcessContext.getEquipVariableList();
if (null == categoryLevelTwo) return productionProcessContext;
for (String item : categoryLevelTwo) {
if (StringUtils.isEmpty(item)) continue;
Optional<MesEquipmentVariable> optional = CollectionUtils.isEmpty(equipmentVariableList) ? null : equipmentVariableList.stream().filter(o -> (null != o && o.getVariableType().compareTo(variableType) == 0 && o.getCategoryLevelTwo().equals(item))).findFirst();
if (null != optional && optional.isPresent()) continue;
return productionProcessContext.message(String.format("请检查设备[%s]必要的数据变量信息,变量类型[%s:%s],二级变量[%s]!", productionProcessContext.getCurCellEquip().getEquipmentCode(), variableType, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.valueOfDescription(variableType), item));
}
return productionProcessContext;
}
@Override
public MesProductionProcessContext checkNecessaryEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
List<MesEquipmentVariable> equipmentVariableList = productionProcessContext.getEquipVariableList();
Map<String, List<MesEquipmentVariableCfg>> cfgMap = getEquipmentVariableCfgMap(reqBean, productionProcessContext);
List<MesEquipmentVariable> filterList = (CollectionUtils.isEmpty(equipmentVariableList) || CollectionUtils.isEmpty(cfgMap)) ? equipmentVariableList :
equipmentVariableList.stream().filter(o -> (null != o && !cfgMap.containsKey(new StringJoiner(MesPcnExtConstWords.AND).add(o.getCategoryLevelTwo()).add(o.getVariableCfgType()).toString()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) return productionProcessContext;
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
return productionProcessContext.message(String.format("请检查设备[%s]必要的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量%s!",
cellEquipmentContext.getEquipmentCode(), cellEquipmentContext.getVariableCfgType(),
(filterList.stream().filter(o -> null != o).map(MesEquipmentVariable::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).toString()));
}
@Override
public MesProductionProcessContext doHandleEquipmentLogListByIds(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
if (!productionProcessContext.getSuccess()) return productionProcessContext;
//获取缓存的生产过程上下文对象中的历史变量接口逻辑采集信息并重置采集数据
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionProcessContext.getEquipVariableCfgCollectList();
if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList.forEach(o -> o.clear());
else equipVariableCollectContextList = getEquipVariableCollectContext(reqBean, productionProcessContext);//封装设备数据变量平铺接口逻辑与采集信息
if (!productionProcessContext.getSuccess() || CollectionUtils.isEmpty(equipVariableCollectContextList)) return productionProcessContext;
//根据常变值分别获取设备ID分表的采集数据
Map<Integer, MesEquipmentLog> needNewValue2Collect = getEquipmentLog(reqBean, equipVariableCollectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue());
Map<Integer, MesEquipmentLog> unNeedNewValue2Collect = getEquipmentLog(reqBean, equipVariableCollectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue());
//修改常变值配置对应的设备ID分表的采集数据的状态为1
if (!CollectionUtils.isEmpty(needNewValue2Collect)) equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), productionProcessContext.getCurCellEquip().getEquipId(), new ArrayList<>(needNewValue2Collect.keySet()));
//采集数据的值赋予生产过程上下文对象中的变量接口逻辑采集信息
equipVariableCollectContextList.forEach(o -> copyValue(o, needNewValue2Collect, unNeedNewValue2Collect));
//生产过程上下文对象赋值设备分表采集信息
return productionProcessContext.equipVariableCfgCollectJson(equipVariableCollectContextList);
}
private void copyValue(MesEquipVariableCollectContext collectContext, Map<Integer, MesEquipmentLog> needNewValue2Collect, Map<Integer, MesEquipmentLog> unNeedNewValue2Collect) {
if (!CollectionUtils.isEmpty(needNewValue2Collect) && needNewValue2Collect.containsKey(collectContext.getClientHandle())) BeanUtils.copyProperties(collectContext, needNewValue2Collect.get(collectContext.getClientHandle()));
if (!CollectionUtils.isEmpty(unNeedNewValue2Collect) && unNeedNewValue2Collect.containsKey(collectContext.getClientHandle())) BeanUtils.copyProperties(collectContext, unNeedNewValue2Collect.get(collectContext.getClientHandle()));
}
private Map<Integer, MesEquipmentLog> getEquipmentLog(StationRequestBean reqBean, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Integer needNewValue) {
List<MesEquipVariableCollectContext> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getNeedNewValue().compareTo(needNewValue) == 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) return null;
List<MesEquipmentLog> equipmentLogList = equipmentLogExtService.getEquipmentLogList(reqBean.getOrganizeCode(),
filterList.get(0).getEquipId(), needNewValue, filterList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getClientHandle).collect(Collectors.toList()));
return CollectionUtils.isEmpty(equipmentLogList) ? null : equipmentLogList.stream().filter(o -> null != o).collect(Collectors.toMap(o -> Integer.valueOf(o.getId().toString()), o -> o));
}
private List<MesEquipVariableCollectContext> getEquipVariableCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
List<MesEquipmentVariable> equipmentVariableList = productionProcessContext.getEquipVariableList();
Map<String, List<MesEquipmentVariableCfg>> cfgMap = getEquipmentVariableCfgMap(reqBean, productionProcessContext);
List<MesEquipVariableCollectContext> equipVariableCollectContextList = null;
for (MesEquipmentVariable equipmentVariable : equipmentVariableList) {
if (null == equipmentVariable) continue;
//一个数据变量如果匹配多个接口逻辑信息,验证接口逻辑信息配置的常变值是否统一
List<MesEquipmentVariableCfg> filterList = getEquipmentVariableCfgListByMap(cfgMap, equipmentVariable.getCategoryLevelTwo(), equipmentVariable.getVariableCfgType());
if (!CollectionUtils.isEmpty(filterList) && filterList.size() > 1 && (filterList.stream().filter(o -> null != o).map(MesEquipmentVariableCfg::getNeedNewValue).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size() > 1)
return productionProcessContext.message(String.format("请检查设备[%s]的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量[%s]关联的多个变量类别对应的常变值未配置统一!",
equipmentVariable.getEquipmentCode(), equipmentVariable.getVariableCfgType(), equipmentVariable.getCategoryLevelTwo())).getEquipVariableCfgCollectList();
MesEquipVariableCollectContext collectContext = new MesEquipVariableCollectContext(equipmentVariable.getId());
BeanUtils.copyProperties(equipmentVariable, collectContext);
collectContext.needNewValue(!CollectionUtils.isEmpty(filterList) ? filterList.get(0).getNeedNewValue() : MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue());
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(collectContext);
}
//生产过程上下文对象赋值 设备数据变量平铺接口逻辑与采集信息
productionProcessContext.equipVariableCfgCollectJson(equipVariableCollectContextList);
return equipVariableCollectContextList;
}
@Override
public Map<String, List<MesEquipmentVariableCfg>> getEquipmentVariableCfgMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgList();
return CollectionUtils.isEmpty(equipmentVariableCfgList) ? null :
equipmentVariableCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getCategoryLevelTwo()).add(o.getVariableCfgType()).toString()));
}
@Override
public MesEquipmentVariableCfg execMatchEquipmentVariableCfgValue(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
MesEquipVariableCollectContext collectContext, Map<String, List<MesEquipmentVariableCfg>> equipmentVariableCfgMap, Boolean isNeedVariableCfgValue) {
List<MesEquipmentVariableCfg> equipmentVariableCfgList = getEquipmentVariableCfgListByMap(equipmentVariableCfgMap, collectContext.getCategoryLevelTwo(), collectContext.getVariableCfgType());
if (isNeedVariableCfgValue && CollectionUtils.isEmpty(CollectionUtils.isEmpty(equipmentVariableCfgList) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getValue()))).collect(Collectors.toList()))) {
productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备变量配置类型[%s],二级变量[%s]对应的信息未配置参考值", collectContext.getVariableCfgType(), collectContext.getCategoryLevelTwo()));
return null;
}
Optional<MesEquipmentVariableCfg> optional = equipmentVariableCfgList.stream().filter(o -> (null != o && o.getValue().equals(collectContext.getEquipVariableValue()))).findFirst();
return null != optional && optional.isPresent() ? optional.get() : null;
}
private List<MesEquipmentVariableCfg> getEquipmentVariableCfgListByMap(Map<String, List<MesEquipmentVariableCfg>> equipmentVariableCfgMap, String categoryLevelTwo, String variableCfgType) {
return CollectionUtils.isEmpty(equipmentVariableCfgMap) ? null : equipmentVariableCfgMap.get(new StringJoiner(MesPcnExtConstWords.AND).add(categoryLevelTwo).add(variableCfgType).toString());
}
}

@ -1,13 +1,27 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
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.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
@ -16,34 +30,77 @@ import org.springframework.util.StringUtils;
@Service("mesWorkResultReadStepService")
public class MesWorkResultReadStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Override
public StepResult init(StationRequestBean reqBean) {
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariable(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(),
MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_OK.getValue(),
MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_NOK.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_SCRAP.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_SUSPICIOUS.getValue());
if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!");
if (!productionProcessContextStepService.getEquipmentVariableCfg(reqBean, productionProcessContext).getSuccess())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage());
if (!productionProcessContextStepService.checkNecessaryEquipmentVariable(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_OK.getValue()).getSuccess())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage());
StepResult stepResult = StepResult.getSuccessComplete();
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(reqBean, productionProcessContext).getSuccess())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage());
if (!productionProcessContextStepService.doHandleEquipmentLogListByIds(reqBean, productionProcessContext).getSuccess())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage());
return stepResult;
}
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
@Override
public StepResult execute(StationRequestBean reqBean) {
Map<String, List<MesEquipmentVariableCfg>> equipmentVariableCfgMap = productionProcessContextStepService.getEquipmentVariableCfgMap(reqBean, productionProcessContext);
StationResultBean resultBean = new StationResultBean();
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionProcessContext.getEquipVariableCfgCollectList();
if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!");
//验证加工模式
Optional<MesEquipVariableCollectContext> optional2Mode = isExistTypeVariableType(equipVariableCollectContextList, MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue());
if (null != optional2Mode && optional2Mode.isPresent() && !checkVariableType2Mode(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipmentVariableCfgMap, optional2Mode.get()).isCompleted())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, stepResult.getMsg());
equipVariableCollectContextList = equipVariableCollectContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipVariableValue()) && !o.getCategoryLevelTwo().equals(MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("正在持续监听设备[%s]的加工结果...", cellEquipContext.getEquipmentCode()));
StepResult stepResult = StepResult.getSuccessComplete();
//验证加工结果
MesEquipmentVariableCfg equipmentVariableCfg = null;
for (MesEquipVariableCollectContext collectContext : equipVariableCollectContextList) {
if (null == cellEquipContext) continue;
equipmentVariableCfg = productionProcessContextStepService.execMatchEquipmentVariableCfgValue(reqBean, productionProcessContext, collectContext, equipmentVariableCfgMap, true);
if (!productionProcessContext.getSuccess()) this.sendMessage(reqBean, resultBean, productionProcessContext.getMessage(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
productionProcessContext.success();
if (null != equipmentVariableCfg) break;
}
if (null == equipmentVariableCfg) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("获取到设备[%s]数据变量的加工结果值与数据变量接口逻辑信息匹配失败!持续监听中...", cellEquipContext.getEquipmentCode()));
//TODO 根据二级变量+变量类别 判断结果
//失败: return false
//成功: 成功 return true/ 零件报废 return custom
//可疑/报废: return custom
return StepResult.getSuccessComplete();
}
private StepResult checkVariableType2Mode(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, Map<String, List<MesEquipmentVariableCfg>> equipmentVariableCfgMap, MesEquipVariableCollectContext collectContext) {
if (StringUtils.isEmpty(collectContext.getEquipVariableValue())) return stepResult.isCompleted(false).msg(String.format("未获取到设备[%s]加工模式数据变量[%s]的结果值,持续监听中...", cellEquipContext.getEquipmentCode(), collectContext.getTagName()));
MesEquipmentVariableCfg equipmentVariableCfg = productionProcessContextStepService.execMatchEquipmentVariableCfgValue(reqBean, productionProcessContext, collectContext, equipmentVariableCfgMap, true);
if (!productionProcessContext.getSuccess()) return stepResult.isCompleted(false).msg(productionProcessContext.getMessage());
if (null == equipmentVariableCfg) return stepResult.isCompleted(false).msg(String.format("获取到设备[%s]加工模式数据变量[%s]的结果值[%s]与数据变量接口逻辑信息匹配失败!持续监听中...", cellEquipContext.getEquipmentCode(), collectContext.getTagName(), collectContext.getEquipVariableValue()));
return stepResult;
}
private Optional<MesEquipVariableCollectContext> isExistTypeVariableType(List<MesEquipVariableCollectContext> equipVariableCollectContextList, String categoryLevelTwo) {
return equipVariableCollectContextList.stream().filter(o -> (null != o && o.getCategoryLevelTwo().equals(categoryLevelTwo))).findFirst();
}
}

@ -0,0 +1,45 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* -
*/
@Data
public class MesCellEquipContext {
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("腔数")
private Integer cavity;
@ApiParam("每腔装配件个数")
private Integer bindQty;
@ApiParam("顺序")
private Integer seq;
@ApiParam("设备ID")
private Integer equipId;
@ApiParam("设备代码")
private String equipmentCode;
@ApiParam("设备名称")
private String equipmentName;
@ApiParam("变量配置类型")
private String variableCfgType;
@ApiParam("是否控制byPass")
private Integer ctrlByPass;
@ApiParam("是否监控停机")
private Integer monitorDown;
@ApiParam("是否监控停机")
private String monitorDownTime;
}

@ -0,0 +1,83 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* -
*/
@Data
public class MesEquipVariableCollectContext {
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("设备变量ID")
private Long equipVariableId;
@ApiParam("设备ID")
private Integer equipId;
@ApiParam("OPC注册ID")
private Integer clientHandle;
@ApiParam("设备代码")
private String equipmentCode;
@ApiParam("通道")
private String channel;
@ApiParam("通道")
private String device;
@ApiParam("tag名称")
private String tagName;
@ApiParam("变量配置类型")
private String variableCfgType;
@ApiParam("变量类型")
private Integer variableType;
@ApiParam("二级变量")
private String categoryLevelTwo;
@ApiParam("是否常变值")
private Integer needNewValue;
@ApiParam("设备变量名称")
private String equipVariableName;
@ApiParam("设备变量描述")
private String equipVariableDesc;
@ApiParam("读写标记")
private Integer readWriteFlag;
@ApiParam("数据类型")
private String dataType;
@ApiParam("变量当前值")
private String equipVariableValue;
@ApiParam("设备质量")
private Integer quality;
public MesEquipVariableCollectContext(Long equipVariableId) {
this.equipVariableId = equipVariableId;
}
public MesEquipVariableCollectContext needNewValue(Integer needNewValue) {
this.needNewValue = needNewValue;
return this;
}
public void clear() {
this.equipVariableName = null;
this.equipVariableDesc = null;
this.readWriteFlag = null;
this.dataType = null;
this.equipVariableValue = null;
this.quality = null;
}
}

@ -0,0 +1,210 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*/
@Data
public class MesProductionProcessContext {
@ApiParam("结果")
private Boolean success;
@ApiParam("信息")
private String message;
@ApiParam("组织代码")
private String organizeCode;
@ApiParam("生产线信息")
private String workCenterJson;
@ApiParam("工位信息")
private String workCellJson;
@ApiParam("工位设备集合信息")
private String cellEquipListJson;
@ApiParam("工序代码")
private String processCode;
@ApiParam("工序名称")
private String processName;
@ApiParam("工艺代码")
private String craftCode;
@ApiParam("工艺代码")
private String craftName;
@ApiParam("当前工位设备信息")
private String curCellEquipJson;
@ApiParam("设备变量信息")
private String equipVariableJson;
@ApiParam("变量接口逻辑信息")
private String equipVariableCfgJson;
@ApiParam("变量接口逻辑采集信息")
private String equipVariableCfgCollectJson;
@ApiParam("头道模具号")
private String firstMouldNo;
@ApiParam("模具号")
private String mouldNo;
@ApiParam("一模多腔信息")
private String mouldCavityJson;
@ApiParam("腔组明细信息")
private String cavityGroupDetailJson;
@ApiParam("设备加工参数信息")
private String equipProdParamJson;
@ApiParam("非排序加工规则信息")
private String unSortRuleJson;
@ApiParam("装配件信息(非排序/排序线排产装配目视项)")
private String assemblyJson;
@ApiParam("时效性信息")
private String timeEfficientJson;
@ApiParam("零件条码信息")
private String produceSnJson;
public MesProductionProcessContext() {}
public MesProductionProcessContext(String organizeCode) {
this.organizeCode = organizeCode;
}
public MesProductionProcessContext success() {
this.success = true;
this.message = null;
return this;
}
public MesProductionProcessContext message(String message) {
this.success = false;
this.message = message;
return this;
}
public MesWorkCenter getWorkCenter() {
return StringUtils.isEmpty(this.workCenterJson) ? null : JSONObject.parseObject(this.workCenterJson, MesWorkCenter.class);
}
public MesProductionProcessContext workCenterJson(MesWorkCenter workCenter) {
this.workCenterJson = null != workCenter ? JSONObject.toJSONString(workCenter) : null;
return this;
}
public MesWorkCell getWorkCell() {
return StringUtils.isEmpty(this.workCellJson) ? null : JSONObject.parseObject(this.workCellJson, MesWorkCell.class);
}
public MesProductionProcessContext workCellJson(MesWorkCell workCell) {
this.workCellJson = null != workCell ? JSONObject.toJSONString(workCell) : null;
return this;
}
private List<MesCellEquipContext> getCellEquipList() {
return StringUtils.isEmpty(this.cellEquipListJson) ? null : JSONObject.parseArray(this.cellEquipListJson, MesCellEquipContext.class);
}
public MesProductionProcessContext cellEquipListJson(List<MesCellEquipContext> cellEquipList) {
this.cellEquipListJson = !CollectionUtils.isEmpty(cellEquipList) ? JSONObject.toJSONString(cellEquipList) : null;
return this;
}
public MesCellEquipContext filterCurCellEquip() {
List<MesCellEquipContext> cellEquipList = getCellEquipList();
if (CollectionUtils.isEmpty(cellEquipList) || cellEquipList.size() == 1) return filterCurCellEquip(cellEquipList);
return filterCurCellEquip(cellEquipList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getSeq()))).sorted(Comparator.comparing(MesCellEquipContext::getSeq)).collect(Collectors.toList()));
}
public MesCellEquipContext filterCurCellEquip(String equipmentCode) {
if (StringUtils.isEmpty(equipmentCode)) return filterCurCellEquip();
List<MesCellEquipContext> cellEquipList = getCellEquipList();
return filterCurCellEquip(CollectionUtils.isEmpty(cellEquipList) ? null : cellEquipList.stream().filter(o -> (null != o && o.getEquipmentCode().equals(equipmentCode))).collect(Collectors.toList()));
}
private MesCellEquipContext filterCurCellEquip(List<MesCellEquipContext> cellEquipContextList) {
return CollectionUtils.isEmpty(cellEquipContextList) ? null : cellEquipContextList.get(0);
}
public MesCellEquipContext getCurCellEquip() {
return StringUtils.isEmpty(this.curCellEquipJson) ? null : JSONObject.parseObject(this.curCellEquipJson, MesCellEquipContext.class);
}
public MesProductionProcessContext curCellEquipJson(MesCellEquipContext curEquip) {
this.curCellEquipJson = null != curEquip ? JSONObject.toJSONString(curEquip) : null;
return this;
}
public MesProductionProcessContext processCode(String processCode, String processName) {
this.processCode = processCode;
this.processName = processName;
return this;
}
public MesProductionProcessContext craftCode(String craftCode, String craftName) {
this.craftCode = craftCode;
this.craftName = craftName;
return this;
}
public List<MesEquipmentVariable> getEquipVariableList() {
return StringUtils.isEmpty(this.equipVariableJson) ? null : JSONObject.parseArray(this.equipVariableJson, MesEquipmentVariable.class);
}
public MesProductionProcessContext equipVariableJson(List<MesEquipmentVariable> equipmentVariableList) {
if (CollectionUtils.isEmpty(equipmentVariableList)) return this;
if (!StringUtils.isEmpty(this.equipVariableJson)) equipmentVariableList.addAll(getEquipVariableList());
this.equipVariableJson = JSONObject.toJSONString(equipmentVariableList);
return this;
}
public List<MesEquipmentVariableCfg> getEquipVariableCfgList() {
return StringUtils.isEmpty(this.equipVariableCfgJson) ? null : JSONObject.parseArray(this.equipVariableCfgJson, MesEquipmentVariableCfg.class);
}
public MesProductionProcessContext equipVariableCfgJson(List<MesEquipmentVariableCfg> equipmentVariableCfgList) {
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) return this;
if (!StringUtils.isEmpty(this.equipVariableCfgJson)) equipmentVariableCfgList.addAll(getEquipVariableCfgList());
this.equipVariableCfgJson = JSONObject.toJSONString(equipmentVariableCfgList);
return this;
}
public List<MesEquipVariableCollectContext> getEquipVariableCfgCollectList() {
if (StringUtils.isEmpty(this.equipVariableCfgCollectJson)) return null;
List<MesEquipVariableCollectContext> equipVariableCollectContextList = JSONObject.parseArray(this.equipVariableCfgCollectJson, MesEquipVariableCollectContext.class);
return equipVariableCollectContextList;
}
public MesProductionProcessContext equipVariableCfgCollectJson(List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
this.equipVariableCfgCollectJson = !CollectionUtils.isEmpty(equipVariableCollectContextList) ? JSONObject.toJSONString(equipVariableCollectContextList) : null;
return this;
}
}

@ -1,4 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
public class TestModel {
}

@ -48,5 +48,33 @@ public class MesPcnExtConstWords {
public static final String MODIFY_USER = "modifyUser";
// 修改人
public static final String USER_INFO = "userInfo";
// 设备代码
public static final String EQUIPMENT_CODE = "equipmentCode";
// 设备ID
public static final String EQUIP_ID = "equipId";
// 设备代码[工步参数]
public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE";
// 变量类型
public static final String VARIABLE_TYPE = "variableType";
// 二级变量
public static final String CATEGORY_LEVEL_TWO = "categoryLevelTwo";
// 变量配置类型
public static final String VARIABLE_CFG_TYPE = "variableCfgType";
// 变量状态
public static final String EQUIP_VARIABLE_STATUS = "equipVariableStatus";
// 0
public static final Integer ZERO = 0;
// 中括号
public static final String SQUARE_BRACKETS = "[]";
// &
public static final String AND = "&";
}

Loading…
Cancel
Save