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

tags/yfai-pcn-ext-v1.0
jun 11 months ago
commit 3095105625

@ -20,7 +20,6 @@ public interface IMesEquipVariableRwExtService {
@ApiOperation(value = "写值") @ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag); MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag);
@ApiOperation(value = "写值") @ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(String value, MesEquipmentVariable equipmentVariable, String kepwareFlag); MesEquipVariableRwResult writeVariable(String value, MesEquipmentVariable equipmentVariable, String kepwareFlag);
} }

@ -42,15 +42,6 @@ public interface IMesProductionCustomContextStepService {
@ApiOperation(value = "发送工步内容") @ApiOperation(value = "发送工步内容")
void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> resultList); void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> resultList);
@ApiOperation(value = "获取手动选择的腔数及工单信息上下文")
List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean);
@ApiOperation(value = "保存选择/扫描/读取的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]")
Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList);
@ApiOperation(value = "删除手动选择的腔数及工单信息上下文")
void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean);
@ApiOperation(value = "验证上下文班次班组信息是否存在") @ApiOperation(value = "验证上下文班次班组信息是否存在")
Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode); Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode);

@ -180,7 +180,6 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文产品加工规则信息集合") @ApiOperation(value = "删除上下文产品加工规则信息集合")
void deleteProdRuleDataContext(StationRequestBean reqBean); void deleteProdRuleDataContext(StationRequestBean reqBean);
@ApiOperation(value = "获取料桶原材料数据集合") @ApiOperation(value = "获取料桶原材料数据集合")
List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean); List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean);

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
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;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -101,5 +102,14 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "存储设备的装配件清单") @ApiOperation(value = "存储设备的装配件清单")
Boolean saveAssemblyNosortCfgContext(StationRequestBean reqBean, List<MesProductionAssemblyNosortContext> assemblyNosortCfgList); Boolean saveAssemblyNosortCfgContext(StationRequestBean reqBean, List<MesProductionAssemblyNosortContext> assemblyNosortCfgList);
@ApiOperation(value = "获取手动选择的腔数及工单信息上下文")
List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean);
@ApiOperation(value = "保存选择/扫描/读取的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]")
Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList);
@ApiOperation(value = "删除手动选择的腔数及工单信息上下文")
void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean);
} }

@ -29,6 +29,9 @@ public interface IMesProductionRecordService {
*/ */
Map<String, Object> checkSnTimeliness(String organizeCode, String serialNo, Long sourceId, Integer dataSource, Boolean isAssembly); Map<String, Object> checkSnTimeliness(String organizeCode, String serialNo, Long sourceId, Integer dataSource, Boolean isAssembly);
@ApiOperation(value = "根据零件条码查询加工记录信息")
List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn);
@ApiOperation(value = "根据零件条码,物料编码,工序代码,工艺代码查询加工记录信息") @ApiOperation(value = "根据零件条码,物料编码,工序代码,工艺代码查询加工记录信息")
List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode); List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode);

@ -22,6 +22,7 @@ import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext; 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 org.springframework.transaction.annotation.Transactional;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -49,6 +50,7 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
super(MesReportNoSortJob.class, "非排序报工JOB"); super(MesReportNoSortJob.class, "非排序报工JOB");
} }
@Override @Override
@Transactional
public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) {
JSONObject jsonObject= new JSONObject(); JSONObject jsonObject= new JSONObject();
@ -83,7 +85,7 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
} catch (ImppBusiException e) { } catch (ImppBusiException e) {
LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); //updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
} }
} }
@ -99,7 +101,7 @@ public class MesReportNoSortJob extends BaseMesScheduleJob {
} catch (ImppBusiException e) { } catch (ImppBusiException e) {
LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); //updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail());
} }
} }

@ -36,7 +36,7 @@ public class MesWorkCellExtendCfgServiceImpl implements IMesWorkCellExtendCfgSer
DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getExtendType(), "extendType", packBean); DdlPreparedPack.getNumEqualPack(bean.getExtendType(), "extendType", packBean);
if(!StringUtil.isEmpty(bean.orderBy())){ if(!StringUtil.isEmpty(bean.orderBy())){
packBean.setOrderByStr(bean.orderBy()); packBean.setOrderByStr(bean.orderBy());
@ -57,7 +57,7 @@ public class MesWorkCellExtendCfgServiceImpl implements IMesWorkCellExtendCfgSer
DdlPreparedPack.getStringEqualPack(bean.getAreaCode(), "areaCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getAreaCode(), "areaCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean);
DdlPreparedPack.getStringEqualPack(StringUtil.isEmpty(bean.getExtendType())?"20":bean.getExtendType(), "extendType", packBean); DdlPreparedPack.getNumEqualPack(StringUtil.isEmpty(bean.getExtendType())?20:bean.getExtendType(), "extendType", packBean);
if(!StringUtil.isEmpty(bean.orderBy())){ if(!StringUtil.isEmpty(bean.orderBy())){
packBean.setOrderByStr(bean.orderBy()); packBean.setOrderByStr(bean.orderBy());
}else { }else {

@ -171,7 +171,6 @@ public class MesNcProcessingService implements IMesNcProcessingService {
Integer type = model.getType(); Integer type = model.getType();
MesDefectType person = StringUtil.isEmpty(model.getPerson())?new MesDefectType():model.getPerson(); MesDefectType person = StringUtil.isEmpty(model.getPerson())?new MesDefectType():model.getPerson();
//保存数据 //保存数据
saveDate(model, model.getPart(), type, person, org,model.getInventoryLocationCode()); saveDate(model, model.getPart(), type, person, org,model.getInventoryLocationCode());
} }

@ -12,9 +12,9 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesTimeEfficientCfgRepository; import cn.estsh.i3plus.pojo.mes.repository.MesTimeEfficientCfgRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -134,11 +134,11 @@ public class MesProductionRecordService implements IMesProductionRecordService {
for (MesTimeEfficientCfg timeliness : timelinessList) { for (MesTimeEfficientCfg timeliness : timelinessList) {
List<MesProductionRecord> records = new ArrayList<>(); List<MesProductionRecord> records = new ArrayList<>();
//时效性规则 零件号不为空 //时效性规则 零件号不为空
if (StringUtils.isNoneBlank(timeliness.getPartNo())){ if (!StringUtils.isEmpty(timeliness.getPartNo())){
records = recordList.stream().filter(item -> item.getPartNo().equals(timeliness.getPartNo())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList()); records = recordList.stream().filter(item -> item.getPartNo().equals(timeliness.getPartNo())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList());
} }
//时效性规则 工艺不为空时 //时效性规则 工艺不为空时
if (StringUtils.isNoneBlank(timeliness.getCraftCode())){ if (!StringUtils.isEmpty(timeliness.getCraftCode())){
records = recordList.stream().filter(item -> item.getCraftCode().equals(timeliness.getCraftCode())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList()); records = recordList.stream().filter(item -> item.getCraftCode().equals(timeliness.getCraftCode())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList());
} }
@ -192,7 +192,16 @@ public class MesProductionRecordService implements IMesProductionRecordService {
} }
@Override @Override
public List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null;
return productionRecordRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn});
}
@Override
public List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode) { public List<MesProductionRecord> findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(processCode) || StringUtils.isEmpty(craftCode)) return null;
return productionRecordRepository.findByProperty( return productionRecordRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.CRAFT_CODE}, new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.CRAFT_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn, partNo, processCode, craftCode}); new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn, partNo, processCode, craftCode});

