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

tags/yfai-pcn-ext-v1.0
administrator 11 months ago
commit 9b421f4ac9

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -76,4 +77,17 @@ public interface IMesProductionCustomContextStepService {
@ApiOperation(value = "获取生产线的当前班组班次信息") @ApiOperation(value = "获取生产线的当前班组班次信息")
MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode); MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "根据装配件规则ID获取可复用条码")
String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String assemblyNosortCfgId);
@ApiOperation(value = "根据设备代码获取可复用条码的个数")
Integer getRepeatAssemblySnCount(String organizeCode, String workCenterCode, String workCellCode, String equipmentCode);
@ApiOperation(value = "保存可复用条码到上下文")
Boolean saveRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyNosortContext productionAssemblyNosortContext);
@ApiOperation(value = "删除上下文可复用条码信息")
void deleteRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode);
} }

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportNoSortJob;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.Pager;
@ -23,8 +24,8 @@ import java.util.List;
public class TestController { public class TestController {
@Autowired @Autowired
private IMesEquipmentLogExtService mesEquipmentLogExtService; private IMesEquipmentLogExtService mesEquipmentLogExtService;
@Autowired
private MesReportNoSortJob mesReportNoSortJob;
@GetMapping("/equipment/log/query") @GetMapping("/equipment/log/query")
@ApiOperation(value = "查询设备交互") @ApiOperation(value = "查询设备交互")
public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) { public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) {
@ -37,4 +38,11 @@ public class TestController {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e); return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
} }
} }
@GetMapping("/reportOrder")
@ApiOperation(value = "报工")
public void reportOrder() {
mesReportNoSortJob.executeMesJob(null, null);
}
} }

@ -2,7 +2,16 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.init.ApplicationProperties; import cn.estsh.impp.framework.boot.init.ApplicationProperties;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -13,6 +22,7 @@ import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@ -29,13 +39,19 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
@Autowired @Autowired
private IMesWorkOrderService workOrderService; private IMesWorkOrderService workOrderService;
@Autowired
private MesProductionRecordRepository productionRecordRao;
public MesReportNoSortJob() { public MesReportNoSortJob() {
super(MesReportNoSortJob.class, "非排序报工JOB"); super(MesReportNoSortJob.class, "非排序报工JOB");
} }
@Override @Override
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
String jobParam = this.getJobParam(); JSONObject jsonObject= new JSONObject();
JSONObject jsonObject= JSONUtil.parseObj(jobParam);
jsonObject.putIfAbsent("organizeCode", "CK01");
jsonObject.putIfAbsent("userName", "job");
String organizeCode = jsonObject.getStr("organizeCode"); String organizeCode = jsonObject.getStr("organizeCode");
String userName = jsonObject.getStr("userName"); String userName = jsonObject.getStr("userName");
if (null == organizeCode){ if (null == organizeCode){
@ -46,6 +62,31 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
userName = "JOB"; userName = "JOB";
} }
List<MesProduceSn> unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode); List<MesProduceSn> unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode);
workOrderService.doProductReport(unReportMesProduceSn,organizeCode,userName); for (MesProduceSn mesProduceSn : unReportMesProduceSn) {
try {
workOrderService.doProductReport(Arrays.asList(mesProduceSn), organizeCode, userName);
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
updateProductionRecord(organizeCode, userName, mesProduceSn);
} catch (ImppBusiException e) {
LOGGER.error("条码:{}报工失败", mesProduceSn.getProductSn(), e.getErrorDetail());
updateProductionRecord(organizeCode, userName, mesProduceSn, e.getErrorDetail());
continue;
}
}
}
private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() },ddlPackBean);
}
private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn, String errorMsg) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean);
productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus", "remark"},
new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue(), errorMsg },ddlPackBean);
} }
} }

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesAssemblyExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesAssemblyExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
@ -39,6 +40,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
@Autowired @Autowired
private MesAssemblyNosortCfgRepository assemblyNosortCfgRepository; private MesAssemblyNosortCfgRepository assemblyNosortCfgRepository;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
//【排序线】获取生产工单装配件绑定记录 //【排序线】获取生产工单装配件绑定记录
@Override @Override
public List<MesProductionAssemblySortContext> getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext) { public List<MesProductionAssemblySortContext> getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext) {
@ -111,7 +115,10 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = new ArrayList<>(); List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = new ArrayList<>();
assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(new MesProductionAssemblyNosortContext().copy(o, prodRuleContext))); //遍历装配件规则, 实例化装配件清单对象, 判断是否配置可复用
assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(
new MesProductionAssemblyNosortContext().copy(prodRuleContext, o, getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), o)))
);
return productionAssemblyNosortContextList; return productionAssemblyNosortContextList;
@ -164,4 +171,13 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
return CollectionUtils.isEmpty(productionAssemblyMap) ? null : productionAssemblyMap.get(id); return CollectionUtils.isEmpty(productionAssemblyMap) ? null : productionAssemblyMap.get(id);
} }
//验证装配件规则对应的ID是否存在可复用装配件条码
private String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesAssemblyNosortCfg assemblyNosortCfg) {
if (null == assemblyNosortCfg || StringUtils.isEmpty(assemblyNosortCfg.getIsRepeat()) || assemblyNosortCfg.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) return null;
return productionCustomContextStepService.getRepeatAssemblySn(organizeCode, workCenterCode, workCellCode, assemblyNosortCfg.getId().toString());
}
} }

