嘉兴终检

dev
王杰 2 years ago
parent 98a4ec8270
commit 1fa4eea56f

@ -16,6 +16,30 @@ public interface IJxProdBusiStrategyService {
StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params);
/**
* 线
* @param params
* @return
*/
@ApiOperation(value = "上线绑定", notes = "上线绑定")
StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params);
/**
*
* @param params
* @return
*/
@ApiOperation(value = "终检验证", notes = "终检验证")
StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params);
/**
*
* @param params
* @return
*/
@ApiOperation(value = "第三方产品条码验证", notes = "第三方产品条码验证")
StepResult checkThirdPartyPs(JxProdBusiStrategyParamsBuilder params);
/**
*
* @param params
* @return
@ -55,4 +79,39 @@ public interface IJxProdBusiStrategyService {
@ApiOperation(value = "获取生产工单已绑数据", notes = "获取生产工单已绑数据")
default Integer queryOrderBindedQty(JxProdBusiStrategyParamsBuilder params) { return MesPcnExtConstWords.ZERO; }
/**
*
* @param params
*/
@ApiOperation(value = "写入管理编码与工单条码关系信息", notes = "写入管理编码与工单条码关系信息")
default void insertProduceSnMcRecord(JxProdBusiStrategyParamsBuilder params) {}
/**
* 线
* @param params
*/
@ApiOperation(value = "完成上线", notes = "完成上线")
default StepResult execLineOnComplete(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
/**
*
* @param params
*/
@ApiOperation(value = "终检绑定", notes = "终检绑定")
default void execFinalInspectionBindPs(JxProdBusiStrategyParamsBuilder params) {}
/**
*
* @param params
*/
@ApiOperation(value = "终检标记返修", notes = "终检标记返修")
default void execFinalInspectionMarkRepair(JxProdBusiStrategyParamsBuilder params) {}
/**
*
* @param params
*/
@ApiOperation(value = "写入条码履历", notes = "写入条码履历")
default void insertProduceSnTravel(JxProdBusiStrategyParamsBuilder params) {}
}

@ -334,4 +334,11 @@ public class SxNumberRuleCheckAttributeService implements ISxNumberRuleCheckAttr
return commonCheck(map, numberRuleDb, null);
}
/**
*
*/
private Map<String, Object> jxmethod1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
return commonCheck(map, numberRuleDb, null);
}
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Author: wangjie
@ -66,5 +67,89 @@ public class JxProdBusiStrategyAttemptService implements IJxProdBusiStrategyServ
}
@Override
public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).insertProduceSnMcRecord(params);
return StepResult.getSuccessComplete().data(params.getProduceSnMcRecordDb());
}
@Override
public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getProduceSnMcRecordDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码与工单条码关系信息或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnExtDb()) return checkFinalInspection4Ps(params, stepResult);
return checkFinalInspection4Mc(params, stepResult);
}
private StepResult checkFinalInspection4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getProcessCode()) && params.getProduceSnExtDb().getProcessCode().equals(params.getProcessCode()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息已完成当前工序,验证失败!", params.getScanName(), params.getScanInfo()));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
private StepResult checkFinalInspection4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getQcStatus())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getLineOnStatus())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前状态[上线未完成],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]验证成功!", params.getScanName(), params.getScanInfo()));
}
@Override
public StepResult checkThirdPartyPs(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = StepResult.getNonComplete();
((IJxProdBusiStrategyService) params.getStrategyService()).queryProduceSnInfo(params.productSn(params.getScanInfo()));
if (null == params.getProduceSnExtDb())
return stepResult.msg(String.format("产品条码[%s]未关联试制工单[%s],操作失败!", params.getScanInfo(), params.getOrderModel().getOrderNo()));
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("产品条码[%s]信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getTrayNo()))
return stepResult.msg(String.format("产品条码[%s]已经过终检工序,验证失败!", params.getScanInfo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("产品条码[%s]信息当前状态[%s],验证失败!", params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("产品条码[%s]信息当前业务类型[返修],验证失败!", params.getScanInfo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() != params.getProduceSnExtDb().getQcStatus())
return stepResult.msg(String.format("产品条码[%s]信息当前质量状态[不合格],验证失败!", params.getScanInfo()));
return stepResult.isCompleted(true);
}
}

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService;
@ -7,8 +8,13 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -33,6 +39,15 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi
@Autowired
private IJxProduceSnExtService produceSnExtService;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private IProduceSnTravelExtService produceSnTravelExtService;
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != params.getOrderModel().getWorkOrderType()) queryBusiData4Mc(params.manageCode(params.getScanInfo()));
@ -101,4 +116,201 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi
return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size();
}
@Override
public void insertProduceSnMcRecord(JxProdBusiStrategyParamsBuilder params) {
MesProduceSnMcRecord produceSnMcRecord = new MesProduceSnMcRecord();
produceSnMcRecord.setManageCode(params.getManageCode());
produceSnMcRecord.setSerialNumber(params.getSerialNumber());
produceSnMcRecord.setPartNo(params.getOrderModel().getPartNo());
produceSnMcRecord.setPartNameRdd(params.getOrderModel().getPartNameRdd());
produceSnMcRecord.setWorkCenterCode(params.getWorkCenterCode());
produceSnMcRecord.setWorkOrderNo(params.getOrderModel().getOrderNo());
produceSnMcRecord.setSnStatus(MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue());
produceSnMcRecord.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.FALSE.getValue());
produceSnMcRecord.setQcStatus(MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.TRUE.getValue());
produceSnMcRecord.setOrganizeCode(params.getOrganizeCode());
produceSnMcRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelInitialize(produceSnMcRecord, params.getUserInfo());
params.produceSnMcRecordDb(produceSnMcRecordRepository.insert(produceSnMcRecord));
}
@Override
public StepResult execLineOnComplete(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = saveProduceSn4LineOn(params);
if (!stepResult.isCompleted()) return stepResult;
StepResult result = saveProduceSnMcRecord4LineOn(params);
if (!result.isCompleted()) return result;
insertProduceSnTravel(params);
return stepResult;
}
private StepResult saveProduceSn4LineOn(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = StepResult.getSuccessComplete();
if (StringUtils.isEmpty(params.getSerialNumber()) && StringUtils.isEmpty(params.getProductSn())) return stepResult;
String serialNumber = params.getSerialNumber();
String productSn = params.getProductSn();
queryProduceSnInfo(params);
MesProduceSnExt produceSnExtDb = params.getProduceSnExtDb();
if (null == produceSnExtDb) return stepResult.isCompleted(false).msg(String.format("过程条码[%s]产品条码[%s]对应的信息不存在!", serialNumber, productSn));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExtDb.getOperateType()) return stepResult.isCompleted(false).msg(String.format("过程条码[%s]产品条码[%s]对应的信息当前业务状态[返修]!", params.getSerialNumber(), params.getProductSn()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExtDb.getSnStatus()) return stepResult;
produceSnExtDb.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue());
produceSnExtService.doPackSnExtProcess((StationRequestBean) params.getObj(), produceSnExtDb);
ConvertBean.serviceModelUpdate(produceSnExtDb, params.getUserInfo());
produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb);
params.produceSnExtDb(produceSnExtRepository.save(produceSnExtDb));
return stepResult;
}
private StepResult saveProduceSnMcRecord4LineOn(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = StepResult.getSuccessComplete();
if (StringUtils.isEmpty(params.getManageCode()) || !params.getManageCode().contains(MesPcnExtConstWords.AND)) return stepResult;
String[] manageCodeArr = params.getManageCode().split(MesPcnExtConstWords.AND);
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1]));
if (null == produceSnMcRecordDb) return stepResult.isCompleted(false).msg(String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息不存在!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == produceSnMcRecordDb.getQcStatus()) return stepResult.isCompleted(false).msg(String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息当前业务状态[返修]!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == produceSnMcRecordDb.getLineOnStatus()) return stepResult;
produceSnMcRecordDb.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue());
ConvertBean.serviceModelUpdate(produceSnMcRecordDb, params.getUserInfo());
produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnMcRecordRepository.save(produceSnMcRecordDb);
return stepResult;
}
@Override
public void insertProduceSnTravel(JxProdBusiStrategyParamsBuilder params) {
if (null == params.getProduceSnExtDb()) return;
produceSnTravelExtService.insertProduceSnTravelExt(params.getProduceSnExtDb());
}
@Override
public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
@Override
public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
@Override
public StepResult checkThirdPartyPs(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
@Override
public void execFinalInspectionBindPs(JxProdBusiStrategyParamsBuilder params) {
saveProduceSnMcRecord4FinalInspection(params);
saveProduceSn4FinalInspection(params);
insertProduceSnTravel(params);
}
private void saveProduceSnMcRecord4FinalInspection(JxProdBusiStrategyParamsBuilder params) {
if (StringUtils.isEmpty(params.getManageCode()) || !params.getManageCode().contains(MesPcnExtConstWords.AND)) return;
String[] manageCodeArr = params.getManageCode().split(MesPcnExtConstWords.AND);
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1]));
produceSnMcRecordDb.setSnStatus(MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_OFF.getValue());
if (StringUtils.isEmpty(produceSnMcRecordDb.getSerialNumber())) produceSnMcRecordDb.setSerialNumber(params.getProduceSnExtDb().getSerialNumber());
if (StringUtils.isEmpty(produceSnMcRecordDb.getProductSn())) produceSnMcRecordDb.setProductSn(params.getScanInfo());
ConvertBean.serviceModelUpdate(produceSnMcRecordDb, params.getUserInfo());
produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnMcRecordRepository.save(produceSnMcRecordDb);
params.manageCode(produceSnMcRecordDb.getManageCode());
}
private void saveProduceSn4FinalInspection(JxProdBusiStrategyParamsBuilder params) {
MesProduceSnExt produceSnExtDb = null == params.getProduceSnExtDb() ? queryProduceSnInfo(params).getProduceSnExtDb() : params.getProduceSnExtDb();
if (StringUtils.isEmpty(produceSnExtDb.getProductSn())) produceSnExtDb.setProductSn(params.getScanInfo());
if (StringUtils.isEmpty(produceSnExtDb.getTrayNo())) produceSnExtDb.setTrayNo(params.getManageCode());
if (MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() != produceSnExtDb.getQcStatus()) produceSnExtDb.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue());
produceSnExtService.doPackSnExtProcess((StationRequestBean) params.getObj(), produceSnExtDb);
ConvertBean.serviceModelUpdate(produceSnExtDb, params.getUserInfo());
produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb);
params.produceSnExtDb(produceSnExtRepository.save(produceSnExtDb));
}
@Override
public void execFinalInspectionMarkRepair(JxProdBusiStrategyParamsBuilder params) {
saveProduceSn4MarkRepair(params);
saveProduceSnMcRecord4MarkRepair(params);
insertProduceSnTravel(params);
}
private void saveProduceSn4MarkRepair(JxProdBusiStrategyParamsBuilder params) {
if (StringUtils.isEmpty(params.getSerialNumber()) && StringUtils.isEmpty(params.getProductSn())) return;
queryProduceSnInfo(params);
MesProduceSnExt produceSnExtDb = params.getProduceSnExtDb();
produceSnExtDb.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.DEFECTED.getValue());
produceSnExtDb.setOperateType(MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue());
ConvertBean.serviceModelUpdate(produceSnExtDb, params.getUserInfo());
produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb);
params.produceSnExtDb(produceSnExtRepository.save(produceSnExtDb));
}
private void saveProduceSnMcRecord4MarkRepair(JxProdBusiStrategyParamsBuilder params) {
if (StringUtils.isEmpty(params.getManageCode()) || !params.getManageCode().contains(MesPcnExtConstWords.AND)) return;
String[] manageCodeArr = params.getManageCode().split(MesPcnExtConstWords.AND);
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1]));
produceSnMcRecordDb.setQcStatus(MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue());
ConvertBean.serviceModelUpdate(produceSnMcRecordDb, params.getUserInfo());
produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnMcRecordRepository.save(produceSnMcRecordDb);
}
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Author: wangjie
@ -44,4 +45,41 @@ public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyServi
}
@Override
public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
@Override
public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
return checkFinalInspection4Ps(params, stepResult);
}
private StepResult checkFinalInspection4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getProcessCode()) && params.getProduceSnExtDb().getProcessCode().equals(params.getProcessCode()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息已完成当前工序,验证失败!", params.getScanName(), params.getScanInfo()));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
@Override
public StepResult checkThirdPartyPs(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); }
}

