44517 装箱防错后吐条码需求(芜湖)

tags/yfai-pcn-ext-v2.8
王杰 4 months ago
parent 1edc7329f6
commit 47e87b8fe1

@ -0,0 +1,26 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
public interface IMesPackingRuleService {
@ApiOperation(value = "根据物料代码,零件类型查询成品包装明细规则")
MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType);
@ApiOperation(value = "根据包装代码查询成品包装规则")
MesPackingRule getPackingRule(String organizeCode, String packageCode);
@ApiOperation(value = "根据箱类别代号查询包装定义")
MesPackingDefine getPackingDefine(String organizeCode, String packCode);
}

@ -0,0 +1,18 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
public interface IMesPackageExtService {
@ApiOperation(value = "根据ID查询包装信息")
MesPackage getMesPackage(String organizeCode, Long id);
}

@ -9,6 +9,7 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
/**
* BUSI
@ -93,4 +94,13 @@ public interface IMesProductionCustomContextStepService {
@ApiOperation(value = "保存设备计数")
void dispatchShortCounter(StationRequestBean reqBean, Integer shortCounter);
@ApiOperation(value = "保存打包数据")
Boolean dispatchPackageDataContext(StationRequestBean reqBean, Map<String, String> packageDataContextMap);
@ApiOperation(value = "获取打包数据")
Map<String, String> getPackageDataContext(StationRequestBean reqBean);
@ApiOperation(value = "删除打包数据")
void removePackageDataContext(StationRequestBean reqBean);
}

@ -155,4 +155,13 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取生产线下的工位集合")
Map<String, MesWorkCell> dispatchWorkCellMap(StationRequestBean reqBean);
@ApiOperation(value = "获取包装规则信息")
Map<String, MesPackageRuleContext> getPackageRuleContext(StationRequestBean reqBean);
@ApiOperation(value = "保存包装规则信息")
Boolean dispatchPackageRuleContext(StationRequestBean reqBean, Map<String, MesPackageRuleContext> packageRuleContextMap);
@ApiOperation(value = "删除包装规则信息")
void removePackageRuleContext(StationRequestBean reqBean);
}

@ -0,0 +1,59 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingRuleService;
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.bean.MesPackingRule;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
@Service
public class MesPackingRuleService implements IMesPackingRuleService {
@Autowired
private MesPackingRuleDetailRepository packingRuleDetailRepository;
@Autowired
private MesPackingRuleRepository packingRuleRepository;
@Autowired
private MesPackingDefineRepository packingDefineRepository;
@Override
public MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(partType)) return null;
return packingRuleDetailRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PART_TYPE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo, partType});
}
@Override
public MesPackingRule getPackingRule(String organizeCode, String packageCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageCode)) return null;
return packingRuleRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACKAGE_CODE},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packageCode});
}
@Override
public MesPackingDefine getPackingDefine(String organizeCode, String packCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packCode)) return null;
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});
}
}

@ -0,0 +1,30 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPackageExtService;
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.MesPackage;
import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate 2024/6/13 15:18
* @Modify:
**/
@Service
public class MesPackageExtService implements IMesPackageExtService {
@Autowired
private MesPackageRepository packageRepository;
@Override
public MesPackage getMesPackage(String organizeCode, Long id) {
return packageRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ID},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id});
}
}

@ -0,0 +1,61 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Description : MES-
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/10/28 16:47
* @Modify:
**/
@Component
public class WuhuPackageNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {
@Override
public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
Map<String, Object> dataMap = genSerialNoModel.getDataMap();
MesPackageRuleContext packageRuleContext = !CollectionUtils.isEmpty(dataMap) ? (MesPackageRuleContext) dataMap.get(MesPackageRuleContext.class.getSimpleName()) : null;
if (null == packageRuleContext) MesPcnException.throwBusiException("生成包装条码缺少必要参数[规则对象]");
genSerialNoModel.setDynamicRule(
new StringJoiner(MesPcnExtConstWords.COMMA)
.add(((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SHORT)).format(new Date())))
.add(String.format("%.1f", packageRuleContext.getPackSpecQty()))
.add(packageRuleContext.getUnit())
.toString()
);
return genSerialNoModel;
}
}
// YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223|
//YFWHU|YFNS {Prefix}
//C901 {ORG}
//C {SPILTRULE}
//241223 {DYNAMICRULE} 2位年月日
//042722 {SERIALNO} 6位
//| {SPILTRULE}
//C901 {ORG}
//| {SPILTRULE}
//401007574AAABN {PARTNO}
//| {SPILTRULE}
//9.0 {DYNAMICRULE} 标包 一位小数
//| {SPILTRULE}
//EA {DYNAMICRULE} 单位
//| {SPILTRULE}
//C901 {ORG}
//| {SPILTRULE}
//20241223 {YEAR}{MONTH}{DAY}
//| {SPILTRULE}

