装配件发送爆炸图 音频文件到客户端

tags/yfai-pcn-ext-v1.0
王杰 10 months ago
parent 9795b07de1
commit 869132254e

@ -10,9 +10,11 @@ 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.MesAssemblyNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesFile;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly;
import cn.estsh.i3plus.pojo.mes.repository.MesAssemblyNosortCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesFileRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -43,6 +45,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesFileRepository fileRepository;
//【排序线】获取生产工单装配件绑定记录
@Override
public List<MesProductionAssemblySortContext> getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext) {
@ -57,13 +62,16 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
if (CollectionUtils.isEmpty(workOrderAssemblyList)) return null;
//获取排序FILE文件URL
Map<Long, String> fileMap = getFileMap(prodRuleContext.getOrganizeCode(), filterSortFileIdList(workOrderAssemblyList));
//获取装配件绑定记录
Map<Long, MesProductionAssembly> productionAssemblyMap = groupProductionAssembly(filterProductionAssemblyList(getProductionAssemblyList(
prodRuleContext.getOrganizeCode(), MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.SORT.getValue(), workOrderAssemblyList.stream().filter(o -> null != o).map(MesWorkOrderAssembly::getId).collect(Collectors.toList()))));
List<MesProductionAssemblySortContext> productionAssemblySortContextList = new ArrayList<>();
workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId()))));
workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId())).fileUrl(fileMap)));
return productionAssemblySortContextList;
}
@ -113,11 +121,14 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
if (CollectionUtils.isEmpty(assemblyNosortCfgList)) return null;
//获取非排序FILE文件URL
Map<Long, String> fileMap = getFileMap(prodRuleContext.getOrganizeCode(), filterNosortFileIdList(assemblyNosortCfgList));
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = new ArrayList<>();
//遍历装配件规则, 实例化装配件清单对象, 判断是否配置可复用
assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(
new MesProductionAssemblyNosortContext().copy(prodRuleContext, o, getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), o)))
new MesProductionAssemblyNosortContext().copy(prodRuleContext, o, getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), o)).fileUrl(fileMap))
);
return productionAssemblyNosortContextList;
@ -200,4 +211,39 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
}
//搜集非排序文件ID集合
private List<Long> filterNosortFileIdList(List<MesAssemblyNosortCfg> assemblyNosortCfgList) {
if (CollectionUtils.isEmpty(assemblyNosortCfgList)) return null;
List<Long> imageFileIdList = assemblyNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getImageFileId()))).map(MesAssemblyNosortCfg::getImageFileId).collect(Collectors.toList());
List<Long> audioFileIdList = assemblyNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getAudioFileId()))).map(MesAssemblyNosortCfg::getAudioFileId).collect(Collectors.toList());
return filterFileIdList(imageFileIdList, audioFileIdList);
}
//搜集排序文件ID集合
private List<Long> filterSortFileIdList(List<MesWorkOrderAssembly> workOrderAssemblyList) {
if (CollectionUtils.isEmpty(workOrderAssemblyList)) return null;
List<Long> imageFileIdList = workOrderAssemblyList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getImageFileId()))).map(MesWorkOrderAssembly::getImageFileId).collect(Collectors.toList());
List<Long> audioFileIdList = workOrderAssemblyList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getAudioFileId()))).map(MesWorkOrderAssembly::getAudioFileId).collect(Collectors.toList());
return filterFileIdList(imageFileIdList, audioFileIdList);
}
//搜集文件ID集合
private List<Long> filterFileIdList(List<Long> imageFileIdList, List<Long> audioFileIdList) {
if (!CollectionUtils.isEmpty(imageFileIdList) && CollectionUtils.isEmpty(audioFileIdList)) return imageFileIdList;
if (CollectionUtils.isEmpty(imageFileIdList) && !CollectionUtils.isEmpty(audioFileIdList)) return audioFileIdList;
imageFileIdList.addAll(audioFileIdList);
return imageFileIdList;
}
//获取FILE文件URL
private Map<Long, String> getFileMap(String organizeCode, List<Long> fileIdList) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(fileIdList)) return null;
fileIdList = fileIdList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (fileIdList.size() == 1) DdlPreparedPack.getNumEqualPack(fileIdList.get(0), MesPcnExtConstWords.ID, packBean);
DdlPreparedPack.getInPackList(fileIdList, MesPcnExtConstWords.ID, packBean);
List<MesFile> fileDbList = fileRepository.findByHqlWhere(packBean);
return CollectionUtils.isEmpty(fileIdList) ? null : fileDbList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getFileUrl()))).collect(Collectors.toMap(MesFile::getId, MesFile::getFileUrl));
}
}