@ -7,6 +7,7 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.bean.*;
@ -223,18 +224,20 @@ public class MesWorkOrderService implements IMesWorkOrderService {
List<MesProduceSn> mesProduceSnList = new ArrayList<>(); List<MesProduceSn> mesProduceSnList = new ArrayList<>();
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单 //1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean); List<Integer> statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList());
DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean);
DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
List<MesProductionRecord> mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 5);
if (mesProductionRecordList.isEmpty()){ if (mesProductionRecordList.isEmpty()){
return mesProduceSnList; return mesProduceSnList;
} }
//2.根据工单查询工单下的mesProduceSn //2.根据工单查询工单下的mesProduceSn
MesProductionRecord mesProductionRecord = mesProductionRecordList.get(0); List<String> workOrderNoList = mesProductionRecordList.stream().map(MesProductionRecord::getWorkOrderNo).collect(Collectors.toList());
//工单号 //工单号
String workOrderNo = mesProductionRecord.getWorkOrderNo();
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo,"workOrderNo",snPackBean); DdlPreparedPack.getInPackList(workOrderNoList,"workOrderNo",snPackBean);
return mesProduceSnRao.findByHqlWhere(snPackBean); return mesProduceSnRao.findByHqlWhere(snPackBean);
} }

@ -57,7 +57,7 @@ public class MesEquipmentLogExtService implements IMesEquipmentLogExtService {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipId) || CollectionUtils.isEmpty(equipVariableIdList)) return; if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipId) || CollectionUtils.isEmpty(equipVariableIdList)) return;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean); DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean);
if (!CollectionUtils.isEmpty(equipVariableIdList) && equipVariableIdList.size() == 1) DdlPreparedPack.getNumEqualPack(equipVariableIdList.get(0), MesPcnExtConstWords.EQUIP_VARIABLE_ID, packBean); if (!CollectionUtils.isEmpty(equipVariableIdList) && equipVariableIdList.size() == 1 ) DdlPreparedPack.getNumEqualPack(equipVariableIdList.get(0), MesPcnExtConstWords.EQUIP_VARIABLE_ID, packBean);
else DdlPreparedPack.getInPackList(equipVariableIdList, MesPcnExtConstWords.EQUIP_VARIABLE_ID, packBean); else DdlPreparedPack.getInPackList(equipVariableIdList, MesPcnExtConstWords.EQUIP_VARIABLE_ID, packBean);
equipmentLogRepository.updateByProperties(new String[]{MesPcnExtConstWords.EQUIP_VARIABLE_STATUS}, new Object[]{MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue()}, packBean); equipmentLogRepository.updateByProperties(new String[]{MesPcnExtConstWords.EQUIP_VARIABLE_STATUS}, new Object[]{MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue()}, packBean);
} }