@ -0,0 +1,101 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService;
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.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import cn.estsh.i3plus.pojo.mes.bean.MesNumberRule;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintedSnLog;
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 com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2024/9/29 16:43
* @Modify:
**/
@Component
@Slf4j
public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService {
@Autowired
private IMesCustomerPartService mesCustomerPartService;
@Override
public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel model,
MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean,
Boolean isStep) {
MesCustomerPart customerPart = (!Objects.isNull(genSerialNoModel) &&
!CollectionUtils.isEmpty(genSerialNoModel.getDataMap()) && genSerialNoModel.getDataMap().containsKey(MesCustomerPart.class.getSimpleName()))
? (MesCustomerPart) genSerialNoModel.getDataMap().get(MesCustomerPart.class.getSimpleName())
: mesCustomerPartService.getMesCustomerPart(model.getOrganizeCode(), model.getPartNo());
if (null == customerPart) MesPcnException.throwBusiException("零件号[%s]未维护客户物料信息", model.getPartNo());
// 返回的结果集合
List<Map<String, Object>> printDataMapList = new ArrayList<>();
if (!isStep) {
//TODO 包装条码补打
} else {
model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart)));
List<Map<String, Object>> resultMapList = new ArrayList<>();
resultMapList.add(packResultMap(model, printDataMapList));
model.setPrintContextList(resultMapList);
}
return model;
}
private Map<String, Object> packResultMap(MesProduceSnPrintModel printModel, List<Map<String, Object>> printTemplateDateList) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.LABEL_TEMPLATE, printModel.getMesLabelTemplate());
resultMap.put(MesPcnExtConstWords.TEMPLATE_DATA, printTemplateDateList);
resultMap.put(MesPcnExtConstWords.TEMPLATE_CODE, printModel.getMesLabelTemplate().getTemplateCode());
resultMap.put(MesPcnExtConstWords.PRINTER, printModel.getPrinter());
return resultMap;
}
private MesPrintedSnLog getMesPrintedSnLog(MesPackage packageDb, String userName, String printData) {
MesPrintedSnLog snLog = new MesPrintedSnLog();
snLog.setBarcode(packageDb.getPackageNo());
snLog.setPartNo(packageDb.getPartNo());
snLog.setPartName(packageDb.getPartName());
snLog.setPrintData(printData);
snLog.setOrganizeCode(packageDb.getOrganizeCode());
ConvertBean.serviceModelInitialize(snLog, userName);
return snLog;
}
private Map<String, Object> getPrintMap(MesProduceSnPrintModel model, MesPackage packageDb, MesCustomerPart customerPart) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.PART_NO, packageDb.getPartNo());
resultMap.put(MesPcnExtConstWords.PART_NAME, packageDb.getPartNo());
resultMap.put(MesPcnExtConstWords.CUST_PART_NO, customerPart.getCustPartNo());
resultMap.put(MesPcnExtConstWords.QR_CODE, packageDb.getPackageNo());
resultMap.put(MesPcnExtConstWords.QTY, packageDb.getQty().intValue());
resultMap.put(MesPcnExtConstWords.UNIT, packageDb.getUnit());
resultMap.put(MesPcnExtConstWords.PACK_SPEC_QTY, packageDb.getPackSpecQty().intValue());
resultMap.put(MesPcnExtConstWords.LOT_NO, packageDb.getLotNo().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R));
// YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223|
// YFNSC901C241223042722 截取原始条码的 第7位到27位
resultMap.put(MesPcnExtConstWords.BAR_CODE, packageDb.getPackageNo().length() >= 27 ? packageDb.getPackageNo().substring(6, 27) : packageDb.getPackageNo());
resultMap.put(MesPcnExtConstWords.MODIFY_DATE_TIME, packageDb.getModifyDatetime().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R));
model.getMesPrintedSnLogList().add(getMesPrintedSnLog(packageDb, model.getUserName(), JSONObject.toJSONString(resultMap)));
return resultMap;
}
}