@ -274,32 +274,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb);
//物料+生产版本获取bom信息 //物料+生产版本获取bom信息
List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
//报工类型
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) {
mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty()));
//更新工单状态
double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty());
mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) {
MesPcnException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工",
mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty());
} else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
} else {
//报工调整数量加-
mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty())));
//冲销数量大于工单完成数量报错
if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) {
MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销",
mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty());
}
}
LOGGER.info("产线:{} 零件:{}更新工单", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo()); LOGGER.info("产线:{} 零件:{}更新工单", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo());
//更新工单 //更新工单
updateMesWorkOrder(mesWorkOrderDb, userName ); // updateMesWorkOrder(mesWorkOrderDb, userName );
//生成条码 todo 有条码 不生成 //生成条码 todo 有条码 不生成
@ -460,7 +438,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//根据物料获取已发布的工单 //根据物料获取已发布的工单
MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode); MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode);
if (oldMesWorkOrder == null) { if (oldMesWorkOrder == null) {
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); //updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
return; return;
} }
@ -474,7 +452,8 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//根据物料获取已发布的工单 //根据物料获取已发布的工单
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null);
if (CollectionUtils.isEmpty(oldMesWorkOrders)) { if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); //updateProductionRecord(organizeCode, userName, productionRecord.getProductSn());
return;
} }
report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0)); report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0));
@ -649,8 +628,8 @@ public class MesWorkOrderService implements IMesWorkOrderService {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean); DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean);
if (!StringUtils.isEmpty(workOrderNo)) { if (!StringUtils.isEmpty(productionRecord.getWorkOrderNo())) {
DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", ddlPackBean); DdlPreparedPack.getStringEqualPack(productionRecord.getWorkOrderNo(), "workOrderNo", ddlPackBean);
} }
DdlPreparedPack.getInPackList(list, "workOrderStatus", ddlPackBean); DdlPreparedPack.getInPackList(list, "workOrderStatus", ddlPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
@ -741,11 +720,17 @@ public class MesWorkOrderService implements IMesWorkOrderService {
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单 //1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean);
DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean); DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean);
List<MesShift> collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList());
String startTime=" 08:00:00";
if(!CollectionUtils.isEmpty(collect)){
MesShift mesShift= collect.get(0);
startTime= StringUtil.isEmpty(mesShift.getStartTime())?" 08:00:00":" "+mesShift.getStartTime()+":00";
}
//获取前一天的早班到当天早班的区间的所有加工记录,统计个数 //获取前一天的早班到当天早班的区间的所有加工记录,统计个数
DdlPreparedPack.timeBuilder( DdlPreparedPack.timeBuilder(
new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00", new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1)) + startTime,
TimeTool.getToday()+" 08:00:00", TimeTool.getToday() + startTime,
"completeDateTime", ddlPackBean, false); "completeDateTime", ddlPackBean, false);
return productionRecordRao.findByHqlWhere(ddlPackBean); return productionRecordRao.findByHqlWhere(ddlPackBean);
@ -755,6 +740,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()), DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()),
"productSn",snPackBean); "productSn",snPackBean);
DdlPreparedPack.getIsNotNull("workCenterCode", snPackBean);
return mesProduceSnRao.findByHqlWhere(snPackBean); return mesProduceSnRao.findByHqlWhere(snPackBean);
} }
@ -872,6 +858,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
item.setProduceTime(TimeTool.getToday()); item.setProduceTime(TimeTool.getToday());
item.setUnCompleteQty(0d); item.setUnCompleteQty(0d);
item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum()); item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum());
item.setReportedQty(item.getQty());
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
//校验标识 //校验标识
//若工单类型为排序 //若工单类型为排序
List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>(); List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>();
@ -887,7 +877,7 @@ public class MesWorkOrderService implements IMesWorkOrderService {
item.setProductVersion(mesProductVersion.getProductVersion()); item.setProductVersion(mesProductVersion.getProductVersion());
//获取bom信息 //获取bom信息
List<MesBom> bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); List<MesBom> bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); //item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
//发送工单信息给WMS //发送工单信息给WMS
saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList)); saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList));
} }

@ -82,10 +82,15 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService {
params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle().toString()); params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle().toString());
params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel()); params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel());
params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId().toString()); params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId().toString());
LOGGER.info("设备数据变量写值开始-> 地址:{}, params={}", equipVariableRwModel.getWriteRequestUrl(), params);
String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getWriteRequestUrl(), params, null, null); String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getWriteRequestUrl(), params, null, null);
if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class).obj(JSONObject.toJSONString(equipVariableRwModel)); LOGGER.info("设备数据变量写值返回-> data:{} ", data);
else return result.noSuccessed().message(String.format("设备数据变量写值失败! CLIENT_HANDLE[%s] CHANNEL[%s] EQUIPMENT_ID[%s] VALUE[%s]",
equipVariableRwModel.getClientHandle(), equipVariableRwModel.getChannel(), equipVariableRwModel.getEquipId(), equipVariableRwModel.getValue())).obj(JSONObject.toJSONString(equipVariableRwModel)); result = !StringUtils.isEmpty(data) ? JsonUtilTool.decode(data, MesEquipVariableRwResult.class).obj(JSONObject.toJSONString(equipVariableRwModel)) : result.noSuccessed();
return result.obj(JSONObject.toJSONString(equipVariableRwModel)).message(String.format("%s设备数据变量写值%s! CLIENT_HANDLE[%s] CHANNEL[%s] EQUIPMENT_ID[%s] VALUE[%s]",
!StringUtils.isEmpty(result.getMessage()) ? String.format("%s!", result.getMessage()) : MesPcnExtConstWords.EMPTY,
result.getIsSuccessed() ? "成功" : "失败", equipVariableRwModel.getClientHandle(), equipVariableRwModel.getChannel(), equipVariableRwModel.getEquipId(), equipVariableRwModel.getValue()));
} }
@ -122,7 +127,6 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService {
else return result.noSuccessed().message(String.format("设备数据变量读值失败! 数据信息:[%s]!", JSONObject.toJSONString(equipVariableRwModel))); else return result.noSuccessed().message(String.format("设备数据变量读值失败! 数据信息:[%s]!", JSONObject.toJSONString(equipVariableRwModel)));
} }
@Override @Override
public MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) { public MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) {
MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel(); MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel();

@ -9,7 +9,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -90,7 +89,7 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
this.sendMessage(reqBean, shiftCountBean); this.sendMessage(reqBean, shiftCountBean);
//验证工位是否锁定 //验证工位是否锁定
reqBean.getDataMap().put(MesPcnConstWords.WS_CMD_INIT_MODULE, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); reqBean.getDataMap().put(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_INIT_MODULE.getCode(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
((IStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).execute(reqBean); ((IStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).execute(reqBean);
//设备BYPASS监控 //设备BYPASS监控

@ -1,6 +1,5 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
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.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
@ -37,9 +36,6 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen
private IMesProductionProcessContextStepService productionProcessContextStepService; private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired @Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IShippingDispatchService shippingDispatchService; private IShippingDispatchService shippingDispatchService;
@Override @Override
@ -66,14 +62,14 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen
} }
//保存手动选择的腔数及工单信息上下文 //保存手动选择的腔数及工单信息上下文
productionCustomContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList); productionProcessContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList);
this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功,请等待验证! 提交信息[%s]", this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功,请等待验证! 提交信息[%s]",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setTriggerAutoFsm(true); reqBean.setTriggerAutoFsm(true);
shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false); shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false);

