裁片功能-》弹框展示成品列表Function

tags/yfai-pcn-ext-v2.3
yxw 8 months ago
parent 023203efaf
commit f105f37d7f

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : xinwang.yi
* @CreateDate 2024/9/12 15:18
* @Modify:
**/
public interface IMesCustomerPartService {
@ApiOperation(value = "根据物料代码、客户代码查询物料信息")
MesCustomerPart getMesCustomerPartByPartNo(String erpPartNo, String custCode, String organizeCode);
}

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
public interface IMesPackingDefineService {
@ApiOperation(value = "查询包装定义信息")
MesPackingDefine getMesPackingDefine(String packCode, String organizeCode);
}

@ -67,7 +67,7 @@ public interface IMesProductionCustomContextStepService {
void removeProductionStatisticsContext(StationRequestBean reqBean);
@ApiOperation(value = "获取生产线的当前班组班次信息")
MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode);
MesProdShiftContext getMesProdShiftKvBean(String organizeCode, String workCenterCode);
@ApiOperation(value = "根据装配件规则ID获取可复用条码")
String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String assemblyNosortCfgId);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
@ -192,6 +193,15 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除料桶原材料数据集合")
void removeMesRawPartChargingDataContext(StationRequestBean reqBean);
@ApiOperation(value = "获取裁片成品数据集合")
List<MesWorkOrderCutDetailModel> getMesWorkOrderCutFgDataContext(StationRequestBean reqBean);
@ApiOperation(value = "保存裁片成品数据集合", notes = "[JSON]List<MesWorkOrderCutDetailModel>")
Boolean dispatchMesWorkOrderCutFgDataContext(StationRequestBean reqBean, List<MesWorkOrderCutDetailModel> workOrderCutDetailModelList);
@ApiOperation(value = "删除裁片成品数据集合")
void removeMesWorkOrderCutFgDataContext(StationRequestBean reqBean);
@ApiOperation(value = "验证工步集死循环执行时是否超过最大执行次数")
Boolean dispatchOverEndlessLoopReadTimes(StationRequestBean reqBean, String maxTimes);

@ -28,4 +28,7 @@ public interface IMesWorkOrderCutService {
@ApiOperation(value = "查询裁片方案成品配置")
List<MesCutSchemeFg> queryCutSchemeFgList(String cutCode, String organizeCode);
@ApiOperation(value = "查询裁片方案设备信息")
MesCutSchemeEquipment getCutSchemeEquipment(String cutCode, String equipmentCode, String organizeCode);
}

@ -0,0 +1,34 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-12 20:41
*/
@Service
public class MesCustomerPartService implements IMesCustomerPartService {
@Autowired
private MesCustomerPartRepository customerPartRepository;
@Override
public MesCustomerPart getMesCustomerPartByPartNo(String erpPartNo, String custCode, String organizeCode) {
if (StringUtils.isEmpty(erpPartNo) || StringUtils.isEmpty(custCode) || StringUtils.isEmpty(organizeCode)) return null;
return customerPartRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ERP_PART_NO, MesPcnExtConstWords.CUST_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), erpPartNo, custCode});
}
}

@ -0,0 +1,29 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingDefineService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @PROJECT_NAME: i3plus-mes-yfai
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2024-09-12 16:53
*/
@Service
public class MesPackingDefineService implements IMesPackingDefineService {
@Autowired
private MesPackingDefineRepository packingDefineRepository;
@Override
public MesPackingDefine getMesPackingDefine(String packCode, String organizeCode) {
return packingDefineRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACK_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packCode});
}
}

@ -122,7 +122,7 @@ public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingSer
}
// 剩余需要扫描的长度
Double surplusLength = workOrderCutMaterial.getMaterialDosage() - workOrderCutMaterial.getScanLength();
Double surplusLength = MathOperation.sub(workOrderCutMaterial.getMaterialDosage(), workOrderCutMaterial.getScanLength());
if (surplusLength.compareTo(length) > 0) {
materialSnDb.setSurplusLength(0.0);
workOrderCutMaterial.setScanLength(workOrderCutMaterial.getScanLength() + length);
@ -130,7 +130,7 @@ public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingSer
result.setShowInfo("长度不足,请继续扫描条码");
result.setIsReset(CommonEnumUtil.FALSE);
} else {
materialSnDb.setSurplusLength(length - surplusLength);
materialSnDb.setSurplusLength(MathOperation.sub(length, surplusLength));
workOrderCutMaterial.setScanLength(workOrderCutMaterial.getMaterialDosage());
boolean isUpdateWorkOrderCut = true;

@ -3,14 +3,9 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesCutScheme;
import cn.estsh.i3plus.pojo.mes.bean.MesCutSchemeFg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesCutSchemeFgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesCutSchemeRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import java.util.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -38,6 +33,9 @@ public class MesWorkOrderCutService implements IMesWorkOrderCutService {
@Autowired
private MesCutSchemeFgRepository cutSchemeFgRepository;
@Autowired
private MesCutSchemeEquipmentRepository cutSchemeEquipmentRepository;
@Override
public MesWorkOrderCut getMesWorkOrderCut(String cutWorkOrderNo, String organizeCode) {
return workOrderCutRepository.getByProperty(
@ -62,10 +60,19 @@ public class MesWorkOrderCutService implements IMesWorkOrderCutService {
@Override
public List<MesCutSchemeFg> queryCutSchemeFgList(String cutCode, String organizeCode) {
if (StringUtils.isEmpty(organizeCode)) return null;
if (StringUtils.isEmpty(organizeCode)) return Collections.emptyList();
return cutSchemeFgRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.CUT_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), cutCode});
}
@Override
public MesCutSchemeEquipment getCutSchemeEquipment(String cutCode, String equipmentCode, String organizeCode) {
return cutSchemeEquipmentRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.CUT_CODE, MesPcnExtConstWords.EQUIPMENT_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), cutCode, equipmentCode});
}
}

