条码生成

tags/yfai-pcn-ext-v1.0
王杰 10 months ago
parent f78108c702
commit 3ee38c6e7a

@ -17,5 +17,5 @@ import java.util.List;
public interface IMesJisShippingService {
@ApiOperation(value = "构筑发运报工数据")
public List<MesJisShipping> getJisShipping(MesShippingOrderManagement orderManagement, List<MesShippingOrderManagementDetail> orderManagementDetailList, String org);
List<MesJisShipping> getJisShipping(MesShippingOrderManagement orderManagement, List<MesShippingOrderManagementDetail> orderManagementDetailList, String org);
}

@ -1,22 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesNumberRuleStrategyModel;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/26 9:34
* @Modify:
**/
public interface INumberRulePackAttributeStrategy {
/**
*
* @return
*/
@ApiOperation(value = "封装封装生成条码模型", notes = "封装封装生成条码模型")
GenSerialNoModel execute(MesNumberRuleStrategyModel model);
}

@ -0,0 +1,71 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Date;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/26 9:38
* @Modify:
**/
@Service
public class XiaoPengNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {
@Autowired
private MesCustomerPartRepository customerPartRepository;
@Override
public GenSerialNoModel execute(GenSerialNoModel model) {
if (StringUtils.isEmpty(model.getOrganizeCode())) MesPcnException.throwMesBusiException("XiaoPengNumberRuleStrategyService执行异常:缺失组织代码参数");
if (StringUtils.isEmpty(model.getPartNo())) MesPcnException.throwMesBusiException("XiaoPengNumberRuleStrategyService执行异常:缺失零件编码参数");
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getPartNo(), "erpPartNo", ddlPackBean);
MesCustomerPart customerPart = customerPartRepository.getByProperty(ddlPackBean);
if (null == customerPart) MesPcnException.throwMesBusiException("请检查客户零件信息,零件[%s]客户零件关系未维护", model.getPartNo());
model.setCustPartNo(customerPart.getCustPartNo());
Date date = new Date();
// XIAO_PENG 原客户条码.小鹏汽车 NoSortBarCodeGZ-new
//{custPartNo}{SPILTRULE}{year}{month}{day}{hour}{minute}{second}{serialNo}
//客户零件号
String custPartNo = model.getCustPartNo();
//日期${dateShort}
model.setYear(getYearShort(date));
model.setMonth(getMonthShort(date));
model.setDay(getDayShort(date));
//中杠 -
//生产日期 + 时间 yyyyMMddHHmmss
//流水号 5位 每天从1开始
return model;
}
private String getYearShort(Date date) {
return MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date)));
}
private String getMonthShort(Date date) {
return MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date)));
}
private String getDayShort(Date date) {
return TimeTool.getDay(date);
}
}

@ -1,55 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule.INumberRulePackAttributeStrategy;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesNumberRuleStrategyModel;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/26 9:38
* @Modify:
**/
@Component
public class XiaoPengNumberRuleStrategy implements INumberRulePackAttributeStrategy {
@Override
public GenSerialNoModel execute(MesNumberRuleStrategyModel model) {
Date date = new Date();
// XIAO_PENG 原客户条码.小鹏汽车 NoSortBarCodeGZ-new
//{custPartNo}{SPILTRULE}{year}{month}{day}{hour}{minute}{second}{serialNo}
GenSerialNoModel genSerialNoModel = new GenSerialNoModel();
genSerialNoModel.setRuleCode(model.getSnRule());
//客户零件号
String custPartNo = model.getCustPartNo();
genSerialNoModel.setCustPartNo(custPartNo);
//日期${dateShort}
genSerialNoModel.setYear(getYearShort(date));
genSerialNoModel.setMonth(getMonthShort(date));
genSerialNoModel.setDay(getDayShort(date));
//中杠 -
//生产日期 + 时间 yyyyMMddHHmmss
//流水号 5位 每天从1开始
return genSerialNoModel;
}
private String getYearShort(Date date) {
return MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date)));
}
private String getMonthShort(Date date) {
return MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date)));
}
private String getDayShort(Date date) {
return TimeTool.getDay(date);
}
}

@ -321,6 +321,15 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue;
//验证进出一致, 进料工单必须与产出工单一致
if (!StringUtils.isEmpty(productionPartContext.getWorkOrderNo()) && !StringUtils.isEmpty(productionPsInContext.getWorkOrderNo()) &&
productionPartContext.getPartNo().equals(productionPsInContext.getPartNo()) && !productionPsInContext.getWorkOrderNo().equals(productionPartContext.getWorkOrderNo())) {
if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete();
else productionPsInContextList.forEach(o -> o.busiCheckToDelete());
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productionPsInContext.getProductSn()), stepResult, String.format("主条码[%s]零件号[%s]关联的加工单[%s]与产出零件[%s]关联的加工单[%s]不一致",
productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), productionPsInContext.getWorkOrderNo(), productionPartContext.getPartNo(), productionPartContext.getWorkOrderNo()));
}
//时效性验证
if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) {
Map<String, Object> result = productionRecordService.checkSnTimeliness(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), innerfilterList.get(0).getId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue());