@ -41,7 +41,7 @@ public class MesFunctionJumpProcessService extends BaseSwsService implements IFs
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setForceJumpProcess(true); reqBean.setForceJumpProcess(true);
shippingDispatchService.doSendScanQueueNextExec(reqBean); shippingDispatchService.doSendScanQueueNextExec(reqBean);

@ -41,7 +41,7 @@ public class MesFunctionJumpStateService extends BaseSwsService implements IFsmM
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setScanInfo(jumpState); reqBean.setScanInfo(jumpState);
shippingDispatchService.doSendScanQueueNextExec(reqBean); shippingDispatchService.doSendScanQueueNextExec(reqBean);

@ -39,7 +39,7 @@ public class MesFunctionProductionUnlockService extends BaseSwsService implement
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setTriggerAutoFsm(true); reqBean.setTriggerAutoFsm(true);
shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false); shippingDispatchService.doSendScanQueueIfNoQueue(reqBean, false);

@ -87,7 +87,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList); doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
//匹配失败需要清除本次扫描/读取信息 //匹配失败需要清除本次扫描/读取信息
if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, productionPartContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, productionPartContextList, productionPsInContextList)) return stepResult;
if (prodRuleContextList.size() != initSize) { if (prodRuleContextList.size() != initSize) {
//保存上下文产品加工规则信息集合 //保存上下文产品加工规则信息集合
@ -162,7 +162,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//【非排序线】获取产品加工规则对应的装配件信息 //【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext( prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()). reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(prodRuleNosortCfgList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()))); copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())));
} }
return stepResult; return stepResult;
@ -207,7 +207,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//【非排序线】获取产品加工规则对应的装配件信息 //【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext( prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
.copy(prodRuleNosortCfgList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()))); .copy(filterList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())));
} }
@ -392,8 +392,11 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
private Boolean doBusiCheckToDelete(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) { private Boolean doBusiCheckToDelete(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean,
productionPsInContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList())); productionPsInContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()));
else if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.saveProductionPartContext(reqBean, else if (!CollectionUtils.isEmpty(productionPartContextList)) {
productionPartContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList())); productionDispatchContextStepService.saveProductionPartContext(reqBean,
productionPartContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()));
productionProcessContextStepService.deleteFunctionChooseCavityOrderContext(reqBean);
}
return true; return true;
} }