@ -41,6 +41,9 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService {
private IMesProductionDispatchContextStepService productionDispatchContextStepService; private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired @Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
@Autowired @Autowired
@ -168,23 +171,32 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService {
if (null == productionAssemblyNosortContext) continue; if (null == productionAssemblyNosortContext) continue;
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) { //非扫描模式 或者 扫描模式情况下非可复用件
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) != 0 ||
(StringUtils.isEmpty(productionAssemblyNosortContext.getIsRepeat()) || productionAssemblyNosortContext.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) {
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {
//已被消费 //已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
//匹配规则 //匹配规则
List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>) List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>)
numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList())); numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList()));
//匹配失败 //匹配失败
if (CollectionUtils.isEmpty(filterList)) continue; if (CollectionUtils.isEmpty(filterList)) continue;
//装配件清单该数据标记已装配 //装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue()); productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue());
}
} }
String getRepeatAssemblySn = getRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyNosortContext);
if (!StringUtils.isEmpty(getRepeatAssemblySn)) productionAssemblyNosortContext.assemblyStatus().assemblySn(getRepeatAssemblySn);
//判断当前装配件规则是否被成功匹配条码 //判断当前装配件规则是否被成功匹配条码
if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break; if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break;
@ -216,5 +228,16 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService {
} }
//验证装配件规则对应的ID是否存在可复用装配件条码
private String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyNosortContext productionAssemblyNosortContext) {
if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) return null;
if (null == productionAssemblyNosortContext || StringUtils.isEmpty(productionAssemblyNosortContext.getIsRepeat()) || productionAssemblyNosortContext.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) return null;
return productionCustomContextStepService.getRepeatAssemblySn(organizeCode, workCenterCode, workCellCode, productionAssemblyNosortContext.getSourceId().toString());
}
} }

@ -123,8 +123,8 @@ public class MesAssemblyReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//匹配读取的装配件的有效性 //匹配读取的装配件的有效性
matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); matchAssemblySnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; 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.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
@ -41,6 +42,9 @@ public class MesAssemblySaveNosortStepService extends BaseStepService {
private IMesProductionDispatchContextStepService productionDispatchContextStepService; private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired @Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository; private MesProductionAssemblyRepository productionAssemblyRepository;
@Autowired @Autowired
@ -139,6 +143,9 @@ public class MesAssemblySaveNosortStepService extends BaseStepService {
if (!StringUtils.isEmpty(productionAssemblyNosortContext.getProductSnId())) productSnId.add(productionAssemblyNosortContext.getProductSnId()); if (!StringUtils.isEmpty(productionAssemblyNosortContext.getProductSnId())) productSnId.add(productionAssemblyNosortContext.getProductSnId());
if (productionAssemblyNosortContext.getIsRepeat2Cache().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)
productionCustomContextStepService.saveRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyNosortContext);
} }
} }

@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepServi
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; 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.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; 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.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -94,14 +95,19 @@ public class MesAssemblyScanStepService extends BaseStepService {
//没有加工规则代表需要反向匹配出加工规则, 需要根据设备腔数直接批量扫描 生成零件号 //没有加工规则代表需要反向匹配出加工规则, 需要根据设备腔数直接批量扫描 生成零件号
if (CollectionUtils.isEmpty(prodRuleContextList)) { if (CollectionUtils.isEmpty(prodRuleContextList)) {
//获取上下文生产扫/读信息:装配件条码 //根据设备代码获取可复用条码的个数
Integer count = productionCustomContextStepService.getRepeatAssemblySnCount(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode());
//获取上下文生产扫/读信息:装配件条码
List<MesEquipVariableCollectContext> cachedEquipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean); List<MesEquipVariableCollectContext> cachedEquipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean);
//删除上下文扫/读信息:装配件条码 //删除上下文扫/读信息:装配件条码
productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean); productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList) && cachedEquipVariableCollectContextList.size() > needQty) Integer scanedQty = !CollectionUtils.isEmpty(cachedEquipVariableCollectContextList) ? cachedEquipVariableCollectContextList.size() : MesPcnExtConstWords.ZERO + count;
execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前上下文中的装配件条码数量[%s]已经超过设备腔数[%s]每腔个数[%s]配置,请重新扫描装配件条码!", cachedEquipVariableCollectContextList.size(), cellEquipContext.getCavity(), cellEquipContext.getBindQty()));
//判断当前已存在数量是否超过需要数量
if (scanedQty > needQty) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), String.format(
"当前上下文中的可复用条码数量[%s]加上装配件条码数量[%s]已经超过设备腔数[%s]每腔个数[%s]配置,请重新扫描装配件条码!", count, cachedEquipVariableCollectContextList.size(), cellEquipContext.getCavity(), cellEquipContext.getBindQty()));
if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList)) { if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList)) {
if (cachedEquipVariableCollectContextList.size() == needQty) equipVariableCollectContextList = cachedEquipVariableCollectContextList; if (cachedEquipVariableCollectContextList.size() == needQty) equipVariableCollectContextList = cachedEquipVariableCollectContextList;

@ -122,8 +122,8 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//验证头道模具号的有效性 //验证头道模具号的有效性
return doCheckFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); return doCheckFirstMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -115,8 +115,8 @@ public class MesMouldNoReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//验证模具号的有效性 //验证模具号的有效性
doCheckMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); doCheckMouldNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -113,8 +113,8 @@ public class MesProductResultReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//匹配加工结果 //匹配加工结果
matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); matchProductResult(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -116,8 +116,8 @@ public class MesProductSnReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//匹配读取的主条码的有效性 //匹配读取的主条码的有效性
return doMatchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); return doMatchProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -114,6 +114,7 @@ public class MesProductSnSaveStepService extends BaseStepService {
produceSn.setCraftCode(productionProcessContext.getCraftCode()); produceSn.setCraftCode(productionProcessContext.getCraftCode());
//TODO 获取下个工艺代码 //TODO 获取下个工艺代码
//produceSn.setNextCraftCode(); //produceSn.setNextCraftCode();
//TODO 重新覆盖打印模版
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()); produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());