@ -1,11 +1,35 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.INumberRuleExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IPartExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProductEncodeCfgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxNumberRuleCheckAttributeService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxNumberRulePackAttributeService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesNumberRuleExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.busi.dispatch.cachedispatch.WorkCellDataCacheDispatch;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Author: wangjie
@ -16,6 +40,27 @@ import org.springframework.stereotype.Service;
@Service
public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategyService {
@Autowired
private IPartExtService partExtService;
@Autowired
private IProductEncodeCfgExtService productEncodeCfgExtService;
@Autowired
private INumberRuleExtService numberRuleExtService;
@Autowired
private ISxNumberRuleCheckAttributeService numberRuleCheckAttributeService;
@Autowired
private ISxNumberRulePackAttributeService numberRulePackAttributeService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Override
public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) {
@ -69,6 +114,167 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer
}
@Override
public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = StepResult.getNonComplete();
MesPartExt partDb = partExtService.getPartExt(params.getOrganizeCode(), params.getOrderModel().getPartNo());
if (null == partDb) return stepResult.msg(String.format("工单号[%s]关联的物料编码[%s]信息不存在!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo()));
String ruleCode;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(params.getOrganizeCode(), MesPcnExtEnumUtil.ENCODE_CODE_TYPE.SERIAL_SN.getValue(), partDb, params.getWorkCenterCode());
} catch (Exception e) {
return stepResult.msg(e.getMessage());
}
if (StringUtils.isEmpty(ruleCode)) return stepResult.msg(String.format("工单号[%s]关联的物料编码[%s]未配置有效的过程编码匹配规则!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo()));
Map<String, Object> map = new HashMap<>();
map.put(MesPcnExtConstWords.ORGANIZE_CODE, params.getOrganizeCode());
map.put(MesPcnExtConstWords.RULE_CODE, ruleCode);
map.put(MesPcnExtConstWords.PART_EXT, partDb);
map.put(MesPcnExtConstWords.WORK_ORDER_NO, params.getOrderModel().getOrderNo());
map.put(MesPcnExtConstWords.WORK_CENTER_CODE, params.getWorkCenterCode());
GenSerialNoModel genSerialNoModel = numberRulePackAttributeService.doPackGenSerialNoModel(map);
BaseResultBean<String> baseResultBean = syncFuncService.syncSerialNo(genSerialNoModel, params.getUserInfo(), params.getOrganizeCode(), 1);
if (null == baseResultBean || (!baseResultBean.isSuccess() || CollectionUtils.isEmpty(baseResultBean.getResultList())))
return stepResult.msg(String.format("工单号[%s]关联的物料编码[%s]配置的过程编码匹配规则编码[%s]生成过程条码失败:%s!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo(), ruleCode, null != baseResultBean ? baseResultBean.getErrorMsg() : null));
((IJxProdBusiStrategyService) params.getStrategyService()).insertProduceSnMcRecord(params.serialNumber(baseResultBean.getResultList().get(0)));
insertProduceSnExt(params);
((IJxProdBusiStrategyService) params.getStrategyService()).insertProduceSnTravel(params);
return stepResult.isCompleted(true).data(params.getProduceSnMcRecordDb());
}
private void insertProduceSnExt(JxProdBusiStrategyParamsBuilder params) {
MesProduceSnExt produceSnExt = new MesProduceSnExt();
produceSnExt.setSerialNumber(params.getSerialNumber());
produceSnExt.setWorkOrderNo(params.getOrderModel().getOrderNo());
produceSnExt.setLastWorkOrderNo(params.getOrderModel().getOrderNo());
produceSnExt.setPartNo(params.getOrderModel().getPartNo());
produceSnExt.setPartNameRdd(params.getOrderModel().getPartNameRdd());
produceSnExt.setPrintStatus(MesPcnExtEnumUtil.PRODUCE_SN_PRINT_STATUS.UNPRINT.getValue());
produceSnExt.setPrintCount(0);
produceSnExt.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
produceSnExt.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue());
produceSnExt.setSnType(MesPcnExtEnumUtil.PRODUCE_SN_TYPE.STANDARD_SN.getValue());
produceSnExt.setQty(1d);
produceSnExt.setWorkCenterCode(params.getWorkCenterCode());
produceSnExt.setTrayNo(params.getManageCode());
produceSnExt.setOperateType(MesPcnExtEnumUtil.SN_OPERATE_TYPE.QUALIFIED.getValue());
produceSnExt.setIfCompensate(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
produceSnExt.setOrganizeCode(params.getOrganizeCode());
ConvertBean.serviceModelInitialize(produceSnExt, params.getUserInfo());
produceSnExt.setInWorkCenterTime(produceSnExt.getCreateDatetime());
produceSnExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
params.produceSnExtDb(produceSnExtRepository.insert(produceSnExt));
}
@Override
public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) {
((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params);
StepResult stepResult = StepResult.getNonComplete();
if (null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo()));
return checkFinalInspection4Ps(params, stepResult);
}
private StepResult checkFinalInspection4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getProcessCode()) && params.getProduceSnExtDb().getProcessCode().equals(params.getProcessCode()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息已完成当前工序,验证失败!", params.getScanName(), params.getScanInfo()));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getQcStatus())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}
@Override
public StepResult checkThirdPartyPs(JxProdBusiStrategyParamsBuilder params) {
StepResult stepResult = StepResult.getNonComplete();
if (!checkProduceSnIsScanOtherCell(params, stepResult)) return stepResult;
MesPartExt partDb = partExtService.getPartExt(params.getOrganizeCode(), params.getOrderModel().getPartNo());
if (null == partDb) return stepResult.msg(String.format("生产工单[%s]关联的物料编码[%s]对应的物料信息不存在!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo()));
if (StringUtils.isEmpty(partDb.getProductMatchType()))
return stepResult.msg(String.format("生产工单[%s]关联的物料编码[%s]对应的物料信息未配置产品编码匹配类型!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo()));
String ruleCode;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(
params.getOrganizeCode(), MesPcnExtEnumUtil.ENCODE_CODE_TYPE.STANDARD_SERIAL_SN.getValue(), partDb, params.getOrderModel().getWorkCenterCode());
} catch (Exception e) {
return stepResult.msg(String.format("生产工单[%s]关联的物料编码[%s]:[%s]!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo(), e.getMessage()));
}
MesNumberRuleExt numberRuleDb = numberRuleExtService.getNumberRuleExtByRuleCode(params.getOrganizeCode(), ruleCode);
if (null == numberRuleDb || StringUtils.isEmpty(numberRuleDb.getNumberRule()) ||
StringUtils.isEmpty(numberRuleDb.getRuleLengthSpilt()) || StringUtils.isEmpty(numberRuleDb.getMethodName()))
return stepResult.msg(String.format("生产工单[%s]关联的物料编码[%s]配置的编码规则代码[%s]无效!", params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo(), ruleCode));
Map<String, Object> map = new HashMap<>();
map.put(MesPcnExtConstWords.SERIAL_NUMBER, params.getScanInfo());
map.put(MesPcnExtConstWords.NUMBER_RULE_EXT, numberRuleDb);
map.put(MesPcnExtConstWords.PART_EXT, partDb);
if (!(Boolean) numberRuleCheckAttributeService.doCheckNumberRule(map).get(MesPcnExtConstWords.RESULT))
return stepResult.msg(String.format("产品条码[%s]与生产工单[%s]关联的物料编码[%s]配置的编码规则不匹配,操作失败!", params.getScanInfo(), params.getOrderModel().getOrderNo(), params.getOrderModel().getPartNo()));
((IJxProdBusiStrategyService) params.getStrategyService()).queryProduceSnInfo(params.productSn(params.getScanInfo()));
if (null != params.getProduceSnExtDb())
return stepResult.msg(String.format("产品条码[%s]已绑定过生产工单[%s],操作失败!", params.getScanInfo(), params.getProduceSnExtDb().getWorkOrderNo()));
return stepResult.isCompleted(true);
}
private synchronized Boolean checkProduceSnIsScanOtherCell(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
if (StringUtils.isEmpty(params.getLockContent())) return true;
String key = new StringJoiner(MesPcnExtConstWords.COLON).add(params.getOrganizeCode()).add(MesPcnExtConstWords.JX_THIRD_PARTY_SN_LOCK).add(params.getLockContent()).toString();
String curCell = new StringJoiner(MesPcnExtConstWords.COLON).add(params.getOrganizeCode()).add(params.getWorkCenterCode()).add(params.getWorkCellCode()).toString();
WorkCellDataCacheDispatch dispatch = new WorkCellDataCacheDispatch.builder().key(key).build().get();
if (!StringUtils.isEmpty(dispatch.getValue()) && !dispatch.getValue().equals(curCell))
return stepResult.msg(String.format("产品条码[%s]已在生产线[%s]工位[%s]被扫描,请扫描其他条码或5秒后重试当前条码,操作失败!",
params.getLockContent(), dispatch.getValue().split(MesPcnExtConstWords.COLON)[1], dispatch.getValue().split(MesPcnExtConstWords.COLON)[2])).isCompleted();
new WorkCellDataCacheDispatch.builder().key(key).value(curCell).timeSecond(5).build().get();
return true;
}
}

@ -0,0 +1,279 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnWorkCellScanModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
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.impp.framework.boot.util.ImppRedis;
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 javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author :wangjie
* @CreateDate : 2020-06-26 11:18
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionModuleService")
public class JxSnFinalInspectionModuleService extends BaseModuleService {
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IProduceSnExtService produceSnExtService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
@Override
public void init(StationRequestBean reqBean) {
MesWorkOrderExt workOrderExt = getCurExecWorkOrder(reqBean);
doLoadData(reqBean, workOrderExt);
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrder)) return true;
MesWorkOrderExt workOrderExtDb = getCachedWorkOrder(reqBean, curExecWorkOrder);
if (null == workOrderExtDb) return true;
doLoadData(reqBean, workOrderExtDb);
return true;
}
private MesWorkOrderExt getCurExecWorkOrder(StationRequestBean reqBean) {
String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null);
MesWorkOrderExt workOrderExtDb = StringUtils.isEmpty(curExecWorkOrder) ? null : getCachedWorkOrder(reqBean, curExecWorkOrder);
return workOrderExtDb;
}
private String getDataKey(StationRequestBean reqBean) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode())
.add(MesPcnExtConstWords.JX_SN_FQC_DATA).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).toString();
}
private MesWorkOrderExt getCachedWorkOrder(StationRequestBean reqBean, String curExecWorkOrder) {
return workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrder);
}
private List<AttrBean> packDataAttrList() {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MANAGE_CODE, "(源)管理码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.STATUS, "终检状态");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, "过程条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PRODUCT_SN, "产品条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, "操作时间");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_USER, "操作人");
return attrBeanList;
}
private void doLoadData(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.JX_SN_FQC_MODULE);
resultBean.setDataAttrList(packDataAttrList());
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
if (null != workOrderExt) {
List<MesProduceSnExt> produceSnList;
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != workOrderExt.getWorkOrderType())
produceSnList = produceSnExtService.getProduceSnExtListByOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo());
else
produceSnList = produceSnExtService.getProduceSnExtListByLastOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo());
resultBean.setResultMap(packResultMap(workOrderExt, getCompleteQtyByType(reqBean, produceSnList)));
resultBean.setResultList(packResultListByType(reqBean, produceSnList));
}
this.sendMessage(reqBean, resultBean);
}
private Integer getCompleteQtyByType(StationRequestBean reqBean, List<MesProduceSnExt> produceSnList) {
List<MesProduceSnExt> curProcessSnList = CollectionUtils.isEmpty(produceSnList) ? null :
produceSnList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessCode()) && o.getProcessCode().equals(reqBean.getProcessCode()))).collect(Collectors.toList());
return CollectionUtils.isEmpty(curProcessSnList) ? MesPcnExtConstWords.ZERO : curProcessSnList.size();
}
private List<JxSnWorkCellScanModel> packResultListByType(StationRequestBean reqBean, List<MesProduceSnExt> produceSnList) {
List<JxSnWorkCellScanModel> resultList = null;
if (CollectionUtils.isEmpty(produceSnList)) return resultList;
produceSnList = produceSnList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSn::getModifyDatetime).reversed()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(produceSnList) && produceSnList.size() > 50) produceSnList = produceSnList.subList(0, 50);
Integer index = 1;
for (MesProduceSnExt produceSnExt : produceSnList) {
if (null == produceSnExt) continue;
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
JxSnWorkCellScanModel result = new JxSnWorkCellScanModel();
BeanUtils.copyProperties(produceSnExt, result);
if (!StringUtils.isEmpty(produceSnExt.getProcessCode()) && produceSnExt.getProcessCode().equals(reqBean.getProcessCode())) result.status("已终检").color(MesPcnExtConstWords.GREEN);
else if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExt.getOperateType()) result.status("返修中");
else result.status("未终检");
resultList.add(result.manageCode(produceSnExt.getTrayNo()).index(index));
index ++;
}
return resultList;
}
private Map<String, Object> packResultMap(MesWorkOrderExt workOrderExt, Integer completeQty) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.CUR_WORK_ORDER_NO, workOrderExt.getOrderNo());
resultMap.put(MesPcnExtConstWords.PART_NO, workOrderExt.getPartNo());
resultMap.put(MesPcnExtConstWords.PART_NAME_RDD, workOrderExt.getPartNameRdd());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE, workOrderExt.getWorkOrderType());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE_NAME, MesPcnExtEnumUtil.WORK_ORDER_TYPE.valueOfDescription(workOrderExt.getWorkOrderType()));
resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, workOrderExt.getWorkOrderStatus());
resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS_NAME, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()));
resultMap.put(MesPcnExtConstWords.QTY, workOrderExt.getQty().intValue());
resultMap.put(MesPcnExtConstWords.COMPLETE_QTY, completeQty);
return resultMap;
}
@Override
public boolean doFunction(StationRequestBean reqBean) {
Boolean result = false;
Map<String, Object> dataMap = reqBean.getDataMap();
String command = (String) dataMap.get(MesPcnExtConstWords.COMMAND);
Object value = dataMap.get(MesPcnExtConstWords.VALUE);
if (StringUtils.isEmpty(command)) {
this.sendMessage(reqBean, null, "后端未获取到业务功能指令", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
switch (command) {
case MesPcnExtConstWords.CMD_WORK_ORDER :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "请选择启动状态的生产工单", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result;
reqBean.setForceJumpProcess(true);
if (StringUtils.isEmpty(selectWorkOrderNo)) {
if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) result = true;
else {
this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
}
break;
case MesPcnExtConstWords.CMD_BUSI_FLAG :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "请点击业务按钮", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
String curBusiFlag = (String) doHandleBusiFlag(reqBean, 1, null);
if (!StringUtils.isEmpty(curBusiFlag) && curBusiFlag.equals(value)) return result;
reqBean.setTriggerAutoFsm(true);
if (StringUtils.isEmpty(curBusiFlag)) {
if ((Boolean) doHandleBusiFlag(reqBean, 2, value.toString())) result = true;
else {
this.sendMessage(reqBean, null, String.format("业务按钮[%s]缓存失败,请重试", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
}
break;
case MesPcnExtConstWords.CMD_FORCE_CENTER_PASS :
if (StringUtils.isEmpty(value)) {
this.sendMessage(reqBean, null, "入参缺少产线强制放行的工步代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return result;
}
reqBean.setForceSpecStepCode(value.toString());
result = true;
break;
default:
break;
}
if (!result) this.sendMessage(reqBean, null, "操作太频繁", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else {
//跳过工序
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
shippingDispatchService.doSendScanQueueNextExec(reqBean);
}
return result;
}
public synchronized Object doHandleCurExecWorkOrder(StationRequestBean reqBean, Integer flag, String curExecWorkOrder) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER, curExecWorkOrder, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleSelectWorkOrderNo(StationRequestBean reqBean, Integer flag, String selectWorkOrderNo) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER, selectWorkOrderNo, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER);
return true;
default:
return null;
}
}
public synchronized Object doHandleBusiFlag(StationRequestBean reqBean, Integer flag, String busiFlag) {
switch (flag) {
case 1:
return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_BUSI_FLAG);
case 2:
return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_BUSI_FLAG, busiFlag, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue());
case 3:
redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_BUSI_FLAG);
return true;
default:
return null;
}
}
}

