diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentLogService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentLogService.java new file mode 100644 index 0000000..4ebf7b8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentLogService.java @@ -0,0 +1,18 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ActorMessage; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +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; + +public interface IMesEquipmentLogService { + + void saveEquipmentLogToRedis(ActorMessage actorMessage); + + + void saveEquipmentLogDetails(); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesSaveVariableJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesSaveVariableJob.java new file mode 100644 index 0000000..caee2e0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesSaveVariableJob.java @@ -0,0 +1,44 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob; + + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentLogService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * @author wangjie + * @version 1.0 + * @date 2021/2/2 16:44 + **/ +@Slf4j +@DisallowConcurrentExecution +@ApiOperation("保存工艺参数job") +public class MesSaveVariableJob implements Job { + + @Autowired + private IMesEquipmentLogService mesEquipmentLogService; + + @Override + public void execute(JobExecutionContext jobExecutionContext) { + + log.info("保存工艺参数job -- START "); + + long startTime = System.currentTimeMillis(); + + mesEquipmentLogService.saveEquipmentLogDetails(); + + long endTime = System.currentTimeMillis(); + + log.info("保存工艺参数job --- END --- 耗时: {} ms", endTime - startTime); + + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/actor/MesHandlerEquipLogActor.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/actor/MesHandlerEquipLogActor.java new file mode 100644 index 0000000..7bf183d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/actor/MesHandlerEquipLogActor.java @@ -0,0 +1,37 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.actor; + +import akka.actor.AbstractActor; +import akka.actor.UntypedAbstractActor; +import akka.japi.pf.ReceiveBuilder; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentLogService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ActorMessage; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.FsmRouteDataService; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component +@Scope("prototype") +public class MesHandlerEquipLogActor extends AbstractActor { + //定义日志,很重要 + private static final Logger log = LoggerFactory.getLogger(MesHandlerEquipLogActor.class); + + @Autowired + private IMesEquipmentLogService mesEquipmentLogService; + /** + *

重写接收方法

+ * @author hanchao 2018/4/16 21:31 + **/ + @Override + public Receive createReceive() { + + return ReceiveBuilder.create().match(ActorMessage.class, o -> { + + mesEquipmentLogService.saveEquipmentLogToRedis(o); + + }).matchAny(o -> log.error("FiniteStateMachineActor--收到的意外的消息{}", o)).build(); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentLogService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentLogService.java new file mode 100644 index 0000000..1537d5f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentLogService.java @@ -0,0 +1,128 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentLogService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.equiplog.MesEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ActorMessage; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.repository.*; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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 javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class MesEquipmentLogService implements IMesEquipmentLogService { + + public static final Logger LOGGER = LoggerFactory.getLogger(CommonConstWords.SYSTEM_LOG); + + @Autowired + private MesEquipmentLogExtService mesEquipmentLogExtService; + @Autowired + private MesEquipmentExtService mesEquipmentExtService; + @Autowired + private MesEquipmentLogDetailRepository mesEquipmentLogDetailRepository; + @Autowired + private MesEquipmentRecordRepository mesEquipmentRecordRepository; + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + @Resource(name = "redisMesPcn") + private ImppRedis redisMesPcn; + + @Override + public void saveEquipmentLogToRedis(ActorMessage actorMessage) { + // 获取设备变量属性 + List equipmentVariableList = mesEquipmentExtService.getEquipmentVariableList(actorMessage.getOrganizeCode(), actorMessage.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue()); + // 获取变量属性中的clientHandle 列表 + List clientHandleList = equipmentVariableList.stream().filter(o -> o.getClientHandle() != null).map( o -> Long.valueOf(o.getClientHandle().longValue())).collect(Collectors.toList()); + // 获取设备数据采集信息 + List equipmentLogList = mesEquipmentLogExtService.getEquipmentLogList(actorMessage.getOrganizeCode(), actorMessage.getEquipId()); + // 筛选出该设备中设备变量属性对应的数据采集信息 + equipmentLogList = equipmentLogList.stream().filter(mesEquipmentLog -> clientHandleList.contains(mesEquipmentLog.getId()) ).collect(Collectors.toList()); + + Long recordId = snowflakeIdMaker.nextId(); + + MesEquipmentRecord mesEquipmentRecord =new MesEquipmentRecord(); + BeanUtils.copyProperties(actorMessage, mesEquipmentRecord); + mesEquipmentRecord.setRecordStatus(MesExtEnumUtil.RECORD_STATUS.RECORD_STATUS_10.getValue()); + mesEquipmentRecord.setId(recordId); + + ConvertBean.serviceModelInitialize(mesEquipmentRecord, actorMessage.getUserName()); + + String key = getKey(mesEquipmentRecord); + + equipmentLogList.forEach(equipLog -> { + redisMesPcn.putList(key, equipLog); + }); + mesEquipmentRecordRepository.save(mesEquipmentRecord); + LOGGER.info("产线【{}】,工位【{}】,设备【{}】下,保存rediskey【{}】和记录成功", mesEquipmentRecord.getWorkCenterCode(),mesEquipmentRecord.getWorkCellCode(),mesEquipmentRecord.getEquipmentCode(),key); + } + + private String getKey(MesEquipmentRecord mesEquipmentRecord){ + return mesEquipmentRecord.getOrganizeCode() + ":" + mesEquipmentRecord.getWorkCenterCode() + ":" + mesEquipmentRecord.getWorkCellCode() + ":" + mesEquipmentRecord.getEquipmentCode () + ":" + mesEquipmentRecord.getId(); + } + + @Override + public void saveEquipmentLogDetails() { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.RECORD_STATUS.RECORD_STATUS_10.getValue(), "recordStatus", ddlPackBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); + List mesEquipmentRecords = mesEquipmentRecordRepository.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(mesEquipmentRecords)) { + LOGGER.info("没有设备记录需要同步"); + } + LOGGER.info("读取设备记录信息【{}】条", mesEquipmentRecords.size()); + for (MesEquipmentRecord mesEquipmentRecord : mesEquipmentRecords) { + saveEquipmentLogDetail(mesEquipmentRecord); + } + } + + private void saveEquipmentLogDetail(MesEquipmentRecord mesEquipmentRecord) { + + String key = getKey(mesEquipmentRecord); + List equipmentLogList = (List)redisMesPcn.getList(key, 0, -1); + + List mesEquipmentLogDetails = new ArrayList<>(); + + for (MesEquipmentLog mesEquipmentLog : equipmentLogList) { + MesEquipmentLogDetail mesEquipmentLogDetail = new MesEquipmentLogDetail(); + BeanUtils.copyProperties(mesEquipmentLog, mesEquipmentLogDetail); + mesEquipmentLogDetail.setAreaCode(mesEquipmentRecord.getAreaCode()); + mesEquipmentLogDetail.setCraftCode(mesEquipmentRecord.getCraftCode()); + mesEquipmentLogDetail.setProcessCode(mesEquipmentRecord.getProcessCode()); + mesEquipmentLogDetail.setWorkCenterCode(mesEquipmentRecord.getWorkCenterCode()); + mesEquipmentLogDetail.setExtend(mesEquipmentRecord.getProduceSnJson()); + mesEquipmentLogDetails.add(mesEquipmentLogDetail); + } + mesEquipmentLogDetailRepository.saveAll(mesEquipmentLogDetails); + // 修改状态 + mesEquipmentRecord.setRecordStatus(MesExtEnumUtil.RECORD_STATUS.RECORD_STATUS_20.getValue()); + mesEquipmentRecordRepository.save(mesEquipmentRecord); + // 删除key + redisMesPcn.deleteKey(key); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldRecordGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldRecordGenerateStepService.java index 2422f39..14788ca 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldRecordGenerateStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldRecordGenerateStepService.java @@ -57,14 +57,19 @@ public class MesMouldRecordGenerateStepService extends BaseStepService { StationResultBean resultBean = new StationResultBean(); - + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue()); + // 获取条码信息 List mesProduceSns = mesProductionDispatchContextStepService.getOutProduceSnDataContext(reqBean); + // 获取头道模具号 MesEquipVariableCollectContext mesFirstMouldNoCollectContext = mesProductionDispatchContextStepService.getFirstMouldNoContext(reqBean); + // 获取模具号 MesEquipVariableCollectContext mesMouldNoCollectContext = mesProductionDispatchContextStepService.getMouldNoContext(reqBean); List mesProdMouldRecords = new ArrayList<>(); + for (MesProduceSn mesProduceSn : mesProduceSns) { + // 获取工位设备信息 MesCellEquipContext mesCellEquipContext = productionProcessContext.getCurCellEquip(); String equipmentCode = mesCellEquipContext.getEquipmentCode(); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java index 4935a6a..a348e86 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java @@ -2,18 +2,18 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; 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.MesSnProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesWorkOrderContext; import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -21,14 +21,17 @@ import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.hutool.core.date.DateUtil; 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.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @Description : 生成零件条码 @@ -64,34 +67,75 @@ public class MesProductSnGenerateStepService extends BaseStepService { StationResultBean resultBean = new StationResultBean(); StepResult stepResult = StepResult.getSuccessComplete(); - + // 获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue()); MesWorkCell mesWorkCell = productionProcessContext.getWorkCell(); + // 获取一模多腔信息 + List mesModelMultiCavities = mesProductionDispatchContextStepService.getMouldMultiCavityContext(reqBean); + // 获取工单号信息 + List workOrderDataContext = mesProductionDispatchContextStepService.getWorkOrderDataContext(reqBean); + // 获取零件号,可能存在多个 + List partNoList = getPartNoList(mesModelMultiCavities, workOrderDataContext); + // 根据零件号组装产品条码信息 + List mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList); + // 保存条码信息 + mesProduceSnRepository.saveAll(mesProduceSns); + // 放到上下文 + mesProductionDispatchContextStepService.saveOutProduceSnDataContext(reqBean, mesProduceSns); - MesEquipVariableCollectContext mesFirstMouldNoCollectContext = mesProductionDispatchContextStepService.getFirstMouldNoContext(reqBean); + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成零件条码成功"); + } - List mesModelMultiCavities = mesProductionDispatchContextStepService.getMouldMultiCavityContext(reqBean); + /** + * 根据零件号组装产品条码信息 + * @param reqBean + * @param productionProcessContext + * @param mesWorkCell + * @param partNoList + * @return + */ + private List generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List partNoList) { List mesProduceSns = new ArrayList<>(); - // todo 要判空 - for (MesMouldMultiCavity modelMultiCavity : mesModelMultiCavities) { + for (String partNo : partNoList) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(modelMultiCavity.getPartNo(), "partNo", packBean); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean); MesPart mesPart = mesPartRepository.getByProperty(packBean); if (mesPart == null) { - return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "零件号不存在"); + MesPcnException.throwFlowException("零件号不存在"); } + // 根据条码规则生成条码 String sn = generateByRule(mesPart); - MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn,mesWorkCell, productionProcessContext,reqBean); + // 组装条码信息 + MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean); + ConvertBean.serviceModelInitialize(mesProduceSn, reqBean.getUserInfo()); mesProduceSns.add(mesProduceSn); } - mesProduceSnRepository.saveAll(mesProduceSns); - MesSnProductionProcessContext mesSnProductionProcessContext = (MesSnProductionProcessContext) productionProcessContext; - mesSnProductionProcessContext.productSns(mesProduceSns); - - return StepResult.getSuccessComplete(); + return mesProduceSns; } + /** + * 获取零件号列表 + * 一模多腔或者加工单信息中获取 + * @param mesModelMultiCavities + * @param workOrderDataContext + * @return + */ + private List getPartNoList(List mesModelMultiCavities, List workOrderDataContext) { + List partNoList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(workOrderDataContext)) { + partNoList = workOrderDataContext.stream().map(MesWorkOrder::getPartNo).collect(Collectors.toList()); + } + if (!CollectionUtils.isEmpty(mesModelMultiCavities)) { + partNoList = mesModelMultiCavities.stream().map(MesMouldMultiCavity::getPartNo).collect(Collectors.toList()); + } + return partNoList; + } + /** + * 生成条码 + * @param mesPart + * @return + */ private String generateByRule(MesPart mesPart) { //生成工单号 GenSerialNoModel genSerialNoModel = new GenSerialNoModel(ORDER_NO_JIS_SORT); @@ -124,6 +168,7 @@ public class MesProductSnGenerateStepService extends BaseStepService { mesProduceSn.setCraftCode(productionProcessContext.getCraftCode()); mesProduceSn.setPrintCount(0); mesProduceSn.setPrintStatus(10); + mesProduceSn.setOrganizeCode(reqBean.getOrganizeCode()); return mesProduceSn; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesVariableWhenFinishedReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesVariableWhenFinishedReadStepService.java index 2e26c5e..9efa785 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesVariableWhenFinishedReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesVariableWhenFinishedReadStepService.java @@ -1,14 +1,21 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.actor.MesHandlerEquipLogActor; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base.MesEquipmentExtService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.equiplog.MesEquipmentLogExtService; 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.context.MesSnProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ActorMessage; import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.config.SpringExt; +import cn.estsh.i3plus.mes.pcn.config.SpringExtProvider; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; @@ -24,18 +31,21 @@ import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.eclipse.milo.opcua.stack.core.channel.messages.HelloMessage; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** * @Description : 保存工艺参数 - * @Author : wangjie + * @Author : zxw **/ @Slf4j @Service @@ -44,28 +54,19 @@ public class MesVariableWhenFinishedReadStepService extends BaseStepService { private SnowflakeIdMaker snowflakeIdMaker; @Autowired - private IMesProductionProcessContextStepService productionProcessContextStepService; - - @Autowired - private MesPartRepository mesPartRepository; + private ActorSystem actorSystem; @Autowired - private MesProduceSnRepository mesProduceSnRepository; - - @Autowired - private ISyncFuncService syncFuncService; - - private MesEquipmentLogExtService mesEquipmentLogExtService; + private IMesProductionProcessContextStepService productionProcessContextStepService; - private MesEquipmentExtService mesEquipmentExtService; - private MesEquipmentLogDetailRepository mesEquipmentLogDetailRepository; @Autowired private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService; public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT"; + private static final Map refMap = new ConcurrentHashMap<>(200); @Override public StepResult execute(StationRequestBean reqBean) { @@ -74,46 +75,34 @@ public class MesVariableWhenFinishedReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + // 获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); - MesCellEquipContext curCellEquip = productionProcessContext.getCurCellEquip(); - - List equipmentLogList = mesEquipmentLogExtService.getEquipmentLogList(reqBean.getOrganizeCode(), curCellEquip.getEquipId()); - - List equipmentVariableList = mesEquipmentExtService.getEquipmentVariableList(productionProcessContext.getOrganizeCode(), curCellEquip.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue()); - - List clientHandleList = equipmentVariableList.stream().filter(o -> o.getClientHandle() != null).map( o -> Long.valueOf(o.getClientHandle().longValue())).collect(Collectors.toList()); - - equipmentLogList = equipmentLogList.stream().filter(mesEquipmentLog -> clientHandleList.contains(mesEquipmentLog.getId())).collect(Collectors.toList()); - - - List mesEquipmentLogDetails = new ArrayList<>(); - - curCellEquip.setQuality(MesExtEnumUtil.EQUIP_LOG_QUALITY.defaultQuality()); - Optional optional = CollectionUtils.isEmpty(equipmentLogList) ? null : equipmentLogList.stream().filter(o -> (null != o && !mesEquipmentLogExtService.checkEquipQuality(o.getQuality()))).findFirst(); - if (null != optional && optional.isPresent()) curCellEquip.setQuality(optional.get().getQuality()); - - MesEquipVariableCollectContext mesFirstMouldNoCollectContext = mesProductionDispatchContextStepService.getFirstMouldNoContext(reqBean); - - mesProductionDispatchContextStepService.sendEquipQualityMessage(reqBean, curCellEquip); - - MesSnProductionProcessContext mesSnProductionProcessContext = (MesSnProductionProcessContext) productionProcessContext; - - for (MesEquipmentLog mesEquipmentLog : equipmentLogList) { - MesEquipmentLogDetail mesEquipmentLogDetail = new MesEquipmentLogDetail(); - BeanUtils.copyProperties(mesEquipmentLog, mesEquipmentLogDetail); - mesEquipmentLogDetail.setAreaCode(reqBean.getAreaCode()); - mesEquipmentLogDetail.setCraftCode(productionProcessContext.getCraftCode()); - mesEquipmentLogDetail.setProcessCode(reqBean.getProcessCode()); - mesEquipmentLogDetail.setWorkCenterCode(reqBean.getWorkCenterCode()); - mesEquipmentLogDetail.setExtend(mesSnProductionProcessContext.getProduceSnJson()); - mesEquipmentLogDetails.add(mesEquipmentLogDetail); - } - mesEquipmentLogDetailRepository.saveAll(mesEquipmentLogDetails); + // 获取条码信息 + List mesProduceSns = mesProductionDispatchContextStepService.getOutProduceSnDataContext(reqBean); + // 通过上下文获取工位设备信息 + MesCellEquipContext curCellEquip = productionProcessContext.getCurCellEquip(); - return StepResult.getSuccessComplete(); + String mesProduceSnsStr = !CollectionUtils.isEmpty(mesProduceSns) ? JSONObject.toJSONString(mesProduceSns) : null; + ActorMessage actorMessage = ActorMessage.builder() + .equipmentCode(curCellEquip.getEquipmentCode()) + .equipId(curCellEquip.getEquipId()) + .organizeCode(reqBean.getOrganizeCode()) + .organizeName(reqBean.getOrganizeName()) + .workCellCode(reqBean.getWorkCellCode()) + .workCenterCode(reqBean.getWorkCenterCode()) + .areaCode(reqBean.getAreaCode()) + .craftCode(productionProcessContext.getCraftCode()) + .processCode(reqBean.getProcessCode()) + .produceSnJson(mesProduceSnsStr) + .userName(reqBean.getUserInfo()) + .build(); + // 数据采集信息需要存放到 redis中 + String key = this.getFsmBusikey(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.name()); + ActorRef ref = refMap.computeIfAbsent(key, + k -> actorSystem.actorOf(SpringExtProvider.getInstance().get(actorSystem).create("mesHandlerEquipLogActor"), key)); + ref.tell(actorMessage, ActorRef.noSender()); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存工艺参数成功"); } - - - } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/ActorMessage.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/ActorMessage.java new file mode 100644 index 0000000..fe5f51a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/ActorMessage.java @@ -0,0 +1,33 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ActorMessage { + + @ApiParam("用户名称") + private String userName; + @ApiParam("组织代码") + private String organizeCode; + @ApiParam("组织名称") + private String organizeName; + @ApiParam("工作中心代码") + private String workCenterCode; + @ApiParam("工作单元代码") + private String workCellCode; + + private String areaCode; + + private String craftCode; + + private String processCode; + + private String produceSnJson; + + private String equipmentCode; + + private Integer equipId; +}