@ -1,399 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
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.util.PojoAttrUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblyShowNosortStepService2")
public class MesAssemblyShowNosortStepService2 extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProdRuleCfgExtService prodRuleCfgExtService;
@Autowired
private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService;
@Autowired
private IMesProductionRecordService productionRecordService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//从上下文中取出生产线对象
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//获取上下文加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
Integer initSize = prodRuleContextList.size();
//封装非排序加工规则
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, productionPartContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
if (prodRuleContextList.size() != initSize) {
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
//保存上下文产出零件信息
if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
//保存进料主条码数据
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
}
//显示装配件信息
showProductionAssembly(reqBean, resultBean, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "装配件扫描项已查询完毕,请查看!");
}
private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前是生成零件号场景】
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return stepResult;
//根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错)
if (CollectionUtils.isEmpty(productionPartContextList)) return doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPsInContextList);
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错)
else return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
}
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//加工规则的数据已与产出零件的数量一致
if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return stepResult;
//拿到当前最大的foreignKey
Optional<MesProductionPartContext> maxForeignKeyOptional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPartContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
//搜集未匹配规则的产出零件
List<String> outPartNoList = productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错)
if (CollectionUtils.isEmpty(productionPsInContextList)) return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错)
else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
}
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty(true).inPartRuleIsEmpty(true));
//根据产出零件分组数据
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
for (MesProductionPartContext productionPartContext : productionPartContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPartContext || productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
List<MesProdRuleNosortCfg> filterList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
if (CollectionUtils.isEmpty(filterList) || filterList.size() > 1) {
productionPartContext.busiCheckToDelete();
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format(
"请检查非排序产品加工规则信息,根据设备[%s]产出零件[%s]进料零件[空]进料零件规则[空]查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo(), CollectionUtils.isEmpty(filterList) ? MesPcnExtConstWords.ZERO : filterList.size()));
}
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(prodRuleNosortCfgList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())));
}
return stepResult;
}
//没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null);
//拿到当前最大的foreignKey
Optional<MesProductionPsInContext> maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPsInContext || productionPsInContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
List<MesProdRuleNosortCfg> filterList;
//搜集进料零件号匹配的产品加工规则
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) filterList = filterProdRuleNosortCfgList(prodRuleNosortCfgList, productionPsInContext.getPartNo());
//进料零件条码匹配进料零件规则
else filterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(prodRuleNosortCfgList));
if (CollectionUtils.isEmpty(filterList) || filterList.size() > 1) {
productionPsInContext.busiCheckToDelete();
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format(
"请检查非排序产品加工规则信息,根据设备[%s]进料零件条码[%s]查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentCode(), productionPsInContext.getProductSn(), CollectionUtils.isEmpty(filterList) ? MesPcnExtConstWords.ZERO : filterList.size()));
}
if (!StringUtils.isEmpty(productionPsInContext.getPartNo()) && !(Boolean) productionRecordService.checkSnTimeliness(
reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterList.get(0).getId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue(), false).get(MesPcnExtConstWords.RESULT)) {
productionPsInContext.busiCheckToDelete();
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("请检查进料主条码信息,进料主条码[%s]时效性验证不通过!", productionPsInContext.getProductSn()));
}
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
.copy(prodRuleNosortCfgList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())));
}
return stepResult;
}
private List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件可能携带产出零件
List<String> inPartNoList = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList());
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && StringUtils.isEmpty(o.getPartNo()))).findFirst();
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(
!CollectionUtils.isEmpty(inPartNoList) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartNos(inPartNoList).outPartNos(outPartNoList) : null,
(null != optional && optional.isPresent()) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartIsEmpty(true).inPartRuleIsEmpty(false).outPartNos(outPartNoList) : null);
return prodRuleNosortCfgList;
}
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList);
//根据产出零件分组数据
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
for (MesProductionPartContext productionPartContext : productionPartContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPartContext || productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue;
//获取匹配产出零件的所有加工规则
List<MesProdRuleNosortCfg> outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null;
String productSn = null;
//判断是否还存在待匹配的主条码信息, 内部循环匹配成功会标记 foreignKey
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) break;
List<MesProdRuleNosortCfg> innerfilterList = null;
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
//foreignKey有值代表已经匹配过产品加工规则
if (null == productionPsInContext || productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
//搜集进料零件号匹配的产品加工规则
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) innerfilterList = filterProdRuleNosortCfgList(outPartNoProdRuleList, productionPsInContext.getPartNo());
//进料零件条码匹配进料零件规则
else innerfilterList = (List<MesProdRuleNosortCfg>) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(outPartNoProdRuleList));
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue;
if (!StringUtils.isEmpty(productionPsInContext.getPartNo()) && !(Boolean) productionRecordService.checkSnTimeliness(
reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), innerfilterList.get(0).getId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue(), false).get(MesPcnExtConstWords.RESULT)) {
productionPsInContext.busiCheckToDelete();
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("请检查进料主条码信息,进料主条码[%s]时效性验证不通过!", productionPsInContext.getProductSn()));
}
productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey());
productSn = productionPsInContext.getProductSn();
break;
}
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) {
productionPsInContextList.forEach(o -> {
if (StringUtils.isEmpty(o.getForeignKey()) || o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) o.busiCheckToDelete();
});
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format(
"请检查非排序产品加工规则信息,根据设备[%s]产出零件[%s]匹配任意一个主条码%s查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentCode(), productionPartContext.getPartNo(),
productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString(),
CollectionUtils.isEmpty(innerfilterList) ? MesPcnExtConstWords.ZERO : innerfilterList.size()));
}
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext(
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(innerfilterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).productSn(productSn)).foreignKey(productionPartContext.getForeignKey()));
}
return stepResult;
}
//搜集进料零件号匹配的产品加工规则
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList, String partNo) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNo()) && o.getInPartNo().equals(partNo))).collect(Collectors.toList());
}
//搜集进料零件规则有值的产品加工规则
private List<MesProdRuleNosortCfg> filterProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getInPartNo()) && !StringUtils.isEmpty(o.getInPartNoRule()))).collect(Collectors.toList());
}
//根据产出零件分组数据
private Map<String, List<MesProdRuleNosortCfg>> groupProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList) {
return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProdRuleNosortCfg::getOutPartNo));
}
//显示装配件信息
public Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList) {
Map<Integer, MesProductionPartContext> productionPartMap = productionPartContextList == null ? null : productionPartContextList.stream().filter(o -> null != o && o.getForeignKey() != null).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
String workOrderNo = getWorkOrderNo(productionPartMap, prodRuleContext.getForeignKey());
//封装匹配当前设备的装配件信息
List<MesAssemblyShowContext> assemblyShowContextList = getAssemblyShowContextList(cellEquipContext, prodRuleContext.getAssemblyDataContext(workCenter), prodRuleContext, workOrderNo);
if (CollectionUtils.isEmpty(assemblyShowContextList)) continue;
//装配件清单列表标题
List<AttrBean> attrBeanList = dataAttrList(workOrderNo);
//封装多表格
resultBean.addStationResultBeans(new StationResultBean().dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue()).dataAttrList(attrBeanList).resultList(assemblyShowContextList));
}
if (CollectionUtils.isEmpty(resultBean.getStationResultBeans())) return false;
resultBean.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue());
this.sendMessage(reqBean, resultBean);
return true;
}
private String getWorkOrderNo(Map<Integer, MesProductionPartContext> productionPartMap, Integer foreignKey) {
return (!CollectionUtils.isEmpty(productionPartMap) && productionPartMap.containsKey(foreignKey)) ? productionPartMap.get(foreignKey).getWorkOrderNo() : null;
}
//封装匹配当前设备的装配件信息
private List<MesAssemblyShowContext> getAssemblyShowContextList(MesCellEquipContext cellEquipContext, List<MesProductionAssemblyContext> productionAssemblyContextList, MesProdRuleContext prodRuleContext, String workOrderNo) {
if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null;
List<MesAssemblyShowContext> assemblyShowContextList = new ArrayList<>();
for (MesProductionAssemblyContext item : productionAssemblyContextList) {
if (null == item) continue;
assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo));
}
assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList());
AtomicReference<Integer> index = new AtomicReference<>(0);
assemblyShowContextList.forEach(o -> o.index(index.updateAndGet(v -> v + 1)));
return assemblyShowContextList;
}
//封装装配件信息
private MesAssemblyShowContext assemblyShowContext(MesProductionAssemblyContext o, MesProdRuleContext prodRuleContext, String workOrderNo) {
MesAssemblyShowContext assemblyShowContext = new MesAssemblyShowContext();
BeanUtils.copyProperties(o, assemblyShowContext);
assemblyShowContext.setAssemblyStatusName(MesExtEnumUtil.ASSEMBLY_STATUS.valueOfDescription(assemblyShowContext.getAssemblyStatus()));
if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() != assemblyShowContext.getAssemblyStatus())
assemblyShowContext.setColor(StringUtils.isEmpty(assemblyShowContext.getShowColor()) ? MesExtEnumUtil.COLOR.GREEN.getValue() : assemblyShowContext.getShowColor());
return assemblyShowContext;
}
//装配件清单列表标题
private List<AttrBean> dataAttrList(String workOrderNo) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号");
if (!StringUtils.isEmpty(workOrderNo)) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.WORK_ORDER_NO, "生产工单编号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NO, "零件编码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NO, "原料编码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NAME, "原料名称");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_SN, "原料条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_STATUS_NAME, "装配状态");
return attrBeanList;
}
private Boolean doBusiCheckToDelete(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean,
productionPsInContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()));
else if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.saveProductionPartContext(reqBean,
productionPartContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()));
return true;
}
}

@ -7,7 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
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;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
@ -49,8 +48,8 @@ public class MesCountDownShowStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete(); StepResult stepResult = StepResult.getSuccessComplete();
//展示组件会调用, 执行到 判断isInit结束, //展示组件会调用, 执行到 判断isInit结束,
Boolean isInit = reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE) ? true : false; Boolean isInit = reqBean.getDataMap().containsKey(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_INIT_MODULE.getCode()) ? true : false;
if (reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE)) reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE); if (reqBean.getDataMap().containsKey(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_INIT_MODULE.getCode())) reqBean.getDataMap().remove(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_INIT_MODULE.getCode());
//获取上下文信息 //获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean); MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);