@ -6,7 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnLineOnModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnWorkCellScanModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
@ -92,7 +92,7 @@ public class JxSnLineOnModuleService extends BaseModuleService {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MANAGE_CODE, "(源)管理码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.BIND_STATUS, "关键件绑定情况");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.STATUS, "上线状态");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, "过程条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PRODUCT_SN, "产品条码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, "操作时间");
@ -129,17 +129,27 @@ public class JxSnLineOnModuleService extends BaseModuleService {
}
private Integer getCompleteQtyByType(Integer workOrderType, List<MesProduceSnExt> produceSnList, List<MesProduceSnMcRecord> produceSnMcRecordList) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return CollectionUtils.isEmpty(produceSnList) ? MesPcnExtConstWords.ZERO : produceSnList.size();
else return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size();
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == workOrderType) return getListSize(produceSnList);
else if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderType) return getListSize(getLineOnSnList(produceSnList));
else return getListSize(produceSnMcRecordList);
}
private List<JxSnLineOnModel> packResultListByType(Integer workOrderType, List<MesProduceSnExt> produceSnList, List<MesProduceSnMcRecord> produceSnMcRecordList) {
private List<MesProduceSnExt> getLineOnSnList(List<MesProduceSnExt> produceSnList) {
return CollectionUtils.isEmpty(produceSnList) ? null :
produceSnList.stream().filter(o -> (null != o && MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() == o.getSnStatus())).collect(Collectors.toList());
}
private Integer getListSize(List list) {
return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.ZERO : list.size();
}
private List<JxSnWorkCellScanModel> packResultListByType(Integer workOrderType, List<MesProduceSnExt> produceSnList, List<MesProduceSnMcRecord> produceSnMcRecordList) {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return packResultListByType1(produceSnList);
else return packResultListByType2(produceSnMcRecordList);
}
private List<JxSnLineOnModel> packResultListByType1(List<MesProduceSnExt> produceSnList) {
List<JxSnLineOnModel> resultList = null;
private List<JxSnWorkCellScanModel> packResultListByType1(List<MesProduceSnExt> produceSnList) {
List<JxSnWorkCellScanModel> resultList = null;
if (CollectionUtils.isEmpty(produceSnList)) return resultList;
@ -150,22 +160,20 @@ public class JxSnLineOnModuleService extends BaseModuleService {
Integer index = 1;
for (MesProduceSnExt produceSnExt : produceSnList) {
if (null == produceSnExt) continue;
JxSnLineOnModel result = new JxSnLineOnModel();
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
JxSnWorkCellScanModel result = new JxSnWorkCellScanModel();
BeanUtils.copyProperties(produceSnExt, result);
result.setManageCode(produceSnExt.getTrayNo());
result.setBindStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus() ? "已完成" : "未完成");
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus()) result.setColor(MesPcnExtConstWords.GREEN);
result.setIndex(index);
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus()) result.status("已完成").color(MesPcnExtConstWords.GREEN);
else result.status("未完成");
resultList.add(result.manageCode(produceSnExt.getTrayNo()).index(index));
index ++;
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
resultList.add(result);
}
return resultList;
}
private List<JxSnLineOnModel> packResultListByType2(List<MesProduceSnMcRecord> produceSnMcRecordList) {
List<JxSnLineOnModel> resultList = null;
private List<JxSnWorkCellScanModel> packResultListByType2(List<MesProduceSnMcRecord> produceSnMcRecordList) {
List<JxSnWorkCellScanModel> resultList = null;
if (CollectionUtils.isEmpty(produceSnMcRecordList)) return resultList;
@ -176,14 +184,13 @@ public class JxSnLineOnModuleService extends BaseModuleService {
Integer index = 1;
for (MesProduceSnMcRecord produceSnMcRecord : produceSnMcRecordList) {
if (null == produceSnMcRecordList) continue;
JxSnLineOnModel result = new JxSnLineOnModel();
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
JxSnWorkCellScanModel result = new JxSnWorkCellScanModel();
BeanUtils.copyProperties(produceSnMcRecord, result);
result.setBindStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus() ? "已完成" : "未完成");
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus()) result.setColor(MesPcnExtConstWords.GREEN);
result.setIndex(index);
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus()) result.status("已完成").color(MesPcnExtConstWords.GREEN);
else result.status("未完成");
resultList.add(result.index(index));
index ++;
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
resultList.add(result);
}
return resultList;