@ -7,11 +7,14 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -74,6 +77,9 @@ public class MesAssemblyScanStepService extends BaseStepService {
if (!CollectionUtils.isEmpty(prodRuleContextList) && !checkIsNeedScanAssembly(prodRuleContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工规则未配置装配件扫描项,当前无需扫描装配件条码!");
//处理装配件的装配爆炸图和音频文件
doHandleAssemblyFile(reqBean, productionProcessContext.getWorkCenter(), prodRuleContextList);
//验证当前是否需要读装配件条码: 验证是否存在待绑定数据 【当前验证只能对内部触发生效】
if (!CollectionUtils.isEmpty(prodRuleContextList) && !hasUnBindAssembly(prodRuleContextList))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工规则对应的装配件清单已扫描完毕,当前无需扫描装配件条码!");
@ -129,6 +135,66 @@ public class MesAssemblyScanStepService extends BaseStepService {
}
//处理装配件的装配爆炸图和音频文件
private void doHandleAssemblyFile(StationRequestBean reqBean, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList) {
Boolean isSendFile = false;
Boolean isBreakLoop = false;
LOOP:
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()) {
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
if (null == productionAssemblyNosortContext ||
productionAssemblyNosortContext.getFileIsFinished().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 ||
productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue()) == 0 ||
(StringUtils.isEmpty(productionAssemblyNosortContext.getImageFileUrl()) && StringUtils.isEmpty(productionAssemblyNosortContext.getAudioFileUrl()))) continue;
//不扫描的默认直接直接标记绿色已装配, 但是文件也需要发送
if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue()) != 0) isBreakLoop = true;
isSendFile = true;
//发送文件到客户端
sendFile(reqBean, productionAssemblyNosortContext.fileIsFinished());
if (isBreakLoop) break LOOP;
}
prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList);
} else {
List<MesProductionAssemblySortContext> productionAssemblySortContextList = prodRuleContext.getSortAssemblyDataContext();
for (MesProductionAssemblySortContext productionAssemblySortContext : productionAssemblySortContextList) {
if (null == productionAssemblySortContext ||
productionAssemblySortContext.getFileIsFinished().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 ||
productionAssemblySortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue()) == 0 ||
(StringUtils.isEmpty(productionAssemblySortContext.getImageFileUrl()) && StringUtils.isEmpty(productionAssemblySortContext.getAudioFileUrl()))) continue;
//不扫描的默认直接直接标记绿色已装配, 但是文件也需要发送
if (productionAssemblySortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue()) != 0) isBreakLoop = true;
isSendFile = true;
//发送文件到客户端
sendFile(reqBean, productionAssemblySortContext.fileIsFinished());
if (isBreakLoop) break LOOP;
}
prodRuleContext.assemblyDataJson(productionAssemblySortContextList);
}
}
//保存上下文产品加工规则信息集合
if (isSendFile) productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
}
//发送文件到客户端
private void sendFile(StationRequestBean reqBean, MesProductionAssemblyContext productionAssemblyContext) {
if (!StringUtils.isEmpty(productionAssemblyContext.getImageFileUrl()))
this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue())
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CUSTOM_CONTENT.getValue())
.dataType(MesPcnEnumUtil.STATION_DATA_TYPE.IMAGE.getValue())
.customPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_ASSEMBLY)
.message(String.format("装配件信息来源ID[%s],装配件爆炸图URL[%s]", productionAssemblyContext.getSourceId(), productionAssemblyContext.getImageFileUrl()))
.resultObj(new JSONObject().put(MesPcnExtConstWords.URL, productionAssemblyContext.getImageFileUrl())));
if (!StringUtils.isEmpty(productionAssemblyContext.getAudioFileUrl()))
this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue())
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue())
.dataType(MesPcnEnumUtil.STATION_DATA_TYPE.SOUND.getValue())
.message(String.format("装配件信息来源ID[%s],装配件音频文件URL[%s]", productionAssemblyContext.getSourceId(), productionAssemblyContext.getAudioFileUrl()))
.resultObj(new JSONObject().put(MesPcnExtConstWords.URL, productionAssemblyContext.getAudioFileUrl())));
}
//判断是否存在装配件清单
private Boolean checkIsNeedScanAssembly(List<MesProdRuleContext> prodRuleContextList) {
Optional<MesProdRuleContext> optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getAssemblyDataJson()))).findFirst();
@ -143,12 +209,14 @@ public class MesAssemblyScanStepService extends BaseStepService {
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
Optional<MesProductionAssemblyNosortContext> optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) continue;
hasUnBindAssembly = true;
break;
}
return hasUnBindAssembly;
}
//封装当前扫描的装配件信息
private List<MesEquipVariableCollectContext> getAssemblySnJson(StationRequestBean reqBean, String scanInfo) {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();

@ -437,7 +437,8 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null;
List<MesAssemblyShowContext> assemblyShowContextList = new ArrayList<>();
for (MesProductionAssemblyContext item : productionAssemblyContextList) {
if (null == item) continue;
//仅目视的不显示出来
if (null == item || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == item.getMatchType()) continue;
assemblyShowContextList.add(assemblyShowContext(item));
}

@ -164,7 +164,8 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null;
List<MesAssemblyShowContext> assemblyShowContextList = new ArrayList<>();
for (MesProductionAssemblyContext item : productionAssemblyContextList) {
if (null == item) continue;
//仅目视的不显示出来
if (null == item || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == item.getMatchType()) continue;
assemblyShowContextList.add(assemblyShowContext(item));
}
assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList());