@ -0,0 +1,485 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingRuleService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPackageExtService;
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.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
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.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.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.i3plus.pojo.mes.repository.IMesPrintedSnLogRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackageDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository;
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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.persistence.EntityManager;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesPackageNoGenerateStepService")
public class MesPackageNoGenerateStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesPackingRuleService packingRuleService;
@Autowired
private IMesPackageExtService packageExtService;
@Autowired
private IMesTemplateService templateService;
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Autowired
private MesPackageRepository packageRepository;
@Autowired
private IMesPrintedSnLogRepository printedSnLogRepository;
@Autowired
private MesPackageDetailRepository packageDetailRepository;
@Autowired
private EntityManager entityManager;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//排序线 直接跳过
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return stepResult;
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
//产出条码根据零件号分组
Map<String, List<String>> productSnMap2Part = productionPsOutContextList.stream().filter(o -> null != o)
.collect(Collectors.groupingBy(MesProductionPsOutContext::getPartNo, Collectors.mapping(MesProductionPsOutContext::getProductSn, Collectors.toList())));
//获取包装规则信息
Map<String, MesPackageRuleContext> packageRuleContextMap = productionProcessContextStepService.getPackageRuleContext(reqBean);
Integer initQty = CollectionUtils.isEmpty(packageRuleContextMap) ? MesPcnExtConstWords.ZERO : packageRuleContextMap.size();
//获取打包数据
Map<String, String> packageDataContextMap = productionCustomContextStepService.getPackageDataContext(reqBean);
//不同的零件号分别打包处理
for (Map.Entry<String, List<String>> entry : productSnMap2Part.entrySet()) {
if (null == entry) continue;
//解析当前零件已经存在的包装明细
List<MesPackageDataContext> packageDataContextList = (CollectionUtils.isEmpty(packageDataContextMap) ||
!packageDataContextMap.containsKey(entry.getKey())) ? null : JSONObject.parseArray(packageDataContextMap.get(entry.getKey()), MesPackageDataContext.class);
//获取生产过程打包规则
MesPackageRuleContext packageRuleContext;
if (!CollectionUtils.isEmpty(packageDataContextList) || (!CollectionUtils.isEmpty(packageRuleContextMap) && packageRuleContextMap.containsKey(entry.getKey()))) {
//从缓存中获取, 如果存在包装信息, 则使用上次获取的包装信息
packageRuleContext = !CollectionUtils.isEmpty(packageDataContextList) ? packageDataContextList.get(0) : packageRuleContextMap.get(entry.getKey());
} else {
//获取包装规则信息
packageRuleContext = getPackageRuleContext(reqBean, entry.getKey());
}
//无生产过程打包规则时, 忽略当前零件
if (null == packageRuleContext) continue;
//更新包装规则信息
if (null == packageRuleContextMap) packageRuleContextMap = new HashMap<>();
if (!packageRuleContextMap.containsKey(entry.getKey())) packageRuleContextMap.put(entry.getKey(), packageRuleContext);
MesLabelTemplate labelTemplate = null;
IPrintTemplateStrategyService strategyService = null;
if (CollectionUtils.isEmpty(packageDataContextList)) {
//查询模版信息
labelTemplate = templateService.getLabelTemplate(packageRuleContext.getPackageTemplate(), reqBean.getOrganizeCode());
strategyService = (null != labelTemplate && !StringUtils.isEmpty(labelTemplate.getMethodCode())) ? (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode()) : null;
if (null == strategyService) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!",
packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
continue;
}
}
//生成包装及明细, 根据标包数量判断是否执行打印 [递归]
stepResult.setDataCollection(new ArrayList());
packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue());
//更新实时的打包数据
if (CollectionUtils.isEmpty(packageDataContextList)) packageDataContextMap.remove(entry.getKey());
else packageDataContextMap.put(entry.getKey(), JSONObject.toJSONString(packageDataContextList));
//判断存在包装信息则进行打印
if (!CollectionUtils.isEmpty(stepResult.getDataCollection())) {
execPrint(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List<MesPackage>) stepResult.getDataCollection());
}
}
//保存包装规则信息
if (initQty != packageRuleContextMap.size()) productionProcessContextStepService.dispatchPackageRuleContext(reqBean, packageRuleContextMap);
// 保存打包数据
productionCustomContextStepService.dispatchPackageDataContext(reqBean, packageDataContextMap);
return stepResult;
}
//获取包装规则信息
private MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, String partNo) {
//根据 物料代码,零件类型=包装物 查询成品包装明细规则
MesPackingRuleDetail packingRuleDetail = packingRuleService.getPackingRuleDetail(reqBean.getOrganizeCode(), partNo, MesExtEnumUtil.PACKING_RULE_DETAIL_PART_TYPE.P.getValue());
if (null == packingRuleDetail) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]未配置包装物类型的成品包装明细规则信息!",
partNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
if (StringUtils.isEmpty(packingRuleDetail.getPackageCode()) ||
StringUtils.isEmpty(packingRuleDetail.getPackSpecQty()) || MathOperation.compareTo(packingRuleDetail.getPackSpecQty(), new Double(0)) == 0) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]配置包装物类型的成品包装明细规则信息中必要信息无效:包装代码[%s]包装规格数量[%s]!",
partNo, packingRuleDetail.getPackageCode(), packingRuleDetail.getPackSpecQty()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
//根据包装代码查询成品包装规则
MesPackingRule packingRule = packingRuleService.getPackingRule(reqBean.getOrganizeCode(), packingRuleDetail.getPackageCode());
if (null == packingRule) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]未配置成品包装规则信息!",
partNo, packingRuleDetail.getPackageCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
String generateTypeName = MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.valueOfDescription(packingRule.getGenerateType());
String packageBarcodeRule = packingRule.getPackageBarcodeRule();
String packageTemplate = packingRule.getPackageTemplate();
String printer = packingRule.getPrinter();
//如果 packageBarcodeRule || packageTemplate || printer 有一个为空, 则需要根据 箱类别代号查询包装定义
if (StringUtils.isEmpty(generateTypeName) || (StringUtils.isEmpty(packingRule.getPackCode()) &&
(StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)))) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:统计方式[%s]箱类别代号[%s]!",
partNo, packingRuleDetail.getPackageCode(), StringUtils.isEmpty(generateTypeName) ? MesPcnExtConstWords.EMPTY : generateTypeName, packingRule.getPackCode()),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
//判断是否需要查询包装定义
if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) {
//根据箱类别代号查询包装定义
MesPackingDefine packingDefine = packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode());
if (null == packingDefine) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置成品包装规则信息中的箱类别代号[%s]未维护包装定义信息!",
partNo, packingRuleDetail.getPackageCode(), packingRule.getPackCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
//如果为空, 则取包装定义中维护的信息
if (StringUtils.isEmpty(packageBarcodeRule)) packageBarcodeRule = packingDefine.getPackageBarcodeRule();
if (StringUtils.isEmpty(packageTemplate)) packageTemplate = packingDefine.getPackageTemplate();
if (StringUtils.isEmpty(printer)) printer = packingDefine.getPrinter();
//此时 packageBarcodeRule || packageTemplate || printer 仍有一个为空则 记录日志 忽略当前零件的打包
if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:编码规则[%s]模版[%s]打印机[%s]!",
partNo, packingRuleDetail.getPackageCode(), packageBarcodeRule, packageTemplate, printer),
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
return null;
}
}
//封装包装规则信息
MesPackageRuleContext packageRuleContext = new MesPackageDataContext();
BeanUtils.copyProperties(packingRuleDetail, packageRuleContext);
BeanUtils.copyProperties(packingRule, packageRuleContext);
packageRuleContext.setPackageBarcodeRule(packageBarcodeRule);
packageRuleContext.setPackageTemplate(packageTemplate);
packageRuleContext.setPrinter(printer);
return packageRuleContext;
}
//生成包装及明细, 根据标包数量判断是否执行打印 [递归]
private List<MesPackageDataContext> doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult,
MesPackageRuleContext packageRuleContext, List<MesPackageDataContext> packageDataContextList, List<String> productSnList) {
//缓存的包装条码明细数量
Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size();
//当前满足标包的差额数量
Integer needQty = packageRuleContext.getPackSpecQty().intValue() - cachedQty;
//当前满足标包的差额条码
List<String> productSnList2Cur;
//除去当前满足标包的差额条码后的剩余条码
List<String> productSnList2Remain = null;
//当前零件剩余未打包条码 如果小于等于 当前满足标包的差额数量, 则直接将 未打包条码赋给当前满足标包的差额条码, 否则 截取条码
if (productSnList.size() <= needQty) {
productSnList2Cur = productSnList;
} else {
productSnList2Cur = productSnList.subList(0, needQty);
productSnList2Remain = productSnList.subList(needQty, productSnList.size());
}
MesPackage packageDb = null;
//判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码
if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = packageExtService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId());
//缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息
if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext);
//如果包装条码未空, 说明上面生成包装条码的时候 根据编码规则生成出现问题, 则直接退出, 记录日志, 忽略当前零件的打包
if (null == packageDb) return null;
//当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数
Integer curQty = cachedQty + productSnList2Cur.size();
//判断当前是否满包
Boolean isSealed = curQty >= packageRuleContext.getPackSpecQty().intValue();
//判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态
packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed);
//判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据
List<MesPackageDataContext> resultList = insertPackageDetailAndBackUnSealedResultList(reqBean, packageRuleContext, packageDb, productSnList2Cur, isSealed);
//如果当前的实际打包数量不满足标包, 则将此前已经缓存的条码合并到 当前未满包的包装条码明细数据resultList中
if (!CollectionUtils.isEmpty(resultList) && !CollectionUtils.isEmpty(packageDataContextList)) resultList.addAll(packageDataContextList);
//判断满包 存储打包信息
if (isSealed) stepResult.getDataCollection().add(packageDb);
//如果已无剩余条码, 则返回当前未满包的包装条码明细数据resultList
if (CollectionUtils.isEmpty(productSnList2Remain)) return resultList;
//传递剩余条码进行递归处理: 此时packageDataContextList直接为null
return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain);
}
//生成包装条码信息
private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) {
//根据编码规则生成包装条码
String packageNo = doGereratePackageNo(reqBean, packageRuleContext);
if (StringUtils.isEmpty(packageNo)) return null;
MesPackage packageDb = new MesPackage();
packageDb.setPackageNo(packageNo);
packageDb.setPartNo(packageRuleContext.getPartNo());
packageDb.setPartName(packageRuleContext.getPartName());
packageDb.setQty(new Double(1));
packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty());
packageDb.setUnit(packageDb.getUnit());
packageDb.setLotNo(TimeTool.getToday());
packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
packageDb.setWorkCenterCode(reqBean.getWorkCenterCode());
packageDb.setWorkCellCode(reqBean.getWorkCellCode());
packageDb.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
packageDb.setPackageSn(packageRuleContext.getPackCode());
packageDb.setPackageLabelTemplate(packageRuleContext.getPackageTemplate());
packageDb.setFid(UUID.randomUUID().toString());
packageDb.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(packageDb, reqBean.getUserInfo());
return packageDb;
}
//判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态
private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed) {
if (!StringUtils.isEmpty(packageDb.getId())) {
//下面直接根据ID进行修改, 所以此处置为游离态
entityManager.detach(packageDb);
ConvertBean.serviceModelUpdate(packageDb, reqBean.getUserInfo());
}
packageDb.setQty(new Double(curQty));
if (isSealed) {
packageDb.setLotNo(TimeTool.getToday());
packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
}
if (StringUtils.isEmpty(packageDb.getId())) return packageRepository.insert(packageDb);
packageRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID},
new Object[]{reqBean.getOrganizeCode(), packageDb.getId()},
new String[]{MesPcnExtConstWords.QTY, MesPcnExtConstWords.IS_SEALED, MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.LOT_NO,
MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{packageDb.getQty(), packageDb.getIsSealed(), packageDb.getPrintStatus(), packageDb.getLotNo(),
packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
return packageDb;
}
//判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据
private List<MesPackageDataContext> insertPackageDetailAndBackUnSealedResultList(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext,
MesPackage packageDb, List<String> productSnList2Cur, Boolean isSealed) {
//当前未满包的包装条码明细数据
List<MesPackageDataContext> resultList = null;
//包装条码明细ID
Long detailId = null;
//遍历当前满足标包的差额条码
for (String productSn : productSnList2Cur) {
if (StringUtils.isEmpty(productSn)) continue;
//判断统计方式,是否生成包装明细信息
if (packageRuleContext.getGenerateType().compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE_DETAIL.getValue()) == 0) {
detailId = insertMesPackageDetail(reqBean, packageDb, productSn);
}
//判断不满包则 赋值给 当前未满包的包装条码明细数据resultList
if (!isSealed) {
if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>();
MesPackageDataContext packageDataContext = new MesPackageDataContext();
BeanUtils.copyProperties(packageRuleContext, packageDataContext);
packageDataContext.setPackageId(packageDb.getId());
packageDataContext.setDetailId(detailId);
packageDataContext.setPackageNo(packageDb.getPackageNo());
packageDataContext.setQty(new Double(1));
packageDataContext.setSerialNumber(productSn);
packageDataContext.setCreateDatetime(packageDb.getCreateDatetime());
packageDataContext.setModifyDatetime(TimeTool.getNowTime(true));
resultList.add(packageDataContext);
}
}
return resultList;
}
//生成包装明细信息
private Long insertMesPackageDetail(StationRequestBean reqBean, MesPackage packageDb, String productSn) {
MesPackageDetail packageDetailDb = new MesPackageDetail();
packageDetailDb.setPackageNo(packageDb.getPackageNo());
packageDetailDb.setPartNo(packageDb.getPartNo());
packageDetailDb.setPartName(packageDb.getPartName());
packageDetailDb.setSerialNumber(productSn);
packageDetailDb.setProductSn(productSn);
packageDetailDb.setQty(new Double(1));
packageDetailDb.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
packageDetailDb.setFid(UUID.randomUUID().toString());
packageDetailDb.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(packageDetailDb, reqBean.getUserInfo());
return packageDetailRepository.insert(packageDetailDb).getId();
}
//根据编码规则生成包装条码
private String doGereratePackageNo(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) {
GenSerialNoModel serialNoModel = new GenSerialNoModel(packageRuleContext.getPackageBarcodeRule())
.putDataMap(MesPackageRuleContext.class.getSimpleName(), packageRuleContext)
.partNo(packageRuleContext.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
try {
return syncFuncService.syncSerialNo(serialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), e.getErrorDetail(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成包装条码%s", serialNoModel.getPartNo(), serialNoModel.getRuleCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.sendMessage(reqBean, new StationResultBean().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);
}
return null;
}
private void execPrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesPackageRuleContext packageRuleContext, MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList) {
if (null == strategyService) {
//查询模版信息
labelTemplate = templateService.getLabelTemplate(packageRuleContext.getPackageTemplate(), reqBean.getOrganizeCode());
strategyService = (null != labelTemplate && !StringUtils.isEmpty(labelTemplate.getMethodCode())) ? (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode()) : null;
}
if (null == strategyService) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate()));
MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel();
mesProduceSnPrintModel.setOrganizeCode(reqBean.getOrganizeCode());
mesProduceSnPrintModel.setUserName(reqBean.getUserInfo());
mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate);
mesProduceSnPrintModel.setPrinter(packageRuleContext.getPrinter());
mesProduceSnPrintModel.setPartNo(packageRuleContext.getPartNo());
mesProduceSnPrintModel.setPartName(packageRuleContext.getPartName());
mesProduceSnPrintModel.getPackageList().addAll(packageList);
MesProduceSnPrintModel printModel = null;
try {
printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, true);
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
} catch (Exception e) {
String webMsg = String.format("零件编码[%s]包装条码模版[%s]打印包装条码%s", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate(), 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();
}
if (CollectionUtils.isEmpty(printModel.getPrintContextList())) return;
//发送打印信息
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT);
resultBean.setResultObj(printModel.getPrintContextList());
this.sendMessage(reqBean, resultBean);
//保存打印记录日志
printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList());
}
}