@ -0,0 +1,198 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesNumberRuleRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Date;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:43
* @Modify:
**/
@Component
@Slf4j
public class CutWorkOrderNoPrintStrategy implements IPrintTemplateStrategyService {
@Autowired
private MesCustomerPartRepository mesCustomerPartRDao;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private IMesPartService mesPartService;
@Autowired
private IConfigService configService;
@Autowired
private MesNumberRuleRepository numberRuleRepository;
@Override
public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep) {
Date date = new Date();
String organizeCode = mesProduceSnPrintModel.getOrganizeCode();
//gz-xiaopeng
//客户条码-小鹏汽车 gz-xiaopeng
//{custPartNo}{year}{month}{day}{serialNo}
//客户零件号
MesCustomerPart mesCustomerPart = getMesCustomerPart(mesProduceSnPrintModel);
String custPartNo = mesCustomerPart == null ? "" : mesCustomerPart.getCustPartNo();
MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), organizeCode);
numberRule = null != numberRule ? numberRule : getNumberRule(organizeCode, mesPart);
MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME, organizeCode);
String organizeName = mesConfig.getCfgValue();
if (!isStep){
//年月日缩写
genSerialNoModel.setYear(getYearShort(date));
genSerialNoModel.setMonth(getMonthShort(date));
genSerialNoModel.setDay(getDayShort(date));
genSerialNoModel.setRuleCode(numberRule.getRuleCode());
genSerialNoModel.setCustPartNo(custPartNo);
//流水号 5位 每天从1开始
for (int i = 0; i < mesProduceSnPrintModel.getPrintQty(); i++) {
ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1);
String sn = resultBean.getResultList().get(0).toString();
Integer serialNoLength = numberRule.getSerialnoLength();
String serialNo = sn.substring(sn.length() - serialNoLength);
//保存条码信息
MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty());
produceSn.setCustPartNo(custPartNo);
//封装打印信息
MesProduceSnPrintDataModel printDataModel = getModel(produceSn, serialNo, custPartNo, organizeName);
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel);
mesProduceSnPrintModel.getMesProduceSnList().add(produceSn);
//保存打印记录
MesPrintedSnLog snLog = new MesPrintedSnLog();
BeanUtil.copyProperties(printDataModel,snLog);
snLog.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName());
mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog);
}
}else {
String sn = mesProduceSnPrintModel.getProductSn();
MesProduceSn mesProduceSn = mesProduceSnPrintModel.getMesProduceSnList().get(0);
Integer serialNoLength = numberRule.getSerialnoLength();
String serialNo = sn.substring(sn.length() - serialNoLength);
//封装打印信息
MesProduceSnPrintDataModel printDataModel = getModel(mesProduceSn, serialNo, custPartNo, organizeName);
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel);
//保存打印记录
MesPrintedSnLog snLog = new MesPrintedSnLog();
BeanUtil.copyProperties(printDataModel,snLog);
snLog.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName());
mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog);
}
return mesProduceSnPrintModel;
}
private MesNumberRule getNumberRule(String organizeCode, MesPart part) {
if (StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("物料[%s]未维护零件条码匹配规则", part.getPartNo());
MesNumberRule numberRule = numberRuleRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.RULE_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), part.getProcessMatchRule()});
if (null == numberRule) MesPcnException.throwMesBusiException("物料[%s]维护的零件条码匹配规则[%s]信息不存在", part.getPartNo(), part.getProcessMatchRule());
return numberRule;
}
private MesCustomerPart getMesCustomerPart(MesProduceSnPrintModel mesProduceSnPrintModel) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getPartNo(), "erpPartNo", ddlPackBean);
MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
/**
* 2024/07/25 numberRule
*/
// if (Objects.isNull(mesCustomerPart)) {
// MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", mesProduceSnPrintModel.getPartNo());
// }
return mesCustomerPart;
}
private String getYearShort(Date date) {
String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date)));
if (StringUtils.isEmpty(yearStr)) {
MesPcnException.throwMesBusiException("【%s】年月简号不存在", TimeTool.getYear(date));
}
return yearStr;
}
private String getMonthShort(Date date) {
String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date)));
if (StringUtils.isEmpty(monthStr)) {
MesPcnException.throwMesBusiException("【%s】月简号不存在", TimeTool.getMonth(date));
}
return monthStr;
}
private String getDayShort(Date date) {
String day = TimeTool.getDay(date);
return day;
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName, Double qty) {
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setSerialNumber(snowflakeIdMaker.nextId() + "");
mesProduceSn.setProductSn(sn);
mesProduceSn.setCustSn(sn);
mesProduceSn.setPartNo(mesPart.getPartNo());
mesProduceSn.setPartName(mesPart.getPartName());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate());
mesProduceSn.setProdLabelTemplate(mesPart.getProductLabelTemplate());
mesProduceSn.setQty(qty);
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
mesProduceSn.setLotNo(TimeTool.getToday());
mesProduceSn.setPrintCount(MesPcnExtConstWords.ONE);
mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
mesProduceSn.setOrganizeCode(mesPart.getOrganizeCode());
ConvertBean.serviceModelInitialize(mesProduceSn, userName);
return mesProduceSn;
}
private MesProduceSnPrintDataModel getModel(MesProduceSn produceSn, String no, String custPartNo, String factoryName) {
MesProduceSnPrintDataModel mesProduceSnPrintDataModel = new MesProduceSnPrintDataModel();
mesProduceSnPrintDataModel.setFactoryName(factoryName);
mesProduceSnPrintDataModel.setPartNo(produceSn.getPartNo());
mesProduceSnPrintDataModel.setPartName(produceSn.getPartName());
mesProduceSnPrintDataModel.setNo(no);
mesProduceSnPrintDataModel.setBarcode(produceSn.getProductSn());
mesProduceSnPrintDataModel.setCustPartNo(custPartNo);
mesProduceSnPrintDataModel.setPrintDate(TimeTool.getNowTime(true));
mesProduceSnPrintDataModel.setProductDate(produceSn.getCreateDatetime());
return mesProduceSnPrintDataModel;
}
}