@ -51,7 +51,7 @@ public class MesManyCellNoticeNextStepService extends BaseStepService {
if (workCellExtendCfg.getWorkCenterCodeBak().equals(reqBean.getWorkCenterCode()) && workCellExtendCfg.getWorkCellCodeBak().equals(reqBean.getWorkCellCode())) continue; if (workCellExtendCfg.getWorkCenterCodeBak().equals(reqBean.getWorkCenterCode()) && workCellExtendCfg.getWorkCellCodeBak().equals(reqBean.getWorkCellCode())) continue;
//验证下个工位是否在线 //验证下个工位是否在线
String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCode(), workCellExtendCfg.getWorkCellCode()); String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCodeBak(), workCellExtendCfg.getWorkCellCodeBak());
if (CollectionUtils.isEmpty(StationWebSocket.getStationWebSocketList(clientInfo))) continue; if (CollectionUtils.isEmpty(StationWebSocket.getStationWebSocketList(clientInfo))) continue;
//调用多工位场景触发定位分屏工步, CLIENT_INFO是必要传参 //调用多工位场景触发定位分屏工步, CLIENT_INFO是必要传参

@ -35,7 +35,7 @@ public class MesManyCellTriggerTabSwitchStepService extends BaseStepService {
StationRequestBean stationRequestBean = new StationRequestBean(); StationRequestBean stationRequestBean = new StationRequestBean();
BeanUtils.copyProperties(reqBean, stationRequestBean); BeanUtils.copyProperties(reqBean, stationRequestBean);
stationRequestBean.setScanInfo(clientInfo); stationRequestBean.setClientInfo(clientInfo);
return clientInfo.equals(reqBean.getClientInfo()) ? return clientInfo.equals(reqBean.getClientInfo()) ?
execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("客户端[%s]监听自动切换页面成功!", reqBean.getClientInfo())) : execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("客户端[%s]监听自动切换页面成功!", reqBean.getClientInfo())) :

@ -12,9 +12,11 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
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;
import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -79,24 +81,27 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!"); if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!");
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//查询工艺路线数据 //查询工艺路线数据
Map<String, List<MesCraftRouteDetail>> craftRouteDataMap = new HashMap<>(); Map<String, List<MesCraftRouteDetail>> craftRouteDataMap = new HashMap<>();
partNoList.forEach(o -> doHandleProdCraftData(reqBean, o, craftRouteDataMap)); partNoList.forEach(o -> doHandleProdCraftData(reqBean, workCenter, o, craftRouteDataMap));
if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size()) if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size())
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!", return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!",
CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString())); CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString()));
//前道工艺防错验证处理 //前道工艺防错验证处理
doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, productionPsInContextList, craftRouteDataMap); doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, workCenter, productionPsInContextList, craftRouteDataMap);
return stepResult; return stepResult;
} }
//查询工艺路线数据 //查询工艺路线数据
private void doHandleProdCraftData(StationRequestBean reqBean, String o, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) { private void doHandleProdCraftData(StationRequestBean reqBean, MesWorkCenter workCenter, String o, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) {
List<MesCraftRouteDetail> craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, o); List<MesCraftRouteDetail> craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, workCenter.getCenterType(), o);
if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList); if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList);
} }
@ -126,14 +131,14 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
//前道工艺防错验证处理 //前道工艺防错验证处理
private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
List<MesProductionPsInContext> productionPsInContextList, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) { MesWorkCenter workCenter, List<MesProductionPsInContext> productionPsInContextList, Map<String, List<MesCraftRouteDetail>> craftRouteDataMap) {
for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { for (MesProductionPsInContext productionPsInContext : productionPsInContextList) {
if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue;
//前道工艺防错验证 //前道工艺防错验证
Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, workCenter, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo()));
if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
@ -149,7 +154,18 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
} }
//前道工艺防错验证 //前道工艺防错验证
private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List<MesCraftRouteDetail> craftRouteDetailList) { private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, MesProductionPsInContext productionPsInContext, List<MesCraftRouteDetail> craftRouteDetailList) {
//排序
if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) return doProdCraftRouteCheckSort(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDetailList);
//非排序
return doProdCraftRouteCheckNosort(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDetailList);
}
//前道工艺防错验证【排序】
private Boolean doProdCraftRouteCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List<MesCraftRouteDetail> craftRouteDetailList) {
String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON;
@ -193,10 +209,10 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
if (CollectionUtils.isEmpty(beforeCellCraftList) && !StringUtils.isEmpty(productionPsInContext.getCraftCode()) && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) if (CollectionUtils.isEmpty(beforeCellCraftList) && !StringUtils.isEmpty(productionPsInContext.getCraftCode()) && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()))
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]已经过首道工艺[%s]", message, productionPsInContext.getProductSn(), productionProcessContext.getCraftCode())).isCompleted(); return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]已经过首道工艺[%s]", message, productionPsInContext.getProductSn(), productionProcessContext.getCraftCode())).isCompleted();
//执行首道工艺 【非工位扫描直接生成的自制件条码】 当前主条码验证通过 //执行首道工艺 当前主条码验证通过
if (CollectionUtils.isEmpty(beforeCellCraftList)) return true; if (CollectionUtils.isEmpty(beforeCellCraftList)) return true;
//当前主条码的工艺字段为空【非工位扫描直接生成的自制件条码】 //当前主条码的工艺字段为空
if (StringUtils.isEmpty(productionPsInContext.getCraftCode()) && craftRouteDetailList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) if (StringUtils.isEmpty(productionPsInContext.getCraftCode()) && craftRouteDetailList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过首道工艺[%s]", message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftCode())).isCompleted(); return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过首道工艺[%s]", message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftCode())).isCompleted();
@ -213,15 +229,83 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService {
//如果没有未完成的工艺, 则代表当前工位可操作 //如果没有未完成的工艺, 则代表当前工位可操作
if (CollectionUtils.isEmpty(unCompleteCraftList)) return true; if (CollectionUtils.isEmpty(unCompleteCraftList)) return true;
//未完成工艺重新正 //未完成工艺
unCompleteCraftList = unCompleteCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq)).collect(Collectors.toList()); unCompleteCraftList = unCompleteCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq).reversed()).collect(Collectors.toList());
Optional<MesCraftRouteDetail> optional = unCompleteCraftList.stream().filter(o -> (null != o && o.getIsChoose() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())).findFirst(); Optional<MesCraftRouteDetail> optional = unCompleteCraftList.stream().filter(o -> (null != o && o.getIsChoose() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())).findFirst();
if (null != optional && optional.isPresent()) if (unCompleteCraftList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), optional.get().getCraftCode())).isCompleted(); return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), unCompleteCraftList.get(0).getCraftCode())).isCompleted();
return true; return true;
} }
//前道工艺防错验证 【非排序】
private Boolean doProdCraftRouteCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List<MesCraftRouteDetail> craftRouteDetailList) {
String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON;
//判断主条码的当前工艺是否包含在产品工艺路线中
Optional<MesCraftRouteDetail> optionalPs = StringUtils.isEmpty(productionPsInContext.getCraftCode()) ? null : craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst();
if (!StringUtils.isEmpty(productionPsInContext.getCraftCode()) && (null == optionalPs || !optionalPs.isPresent()))
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]对应的工艺代码[%s]不匹配零件[%s]对应的产品工艺路线[%s]",
message, productionPsInContext.getProductSn(), productionPsInContext.getCraftCode(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode())).isCompleted();
//验证工艺对应工序最多经过1个: 当前主条码的工艺字段有值, 对应的工艺路线明细信息设置了【true】, 当前工位的工艺与主条码的当前工艺相同, 当前工位的工序与主条码的当前工序不相同
if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getAtMostProcess().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()) && !reqBean.getProcessCode().equals(productionPsInContext.getProcessCode()))
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]相同工艺对应工序最多经过1个,上道工艺[%s]当前工位工艺[%s]",
message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), productionProcessContext.getCraftCode())).isCompleted();
List<MesProductionRecord> productionRecordList = null;
//验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数
if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) {
//根据零件条码查询加工记录信息
productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn());
//条码+物料+工序+工艺搜集加工记录
List<MesProductionRecord> filterList = CollectionUtils.isEmpty(productionRecordList) ? null :
productionRecordList.stream().filter(o -> (null != o && o.getPartNo().equals(productionPsInContext.getPartNo()) && o.getProcessCode().equals(reqBean.getProcessCode()) && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(filterList) && filterList.size() >= optionalPs.get().getRepeatTimes())
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]",
message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted();
}
//判断当前工位的工序对应的工艺是否包含在产品工艺路线中
Optional<MesCraftRouteDetail> optionalCell = craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).findFirst();
//根据当前工位对应的工艺 获取 所有前道工艺, 如果当前工位的工序对应工艺不在工艺路线明细内, 则默认所有明细均为所有前道工艺, 否则搜集当前工位工序对应工艺前面的所有前道工艺
List<MesCraftRouteDetail> beforeCellCraftList;
if (null == optionalCell || !optionalCell.isPresent()) beforeCellCraftList = craftRouteDetailList;
else beforeCellCraftList = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalCell.get().getSeq()) < 0)).collect(Collectors.toList());
//前道工艺不存在即当前为首道工艺
if (CollectionUtils.isEmpty(beforeCellCraftList)) return true;
//前道工艺正序
beforeCellCraftList = beforeCellCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq)).collect(Collectors.toList());
//判断上面是否已经查询过数据
if (!(null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())))
productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn());
Map<String, List<MesProductionRecord>> prMapByCraft = CollectionUtils.isEmpty(productionRecordList) ? null : productionRecordList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionRecord::getCraftCode));
//遍历前道工艺, 根据工艺查询加工记录是否存在, 并验证是否存在捆绑工艺
for (int i = 0; i < beforeCellCraftList.size(); i ++) {
if (null == beforeCellCraftList.get(i)) continue;
Boolean isExist = isExistProductionRecord(prMapByCraft, beforeCellCraftList.get(i).getCraftCode());
if (beforeCellCraftList.get(i).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && !isExist)
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), beforeCellCraftList.get(i).getCraftCode())).isCompleted();
if (i != 0 && beforeCellCraftList.get(i - 1).getIsBindNextCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && isExistProductionRecord(prMapByCraft, beforeCellCraftList.get(i - 1).getCraftCode()) && !isExist)
return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]工艺[%s]捆绑后道工艺",
message, productionPsInContext.getProductSn(), beforeCellCraftList.get(i).getCraftRouteCode(), beforeCellCraftList.get(i - 1).getCraftCode())).isCompleted();
}
return true;
}
private Boolean isExistProductionRecord(Map<String, List<MesProductionRecord>> prMapByCraft, String craftCode) {
return (CollectionUtils.isEmpty(prMapByCraft) || !prMapByCraft.containsKey(craftCode)) ? false : true;
}
} }