@ -118,8 +118,8 @@ public class MesProductionPartNoReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//验证产出零件号的有效性 //验证产出零件号的有效性
return doCheckProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); return doCheckProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -109,8 +109,8 @@ public class MesReadySignalReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//匹配就绪信号有效性 //匹配就绪信号有效性
matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); matchReadySignal(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -77,7 +77,7 @@ public class MesSaveProcessResultStepService extends BaseStepService {
/** /**
* *
*/ */
mesProductResultErrorHandleStepService.execute(reqBean); // mesProductResultErrorHandleStepService.execute(reqBean);
/** /**
* *
*/ */

@ -77,6 +77,7 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService {
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList = new ArrayList<>(); List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList = new ArrayList<>();
Map<Integer, List<MesEquipmentProdParamCfg>> mesEquipmentVariableMap = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList); Map<Integer, List<MesEquipmentProdParamCfg>> mesEquipmentVariableMap = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList);
mesEquipmentVariableMap.forEach((k, v) -> { mesEquipmentVariableMap.forEach((k, v) -> {
v.stream().forEach(mesEquipmentProdParamCfg -> { v.stream().forEach(mesEquipmentProdParamCfg -> {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(); DdlPackBean packBean = DdlPackBean.getDdlPackBean();
@ -152,4 +153,6 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService {
} }
return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : 3; return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : 3;
} }
} }

@ -113,8 +113,8 @@ public class MesWorkOrderReadStepService extends BaseStepService {
//验证设备通信质量 //验证设备通信质量
productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s],持续监听中...", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
//匹配读取的加工单的有效性 //匹配读取的加工单的有效性
matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);

@ -0,0 +1,171 @@
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.api.busi.IWriteVariableService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
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.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
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.repository.MesEquipmentProdParamCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository;
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.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service("mesWriteMainBarcodeCmdStepService")
public class MesWriteMainBarcodeCmdStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IWriteVariableService writeVariableService;
@Autowired
private MesEquipmentVariableRepository mesEquipmentVariableRepository;
@Autowired
private MesEquipmentProdParamCfgRepository mesEquipmentProdParamCfgRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//获取上下文加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "未找到加工规则,无需发送加工参数");
}
List<MesEquipmentVariable> mesEquipmentVariableList = new ArrayList<>();
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList = new ArrayList<>();
Map<Integer, List<MesEquipmentProdParamCfg>> mesEquipmentVariableMap = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList);
// 过滤掉非条码的
mesEquipmentVariableMap = filterMsg(mesEquipmentVariableMap);
mesEquipmentVariableMap.forEach((k, v) -> {
v.stream().forEach(mesEquipmentProdParamCfg -> {
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesEquipmentProdParamCfg.getEquipVariableId(), "id", packBean);
MesEquipmentVariable mesEquipmentVariable = mesEquipmentVariableRepository.getByProperty(packBean);
if (mesEquipmentVariable == null) {
return;
}
mesEquipmentVariableList.add(mesEquipmentVariable);
mesEquipmentProdParamCfgList.add(mesEquipmentProdParamCfg);
execSendEquipParamsCmd(reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), k, stepParamMap);
});
});
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "发送加工参数成功");
}
/**
*
* @param reqBean
* @param prodRuleContextList
* @param mesEquipmentProdParamCfgList
* @return
*/
private Map<Integer, List<MesEquipmentProdParamCfg>> getMesEquipmentProdParamCfgs(StationRequestBean reqBean, List<MesProdRuleContext> prodRuleContextList, List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList) {
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
Map<Integer, List<MesEquipmentProdParamCfg>> map = new HashMap<>();
for (MesProdRuleContext mesProdRuleContext : prodRuleContextList) {
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgs= new ArrayList<>();
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
// 获取加工参数
if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()){
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesProdRuleContext.getPid(), "sourceId", ddlPackBean);
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean);
} else {
MesWorkCenter mesWorkCenter = new MesWorkCenter();
mesWorkCenter.setWorkCenterCode(reqBean.getWorkCenterCode());
List<MesProductionAssemblyContext> assemblyDataContext = mesProdRuleContext.getAssemblyDataContext(mesWorkCenter);
List<Long> sourceIds = assemblyDataContext.stream().map(MesProductionAssemblyContext::getSourceId).collect(Collectors.toList());
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(sourceIds, "sourceId", ddlPackBean);
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean);
}
if (!CollectionUtils.isEmpty(mesEquipmentProdParamCfgs)) {
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgs.stream().distinct().collect(Collectors.toList());
}
map.put(mesProdRuleContext.getForeignKey(), mesEquipmentProdParamCfgs);
}
return map;
}
private void execSendEquipParamsCmd(StationRequestBean reqBean,
String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey, Optional<Map<String, MesProdRouteOptParam>> stepParamMap) {
//最大重试次数[工步参数]
Integer maxRetryTimes = getMaxRetryTimes(stepParamMap);
writeVariableService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey, null, maxRetryTimes);
}
//最大重试次数[工步参数]
private Integer getMaxRetryTimes(Optional<Map<String, MesProdRouteOptParam>> stepParamMap) {
Integer maxRetryTimes = null;
try {
maxRetryTimes = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.MAX_RETRY_TIMES)) ? Integer.valueOf(stepParamMap.get().get(MesPcnExtConstWords.MAX_RETRY_TIMES).getParamValue()) : null;
} catch (NumberFormatException e) {
}
return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : 3;
}
private Map<Integer, List<MesEquipmentProdParamCfg>> filterMsg(Map<Integer, List<MesEquipmentProdParamCfg>> map){
if (CollectionUtils.isEmpty(map)) {
return null;
}
map.forEach((k,v) -> {
v = v.stream().filter(cfg -> StringUtils.isEmpty(cfg.getMatchRule()) && cfg.getMatchRule()
.toUpperCase().startsWith("BARCODE")).collect(Collectors.toList()); });
return map;
}
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
@ -229,4 +230,39 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT); deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT);
} }
//工位加工锁KEY
private String getRepeatAssemblySnContextKey(String organizeCode, String workCenterCode, String workCellCode) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.REPEAT_ASSEMBLY_SN_CONTEXT).add(workCenterCode).add(workCellCode).toString();
}
//根据装配件规则ID获取可复用条码
@Override
public String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String assemblyNosortCfgId) {
String repeatAssemblySnJson = getFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), assemblyNosortCfgId);
MesProductionAssemblyNosortContext productionAssemblyNosortContext = !StringUtils.isEmpty(repeatAssemblySnJson) ? JSONObject.parseObject(repeatAssemblySnJson, MesProductionAssemblyNosortContext.class) : null;
return null != productionAssemblyNosortContext ? productionAssemblyNosortContext.getAssemblySn() : null;
}
//根据设备代码获取可复用条码的个数
@Override
public Integer getRepeatAssemblySnCount(String organizeCode, String workCenterCode, String workCellCode, String equipmentCode) {
String countStr = getFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), equipmentCode);
return !StringUtils.isEmpty(countStr) ? Integer.valueOf(countStr) : MesPcnExtConstWords.ZERO;
}
//根据装配件规则ID获取可复用条码
@Override
public Boolean saveRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyNosortContext productionAssemblyNosortContext) {
Integer count = getRepeatAssemblySnCount(organizeCode, workCenterCode, workCellCode, productionAssemblyNosortContext.getEquipmentCode()) + 1;
saveFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyNosortContext.getEquipmentCode(), count.toString());
return saveFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyNosortContext.getSourceId().toString(), JSONObject.toJSONString(productionAssemblyNosortContext));
}
//删除上下文可复用条码信息
@Override
public void deleteRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode) {
deleteFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode));
}
} }