@ -0,0 +1,202 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesNumberRuleRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:43
* @Modify:
**/
@Component
@Slf4j
public class CutWorkOrderPackageSnPrintStrategy implements IPrintTemplateStrategyService {
@Autowired
private MesCustomerPartRepository mesCustomerPartRDao;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private IMesPartService mesPartService;
@Autowired
private IConfigService configService;
@Autowired
private MesNumberRuleRepository numberRuleRepository;
@Override
public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep) {
Date date = new Date();
String organizeCode = mesProduceSnPrintModel.getOrganizeCode();
//gz-xiaopeng
//客户零件号
MesCustomerPart mesCustomerPart = getMesCustomerPart(mesProduceSnPrintModel);
String custPartNo = mesCustomerPart == null ? "" : mesCustomerPart.getCustPartNo();
MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), organizeCode);
MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME, organizeCode);
String organizeName = mesConfig.getCfgValue();
List<MesWorkOrderCutDetailModel> workOrderCutDetailModelList = (List<MesWorkOrderCutDetailModel>) mesProduceSnPrintModel.getSourceData();
if (!isStep){
//年月日缩写
genSerialNoModel.setYear(getYearShort(date));
genSerialNoModel.setMonth(getMonthShort(date));
genSerialNoModel.setDay(getDayShort(date));
genSerialNoModel.setRuleCode(numberRule.getRuleCode());
genSerialNoModel.setCustPartNo(custPartNo);
//流水号 5位 每天从1开始
for (int i = 0; i < mesProduceSnPrintModel.getPrintQty(); i++) {
ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1);
String sn = resultBean.getResultList().get(0).toString();
Integer serialNoLength = numberRule.getSerialnoLength();
String serialNo = sn.substring(sn.length() - serialNoLength);
//保存条码信息
MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty());
produceSn.setCustPartNo(custPartNo);
//封装打印信息
MesProduceSnPrintDataModel printDataModel = getModel(produceSn, serialNo, custPartNo, organizeName);
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel);
mesProduceSnPrintModel.getMesProduceSnList().add(produceSn);
//保存打印记录
MesPrintedSnLog snLog = new MesPrintedSnLog();
BeanUtil.copyProperties(printDataModel,snLog);
snLog.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName());
mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog);
}
}else {
String sn = mesProduceSnPrintModel.getProductSn();
MesProduceSn mesProduceSn = mesProduceSnPrintModel.getMesProduceSnList().get(0);
Integer serialNoLength = numberRule.getSerialnoLength();
String serialNo = sn.substring(sn.length() - serialNoLength);
//封装打印信息
MesProduceSnPrintDataModel printDataModel = getModel(mesProduceSn, serialNo, custPartNo, organizeName);
mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel);
//保存打印记录
MesPrintedSnLog snLog = new MesPrintedSnLog();
BeanUtil.copyProperties(printDataModel,snLog);
snLog.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName());
mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog);
}
return mesProduceSnPrintModel;
}
private MesNumberRule getNumberRule(String organizeCode, MesPart part) {
if (StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("物料[%s]未维护零件条码匹配规则", part.getPartNo());
MesNumberRule numberRule = numberRuleRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.RULE_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), part.getProcessMatchRule()});
if (null == numberRule) MesPcnException.throwMesBusiException("物料[%s]维护的零件条码匹配规则[%s]信息不存在", part.getPartNo(), part.getProcessMatchRule());
return numberRule;
}
private MesCustomerPart getMesCustomerPart(MesProduceSnPrintModel mesProduceSnPrintModel) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getPartNo(), "erpPartNo", ddlPackBean);
MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
/**
* 2024/07/25 numberRule
*/
// if (Objects.isNull(mesCustomerPart)) {
// MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", mesProduceSnPrintModel.getPartNo());
// }
return mesCustomerPart;
}
private String getYearShort(Date date) {
String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date)));
if (StringUtils.isEmpty(yearStr)) {
MesPcnException.throwMesBusiException("【%s】年月简号不存在", TimeTool.getYear(date));
}
return yearStr;
}
private String getMonthShort(Date date) {
String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date)));
if (StringUtils.isEmpty(monthStr)) {
MesPcnException.throwMesBusiException("【%s】月简号不存在", TimeTool.getMonth(date));
}
return monthStr;
}
private String getDayShort(Date date) {
String day = TimeTool.getDay(date);
return day;
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName, Double qty) {
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setSerialNumber(snowflakeIdMaker.nextId() + "");
mesProduceSn.setProductSn(sn);
mesProduceSn.setCustSn(sn);
mesProduceSn.setPartNo(mesPart.getPartNo());
mesProduceSn.setPartName(mesPart.getPartName());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate());
mesProduceSn.setProdLabelTemplate(mesPart.getProductLabelTemplate());
mesProduceSn.setQty(qty);
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue());
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
mesProduceSn.setLotNo(TimeTool.getToday());
mesProduceSn.setPrintCount(MesPcnExtConstWords.ONE);
mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
mesProduceSn.setOrganizeCode(mesPart.getOrganizeCode());
ConvertBean.serviceModelInitialize(mesProduceSn, userName);
return mesProduceSn;
}
private MesProduceSnPrintDataModel getModel(MesProduceSn produceSn, String no, String custPartNo, String factoryName) {
MesProduceSnPrintDataModel mesProduceSnPrintDataModel = new MesProduceSnPrintDataModel();
mesProduceSnPrintDataModel.setFactoryName(factoryName);
mesProduceSnPrintDataModel.setPartNo(produceSn.getPartNo());
mesProduceSnPrintDataModel.setPartName(produceSn.getPartName());
mesProduceSnPrintDataModel.setNo(no);
mesProduceSnPrintDataModel.setBarcode(produceSn.getProductSn());
mesProduceSnPrintDataModel.setCustPartNo(custPartNo);
mesProduceSnPrintDataModel.setPrintDate(TimeTool.getNowTime(true));
mesProduceSnPrintDataModel.setProductDate(produceSn.getCreateDatetime());
return mesProduceSnPrintDataModel;
}
}

@ -0,0 +1,67 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description :
**/
@Service
public class MesFunctionCutOrderDialogPrintService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IShippingDispatchService shippingDispatchService;
@Override
public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//获取生产过程上下文对象
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean);
if (!productionProcessContext.getSuccess()) return false;
MesWorkCell workCell = productionProcessContext.getWorkCell();
if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) {
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
String.format("生产线[%s]工位[%s]%s失败,裁片方案成品[%s]的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return false;
}
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setForceJumpProcess(true);
shippingDispatchService.sendScanQueueNextExec(reqBean);
return true;
}
@Override
public Object stepDialogDispatch(StationRequestBean reqBean, String customPageName) {
return productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean);
}
}