@ -73,7 +73,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
// 获取加工结果 // 获取加工结果
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean); String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 如果是报废或者可疑需要编辑条码状态为不合格、并且nc判定需要新增一条记录 // 如果是报废或者可疑需要编辑条码状态为不合格、并且nc判定需要新增一条记录
if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getCode(), result)) { if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getCode() + "", result)) {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工结果合格,无需记录异常"); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工结果合格,无需记录异常");
} }
// 获取条码列表 // 获取条码列表
@ -132,6 +132,8 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
mesPartInspectionDetail.setDefectTypeCode(mesDefectType.getDefectTypeCode()); mesPartInspectionDetail.setDefectTypeCode(mesDefectType.getDefectTypeCode());
mesPartInspectionDetail.setDefectTypeName(mesDefectType.getDefectTypeName()); mesPartInspectionDetail.setDefectTypeName(mesDefectType.getDefectTypeName());
model.setPartInspection(partInspection); model.setPartInspection(partInspection);
model.setType(partInspection.getSourceType());
model.setPartInspectionDetailList(Arrays.asList(mesPartInspectionDetail)); model.setPartInspectionDetailList(Arrays.asList(mesPartInspectionDetail));
ncProcessingService.saveNc(model, reqBean.getOrganizeCode()); ncProcessingService.saveNc(model, reqBean.getOrganizeCode());
}); });

@ -256,7 +256,7 @@ public class MesProductSnScanNosortStepService extends BaseStepService {
} }
////比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量 //比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量
private StepResult checkFinishCodeSize(StepResult stepResult, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, Boolean scanInfoIsFinishCode) { private StepResult checkFinishCodeSize(StepResult stepResult, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, Boolean scanInfoIsFinishCode) {
//没有产出零件 不需要对比空腔数量 //没有产出零件 不需要对比空腔数量

@ -112,7 +112,11 @@ public class MesSendInitializationCmdStepService extends BaseStepService {
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())); if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
if (equipVariableRwResult.getIsSuccessed()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送成功!", cellEquipContext.getEquipmentCode())); if (equipVariableRwResult.getIsSuccessed()) {
String message = String.format("设备[%s]:初始化指令发送成功!", cellEquipContext.getEquipmentCode());
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("%s%s", message, equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, message);
}
execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:%s", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage())); execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:%s", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage()));

@ -114,7 +114,11 @@ public class MesSendProcessCmdStepService extends BaseStepService {
if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:允许加工指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())); if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:允许加工指令发送失败!原因:%s", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage()));
if (equipVariableRwResult.getIsSuccessed()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送成功!", cellEquipContext.getEquipmentCode())); if (equipVariableRwResult.getIsSuccessed()) {
String message = String.format("设备[%s]:允许加工指令发送成功!", cellEquipContext.getEquipmentCode());
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("%s%s", message, equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, message);
}
execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送失败!累计次数[%s]!原因:%s", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage())); execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送失败!累计次数[%s]!原因:%s", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage()));