@ -21,6 +21,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicReference;
@ -267,4 +268,29 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
dispatchFsmBusiData(reqBean.getOrganizeCode(), getShortCounterContextKey(reqBean), shortCounter.toString());
}
//打包数据KEY
private String getPackageDataContextKey(StationRequestBean reqBean) {
return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PACKAGE_DATA_CONTEXT).toString();
}
//保存打包数据 [JSON]List<MesPackageDataContext>
@Override
public Boolean dispatchPackageDataContext(StationRequestBean reqBean, Map<String, String> packageDataContextMap) {
if (CollectionUtils.isEmpty(packageDataContextMap)) return false;
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean), JSONObject.toJSONString(packageDataContextMap));
}
//获取打包数据 [JSON]List<MesPackageDataContext>
@Override
public Map<String, String> getPackageDataContext(StationRequestBean reqBean) {
String contextStr = getFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean));
return !StringUtils.isEmpty(contextStr) ? JSONObject.parseObject(contextStr, Map.class) : null;
}
//删除上下文班次班组信息
@Override
public void removePackageDataContext(StationRequestBean reqBean) {
removeFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean));
}
}

@ -551,4 +551,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
if (!CollectionUtils.isEmpty(workCellList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_CELL_MAP_CONTEXT, JSONObject.toJSONString(workCellMap));
return workCellMap;
}
//获取包装规则信息
@Override
public Map<String, MesPackageRuleContext> getPackageRuleContext(StationRequestBean reqBean) {
String packageRuleContextJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT);
return !StringUtils.isEmpty(packageRuleContextJson) ? JSONObject.parseObject(packageRuleContextJson, new TypeReference<Map<String, MesPackageRuleContext>>() {}): null;
}
//保存包装规则信息
@Override
public Boolean dispatchPackageRuleContext(StationRequestBean reqBean, Map<String, MesPackageRuleContext> packageRuleContextMap) {
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT, JSONObject.toJSONString(packageRuleContextMap));
}
//删除包装规则信息
@Override
public void removePackageRuleContext(StationRequestBean reqBean) {
removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT);
}
}