@ -1,5 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingDefineService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
@ -7,7 +9,6 @@ import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -52,6 +53,12 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private IMesPackingDefineService packingDefineService;
@Autowired
private IMesCustomerPartService customerPartService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -78,43 +85,49 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取工单对应的条码数据信息
List<MesProductionPsInContext> cachedProductionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//验证扫描信息是否属于工艺强过码
Boolean isCraftJumpCode = matchCraftJumpCode(productionProcessContext, equipVariableCollectContextList);
//验证是否支持跳过
Boolean isAllowJump = checkIsAllowJump(cachedProductionPartContextList, cachedProductionPsInContextList);
MesWorkCell workCell = productionProcessContext.getWorkCell();
//当前不允许跳过
if (isCraftJumpCode && !isAllowJump)
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).
scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的裁片工单信息!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
////获取上下文产出零件信息
//List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
////获取工单对应的条码数据信息
//List<MesProductionPsInContext> cachedProductionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//允许跳过,先更新数据
if (isCraftJumpCode && isAllowJump) {
updateProductionPartAndPsInContextList(reqBean, cachedProductionPartContextList, cachedProductionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue());
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).
scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
}
//验证扫描信息是否属于工艺强过码
//Boolean isCraftJumpCode = matchCraftJumpCode(productionProcessContext, equipVariableCollectContextList);
//
////验证是否支持跳过
//Boolean isAllowJump = checkIsAllowJump(cachedProductionPartContextList, cachedProductionPsInContextList);
////当前不允许跳过
//if (isCraftJumpCode && !isAllowJump)
// return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).
// scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的裁片工单信息!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
//
////允许跳过,先更新数据
//if (isCraftJumpCode && isAllowJump) {
// updateProductionPartAndPsInContextList(reqBean, cachedProductionPartContextList, cachedProductionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue());
// return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).
// scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue()));
//}
//验证工单的有效性
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
List<MesProductionPsOutContext> productionPsOutContextList = new ArrayList<>();
if (!checkWorkOrderValid(reqBean, stepResult, productionProcessContext, workCenter,
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter,
equipVariableCollectContextList, productionPartContextList, productionPsInContextList,
productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
productionPsOutContextList, workCell).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//保存零件数据信息
if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
////保存零件数据信息
//if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//保存上下文产出零件信息
//保存上下文零件信息
productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList);
//保存上下文产出零件信息
productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList);
//保存上下文产出零件信息
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService.dispatchModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
@ -138,6 +151,15 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
}
//public StepResult savePartDataMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<MesProductionPartContext> productionPartContextList, Boolean isBackError) {
//
// //从一模多腔信息中搜集零件编码并去重
// List<String> partNoList = (productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
//
// return savePartDataMap(reqBean, resultBean, stepResult, partNoList, isBackError);
//
//}
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
@ -164,22 +186,21 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StepResult stepResult,
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
List<MesEquipVariableCollectContext> equipVariableCollectContextList,
List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList,
List<MesProductionPsOutContext> productionPsOutContextList) {
List<MesProductionPsOutContext> productionPsOutContextList,
MesWorkCell workCell) {
//搜集生产工单号
//搜集裁片工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderCutNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());
//Map<String, Map<String, Object>> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList);
String cutWorkOrderNo = workOrderCutNoList.stream().findFirst().get();
MesWorkOrderCut workOrderCut = workOrderCutService.getMesWorkOrderCut(reqBean.getOrganizeCode(), cutWorkOrderNo);
MesWorkOrderCut workOrderCut = workOrderCutService.getMesWorkOrderCut(cutWorkOrderNo, reqBean.getOrganizeCode());
if (workOrderCut == null)
return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]无效!", cutWorkOrderNo));
@ -189,12 +210,17 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
if (cutScheme == null)
return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]所属裁片配置无效!", cutWorkOrderNo));
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsCheckMaterial() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue())
if (!cutScheme.getWorkCenterCode().equals(workCenter.getWorkCenterCode()))
return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]所属裁片方案[%s]产线[%s]与当前产线[%s]不一致!", cutWorkOrderNo, cutScheme.getCutCode(), cutScheme.getWorkCenterCode(), workCenter.getWorkCenterCode()));
if (workOrderCut.getWorkOrderStatus() == MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue())
return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]当前状态[%s],无需加工!", cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.valueOfDescription(workOrderCut.getWorkOrderStatus())));
else if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsCheckMaterial() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue())
return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]未进行裁片原材料防错!", cutWorkOrderNo));
else if (workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() || workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue())
else if (workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue())
return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]当前状态[%s]无需加工或无法加工!", cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.valueOfDescription(workOrderCut.getWorkOrderStatus())));
List<MesWorkOrderCutDetail> mesWorkOrderCutDetailList = workOrderCutService.queryMesWorkOrderCutDetailList(reqBean.getOrganizeCode(), cutWorkOrderNo);
List<MesWorkOrderCutDetail> mesWorkOrderCutDetailList = workOrderCutService.queryMesWorkOrderCutDetailList(cutWorkOrderNo, reqBean.getOrganizeCode());
if (CollectionUtils.isEmpty(mesWorkOrderCutDetailList))
return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]明细不存在!", cutWorkOrderNo));
@ -214,6 +240,9 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
return stepResult.isCompleted(false).msg(String.format("请检查工单信息,裁片工单[%s]信息绑定工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", cutWorkOrderNo, workOrder.getWorkOrderNo(), workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode()));
}
//保存零件数据信息
if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
// 裁片方案成品配置
List<MesCutSchemeFg> mesCutSchemeFgList = workOrderCutService.queryCutSchemeFgList(cutScheme.getCutCode(), reqBean.getOrganizeCode());
@ -222,20 +251,48 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
List<String> fgPartNoList = mesCutSchemeFgList.stream().map(MesCutSchemeFg::getPartNo).distinct().collect(Collectors.toList());
List<String> worKOrderPartNoList = workOrderList.stream().map(MesWorkOrder::getWorkOrderNo).distinct().collect(Collectors.toList());
List<String> worKOrderPartNoList = workOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList());
worKOrderPartNoList.removeAll(fgPartNoList);
if (!CollectionUtils.isEmpty(worKOrderPartNoList))
return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%]成品配置信息中维护!", worKOrderPartNoList, cutScheme.getCutCode()));
return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%s]成品配置信息中维护!", worKOrderPartNoList, cutScheme.getCutCode()));
// 最后一个工位 封装 包装条码打印所需参数
if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
Map<String, MesPartContext> partDataExtContext = productionDispatchContextStepService.getPartDataExtContext(reqBean);
for (MesCutSchemeFg mesCutSchemeFg : mesCutSchemeFgList) {
if (StringUtils.isEmpty(mesCutSchemeFg.getPackageSnRuleCode()))
return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%s]成品配置信息中维护包装编码规则!", mesCutSchemeFg.getPartNo(), cutScheme.getCutCode()));
MesPackingDefine mesPackingDefine = packingDefineService.getMesPackingDefine(mesCutSchemeFg.getPackageSnRuleCode(), reqBean.getOrganizeCode());
if (mesPackingDefine == null)
return stepResult.isCompleted(false).msg(String.format("裁片方案代码[%s]关联产成零件[%s]箱类别代号[%s]无效!", mesCutSchemeFg.getCutCode(), mesCutSchemeFg.getPartNo(), mesCutSchemeFg.getPackageSnRuleCode()));
MesCustomerPart customerPart = customerPartService.getMesCustomerPartByPartNo(mesCutSchemeFg.getPartNo(), mesPackingDefine.getCustCode(), reqBean.getOrganizeCode());
MesPartContext mesPartContext = partDataExtContext.get(mesCutSchemeFg.getPartNo());
mesPartContext.setCopies(cutScheme.getCopies());
mesPartContext.setPackageSnRule(mesPackingDefine.getPackageBarcodeRule());
mesPartContext.setPrinter(mesPackingDefine.getPrinter());
mesPartContext.setLabelTemplate(mesPackingDefine.getPakcageTemplate());
mesPartContext.setCustPartNo(customerPart == null ? "" : customerPart.getCustPartNo());
partDataExtContext.put(mesCutSchemeFg.getPartNo(), mesPartContext);
}
productionDispatchContextStepService.dispatchPartDataContext(reqBean, partDataExtContext);
}
Map<String, MesWorkOrderCutDetail> workOrderCutDetailMap = mesWorkOrderCutDetailList.stream().collect(Collectors.toMap(MesWorkOrderCutDetail::getWorkOrderNo, Function.identity(), (x, y) -> y));
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), cutWorkOrderNo);
//获取上下文的工位
MesWorkCell workCell = productionProcessContext.getWorkCell();
// 获取上道工艺生产的条码并封装到进料上下文中
if (!CollectionUtils.isEmpty(produceSnList))
produceSnList.stream().filter(o -> null != o).forEach(o -> {

@ -8,6 +8,7 @@ import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesCutSchemeEquipment;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
@ -54,6 +55,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Autowired
private IMesWorkOrderCutService workOrderCutService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -73,7 +77,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//从上下文中取出生产线对象
//从上下文中取出设备对象
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//获取上下文加工规则数据信息集合
@ -90,7 +94,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
Integer initSize = prodRuleContextList.size();
//封装非排序加工规则
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext,
doHandleProdRuleData(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext,
prodRuleContextList, productionPartContextList);
//匹配失败需要清除本次扫描/读取信息
@ -110,19 +114,19 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
}
private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList,
List<MesProductionPartContext> productionPartContextList) {
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错)
return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext,
return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, productionProcessContext,
cellEquipContext, prodRuleContextList, productionPartContextList);
}
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean,
StepResult stepResult, MesWorkCenter workCenter,
StepResult stepResult,
MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList,
@ -158,6 +162,14 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
//根据产出零件分组数据
Map<String, List<MesProdRuleNosortCfg>> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList);
String cutCode = productionPartContextList.get(0).getCutCode();
MesCutSchemeEquipment cutSchemeEquipment = workOrderCutService.getCutSchemeEquipment(cutCode, cellEquipContext.getEquipmentCode(), reqBean.getOrganizeCode());
if (cutSchemeEquipment == null)
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format(
"未维护裁片方案代码[%s]设备[%s]的裁片设备配置信息!", cutCode, cellEquipContext.getEquipmentName()));
for (MesProductionPartContext productionPartContext : productionPartContextList) {
//foreignKey有值代表已经匹配过产品加工规则
@ -174,14 +186,13 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
.copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()));
prodRuleContext.setIsPrint(cutSchemeEquipment.getIsPrint());
prodRuleContextList.add(prodRuleContext);
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 产出零件信息:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(prodRuleContext));
}
// 默认头道才有超工单
//validSuperWorkOrder(reqBean, productionPartContextList, null, workCenter, stepResult, resultBean);
return stepResult;
}