@ -118,7 +118,7 @@ public class JxBindKeyPartStepService extends BaseStepService {
doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.BIND_KEY_PART, JSONObject.toJSONString(pbList));
this.refresh(reqBean, pbList);
this.refresh(reqBean, resultBean, pbList);
log.info("工厂{}生产线{}工位{}: --- STEP INIT --- JxBindKeyPartStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
@ -156,7 +156,7 @@ public class JxBindKeyPartStepService extends BaseStepService {
if (null == data) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, checkIsJumpState(reqBean, resultBean, moduleService, method, appendItem, true), "没有需要绑定的清单,请维护!");
List<ProcessBomModel> pbList = this.refresh(reqBean, JSONObject.parseArray((String) data, ProcessBomModel.class));
List<ProcessBomModel> pbList = this.refresh(reqBean, resultBean, JSONObject.parseArray((String) data, ProcessBomModel.class));
List<MesKpsnRule> kpsnRuleList = getKpsnRuleList(reqBean, pbList);
@ -179,7 +179,7 @@ public class JxBindKeyPartStepService extends BaseStepService {
overrideMatchPbData(processBomModel);
this.refresh(reqBean, pbList);
this.refresh(reqBean, resultBean, pbList);
if (!checkPbListIsComplete(reqBean, resultBean, moduleService, method, appendItem, pbList, true))
execSendMsgAndThrowEx(reqBean, resultBean, String.format("关键件条码[%s]绑定%s成功,请继续扫描关键件!", reqBean.getScanInfo(), suffix));
@ -296,7 +296,7 @@ public class JxBindKeyPartStepService extends BaseStepService {
else return null;
}
private List<ProcessBomModel> refresh(StationRequestBean reqBean, List<ProcessBomModel> pbList) {
private List<ProcessBomModel> refresh(StationRequestBean reqBean, StationResultBean resultBean, List<ProcessBomModel> pbList) {
List<AttrBean> attrBeanList = new ArrayList<>();
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NO, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料号"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料名称"));
@ -305,7 +305,6 @@ public class JxBindKeyPartStepService extends BaseStepService {
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.BOUND_QTY, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "已绑数量"));
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.IS_BIND_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "是否绑定"));
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue());
resultBean.setResultList(pbList);