@ -123,9 +123,9 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
}
//查询工艺路线数据
private void doHandleProdCraftData(StationRequestBean reqBean, MesWorkCenter workCenter, String o, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) {
List<MesCraftRouteDetail> craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, workCenter.getCenterType(), o);
if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList);
private void doHandleProdCraftData(StationRequestBean reqBean, MesWorkCenter workCenter, String partNo, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) {
List<MesCraftRouteDetail> craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, workCenter.getCenterType(), partNo);
if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(partNo, craftRouteDetailList);
}
//验证是否存在工艺强过码, 存在则保存 并返回强过的主条码

@ -60,7 +60,7 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
//客户端下线
@Override
public Boolean doOffLine(StationRequestBean requestBean) {
//删除当前状态点
//删除当前工步集
fsmCommonService.doFlushCache(requestBean);
//清除上下文中的所有业务数据
productionDispatchContextStepService.doFlushProductionDispatchContext(requestBean);
@ -69,7 +69,7 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
return true;
}
//工位流程重置 【父类已经调用: 删除当前状态点; 清除工位工序流程; TASK_COMPLETE】
//工位流程重置 【父类已经调用: 删除当前工步集; 清除工位工序流程; TASK_COMPLETE】
@Override
public Boolean fsmReset(StationRequestBean requestBean) {
//清除上下文中的所有业务数据

@ -15,7 +15,7 @@ public class MesProductionAssemblyContext implements Serializable {
private static final long serialVersionUID = 2382117884422723639L;
@ApiParam("生产工单号")
private String workOrderNo;
public String workOrderNo;
@ApiParam("装配件零件编码")
public String assemblyPartNo;
@ -66,13 +66,22 @@ public class MesProductionAssemblyContext implements Serializable {
public Integer routeSeq;
@ApiParam(value = "装配爆炸图FID")
private Long imageFileId;
public Long imageFileId;
@ApiParam(value = "音频文件")
private Long audioFileId;
public Long audioFileId;
@ApiParam(value = "装配爆炸图URL")
public String imageFileUrl;
@ApiParam(value = "音频文件URL")
public String audioFileUrl;
@ApiParam(value = "装配爆炸图URL")
public Integer fileIsFinished = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
@ApiParam("前道工艺代码")
private String preCraftCode;
public String preCraftCode;
@ApiParam("组织代码")
public String organizeCode;

@ -7,9 +7,11 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.Map;
/**
* -()
@ -102,4 +104,16 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
return this;
}
public MesProductionAssemblyNosortContext fileUrl(Map<Long, String> fileMap) {
if (CollectionUtils.isEmpty(fileMap)) return this;
if (!StringUtils.isEmpty(this.imageFileId)) this.imageFileUrl= fileMap.get(this.imageFileId);
if (!StringUtils.isEmpty(this.audioFileId)) this.audioFileUrl= fileMap.get(this.audioFileId);
return this;
}
public MesProductionAssemblyNosortContext fileIsFinished() {
this.fileIsFinished = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
}

@ -8,9 +8,11 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.Map;
/**
* -
@ -132,4 +134,16 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
return this;
}
public MesProductionAssemblySortContext fileUrl(Map<Long, String> fileMap) {
if (CollectionUtils.isEmpty(fileMap)) return this;
if (!StringUtils.isEmpty(this.imageFileId)) this.imageFileUrl= fileMap.get(this.imageFileId);
if (!StringUtils.isEmpty(this.audioFileId)) this.audioFileUrl= fileMap.get(this.audioFileId);
return this;
}
public MesProductionAssemblySortContext fileIsFinished() {
this.fileIsFinished = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
}

@ -151,6 +151,8 @@ public class MesPcnExtConstWords {
public static final String STEP_CODE = "stepCode";
// 生产顺序号
public static final String PRODUCE_SEQ = "produceSeq";
// URL
public static final String URL = "url";
// 时间格式
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@ -271,12 +273,15 @@ public class MesPcnExtConstWords {
//过程条码默认生成规则
public static final String DEFAULT_SERIAL_NUMBER_RULE = "DEFAULT_SERIAL_NUMBER_RULE";
// 定制页面名称(默认)
// 定制页面名称(默认 产出零件)
public static final String CUSTOM_PAGE_NAME_DEFAULT = "CUSTOM_PAGE_NAME_DEFAULT";
// 定制页面名称(默认)
// 定制页面名称(工位)
public static final String CUSTOM_PAGE_NAME_WORK_CELL = "CUSTOM_PAGE_NAME_WORK_CELL";
// 定制页面名称(装配件)
public static final String CUSTOM_PAGE_NAME_ASSEMBLY = "CUSTOM_PAGE_NAME_ASSEMBLY";
// 上个扫描信息
public static final String CLIENT_INFO = "clientInfo";
// 上个扫描信息

Loading…
Cancel
Save