@ -0,0 +1,167 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
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.exception.ImppBusiException;
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 java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderCutPackageSnSaveStepService")
public class MesWorkOrderCutPackageSnSaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
// 获取产成零件信息
Map<String, MesPartContext> partDataContext = productionDispatchContextStepService.getPartDataExtContext(reqBean);
//从上下文中取出工位对象
MesWorkCell workCell = productionProcessContext.getWorkCell();
// 重新收集打印裁片箱条码
List<MesWorkOrderCutDetailModel> newWorkOrderCutFgDataContextList = new ArrayList<>();
// 最后一个工位才生成箱条码
if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
List<MesWorkOrderCutDetailModel> workOrderCutFgDataContextList = productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean);
if (CollectionUtils.isEmpty(workOrderCutFgDataContextList))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "缺失裁片工单箱条码配置信息!");
for (MesWorkOrderCutDetailModel workOrderCutDetailModel : workOrderCutFgDataContextList) {
BigDecimal[] bigDecimals = divideAndRemainder(workOrderCutDetailModel);
// 获取 商 根据商的决定生成条码次数
double num = bigDecimals[0].doubleValue();
/* 0
1
2
*/
double remainder = bigDecimals[1].doubleValue();
List<MesWorkOrderCutPackage> workOrderCutPackages = new ArrayList<>();
// 商大于 0 则
while (num > 0) {
// 满箱直接取标包数量
packWorkOrderPackageList(reqBean, resultBean, workOrderCutDetailModel, partDataContext,
workOrderCutDetailModel.getPackageQty(), workOrderCutPackages, newWorkOrderCutFgDataContextList);
num--;
}
if (remainder > 0) {
// 尾数箱取剩余产成数量
packWorkOrderPackageList(reqBean, resultBean, workOrderCutDetailModel, partDataContext,
remainder, workOrderCutPackages, newWorkOrderCutFgDataContextList);
}
}
productionDispatchContextStepService.dispatchMesWorkOrderCutFgDataContext(reqBean, newWorkOrderCutFgDataContextList);
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单箱条码成功!");
}
private void packWorkOrderPackageList(StationRequestBean reqBean, StationResultBean resultBean,
MesWorkOrderCutDetailModel workOrderCutDetailModel,
Map<String, MesPartContext> partDataContext,
Double qty, List<MesWorkOrderCutPackage> workOrderCutPackages,
List<MesWorkOrderCutDetailModel> newWorkOrderCutFgDataContextList) {
MesPartContext mesPartContext = partDataContext.get(workOrderCutDetailModel.getPartNo());
String nowTime = TimeTool.getNowTime(false);
MesWorkOrderCutPackage cutPackage = new MesWorkOrderCutPackage();
ConvertBean.serviceModelInitialize(cutPackage, reqBean.getUserInfo());
cutPackage.setOrganizeCode(reqBean.getOrganizeCode());
BeanUtils.copyProperties(workOrderCutDetailModel, cutPackage);
cutPackage.setQty(qty);
cutPackage.setLotNo(nowTime);
cutPackage.setSn(doGenerateSerialNo(reqBean, resultBean, mesPartContext.getPackageSnRule(), mesPartContext));
MesWorkOrderCutDetailModel newWorkOrderCutDetailModel = new MesWorkOrderCutDetailModel();
BeanUtils.copyProperties(workOrderCutDetailModel, newWorkOrderCutDetailModel);
newWorkOrderCutDetailModel.setQty(qty);
newWorkOrderCutDetailModel.setCreateDatetime(cutPackage.getCreateDatetime());
workOrderCutPackages.add(cutPackage);
newWorkOrderCutFgDataContextList.add(newWorkOrderCutDetailModel);
}
private BigDecimal[] divideAndRemainder(MesWorkOrderCutDetailModel workOrderCutDetailModel) {
BigDecimal dividend = new BigDecimal(workOrderCutDetailModel.getQty().toString());
BigDecimal divisor = new BigDecimal(workOrderCutDetailModel.getPackageQty().toString());
return dividend.divideAndRemainder(divisor);
}
private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
try {
return syncFuncService.syncSerialNo(
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()),
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
foundExThrowNoShowMsg();
}
return null;
}
}