@ -0,0 +1,105 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonBean;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionAspectCheckStepService")
public class JxSnFinalInspectionAspectCheckStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Override
public StepResult init(StationRequestBean reqBean) {
clearStepContent(reqBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionAspectCheckStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
String busiFlag = (String) snFinalInspectionModuleService.doHandleBusiFlag(reqBean, 1, null);
if (!StringUtils.isEmpty(busiFlag)) snFinalInspectionModuleService.doHandleBusiFlag(reqBean, 3, null);
String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? "管理编码" : "产品条码";
String suffixSn = StringUtils.isEmpty(reqBean.getProductSn()) ? getManageCode(reqBean.getTray(), 1) : reqBean.getProductSn();
if (StringUtils.isEmpty(busiFlag)) execSendAspectCheckBusiFlag(reqBean, resultBean, suffix, suffixSn);
StepResult stepResult = StepResult.getSuccessComplete();
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionAspectCheckStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
if (busiFlag.equals(BUSI_FLAG.QUALIFIED.getValue()))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s[%s]外观检查[合格]!", suffix, suffixSn));
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s[%s]外观检查[不合格]!即将进行返修状态标记!", suffix, suffixSn));
}
private void execSendAspectCheckBusiFlag(StationRequestBean reqBean, StationResultBean resultBean, String suffix, String suffixSn) {
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.BUTTON.getValue());
List<ButtonBean> buttonBeanList = new ArrayList<>();
buttonBeanList.add(ButtonBean.builder().buttonCode(BUSI_FLAG.QUALIFIED.value).buttonName(BUSI_FLAG.QUALIFIED.description).methodContent(suffixSn).buttonDesc(BUSI_FLAG.QUALIFIED.description).build());
buttonBeanList.add(ButtonBean.builder().buttonCode(BUSI_FLAG.REPAIR.value).buttonName(BUSI_FLAG.REPAIR.description).methodContent(suffixSn).buttonDesc(BUSI_FLAG.REPAIR.description).build());
resultBean.setResultList(buttonBeanList);
this.sendMessage(reqBean, resultBean);
this.sendMessage(reqBean, resultBean, String.format("请对当前产品:%s[%s]进行外观检查!", suffix, suffixSn), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
execSendGuideAndThrowEx(reqBean, resultBean, "请点击业务按钮!");
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
enum BUSI_FLAG {
QUALIFIED("QUALIFIED", "检查合格"),
REPAIR("REPAIR", "返工返修");
private String value;
private String description;
BUSI_FLAG(String value, String description) {
this.value = value;
this.description = description;
}
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
}
}

@ -0,0 +1,133 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
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.StringUtils;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionBindPsStepService")
public class JxSnFinalInspectionBindPsStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionBindPsStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getProductSn()) && StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
StepResult stepResult = StepResult.getSuccessComplete();
if (StringUtils.isEmpty(reqBean.getProductSn())) checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel);
else reqBean.setScanInfo(null);
String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn());
execFinalInspectionBindPs(reqBean, stepResult, orderModel);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionBindPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s%s终检完成!", suffix, !StringUtils.isEmpty(reqBean.getScanInfo()) ? String.format("已绑定产品条码[%s]!", reqBean.getScanInfo()) : MesPcnExtConstWords.EMPTY));
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
private void checkScanInfoIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, WorkOrderExtModel orderModel) {
JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.scanInfo(reqBean.getScanInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.orderModel(orderModel)
.lockContent(reqBean.getScanInfo())
.strategyService(SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.build();
StepResult result = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.valueOfClazz(orderModel.getWorkOrderType()))).checkThirdPartyPs(params);
this.sendMessage(reqBean, resultBean, result.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, result.isCompleted() ? MesPcnEnumUtil.STATION_DATA_TYPE.TEXT : MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
if (!result.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!");
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() == orderModel.getWorkOrderType()) stepResult.setData(params.getProduceSnExtDb());
}
private void execFinalInspectionBindPs(StationRequestBean reqBean, StepResult stepResult, WorkOrderExtModel orderModel) {
((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.execFinalInspectionBindPs(new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.userInfo(reqBean.getUserInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.orderModel(orderModel)
.serialNumber(reqBean.getSerialNumber())
.productSn(reqBean.getProductSn())
.scanInfo(reqBean.getScanInfo())
.manageCode(reqBean.getTray())
.produceSnExtDb(null != stepResult.getData() ? (MesProduceSnExt) stepResult.getData() : null)
.obj(reqBean)
.build());
}
}

@ -0,0 +1,124 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
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.StringUtils;
import java.util.StringJoiner;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionCheckMcOrPsStepService")
public class JxSnFinalInspectionCheckMcOrPsStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult guide(StationRequestBean reqBean) {
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!");
}
@Override
public StepResult init(StationRequestBean reqBean) {
reqBean.setSerialNumber(null);
reqBean.setProductSn(null);
reqBean.setTray(null);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionCheckMcOrPsStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getScanInfo())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少管理编码或产品条码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel);
reqBean.setScanInfo(null);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionCheckMcOrPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
private StepResult checkScanInfoIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, WorkOrderExtModel orderModel) {
JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.scanInfo(reqBean.getScanInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.routeProcess(reqBean.getRouteCode(), reqBean.getProcessCode())
.orderModel(orderModel)
.strategyService(SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.build();
StepResult result = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.valueOfClazz(orderModel.getWorkOrderType()))).checkFinalInspection(params);
this.sendMessage(reqBean, resultBean, result.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, result.isCompleted() ? MesPcnEnumUtil.STATION_DATA_TYPE.TEXT : MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
stepResult.setCompleted(result.isCompleted());
reqBean.setSerialNumber(params.getSerialNumber());
reqBean.setProductSn(params.getProductSn());
reqBean.setTray(null == params.getProduceSnMcRecordDb() ? params.getManageCode() : new StringJoiner(MesPcnExtConstWords.AND).add(params.getProduceSnMcRecordDb().getManageCode()).add(params.getProduceSnMcRecordDb().getId().toString()).toString());
return stepResult;
}
}

@ -0,0 +1,121 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductData;
import cn.estsh.i3plus.pojo.mes.model.ButtonBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesProductDataRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionDataReviewStepService")
public class JxSnFinalInspectionDataReviewStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Autowired
private MesProductDataRepository productDataRepository;
@Override
public StepResult init(StationRequestBean reqBean) {
clearStepContent(reqBean);
return super.init(reqBean);
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionDataReviewStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
String busiFlag = (String) snFinalInspectionModuleService.doHandleBusiFlag(reqBean, 1, null);
if (!StringUtils.isEmpty(busiFlag)) snFinalInspectionModuleService.doHandleBusiFlag(reqBean, 3, null);
String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? "管理编码" : "产品条码";
String suffixSn = StringUtils.isEmpty(reqBean.getProductSn()) ? getManageCode(reqBean.getTray(), 1) : reqBean.getProductSn();
if (!StringUtils.isEmpty(busiFlag) && busiFlag.equals(BUSI_FLAG.ASPECT_CHECK.getValue()))
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s[%s]已跳过数据复核进入外观检查!", suffix, suffixSn));
StepResult stepResult = StepResult.getSuccessComplete();
if (!StringUtils.isEmpty(busiFlag) && busiFlag.equals(BUSI_FLAG.REPAIR.getValue()))
return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.nextTriggerEvent(MesPcnExtConstWords.STATE_REPAIR), String.format("%s[%s]已跳过数据复核!即将进行返修状态标记!", suffix, suffixSn));
MesProductData productData = getProductData(reqBean, suffixSn);
if (null == productData) execSendDataReviewBusiFlag(reqBean, resultBean, suffix, suffixSn);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionDataReviewStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s数据复核验证成功!", suffix));
}
private MesProductData getProductData(StationRequestBean reqBean, String suffixSn) {
return productDataRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.SERIAL_NUMBER},
new Object[]{reqBean.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), suffixSn});
}
private void execSendDataReviewBusiFlag(StationRequestBean reqBean, StationResultBean resultBean, String suffix, String suffixSn) {
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.BUTTON.getValue());
List<ButtonBean> buttonBeanList = new ArrayList<>();
buttonBeanList.add(ButtonBean.builder().buttonCode(BUSI_FLAG.ASPECT_CHECK.value).buttonName(BUSI_FLAG.ASPECT_CHECK.description).methodContent(suffixSn).buttonDesc(BUSI_FLAG.ASPECT_CHECK.description).build());
buttonBeanList.add(ButtonBean.builder().buttonCode(BUSI_FLAG.REPAIR.value).buttonName(BUSI_FLAG.REPAIR.description).methodContent(suffixSn).buttonDesc(BUSI_FLAG.REPAIR.description).build());
resultBean.setResultList(buttonBeanList);
this.sendMessage(reqBean, resultBean);
this.sendMessage(reqBean, resultBean, String.format("%s[%s]数据复核验证失败!", suffix, suffixSn), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
execSendGuideAndThrowEx(reqBean, resultBean, "请点击业务按钮!");
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
enum BUSI_FLAG {
ASPECT_CHECK("ASPECT_CHECK", "外观检查"),
REPAIR("REPAIR", "返工返修");
private String value;
private String description;
BUSI_FLAG(String value, String description) {
this.value = value;
this.description = description;
}
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
}
}