@ -1,6 +1,5 @@
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.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.api.busi.IMesWorkOrderExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
@ -42,9 +41,6 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer
private IMesProductionDispatchContextStepService productionDispatchContextStepService; private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired @Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesWorkOrderExtService workOrderExtService; private IMesWorkOrderExtService workOrderExtService;
@Autowired @Autowired
@ -113,7 +109,7 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工单信息全部为空腔,已清除当前的空腔数据!"); return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工单信息全部为空腔,已清除当前的空腔数据!");
//保存选择/扫描/读取的腔数及工单信息上下文 //保存选择/扫描/读取的腔数及工单信息上下文
productionCustomContextStepService.saveFunctionChooseCavityOrderContext(reqBean, StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), productionProcessContextStepService.saveFunctionChooseCavityOrderContext(reqBean, StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", String.valueOf(productionPartContextList.size())), new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", String.valueOf(productionPartContextList.size())),
new StationKvBean(MesPcnExtConstWords.CELL_MESSAGE_SOURCE, "工位信息来源", MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValueStr()), new StationKvBean(MesPcnExtConstWords.CELL_MESSAGE_SOURCE, "工位信息来源", MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValueStr()),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "加工单", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON))))); new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "加工单", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)))));

@ -105,10 +105,10 @@ public class MesWorkOrderScanStepService extends BaseStepService {
private List<MesEquipVariableCollectContext> doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult) { private List<MesEquipVariableCollectContext> doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult) {
//获取手动选择的腔数及工单信息上下文, 扫描的加工单也会存入其中 //获取手动选择的腔数及工单信息上下文, 扫描的加工单也会存入其中
List<StationKvBean> chooseCavityOrder = productionCustomContextStepService.getFunctionChooseCavityOrderContext(reqBean); List<StationKvBean> chooseCavityOrder = productionProcessContextStepService.getFunctionChooseCavityOrderContext(reqBean);
//删除手动选择的腔数及工单信息上下文 //删除手动选择的腔数及工单信息上下文
if (!CollectionUtils.isEmpty(chooseCavityOrder)) productionCustomContextStepService.deleteFunctionChooseCavityOrderContext(reqBean); if (!CollectionUtils.isEmpty(chooseCavityOrder)) productionProcessContextStepService.deleteFunctionChooseCavityOrderContext(reqBean);
if (CollectionUtils.isEmpty(chooseCavityOrder)) return null; if (CollectionUtils.isEmpty(chooseCavityOrder)) return null;

@ -108,36 +108,6 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
this.sendMessage(reqBean, resultBean); this.sendMessage(reqBean, resultBean);
} }
//手选腔数及工单信息KEY
private String getChooseCavityOrderContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER).toString()); }
//获取手动选择的腔数及工单信息上下文
@Override
public List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean));
return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null;
}
//保存选择/扫描/读取的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]
@Override
public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList) {
if (CollectionUtils.isEmpty(resultList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean), JSONObject.toJSONString(resultList));
}
//删除手动选择的腔数及工单信息上下文
@Override
public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean));
}
//开班信息KEY 【PS:生产线级别】
private String getProdShiftContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(workCenterCode).toString(); }
//获取生产线的当前班组班次信息 //获取生产线的当前班组班次信息
@Override @Override
public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) { public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) {
@ -155,21 +125,20 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
return mesProdShiftContext; return mesProdShiftContext;
} }
//加工次数key //开班信息KEY 【PS:生产线级别】
private String getProductionStatisticsContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_COUNT_CONTEXT).toString()); } private String getProdShiftContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(workCenterCode).toString(); }
//获取上下文班次班组信息 //获取上下文班次班组信息
@Override @Override
public List<StationKvBean> getProdShiftDataContext(String orgainzeCode, String workCenterCode) { public List<StationKvBean> getProdShiftDataContext(String orgainzeCode, String workCenterCode) {
String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode));
return !StringUtils.isEmpty(prodShiftJson) ? JSONObject.parseArray(prodShiftJson, StationKvBean.class) : null; return !StringUtils.isEmpty(prodShiftJson) ? JSONObject.parseArray(prodShiftJson, StationKvBean.class) : null;
} }
//验证上下文班次班组信息是否存在 //验证上下文班次班组信息是否存在
@Override @Override
public Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode) { public Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode) {
String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode));
return !StringUtils.isEmpty(prodShiftJson) ? true : false; return !StringUtils.isEmpty(prodShiftJson) ? true : false;
} }
@ -177,19 +146,22 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
@Override @Override
public Boolean saveProdShiftDataContext(String organizeCode, String workCenterCode, List<StationKvBean> prodShiftDataList) { public Boolean saveProdShiftDataContext(String organizeCode, String workCenterCode, List<StationKvBean> prodShiftDataList) {
if (CollectionUtils.isEmpty(prodShiftDataList)) return false; if (CollectionUtils.isEmpty(prodShiftDataList)) return false;
return saveFsmBusiData(organizeCode, getProdShiftContextKey(organizeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode, JSONObject.toJSONString(prodShiftDataList)); return saveFsmBusiData(organizeCode, getProdShiftContextKey(organizeCode, workCenterCode), JSONObject.toJSONString(prodShiftDataList));
} }
//删除上下文班次班组信息 //删除上下文班次班组信息
@Override @Override
public void deleteProdShiftDataContext(String orgainzeCode, String workCenterCode) { public void deleteProdShiftDataContext(String orgainzeCode, String workCenterCode) {
deleteFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); deleteFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode));
} }
//加工次数key
private String getProductionStatisticsContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT).toString()); }
//获取上下文工位加工数统计信息 //获取上下文工位加工数统计信息
@Override @Override
public List<StationKvBean> getProductionStatisticsContext(StationRequestBean reqBean) { public List<StationKvBean> getProductionStatisticsContext(StationRequestBean reqBean) {
String productionStatisticsJson = getFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT); String productionStatisticsJson = getFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean));
return !StringUtils.isEmpty(productionStatisticsJson) ? JSONObject.parseArray(productionStatisticsJson, StationKvBean.class) : null; return !StringUtils.isEmpty(productionStatisticsJson) ? JSONObject.parseArray(productionStatisticsJson, StationKvBean.class) : null;
} }
@ -197,7 +169,13 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
@Override @Override
public Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List<StationKvBean> productionStatisticsList) { public Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List<StationKvBean> productionStatisticsList) {
if (CollectionUtils.isEmpty(productionStatisticsList)) return false; if (CollectionUtils.isEmpty(productionStatisticsList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT, JSONObject.toJSONString(productionStatisticsList)); return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), JSONObject.toJSONString(productionStatisticsList));
}
//删除上下文工位加工数统计信息
@Override
public void deleteProductionStatisticsContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean));
} }
@Override @Override
@ -224,16 +202,9 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
return true; return true;
} }
//删除上下文工位加工数统计信息 //可复用条码KEY
@Override
public void deleteProductionStatisticsContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT);
}
//工位加工锁KEY
private String getRepeatAssemblySnContextKey(String organizeCode, String workCenterCode, String workCellCode) { 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(); return new StringJoiner(":").add(organizeCode).add(workCenterCode).add(workCellCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.REPEAT_ASSEMBLY_SN_CONTEXT).toString();
} }
//根据装配件规则ID获取可复用条码 //根据装配件规则ID获取可复用条码