@ -0,0 +1,303 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
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.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderCutProductSnSaveStepService")
public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesWorkOrderCutRepository workOrderCutRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//看是否修改裁片工单状态
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//获取上下文产成零件条码信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
// 根据产出零件号分组加工规则
Map<String, MesProdRuleContext> prodRuleContextMapByOutPartNo = prodRuleContextList.stream().collect(Collectors.toMap(MesProdRuleContext::getOutPartNo, Function.identity(), (x, y) -> y));
// 获取产成零件信息
Map<String, MesPart> partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean);
//从上下文中取出工位对象
MesWorkCell workCell = productionProcessContext.getWorkCell();
// 无进料条码则生成条码
if (CollectionUtils.isEmpty(productionPsInContextList)) {
productionPsOutContextList = new ArrayList<>();
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!");
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
MesPart part = partDataContext.get(mesProductionPartContext.getPartNo());
MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo());
MesProduceSn produceSn = new MesProduceSn();
ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo());
produceSn.setOrganizeCode(reqBean.getOrganizeCode());
produceSn.setProductSn(cutWorkOrderNo);
produceSn.setRouteCode(reqBean.getRouteCode());
produceSn.setProcessCode(reqBean.getProcessCode());
produceSn.setCraftCode(productionProcessContext.getCraftCode());
produceSn.setCustSn(produceSn.getCustSn());
produceSn.setSerialNumber(doGenerateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part));
produceSn.setQty(mesProductionPartContext.getQty());
produceSn.setWorkOrderNo(mesProductionPartContext.getWorkOrderNo());
produceSn.setCustCode(mesProductionPartContext.getCustCode());
produceSn.setCustPartNo(mesProductionPartContext.getCustPartNo());
produceSn.setAreaCode(workCell.getAreaCode());
produceSn.setWorkCenterCode(workCell.getWorkCenterCode());
produceSn.setWorkCellCode(workCell.getWorkCellCode());
produceSn.setPartNo(mesProductionPartContext.getPartNo());
produceSn.setPartName(mesProductionPartContext.getPartName());
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
produceSn.setSnStatus(workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() ? MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() : MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue());
produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
produceSn.setPrintCount(MesPcnExtConstWords.ZERO);
produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
produceSn.setFid(UUID.randomUUID().toString());
produceSn = produceSnExtService.insert(produceSn);
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn, mesProdRuleContext.getForeignKey());
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext));
productionPsOutContextList.add(productionPsOutContext);
// 新增装配件加工记录
//saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
}
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
} else {
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
Map<String, MesProductionPsOutContext> productionPsOutContextMap = productionPsOutContextList.stream().collect(Collectors.toMap(MesProductionPsOutContext::getPartNo, Function.identity(), (x, y) -> y));
MesProductionPsOutContext productionPsOutContext = productionPsOutContextMap.get(mesProductionPartContext.getPartNo());
if (productionPsOutContext == null)
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", mesProductionPartContext.getPartNo()));
//MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(mesProductionPartContext.getPartNo());
// 新增装配件加工记录
//saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
}
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单条码成功!");
}
private void insertWorkOrderCutPackage(StationRequestBean reqBean, StationResultBean resultBean) {
List<MesWorkOrderCutDetailModel> workOrderCutFgDataContextList = productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean);
if (CollectionUtils.isEmpty(workOrderCutFgDataContextList))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "缺失裁片工单箱条码配置信息!");
for (MesWorkOrderCutDetailModel workOrderCutDetailModel : workOrderCutFgDataContextList) {
}
}
private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext,
MesProductionPsOutContext productionPsOutContext) {
MesProductionAssembly productionAssembly = new MesProductionAssembly();
productionAssembly.setAssemblySn("");
productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue());
productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
productionAssembly.setIsSkip(CommonEnumUtil.FALSE);
productionAssembly.setAreaCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCellCode(reqBean.getWorkCellCode());
productionAssembly.setProcessCode(reqBean.getProcessCode());
productionAssembly.setProcessName(productionProcessContext.getProcessName());
productionAssembly.setCraftCode(productionProcessContext.getCraftCode());
productionAssembly.setCraftName(productionProcessContext.getCraftName());
productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionAssembly.setProductionRecordId(mesProdRuleContext.getProductionRecordId());
productionAssembly.setMouldNo(mesProdRuleContext.getMouldNo());
if (null != productionPsOutContext) {
productionAssembly.setPartNo(productionPsOutContext.getPartNo());
productionAssembly.setPartName(productionPsOutContext.getPartName());
productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber());
productionAssembly.setProductSn(productionPsOutContext.getProductSn());
productionAssembly.setCustSn(productionPsOutContext.getCustSn());
}
MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.dispatchScanMonitorContext(reqBean, true);
if (null != scanMonitorContext) productionAssembly.setMouldRecordId(scanMonitorContext.getMouldRecordId());
productionAssembly.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo());
productionAssembly.setFid(UUID.randomUUID().toString());
productionAssemblyRepository.insert(productionAssembly);
}
private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status},
packBean);
}
private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
try {
return syncFuncService.syncSerialNo(
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()),
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
foundExThrowNoShowMsg();
}
return null;
}
}