@ -0,0 +1,37 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
*
*/
@Data
public class MesPackageDataContext extends MesPackageRuleContext implements Serializable {
private static final long serialVersionUID = 8644214903859925217L;
@ApiParam("包装信息ID")
private Long packageId;
@ApiParam("明细ID")
private Long detailId;
@ApiParam("包装编号")
private String packageNo;
@ApiParam("数量")
private Double qty;
@ApiParam("产品条码")
private String serialNumber;
@ApiParam("打包开始时间")
private String createDatetime;
@ApiParam("打包结束时间")
private String modifyDatetime;
}

@ -0,0 +1,61 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
*
*/
@Data
public class MesPackageRuleContext implements Serializable {
private static final long serialVersionUID = 1369218116212836881L;
@ApiParam(name = "包装代码")
private String packageCode;
@ApiParam(name = "行号")
private String lineNo;
@ApiParam(name = "零件号")
private String partNo;
@ApiParam(name = "零件名称")
private String partName;
@ApiParam(name = "零件类型")
private String partType;
@ApiParam("包装规格数量")
private Double packSpecQty;
@ApiParam("最小数量")
private Double minQty;
@ApiParam("取整数量")
private Double roundnessQty;
@ApiParam(name = "计量单位")
private String unit;
@ApiParam(name = "是否默认包装")
private Integer defaultFlag;
@ApiParam(name = "统计方式")
private Integer generateType;
@ApiParam(name = "箱类别代号")
private String packCode;
@ApiParam(name = "包装条码编码规则")
private String packageBarcodeRule;
@ApiParam(name = "包装条码模板")
private String packageTemplate;
@ApiParam(name = "打印机")
private String printer;
}