@ -0,0 +1,107 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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 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.StringUtils;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionInitOrderStepService")
public class JxSnFinalInspectionInitOrderStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionInitOrderStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
String selectWorkOrderNo = (String) snFinalInspectionModuleService.doHandleSelectWorkOrderNo(reqBean, 1, null);
String curExecWorkOrderNo = (String) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo)) snFinalInspectionModuleService.doHandleSelectWorkOrderNo(reqBean, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) {
if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null;
else curExecWorkOrderNo = null;
}
MesWorkOrderExt workOrderExt = null;
if (!StringUtils.isEmpty(selectWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo), true);
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo);
}
if (!StringUtils.isEmpty(curExecWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo), false);
}
if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!");
cacheOrderModel(reqBean, workOrderExt);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) {
Boolean flag = (Boolean) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 2, selectWorkOrderNo);
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo));
else {
snFinalInspectionModuleService.execStateModule(reqBean, null, null);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
private void checkWorkOrderExtIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkOrderExt workOrderExt, String suffix, Boolean flag) {
if (null == workOrderExt) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s对应的工单信息不存在!", suffix));
if (stepResult.isCompleted() && MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus())
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s状态[%s],不支持在此工位操作!", suffix, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())));
if (stepResult.isCompleted() && MathOperation.compareTo(workOrderExt.getQty(), new Double(0)) <= 0)
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s计划数量为[0],不支持在此工位操作!", suffix));
if (!stepResult.isCompleted()) return;
}
private void cacheOrderModel(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
WorkOrderExtModel orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER, orderModel);
}
}