@ -2,43 +2,23 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
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.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.*;
/**
* @Description :
* @Author : wangjie
@ -51,207 +31,26 @@ public class MesWorkOrderCutSaveStepService extends BaseStepService {
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesWorkOrderCutService workOrderCutService;
@Autowired
private MesWorkOrderCutRepository workOrderCutRepository;
@Autowired
private IFsmCommonService fsmCommonService;
@Autowired
private MesFirstMouldNoReadStepService firstMouldNoReadStepService;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
// 看是否修改裁片工单状态
//获取工位参数
Map<String, String> wcpcMap = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean);
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//获取上下文产成零件条码信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
// 根据产出零件号分组加工规则
Map<String, MesProdRuleContext> prodRuleContextMapByOutPartNo = prodRuleContextList.stream().collect(Collectors.toMap(MesProdRuleContext::getOutPartNo, Function.identity(), (x, y) -> y));
// 获取产成零件信息
Map<String, MesPart> partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean);
// 无进料条码则生成条码
if (CollectionUtils.isEmpty(productionPsInContextList)) {
productionPsOutContextList = new ArrayList<>();
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!");
//从上下文中取出工位对象
MesWorkCell workCell = productionProcessContext.getWorkCell();
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
MesPart part = partDataContext.get(mesProductionPartContext.getPartNo());
MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo());
//保存裁片工单条码工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutProductSnSaveStepService")).executeInState(reqBean);
MesProduceSn produceSn = new MesProduceSn();
ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo());
produceSn.setOrganizeCode(reqBean.getOrganizeCode());
produceSn.setProductSn(cutWorkOrderNo);
//produceSn.set
produceSn.setCustSn(produceSn.getCustSn());
produceSn.setSerialNumber(doGenerateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part));
produceSn.setQty(mesProductionPartContext.getQty());
produceSn.setWorkOrderNo(mesProductionPartContext.getWorkOrderNo());
produceSn.setCustCode(mesProductionPartContext.getCustCode());
produceSn.setCustPartNo(mesProductionPartContext.getCustPartNo());
produceSn.setAreaCode(workCell.getAreaCode());
produceSn.setWorkCenterCode(workCell.getWorkCenterCode());
produceSn.setWorkCellCode(workCell.getWorkCellCode());
produceSn.setPartNo(mesProductionPartContext.getPartNo());
produceSn.setPartName(mesProductionPartContext.getPartName());
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
produceSn.setPrintCount(MesPcnExtConstWords.ZERO);
produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
produceSn.setFid(UUID.randomUUID().toString());
produceSn = produceSnExtService.insert(produceSn);
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn, mesProdRuleContext.getForeignKey());
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext));
productionPsOutContextList.add(productionPsOutContext);
saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
}
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
} else {
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
Map<String, MesProductionPsOutContext> productionPsOutContextMap = productionPsOutContextList.stream().collect(Collectors.toMap(MesProductionPsOutContext::getPartNo, Function.identity(), (x, y) -> y));
MesPart part = partDataContext.get(mesProductionPartContext.getPartNo());
if (part == null)
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo()));
MesProductionPsOutContext productionPsOutContext = productionPsOutContextMap.get(part.getPartNo());
if (productionPsOutContext == null)
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo()));
MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo());
saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
}
}
//生成裁片工单包装条码工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutPackageSnSaveStepService")).executeInState(reqBean);
//生成加工记录工步
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean);
// 是否修改工单状态为完成
String cutOrderOrderIsComplete = wcpcMap.containsKey(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) ? wcpcMap.get(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) : null;
if (!StringUtils.isEmpty(cutOrderOrderIsComplete)) {
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue());
} else {
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue());
}
//保存装配记录工步
//((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean);
//保存工单信息工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean);
//修改裁片工单、工单信息工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutWorkOrderSaveStepService")).executeInState(reqBean);
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!");
}
private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext,
MesProductionPsOutContext productionPsOutContext) {
@ -296,28 +95,4 @@ public class MesWorkOrderCutSaveStepService extends BaseStepService {
productionAssemblyRepository.insert(productionAssembly);
}
private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status},
packBean);
}
private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
try {
return syncFuncService.syncSerialNo(
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()),
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
foundExThrowNoShowMsg();
}
return null;
}
}

@ -0,0 +1,133 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
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.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderCutWorkOrderSaveStepService")
public class MesWorkOrderCutWorkOrderSaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesWorkOrderCutRepository workOrderCutRepository;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//从上下文中取出工位对象
MesWorkCell workCell = productionProcessContext.getWorkCell();
// 为最后一个工位则将工单更新为完成 并 新增裁片工单包装条码
if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue());
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), mesProductionPartContext.getWorkOrderNo());
workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), mesProductionPartContext.getQty()));
if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0)
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
else
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo());
workOrder.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date()));
workOrderExtService.update(workOrder);
}
} else {
updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue());
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单成功!");
}
private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean);
workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status},
packBean);
}
private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
try {
return syncFuncService.syncSerialNo(
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()),
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
foundExThrowNoShowMsg();
}
return null;
}
}

@ -111,8 +111,13 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
//获取生产线的当前班组班次信息
@Override
public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) {
List<StationKvBean> stationKvBeans = getProdShiftDataContext(orgainzeCode, workCenterCode);
public MesProdShiftContext getMesProdShiftKvBean(String organizeCode, String workCenterCode) {
log.info("获取生产线的当前班组班次信息 --- getMesProdShiftKvBean --- start");
List<StationKvBean> stationKvBeans = getProdShiftDataContext(organizeCode, workCenterCode);
log.info("获取生产线的当前班组班次信息 --- getMesProdShiftKvBean --- end");
MesProdShiftContext mesProdShiftContext = new MesProdShiftContext();
if (CollectionUtils.isEmpty(stationKvBeans)) {

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
@ -425,6 +426,23 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
}
@Override
public List<MesWorkOrderCutDetailModel> getMesWorkOrderCutFgDataContext(StationRequestBean reqBean) {
String mesWorkOrderCutFgDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT);
return !StringUtils.isEmpty(mesWorkOrderCutFgDataJson) ? JSONObject.parseArray(mesWorkOrderCutFgDataJson, MesWorkOrderCutDetailModel.class) : null;
}
@Override
public Boolean dispatchMesWorkOrderCutFgDataContext(StationRequestBean reqBean, List<MesWorkOrderCutDetailModel> workOrderCutDetailModelList) {
if (CollectionUtils.isEmpty(workOrderCutDetailModelList)) return false;
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT, JSONObject.toJSONString(workOrderCutDetailModelList));
}
@Override
public void removeMesWorkOrderCutFgDataContext(StationRequestBean reqBean) {
removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT);
}
@Override
public Boolean dispatchOverEndlessLoopReadTimes(StationRequestBean reqBean, String maxTimes) {
String item = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES).add(reqBean.getCurFsmState().getNextStatus()).toString();
String endlessLoopReadTimes = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), item);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
@ -14,6 +15,26 @@ public class MesPartContext extends MesPart implements Serializable {
private static final long serialVersionUID = -1221271846639577097L;
@ApiParam("客户物料号")
private String custPartNo;
@ApiParam("打印份数")
private Integer copies = 1;
@ApiParam("包装条码规则")
private String packageSnRule;
@ApiParam("标签模板")
private String labelTemplate;
@ApiParam("产成数量")
private Double qty;
@ApiParam("标包数量")
private Double packageQty;
@ApiParam("打印机")
private String printer;
public MesPartContext(MesPart part) {
BeanUtils.copyProperties(part, this);

@ -9,6 +9,7 @@ import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Description : Model
@ -69,6 +70,12 @@ public class MesProduceSnPrintModel {
private List<MesPrintedSnLog> mesPrintedSnLogList = new ArrayList<>();
@ApiParam(name = "源数据 使用功能1-裁片")
private Object sourceData;
@ApiParam(name = "打印参数值 使用功能1-裁片")
List<Map<String, Object>> printParamValueList = new ArrayList<>();
public Double getQty() {
return qty == null || qty <= 0d ? 1d : qty;
}

@ -33,6 +33,26 @@ public class MesWorkOrderCutDetailModel {
@ApiParam("标包数量")
private Double packageQty;
@ApiParam("包装条码规则")
private String packageSnRule;
// 包装条码打印所需属性 START
@ApiParam("客户代码")
private String custCode;
@ApiParam("客户零件号")
private String custPartNo;
@ApiParam("生产日期")
private String lotNo;
@ApiParam("创建时间")
private String createDatetime;
@ApiParam("箱号")
private String packageNo;
@ApiParam("打印份数")
private Integer copies;
// 包装条码打印所需属性 END
}

@ -410,6 +410,8 @@ public class MesPcnExtConstWords {
public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT";
// 上下文: 料桶原材料数据
public static final String RAW_PART_CHARGING_DATA_CONTEXT = "RAW_PART_CHARGING_DATA_CONTEXT";
// 上下文: 裁片工单成品数据
public static final String WORK_ORDER_CUT_FG_DATA_CONTEXT = "WORK_ORDER_CUT_FG_DATA_CONTEXT";
//OPC_API_PARAM
@ -442,12 +444,19 @@ public class MesPcnExtConstWords {
public static final String SN = "sn";
//工单状态
public static final String WORK_ORDER_STATUS = "workOrderStatus";
// 工位是否修改裁片工单状态为完成状态参数[工位参数]
public static final String CUT_ORDER_ORDER_IS_COMPLETE = "CUT_ORDER_ORDER_IS_COMPLETE";
// 裁片方案代码
public static final String CUT_CODE = "cutCode";
// 裁片成品列表弹框打印
public static final String FUNCITON_CUT_ORDER_DIALOG_PRINT = "FUNCTION_CUT_ORDER_DIALOG_PRINT";
public static final String FUNCTION_CUT_ORDER_DIALOG_PRINT = "FUNCTION_CUT_ORDER_DIALOG_PRINT";
// 箱类别代号
public static final String PACK_CODE = "packCode";
// 客户代码
public static final String CUST_CODE = "custCode";
// 模板代码
public static final String TEMPLATE_CODE = "templateCode";
}

Loading…
Cancel
Save