工位扫描日志 增加策略

tags/yfai-pcn-ext-v1.4
王杰 9 months ago
parent fd2cf6d695
commit cadf719f0a

@ -0,0 +1,158 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.equiplog;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesScanMonitorContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.swslog.ISwsWriteDbLogService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
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.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCellScanMonitorLog;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellScanMonitorLogRepository;
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.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MesWorkCellScanMonitorLogExt2Service implements ISwsWriteDbLogService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesWorkCellScanMonitorLogRepository workCellScanMonitorLogRepository;
private final static Map<String, List<String>> cellMsg2RepeatMap = new ConcurrentHashMap();
@Override
public void doWriteDbLog(StationResultBean resultBean) {
//获取上下文工位扫描监控信息
MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.getScanMonitorContext(resultBean.getOrganizeCode(), resultBean.getWorkCenterCode(), resultBean.getWorkCellCode());
if (checkRepeat(resultBean, scanMonitorContext)) return;
MesWorkCellScanMonitorLog workCellScanMonitorLog = new MesWorkCellScanMonitorLog();
if (null != scanMonitorContext) BeanUtils.copyProperties(scanMonitorContext, workCellScanMonitorLog);
else log.info("工厂{}生产线{}工位{}: MesWorkCellScanMonitorLogExt2Service --- 上下文当前不存在工位扫描监控信息 --- {}", resultBean.getOrganizeCode(), resultBean.getWorkCenterCode(), resultBean.getWorkCellCode(), resultBean.toWriteDbString());
BeanUtils.copyProperties(resultBean, workCellScanMonitorLog);
workCellScanMonitorLog.setMessageType(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_MESSAGE_TYPE.codeOfValue(resultBean.getDataType()));
workCellScanMonitorLog.setOrgWorkCode(new StringJoiner(MesPcnExtConstWords.E_UNDERLINE).add(workCellScanMonitorLog.getOrganizeCode()).add(workCellScanMonitorLog.getWorkCenterCode()).toString());
ConvertBean.serviceModelInitialize(workCellScanMonitorLog, resultBean.getUserInfo());
//存在开模ID的记录延迟同步
if (!StringUtils.isEmpty(workCellScanMonitorLog.getMouldRecordId())) {
workCellScanMonitorLog.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
workCellScanMonitorLog.setDealStatus(MesExtEnumUtil.MES_LOG_DEAL_STATUS.UNDEAL.getValue());
} else {
workCellScanMonitorLog.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
workCellScanMonitorLog.setDealStatus(MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_SUCCESS.getValue());
}
workCellScanMonitorLogRepository.insert(workCellScanMonitorLog);
}
private Boolean checkRepeat(StationResultBean resultBean, MesScanMonitorContext scanMonitorContext) {
initCellMsg2RepeatMap(resultBean);
Long mouldRecordId = null != scanMonitorContext ? scanMonitorContext.getMouldRecordId() : null;
String mouldRecordIdStr = !StringUtils.isEmpty(mouldRecordId) ? mouldRecordId.toString() : MesPcnExtConstWords.EMPTY;
if (!cellMsg2RepeatMap.get(resultBean.getClientInfo()).get(0).equals(mouldRecordIdStr)) {
cellMsg2RepeatMap.get(resultBean.getClientInfo()).clear();
cellMsg2RepeatMap.get(resultBean.getClientInfo()).add(0, mouldRecordIdStr);
//补偿数据
DdlPackBean packBean = DdlPackBean.getDdlPackBean(resultBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(resultBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.MES_LOG_DEAL_STATUS.UNDEAL.getValue(), MesPcnExtConstWords.DEAL_STATUS, packBean);
if (!StringUtils.isEmpty(mouldRecordId)) DdlPreparedPack.getNumNOEqualPack(mouldRecordId, MesPcnExtConstWords.MOULD_RECORD_ID, packBean);
int count = workCellScanMonitorLogRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.DEAL_STATUS},
new Object[]{CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_SUCCESS.getValue()},
packBean);
log.info("工厂{}生产线{}工位{}: MesWorkCellScanMonitorLogExt2Service --- 补偿同步条数:{} ---", resultBean.getOrganizeCode(), resultBean.getWorkCenterCode(), resultBean.getWorkCellCode(), count);
}
if (resultBean.getIsCheckRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) return false;
synchronized ((resultBean.getClientInfo() + this.getClass().getSimpleName()).intern()) {
if (cellMsg2RepeatMap.get(resultBean.getClientInfo()).contains(resultBean.getMessage())) return true;
cellMsg2RepeatMap.get(resultBean.getClientInfo()).add(resultBean.getMessage());
return false;
}
}
private void initCellMsg2RepeatMap(StationResultBean resultBean) {
cellMsg2RepeatMap.computeIfAbsent(resultBean.getClientInfo(), o -> {
List<String> list = new CopyOnWriteArrayList<>();
list.add(0, MesPcnExtConstWords.EMPTY);
return list;
});
}
@Override
public void doRestoreDbLog(StationResultBean resultBean) {
if (StringUtils.isEmpty(resultBean.getScanInfo()) || CollectionUtils.isEmpty(resultBean.getResultList())) return;
List<MesProductionPsOutContext> productionPsOutContextList = resultBean.getResultList();
String workOrderNo = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).map(MesProductionPsOutContext::getWorkOrderNo).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
String serialNumber = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getSerialNumber()))).map(MesProductionPsOutContext::getSerialNumber).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
String productSn = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProductSn()))).map(MesProductionPsOutContext::getProductSn).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
String custSn = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCustSn()))).map(MesProductionPsOutContext::getCustSn).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
String partNo = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsOutContext::getPartNo).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
String partName = productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartName()))).map(MesProductionPsOutContext::getPartName).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
DdlPackBean packBean = DdlPackBean.getDdlPackBean(resultBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(resultBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getNumEqualPack(Long.valueOf(resultBean.getScanInfo()), MesPcnExtConstWords.MOULD_RECORD_ID, packBean);
workCellScanMonitorLogRepository.updateByProperties(
new String[]{MesPcnExtConstWords.WORK_ORDER_NO, MesPcnExtConstWords.SERIAL_NUMBER, MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.CUST_SN,
MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PART_NAME, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.DEAL_STATUS},
new Object[]{workOrderNo, serialNumber, productSn, custSn,
partNo, partName, TimeTool.getNowTime(true), resultBean.getUserInfo(), MesExtEnumUtil.MES_LOG_DEAL_STATUS.DEAL_SUCCESS.getValue()},
packBean);
}
}