@ -30,8 +30,6 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BUSI_DATA_CONTEXT).toString()); } private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BUSI_DATA_CONTEXT).toString()); }
private String getContextKey(String organizeCode, String busiCode) { return new StringJoiner(":").add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); }
//清除上下文中的所有业务数据 //清除上下文中的所有业务数据
@Override @Override
public void doFlushProductionDispatchContext(StationRequestBean reqBean) { public void doFlushProductionDispatchContext(StationRequestBean reqBean) {
@ -397,21 +395,25 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
public void deleteProdRuleDataContext(StationRequestBean reqBean) { public void deleteProdRuleDataContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT); deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT);
} }
//获取料桶原材料数据集合
@Override @Override
public List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean) { public List<MesRawPartCharging> getMesRawPartChargingDataContext(StationRequestBean reqBean) {
String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT);
return !StringUtils.isEmpty(mesRawPartChargingDataJson) ? JSONObject.parseArray(mesRawPartChargingDataJson, MesRawPartCharging.class) : null; return !StringUtils.isEmpty(mesRawPartChargingDataJson) ? JSONObject.parseArray(mesRawPartChargingDataJson, MesRawPartCharging.class) : null;
} }
//保存料桶原材料数据集合
@Override @Override
public Boolean saveMesRawPartChargingDataContext(StationRequestBean reqBean, List<MesRawPartCharging> mesRawPartChargingList) { public Boolean saveMesRawPartChargingDataContext(StationRequestBean reqBean, List<MesRawPartCharging> mesRawPartChargingList) {
if (CollectionUtils.isEmpty(mesRawPartChargingList)) return false; if (CollectionUtils.isEmpty(mesRawPartChargingList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT", JSONObject.toJSONString(mesRawPartChargingList)); return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT, JSONObject.toJSONString(mesRawPartChargingList));
} }
//删除料桶原材料数据集合
@Override @Override
public void deleteMesRawPartChargingDataContext(StationRequestBean reqBean) { public void deleteMesRawPartChargingDataContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT);
} }
} }

@ -11,6 +11,7 @@ import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.bean.*;
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;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -342,4 +343,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ASSEMBLY_NOSORT_CFG_CONTEXT, JSONObject.toJSONString(assemblyNosortCfgList)); return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ASSEMBLY_NOSORT_CFG_CONTEXT, JSONObject.toJSONString(assemblyNosortCfgList));
} }
//获取手动选择的腔数及工单信息上下文
@Override
public List<StationKvBean> getFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER);
return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null;
}
//保存选择/扫描/读取的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]
@Override
public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List<StationKvBean> resultList) {
if (CollectionUtils.isEmpty(resultList)) return false;
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER, JSONObject.toJSONString(resultList));
}
//删除手动选择的腔数及工单信息上下文
@Override
public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) {
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER);
}
} }

@ -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.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
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.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
@ -27,18 +28,15 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
private IMesProductionCustomContextStepService productionCustomContextStepService; private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired @Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker; private SnowflakeIdMaker snowflakeIdMaker;
@Override @Override
public Boolean doProcessStart(StationRequestBean requestBean) { public Boolean doProcessStart(StationRequestBean requestBean) {
Long mouldId = snowflakeIdMaker.nextId(); // Long mouldId = snowflakeIdMaker.nextId();
return true; return true;
@ -46,6 +44,7 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
@Override @Override
public Boolean doProcessComplete(StationRequestBean requestBean) { public Boolean doProcessComplete(StationRequestBean requestBean) {
//执行跳过工序二开实现逻辑
doJumpProcess(requestBean); doJumpProcess(requestBean);
//发送工序完成音 //发送工序完成音
this.sendMessage(requestBean, new StationResultBean().resultObj(MesPcnExtConstWords.PROCESS_COMPLETE).busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.SOUND.getValue())); this.sendMessage(requestBean, new StationResultBean().resultObj(MesPcnExtConstWords.PROCESS_COMPLETE).busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.SOUND.getValue()));
@ -58,10 +57,18 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic
productionDispatchContextStepService.doFlushProductionDispatchContext(requestBean); productionDispatchContextStepService.doFlushProductionDispatchContext(requestBean);
//清除工步客制化区域数据【装配件清单】 //清除工步客制化区域数据【装配件清单】
this.sendMessage(requestBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue())); this.sendMessage(requestBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue()));
return true;
}
//清除上下文中的所有基础数据 //TODO 临时增加 后面删掉 @Override
public Boolean doOffLine(StationRequestBean requestBean) {
//删除当前状态点
fsmCommonService.doFlushCache(requestBean);
//执行跳过工序二开实现逻辑
doJumpProcess(requestBean);
//清除上下文中的所有基础数据
productionProcessContextStepService.doFlushProductionProcessContext(requestBean); productionProcessContextStepService.doFlushProductionProcessContext(requestBean);
return true; return true;
} }
} }

@ -161,7 +161,7 @@ public class MesPcnExtConstWords {
// 读取失败睡眠毫秒数[工步参数] // 读取失败睡眠毫秒数[工步参数]
public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP"; public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP";
// 读取失败睡眠默认毫秒数 // 读取失败睡眠默认毫秒数
public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 1000L; public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 2000L;
// 最大重试次数[工步参数] // 最大重试次数[工步参数]
public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES"; public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES";
// 最大重试次数[工步参数] // 最大重试次数[工步参数]
@ -265,8 +265,6 @@ public class MesPcnExtConstWords {
public static final String ASSEMBLY_NOSORT_CFG_CONTEXT = "ASSEMBLY_NOSORT_CFG_CONTEXT"; public static final String ASSEMBLY_NOSORT_CFG_CONTEXT = "ASSEMBLY_NOSORT_CFG_CONTEXT";
// 生产过程控制工位加工锁 // 生产过程控制工位加工锁
public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT"; public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT";
// 生产过程控制工位加工锁
public static final String PRODUCTION_COUNT_CONTEXT = "PRODUCTION_COUNT_CONTEXT";
// 历史扫描信息 // 历史扫描信息
public static final String LAST_SCAN_INFO_CONTEXT = "LAST_SCAN_INFO_CONTEXT"; public static final String LAST_SCAN_INFO_CONTEXT = "LAST_SCAN_INFO_CONTEXT";
// 上下文: 班次班组信息 // 上下文: 班次班组信息
@ -304,6 +302,8 @@ public class MesPcnExtConstWords {
public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT"; public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT";
// 上下文: 产出条码数据信息 // 上下文: 产出条码数据信息
public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT"; public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT";
// 上下文: 料桶原材料数据
public static final String RAW_PART_CHARGING_DATA_CONTEXT = "RAW_PART_CHARGING_DATA_CONTEXT";
//OPC_API_PARAM //OPC_API_PARAM

Loading…
Cancel
Save