@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepServi
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.process.BaseProcessMonitorService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.process.BaseProcessMonitorService;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -21,9 +22,22 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
@Autowired @Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService; private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Override @Override
public Boolean doProcessStart(StationRequestBean requestBean) { public Boolean doProcessStart(StationRequestBean requestBean) {
return super.doProcessStart(requestBean);
Long mouldId = snowflakeIdMaker.nextId();
return true;
} }
@Override @Override

@ -61,6 +61,12 @@ public class MesProductionAssemblyContext implements Serializable {
@ApiParam(value = "装备序号") @ApiParam(value = "装备序号")
public Integer routeSeq; public Integer routeSeq;
@ApiParam(value = "装配爆炸图FID")
private Long imageFileId;
@ApiParam(value = "音频文件")
private Long audioFileId;
@ApiParam("组织代码") @ApiParam("组织代码")
public String organizeCode; public String organizeCode;

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context; package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesAssemblyNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesAssemblyNosortCfg;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
@ -24,15 +25,21 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
@ApiParam(value = "是否可复用条码") @ApiParam(value = "是否可复用条码")
private Integer isRepeat; private Integer isRepeat;
@ApiParam(value = "是否可复用条码是否写入上下文进行复用")
private Integer isRepeat2Cache = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
@ApiParam(value = "是否忽略回车") @ApiParam(value = "是否忽略回车")
private Integer isIgnoreEntry; private Integer isIgnoreEntry;
@ApiParam(value = "工序用量") @ApiParam(value = "工序用量")
private Integer qty; private Integer qty;
@ApiParam(name = "产成品图")
private String outPartNoPic;
public MesProductionAssemblyNosortContext() {} public MesProductionAssemblyNosortContext() {}
public MesProductionAssemblyNosortContext copy(MesAssemblyNosortCfg assemblyNosortCfg, MesProdRuleContext prodRuleContext) { public MesProductionAssemblyNosortContext copy(MesProdRuleContext prodRuleContext, MesAssemblyNosortCfg assemblyNosortCfg, String assemblySn) {
BeanUtils.copyProperties(assemblyNosortCfg, this); BeanUtils.copyProperties(assemblyNosortCfg, this);
BeanUtils.copyProperties(prodRuleContext, this); BeanUtils.copyProperties(prodRuleContext, this);
this.sourceId = assemblyNosortCfg.getId(); this.sourceId = assemblyNosortCfg.getId();
@ -41,6 +48,11 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue(); this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue();
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == this.matchType || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == this.matchType) if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_50.getValue() == this.matchType || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_60.getValue() == this.matchType)
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(); this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
if (!StringUtils.isEmpty(assemblySn)) {
this.assemblySn = assemblySn;
this.isRepeat2Cache = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
}
return this; return this;
} }