@ -1,9 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintedSnLog;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.*;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@ -33,6 +30,9 @@ public class MesProduceSnPrintModel {
@ApiParam("条码")
private String productSn;
@ApiParam("包装条码")
private String packageNo;
@ApiParam("打印数量")
private Integer printQty;
@ -69,13 +69,18 @@ public class MesProduceSnPrintModel {
@ApiParam(name = "打印模板信息")
private MesLabelTemplate mesLabelTemplate;
@ApiParam(name = "产品条码信息")
private List<MesProduceSnPrintDataModel> mesProduceSnPrintDataModelList = new ArrayList<>();
@ApiParam(name = "产出条码")
private List<MesProduceSn> mesProduceSnList = new ArrayList<>();
@ApiParam(name = "产出包装")
private List<MesPackage> packageList = new ArrayList<>();
@ApiParam(name = "打印日志信息")
private List<MesPrintedSnLog> mesPrintedSnLogList = new ArrayList<>();
@ApiParam(name = "产品条码打印信息")
private List<MesProduceSnPrintDataModel> mesProduceSnPrintDataModelList = new ArrayList<>();
@ApiParam(name = "源数据 使用功能1-裁片")
private Object sourceData;

@ -313,6 +313,16 @@ public class MesPcnExtConstWords {
public static final String REWORK_TASK_ID = "reworkTaskId";
//nc状态
public static final String NC_STATUS = "nc_status";
//零件类型
public static final String PART_TYPE = "partType";
//包装代码
public static final String PACKAGE_CODE = "packageCode";
//是否封箱
public static final String IS_SEALED = "isSealed";
//单位
public static final String UNIT = "unit";
//包装规格数量
public static final String PACK_SPEC_QTY = "packSpecQty";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
@ -334,6 +344,13 @@ public class MesPcnExtConstWords {
// 扩展字段
public static final String EXTEND = "extend";
// 用户缓存
public static final String USER_INFO_CONTEXT = "USER_INFO_CONTEXT";
// 装箱防错
public static final String BOXING_ERROR_PROOFING = "BOXING_ERROR_PROOFING";
// 是否记忆
public static final String IS_MEMORY = "IS_MEMORY";
// 时间格式
public static final String DATE_FORMAT_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@ -552,12 +569,10 @@ public class MesPcnExtConstWords {
public static final String REPEAT_ASSEMBLY_SN_CONTEXT = "REPEAT_ASSEMBLY_SN_CONTEXT";
// 设备计数上下文
public static final String SHORT_COUNTER_CONTEXT = "SHORT_COUNTER_CONTEXT";
// 用户缓存
public static final String USER_INFO_CONTEXT = "USER_INFO_CONTEXT";
// 装箱防错
public static final String BOXING_ERROR_PROOFING = "BOXING_ERROR_PROOFING";
// 是否记忆
public static final String IS_MEMORY = "IS_MEMORY";
// 打包数据上下文
public static final String PACKAGE_DATA_CONTEXT = "PACKAGE_DATA_CONTEXT";
// 打包规则上下文
public static final String PACKAGE_RULE_CONTEXT = "PACKAGE_RULE_CONTEXT";
// 上下文: 展示组件数据
public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";
@ -621,7 +636,6 @@ public class MesPcnExtConstWords {
//打印客户条码
public static final String SORT_WORK_CENTER_PRINT = "SORT_WORK_CENTER_PRINT";
//强过 跳过
public static final String SHIP_PASS = "跳过";
public static final String STRONGER_PASS = "强过";

Loading…
Cancel
Save