@ -97,20 +97,22 @@ public class MesTimeEfficientCfgMatchService implements IMesTimeEfficientCfgMatc
else
filterList = produceSnList.stream().filter(item -> item.getPartNo().equals(timeliness.getPartNo())).sorted(Comparator.comparing(MesProduceSn::getCreateDatetime).reversed()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) return backResultMap(resultMap, String.format("零件条码[%s]时效性零件号[%s]工艺[%s]验证失败,未查询到%s!", productSn, timeliness.getPartNo(), timeliness.getCraftCode(), !StringUtils.isEmpty(timeliness.getCraftCode()) ? "加工记录信息" : "零件条码信息"));
if (CollectionUtils.isEmpty(filterList)) return backResultMap(resultMap, String.format("零件条码[%s]时效性零件号[%s]工艺[%s]验证失败,未查询到%s!",
productSn, timeliness.getPartNo(), !StringUtils.isEmpty(timeliness.getCraftCode()) ? timeliness.getCraftCode() : MesPcnExtConstWords.EMPTY, !StringUtils.isEmpty(timeliness.getCraftCode()) ? "加工记录信息" : "零件条码信息"));
//不为空 则 需要校验时效性
String completeDateTime = !StringUtils.isEmpty(timeliness.getCraftCode()) ? ((MesProductionRecord) filterList.get(0)).getCompleteDateTime() : ((MesProduceSn) filterList.get(0)).getCreateDatetime();
Date productDateTime = sdf.parse(completeDateTime);
//时差
int minDiff = (int) ((now.getTime() - productDateTime.getTime())/(60 * 1000));
if (!checkTimeliness(timeliness, minDiff)) return backResultMap(resultMap, String.format("零件条码[%s]时效性零件号[%s]工艺[%s]验证失败!", productSn, timeliness.getPartNo(), timeliness.getCraftCode()));
if (!checkTimeliness(timeliness, minDiff)) return backResultMap(resultMap, String.format("零件条码[%s]时效性零件号[%s]工艺[%s]验证失败!",
productSn, timeliness.getPartNo(), !StringUtils.isEmpty(timeliness.getCraftCode()) ? timeliness.getCraftCode() : MesPcnExtConstWords.EMPTY));
}
return resultMap;
} catch (Exception e) {
return backResultMap(resultMap, String.format("零件条码[%s]时效性零件号[%s]工艺[%s]验证异常:%s!", productSn, e.toString()));
return backResultMap(resultMap, String.format("零件条码[%s]时效性验证异常:%s!", productSn, e.toString()));
}
}

Loading…
Cancel
Save