@ -67,9 +67,6 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
@ApiParam(value = "SAP目标库位") @ApiParam(value = "SAP目标库位")
private String destErpLocation; private String destErpLocation;
@ApiParam(value = "装配爆炸图FID")
private Long imageFileId;
@ApiParam(value = "条码打印方式") @ApiParam(value = "条码打印方式")
private Integer printType; private Integer printType;
@ -82,9 +79,6 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
@ApiParam(value = "是否启动组合条码") @ApiParam(value = "是否启动组合条码")
private String isCombineSn; private String isCombineSn;
@ApiParam(value = "音频文件")
private Long audioFileId;
@ApiParam(value = "逻辑数量") @ApiParam(value = "逻辑数量")
private Double logicNum; private Double logicNum;

@ -279,4 +279,5 @@ public class MesProductionProcessContext implements Serializable {
this.cavityGroupDetailJson = JSONObject.toJSONString(mesCavityGroupDetailCfgs); this.cavityGroupDetailJson = JSONObject.toJSONString(mesCavityGroupDetailCfgs);
return this.isNeedCache(); return this.isNeedCache();
} }
} }

@ -269,6 +269,8 @@ public class MesPcnExtConstWords {
public static final String PROD_SHIFT_DATA_CONTEXT = "PROD_SHIFT_DATA_CONTEXT"; public static final String PROD_SHIFT_DATA_CONTEXT = "PROD_SHIFT_DATA_CONTEXT";
// 上下文: 加工统计信息 // 上下文: 加工统计信息
public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT"; public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT";
// 可复用装配件条码上下文
public static final String REPEAT_ASSEMBLY_SN_CONTEXT = "REPEAT_ASSEMBLY_SN_CONTEXT";
// 上下文: 展示组件数据 // 上下文: 展示组件数据
public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT"; public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";

Loading…
Cancel
Save