@ -0,0 +1,62 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
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.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionMarkRepairStepService")
public class JxSnFinalInspectionMarkRepairStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionMarkRepairStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StationResultBean resultBean = new StationResultBean();
String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn());
execFinalInspectionMarkRepair(reqBean);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionMarkRepairStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s标记返修完成!", suffix));
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
private void execFinalInspectionMarkRepair(StationRequestBean reqBean) {
((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.execFinalInspectionMarkRepair(new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.userInfo(reqBean.getUserInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.serialNumber(reqBean.getSerialNumber())
.productSn(reqBean.getProductSn())
.manageCode(reqBean.getTray())
.build());
}
}

@ -1,39 +1,26 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IPartExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProductEncodeCfgExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxNumberRulePackAttributeService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
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.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
/**
@ -53,24 +40,6 @@ public class JxSnLineOnBindMcStepService extends BaseStepService {
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private IProductEncodeCfgExtService productEncodeCfgExtService;
@Autowired
private IPartExtService partExtService;
@Autowired
private ISxNumberRulePackAttributeService numberRulePackAttributeService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Override
public StepResult guide(StationRequestBean reqBean) {
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!");
@ -91,21 +60,17 @@ public class JxSnLineOnBindMcStepService extends BaseStepService {
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == orderModel.getWorkOrderType()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, "返工工单已跳过管理编码绑定!");
MesPartExt partDb = partExtService.getPartExt(reqBean.getOrganizeCode(), orderModel.getPartNo());
if (null == partDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]信息不存在!", orderModel.getOrderNo(), orderModel.getPartNo()));
StepResult stepResult = execLineOnBindMc(reqBean, resultBean, orderModel);
String serialNumber = null;
if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == orderModel.getWorkOrderType()) serialNumber = execSerialNumber(reqBean, resultBean, orderModel, partDb);
MesProduceSnMcRecord produceSnMcRecord = (MesProduceSnMcRecord) stepResult.getData();
MesProduceSnMcRecord produceSnMcRecord = insertMcAndSn(reqBean, orderModel, serialNumber);
reqBean.setSerialNumber(serialNumber);
reqBean.setSerialNumber(produceSnMcRecord.getSerialNumber());
reqBean.setTray(new StringJoiner(MesPcnExtConstWords.AND).add(produceSnMcRecord.getManageCode()).add(produceSnMcRecord.getId().toString()).toString());
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- SUCCESS --- MesProduceSnMcRecord:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), JSONObject.toJSONString(produceSnMcRecord));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("管理编码[%s]%s绑定生产工单[%s]成功!",
produceSnMcRecord.getManageCode(), !StringUtils.isEmpty(serialNumber) ? String.format("关联过程条码[%s]", serialNumber) : MesPcnExtConstWords.EMPTY, orderModel.getOrderNo()));
produceSnMcRecord.getManageCode(), !StringUtils.isEmpty(reqBean.getSerialNumber()) ? String.format("关联过程条码[%s]", reqBean.getSerialNumber()) : MesPcnExtConstWords.EMPTY, orderModel.getOrderNo()));
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
@ -128,79 +93,20 @@ public class JxSnLineOnBindMcStepService extends BaseStepService {
return orderModel;
}
private String execSerialNumber(StationRequestBean reqBean, StationResultBean resultBean, WorkOrderExtModel orderModel, MesPartExt partDb) {
String ruleCode = null;
try {
ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(reqBean.getOrganizeCode(), MesPcnExtEnumUtil.ENCODE_CODE_TYPE.SERIAL_SN.getValue(), partDb, orderModel.getWorkCenterCode());
} catch (Exception e) {
execExpSendMsgAndThrowEx(reqBean, resultBean, e.getMessage());
}
if (StringUtils.isEmpty(ruleCode)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]未配置有效的过程编码匹配规则!", orderModel.getOrderNo(), orderModel.getPartNo()));
Map<String, Object> map = new HashMap<>();
map.put(MesPcnExtConstWords.ORGANIZE_CODE, reqBean.getOrganizeCode());
map.put(MesPcnExtConstWords.RULE_CODE, ruleCode);
map.put(MesPcnExtConstWords.PART_EXT, partDb);
map.put(MesPcnExtConstWords.WORK_ORDER_NO, orderModel.getOrderNo());
map.put(MesPcnExtConstWords.WORK_CENTER_CODE, orderModel.getWorkCenterCode());
GenSerialNoModel genSerialNoModel = numberRulePackAttributeService.doPackGenSerialNoModel(map);
BaseResultBean<String> baseResultBean = syncFuncService.syncSerialNo(genSerialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1);
if (null == baseResultBean || (!baseResultBean.isSuccess() || CollectionUtils.isEmpty(baseResultBean.getResultList())))
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format(
"工单号[%s]关联的物料编码[%s]配置的过程编码匹配规则编码[%s]生成过程条码失败:%s!", orderModel.getOrderNo(), orderModel.getPartNo(), ruleCode, null != baseResultBean ? baseResultBean.getErrorMsg() : null));
private StepResult execLineOnBindMc(StationRequestBean reqBean, StationResultBean resultBean, WorkOrderExtModel orderModel) {
return baseResultBean.getResultList().get(0);
}
private MesProduceSnMcRecord insertMcAndSn(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnMcRecord produceSnMcRecord = insertProduceSnMcRecord(reqBean, orderModel, serialNumber);
if (!StringUtils.isEmpty(serialNumber)) insertProduceSnExt(reqBean, orderModel, serialNumber);
return produceSnMcRecord;
}
private MesProduceSnMcRecord insertProduceSnMcRecord(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnMcRecord produceSnMcRecord = new MesProduceSnMcRecord();
produceSnMcRecord.setManageCode(reqBean.getTray());
produceSnMcRecord.setSerialNumber(serialNumber);
produceSnMcRecord.setPartNo(orderModel.getPartNo());
produceSnMcRecord.setPartNameRdd(orderModel.getPartNameRdd());
produceSnMcRecord.setWorkCenterCode(orderModel.getWorkCenterCode());
produceSnMcRecord.setWorkOrderNo(orderModel.getOrderNo());
produceSnMcRecord.setSnStatus(MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue());
produceSnMcRecord.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.FALSE.getValue());
produceSnMcRecord.setQcStatus(MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.TRUE.getValue());
produceSnMcRecord.setOrganizeCode(reqBean.getOrganizeCode());
produceSnMcRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelInitialize(produceSnMcRecord, reqBean.getUserInfo());
return produceSnMcRecordRepository.insert(produceSnMcRecord);
}
StepResult stepResult = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.valueOfClazz(orderModel.getWorkOrderType())))
.execLineOnBindMc(new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.userInfo(reqBean.getUserInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.orderModel(orderModel)
.manageCode(reqBean.getTray())
.strategyService(SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.build());
if (!stepResult.isCompleted()) execExpSendMsgAndThrowEx(reqBean, resultBean, stepResult.getMsg());
private void insertProduceSnExt(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) {
MesProduceSnExt produceSnExt = new MesProduceSnExt();
produceSnExt.setSerialNumber(serialNumber);
produceSnExt.setWorkOrderNo(orderModel.getOrderNo());
produceSnExt.setLastWorkOrderNo(orderModel.getOrderNo());
produceSnExt.setPartNo(orderModel.getPartNo());
produceSnExt.setPartNameRdd(orderModel.getPartNameRdd());
produceSnExt.setPrintStatus(MesPcnExtEnumUtil.PRODUCE_SN_PRINT_STATUS.UNPRINT.getValue());
produceSnExt.setPrintCount(0);
produceSnExt.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
produceSnExt.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue());
produceSnExt.setSnType(MesPcnExtEnumUtil.PRODUCE_SN_TYPE.STANDARD_SN.getValue());
produceSnExt.setQty(1d);
produceSnExt.setWorkCenterCode(orderModel.getWorkCenterCode());
produceSnExt.setTrayNo(reqBean.getTray());
produceSnExt.setOperateType(MesPcnExtEnumUtil.SN_OPERATE_TYPE.QUALIFIED.getValue());
produceSnExt.setIfCompensate(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
produceSnExt.setOrganizeCode(orderModel.getOrganizeCode());
ConvertBean.serviceModelInitialize(produceSnExt, reqBean.getUserInfo());
produceSnExt.setInWorkCenterTime(produceSnExt.getCreateDatetime());
produceSnExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
produceSnExtRepository.insert(produceSnExt);
return stepResult;
}
}

@ -70,9 +70,7 @@ public class JxSnLineOnCheckMcOrPsStepService extends BaseStepService {
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
if (!checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel).isCompleted()) return stepResult;
this.sendMessage(reqBean, resultBean, stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());

@ -1,21 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -35,18 +29,6 @@ public class JxSnLineOnCompleteStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private IJxProduceSnExtService produceSnExtService;
@Autowired
private MesProduceSnMcRecordRepository produceSnMcRecordRepository;
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private IProduceSnTravelExtService produceSnTravelExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -58,15 +40,11 @@ public class JxSnLineOnCompleteStepService extends BaseStepService {
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
MesProduceSnExt produceSnExtDb = saveProduceSn(reqBean, resultBean);
saveProduceSnMcRecord(reqBean, resultBean);
insertProduceSnTravel(produceSnExtDb);
StepResult stepResult = execLineOnComplete(reqBean, resultBean);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCompleteStepService --- SUCCESS ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, StepResult.getSuccessComplete(), true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
String.format("管理编码[%s]过程条码[%s]产品条码[%s]关联生产工单[%s]上线完成!", reqBean.getTray(), reqBean.getSerialNumber(), reqBean.getProductSn(), curExecWorkOrderNo));
}
@ -76,40 +54,19 @@ public class JxSnLineOnCompleteStepService extends BaseStepService {
return curExecWorkOrderNo;
}
private MesProduceSnExt saveProduceSn(StationRequestBean reqBean, StationResultBean resultBean) {
if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return null;
MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtDb(reqBean.getOrganizeCode(), reqBean.getSerialNumber(), reqBean.getProductSn());
if (null == produceSnExtDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息不存在!", reqBean.getSerialNumber(), reqBean.getProductSn()));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExtDb.getOperateType()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息当前业务状态[返修]!", reqBean.getSerialNumber(), reqBean.getProductSn()));
if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExtDb.getSnStatus()) return produceSnExtDb;
produceSnExtDb.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue());
produceSnExtService.doPackSnExtProcess(reqBean, produceSnExtDb);
ConvertBean.serviceModelUpdate(produceSnExtDb, reqBean.getUserInfo());
produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb);
return produceSnExtRepository.save(produceSnExtDb);
}
private void saveProduceSnMcRecord(StationRequestBean reqBean, StationResultBean resultBean) {
if (StringUtils.isEmpty(reqBean.getTray()) || !reqBean.getTray().contains(MesPcnExtConstWords.AND)) return;
String[] manageCodeArr = reqBean.getTray().split(MesPcnExtConstWords.AND);
MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1]));
if (null == produceSnMcRecordDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息不存在!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == produceSnMcRecordDb.getQcStatus()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息当前业务状态[返修]!", manageCodeArr[0], manageCodeArr[1]));
if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == produceSnMcRecordDb.getLineOnStatus()) return;
produceSnMcRecordDb.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue());
ConvertBean.serviceModelUpdate(produceSnMcRecordDb, reqBean.getUserInfo());
produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnMcRecordRepository.save(produceSnMcRecordDb);
}
private void insertProduceSnTravel(MesProduceSnExt produceSnExtDb) {
if (null == produceSnExtDb) return;
produceSnTravelExtService.insertProduceSnTravelExt(produceSnExtDb);
private StepResult execLineOnComplete(StationRequestBean reqBean, StationResultBean resultBean) {
StepResult stepResult = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz()))
.execLineOnComplete(new JxProdBusiStrategyParamsBuilder.builder()
.organizeCode(reqBean.getOrganizeCode())
.userInfo(reqBean.getUserInfo())
.location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.manageCode(reqBean.getTray())
.serialNumber(reqBean.getSerialNumber())
.productSn(reqBean.getProductSn())
.obj(reqBean)
.build());
if (!stepResult.isCompleted()) execExpSendMsgAndThrowEx(reqBean, resultBean, stepResult.getMsg());
return stepResult;
}
}

@ -53,6 +53,14 @@ public class JxProdBusiStrategyParamsBuilder implements Serializable {
private Object strategyService;
private String routeCode;
private String processCode;
private String lockContent;
private Object obj;
public static class builder {
JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder();
@ -113,6 +121,27 @@ public class JxProdBusiStrategyParamsBuilder implements Serializable {
return this;
}
public builder routeProcess(String routeCode, String processCode) {
params.routeCode = routeCode;
params.processCode = processCode;
return this;
}
public builder lockContent(String lockContent) {
params.lockContent = lockContent;
return this;
}
public builder produceSnExtDb(MesProduceSnExt produceSnExtDb) {
params.produceSnExtDb = produceSnExtDb;
return this;
}
public builder obj(Object obj) {
params.obj = obj;
return this;
}
public JxProdBusiStrategyParamsBuilder build() {
return params;
}

@ -12,8 +12,8 @@ import java.io.Serializable;
* @date 2021/1/15 15:32
**/
@Data
@ApiModel("嘉兴松下条码上线 MODEL")
public class JxSnLineOnModel implements Serializable {
@ApiModel("嘉兴松下工位扫描 MODEL")
public class JxSnWorkCellScanModel implements Serializable {
private static final long serialVersionUID = 8683799945479864228L;
@ -35,10 +35,30 @@ public class JxSnLineOnModel implements Serializable {
@ApiParam("产品条码")
private String productSn;
@ApiParam("关键件绑定情况")
private String bindStatus;
@ApiParam("状态")
private String status;
@ApiParam("颜色")
private String color;
public JxSnWorkCellScanModel index(Integer index) {
this.index = index;
return this;
}
public JxSnWorkCellScanModel manageCode(String manageCode) {
this.manageCode = manageCode;
return this;
}
public JxSnWorkCellScanModel status(String status) {
this.status = status;
return this;
}
public JxSnWorkCellScanModel color(String color) {
this.color = color;
return this;
}
}

@ -889,4 +889,12 @@ public class MesPcnExtConstWords {
public static final Integer ZERO = 0;
public static final String THIRD_PARTY_PID = "thirdPartyPid";
public static final String JX_SN_FQC_MODULE = "JX_SN_FQC_MODULE";
public static final String JX_SN_FQC_DATA = "JX_SN_FQC_DATA";
public static final String CMD_BUSI_FLAG = "CMD_BUSI_FLAG";
public static final String STATE_REPAIR = "STATE_REPAIR";
public static final String JX_THIRD_PARTY_SN_LOCK = "JX_THIRD_PARTY_SN_LOCK";
}

Loading…
Cancel
Save