@ -2,6 +2,7 @@ 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.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -10,6 +11,9 @@ import cn.estsh.i3plus.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* @Description :
@ -41,6 +45,10 @@ public class MesProduceSeqCheckStepService extends BaseStepService {
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
if (CollectionUtils.isEmpty(productionPartContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无产出零件信息,无需进行顺序防错验证!");
return stepResult;

@ -4,17 +4,14 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule.INumberRulePackAttributeStrategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesNumberRuleStrategyModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
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.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -24,7 +21,6 @@ import cn.estsh.i3plus.pojo.mes.repository.MesNumberRuleRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -34,7 +30,6 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -159,51 +154,12 @@ public class MesProductSnGenerateStepService extends BaseStepService {
MesProduceSn produceSn = (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getRelateId())) ? null : produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getRelateId());
if (null == produceSn) produceSn = new MesProduceSn();
try {
String sn;
if(null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())){
sn = productionPsInContext.getProductSn();
}else {
String snRule = part.getProductMatchRule();
//获取条码规则,根据条码规则中的序列号长度截取序列号
DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(snRule, "ruleCode", mesRulePackBean);
List<MesNumberRule> ruleList = mesNumberRuleRao.findByHqlWhere(mesRulePackBean);
if (!ruleList.isEmpty() && !StringUtils.isEmpty(ruleList.get(0).getMethodNameExt())) {
MesNumberRule numberRule = ruleList.get(0);
String methodNameExt = numberRule.getMethodNameExt();
INumberRulePackAttributeStrategy strategy = (INumberRulePackAttributeStrategy)SpringContextsUtil.getBean(methodNameExt);
if (strategy == null){
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),String.format("零件号【%s】的编码规则【%s】生产编码的构造入参方法名未配置!", part.getPartNo(),snRule));
}
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(part.getPartNo(), "erpPartNo", ddlPackBean);
MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesCustomerPart)) {
MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", part.getPartNo());
}
MesNumberRuleStrategyModel model = new MesNumberRuleStrategyModel();
model.setCustPartNo(mesCustomerPart.getCustPartNo());
model.setSnRule(snRule);
model.setPartNo(part.getPartNo());
model.setPartName(part.getPartName());
model.setProdLocation(reqBean.getWorkCenterCode());
GenSerialNoModel genSerialNoModel = strategy.execute(model);
sn = syncFuncService.syncSerialNo(genSerialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
}else {
sn=syncFuncService.syncSerialNo(new GenSerialNoModel(getProduceSnNumberRule(reqBean, resultBean, part)).partNo(part.getPartNo()), reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
}
}
produceSn.setProductSn(sn);
produceSn.setSerialNumber(syncFuncService.syncSerialNo(new GenSerialNoModel(MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE).prodLocation(reqBean.getWorkCenterCode()), reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString());
produceSn.setProductSn((null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) ? productionPsInContext.getProductSn() : doGererateSerialNo(reqBean, resultBean, getProduceSnNumberRule(reqBean, resultBean, part), part));
} catch (ImppBusiException e) {
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
}
produceSn.setSerialNumber(doGererateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part));
produceSn.setCustSn(produceSn.getProductSn());
produceSn.setQty(new Double(1));
//未知状态的需要重置工单相关字段
@ -246,6 +202,19 @@ public class MesProductSnGenerateStepService extends BaseStepService {
}
private String doGererateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) {
try {
return syncFuncService.syncSerialNo(
new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).organizeCode(reqBean.getOrganizeCode()),
reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.toString());
}
return null;
}
private String getProduceSnNumberRule(StationRequestBean reqBean, StationResultBean resultBean, MesPart part) {
if (StringUtils.isEmpty(part.getProductMatchRule())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo()));
return part.getProductMatchRule();

@ -149,7 +149,7 @@ public class MesWorkOrderCheckStepService extends BaseStepService {
//封装产出零件信息
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(
new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()).get(0) : null, o.getMessageSource())));
new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()).get(0) : null, o.getMessageSource()).isCheck(productionProcessContext.getWorkCell())));
return stepResult.obj(filterList);

@ -1,42 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/6/20 11:40
* @Modify:
**/
@Data
@NoArgsConstructor
public class MesNumberRuleStrategyModel {
@ApiParam("物料号")
private String partNo;
@ApiParam("物料名称")
private String partName;
@ApiParam("生产厂家名称")
private String factoryName;
@ApiParam("生产日期")
private String productDate;
@ApiParam("供应商代码")
private String supplierCode;
@ApiParam("客户物料号")
private String custPartNo;
@ApiParam("打印规则")
private String snRule;
@ApiParam("产地")
private String prodLocation;
}
Loading…
Cancel
Save