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

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

@ -83,7 +83,7 @@ public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService
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.PART_NAME, packageDb.getPartName());
resultMap.put(MesPcnExtConstWords.CUST_PART_NO, customerPart.getCustPartNo());
resultMap.put(MesPcnExtConstWords.QR_CODE, packageDb.getPackageNo());
resultMap.put(MesPcnExtConstWords.QTY, packageDb.getQty().intValue());

@ -0,0 +1,116 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.MesPackageNoGenerateStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
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 cn.estsh.i3plus.pojo.mes.model.StepResult;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
**/
@Service
public class MesFunctionPackageProgressService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesPackageNoGenerateStepService packageNoGenerateStepService;
@Override
public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//获取打包数据
Map<String, String> packageDataContextMap = productionCustomContextStepService.getPackageDataContext(reqBean);
if (CollectionUtils.isEmpty(packageDataContextMap)) return null;
if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) {
//封装返回列表
List<MesPackageDataContext> resultList = new ArrayList<>();
for (String partNo : packageDataContextMap.keySet()) {
if (StringUtils.isEmpty(partNo)) continue;
List<MesPackageDataContext> packageDataContextList = JSONObject.parseArray(packageDataContextMap.get(partNo), MesPackageDataContext.class);
packageDataContextList = packageDataContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPackageDataContext::getModifyDatetime).reversed()).collect(Collectors.toList());
//列表展示: 包装条码, 装箱个数, 包装规格数量, 装箱开始时间, 装箱结束时间
resultList.add(new MesPackageDataContext(packageDataContextList.get(0).getPackageNo(), new Double(packageDataContextList.size()),
packageDataContextList.get(0).getPackSpecQty(), packageDataContextList.get(0).getCreateDatetime(), packageDataContextList.get(0).getModifyDatetime()));
}
resultList = resultList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPackageDataContext::getModifyDatetime).reversed()).collect(Collectors.toList());
return resultList;
}
resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue());
Map<String, String> resultMap = new HashMap<>();
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
MesPackageDataContext packageDataContext = JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class);
if (null == packageDataContext) {
return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,参数异常!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
}
if (CollectionUtils.isEmpty(packageDataContextMap) || !packageDataContextMap.containsKey(packageDataContext.getPartNo())) {
return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,当前已无零件号[%s]未封箱状态的包装信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPartNo()));
}
MesPackageDataContext packageDataContextCached = JSONObject.parseObject(packageDataContextMap.get(packageDataContext.getPartNo()), MesPackageDataContext.class);
if (null == packageDataContextCached || !packageDataContextCached.getPackageNo().equals(packageDataContext.getPackageNo())) {
return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,打包进度列表中已经不存在包装条码[%s],请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo()));
}
MesPackage packageDb = packageNoGenerateStepService.getMesPackage(reqBean.getOrganizeCode(), packageDataContext.getPackageId());
if (null == packageDb) {
return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,包装条码[%s]信息已经不存在,请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo()));
}
StepResult stepResult = StepResult.getSuccessComplete();
doForcePrint(reqBean, resultBean, stepResult, packageDataContextCached, packageDb);
if (!StringUtils.isEmpty(stepResult.getMsg())) {
return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg()));
}
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue());
return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]强制封箱!正在打印中...请稍后!", packageDataContext.getPartNo()));
}
private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map<String, String> resultMap, String message) {
this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
resultMap.put(MesPcnExtConstWords.MESSAGE, message);
return resultMap;
}
private void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageDataContext packageDataContext, MesPackage packageDb) {
packageNoGenerateStepService.savePackageDb(reqBean, packageDb, packageDb.getQty().intValue(), true);
List<MesPackage> packageList = new ArrayList<>();
packageList.add(packageDb);
packageNoGenerateStepService.execPrint(reqBean, resultBean, stepResult, packageDataContext, null, null, packageList, true);
}
}

@ -170,13 +170,13 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
stepResult.setDataCollection(new ArrayList());
packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue());
//更新实时的打包数据
//更新实时的打包数据 if (CollectionUtils.isEmpty(packageDataContextMap)) packageDataContextMap = new HashMap<>();
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());
execPrint(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List<MesPackage>) stepResult.getDataCollection(), false);
}
}
@ -245,8 +245,8 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
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)) {
//此时 packageBarcodeRule || packageTemplate 仍有一个为空则 记录日志 忽略当前零件的打包
if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)) {
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);
@ -288,7 +288,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
MesPackage packageDb = null;
//判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码
if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = packageExtService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId());
if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId());
//缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息
if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext);
@ -319,6 +319,9 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
}
//根据ID查询包装信息
public MesPackage getMesPackage(String organizeCode, Long packageId) { return packageExtService.getMesPackage(organizeCode, packageId); }
//生成包装条码信息
private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) {
//根据编码规则生成包装条码
@ -330,7 +333,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
packageDb.setPartName(packageRuleContext.getPartName());
packageDb.setQty(new Double(1));
packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty());
packageDb.setUnit(packageDb.getUnit());
packageDb.setUnit(packageRuleContext.getUnit());
packageDb.setLotNo(TimeTool.getToday());
packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
@ -346,7 +349,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
}
//判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态
private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed) {
public MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed) {
if (!StringUtils.isEmpty(packageDb.getId())) {
//下面直接根据ID进行修改, 所以此处置为游离态
@ -439,14 +442,20 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
return null;
}
private void execPrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesPackageRuleContext packageRuleContext, MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList) {
public void execPrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList, Boolean isAsyn) {
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()));
if (null == strategyService) {
if (!isAsyn) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate()));
else {
stepResult.msg(String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate()));
return;
}
}
MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel();
mesProduceSnPrintModel.setOrganizeCode(reqBean.getOrganizeCode());
@ -461,22 +470,32 @@ public class MesPackageNoGenerateStepService extends BaseStepService {
try {
printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, true);
} catch (ImppBusiException e) {
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
if (!isAsyn) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
else {
stepResult.msg(e.getErrorDetail());
return;
}
} 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 (!isAsyn) {
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();
} else {
stepResult.msg(webMsg);
return;
}
}
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);
this.sendMessage(reqBean, new StationResultBean()
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue())
.dataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue())
.customPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT)
.resultObj(printModel.getPrintContextList())
);
//保存打印记录日志
printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList());

@ -145,16 +145,16 @@ public class MesProductSnPrintNosortStepService extends BaseStepService {
}
//前端接收到busiTyep是customComponent并且 dataType是file类型的消息就需要打印后续消息里的数据一个模板对应多个打印数据
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue());
StationResultBean stationResultBean = new StationResultBean()
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue())
.dataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue());
if (!CollectionUtils.isEmpty(resultMapList) && resultMapList.size() > MesPcnExtConstWords.ZERO) {
resultBean.setCustomPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT);
resultBean.setResultObj(resultMapList);
stationResultBean.setCustomPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT);
stationResultBean.setResultObj(resultMapList);
} else {
resultBean.setResultObj(printModelList);
stationResultBean.setResultObj(printModelList);
}
//3. 发送数据给到前端
this.sendMessage(reqBean, resultBean);
this.sendMessage(reqBean, stationResultBean);
List<MesPrintedSnLog> snLogList = printModelList.stream().map(MesProduceSnPrintModel::getMesPrintedSnLogList).flatMap(List::stream).collect(Collectors.toList());
//更新打印状态
for (MesProductionPsOutContext outSn : productionPsOutContextList) {

@ -152,12 +152,12 @@ public class MesProductSnPrintSortStepService extends BaseStepService {
}
//前端接收到busiTyep是customComponent并且 dataType是file类型的消息就需要打印后续消息里的数据一个模板对应多个打印数据
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(resultMap);
//3. 发送数据给到前端
this.sendMessage(reqBean, resultBean);
this.sendMessage(reqBean, new StationResultBean()
.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue())
.dataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue())
.customPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT)
.resultObj(resultMap)
);
//保存打印条码记录
snLogRao.saveAll(snLogList);
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "打印成功!");

@ -34,4 +34,13 @@ public class MesPackageDataContext extends MesPackageRuleContext implements Seri
@ApiParam("打包结束时间")
private String modifyDatetime;
public MesPackageDataContext() {}
public MesPackageDataContext(String packageNo, Double qty, Double packSpecQty, String createDatetime, String modifyDatetime) {
this.packageNo = packageNo;
this.qty = qty;
this.packSpecQty = packSpecQty;
this.createDatetime = createDatetime;
this.modifyDatetime = modifyDatetime;
}
}

@ -14,48 +14,48 @@ public class MesPackageRuleContext implements Serializable {
private static final long serialVersionUID = 1369218116212836881L;
@ApiParam(name = "包装代码")
private String packageCode;
public String packageCode;
@ApiParam(name = "行号")
private String lineNo;
public String lineNo;
@ApiParam(name = "零件号")
private String partNo;
public String partNo;
@ApiParam(name = "零件名称")
private String partName;
public String partName;
@ApiParam(name = "零件类型")
private String partType;
public String partType;
@ApiParam("包装规格数量")
private Double packSpecQty;
public Double packSpecQty;
@ApiParam("最小数量")
private Double minQty;
public Double minQty;
@ApiParam("取整数量")
private Double roundnessQty;
public Double roundnessQty;
@ApiParam(name = "计量单位")
private String unit;
public String unit;
@ApiParam(name = "是否默认包装")
private Integer defaultFlag;
public Integer defaultFlag;
@ApiParam(name = "统计方式")
private Integer generateType;
public Integer generateType;
@ApiParam(name = "箱类别代号")
private String packCode;
public String packCode;
@ApiParam(name = "包装条码编码规则")
private String packageBarcodeRule;
public String packageBarcodeRule;
@ApiParam(name = "包装条码模板")
private String packageTemplate;
public String packageTemplate;
@ApiParam(name = "打印机")
private String printer;
public String printer;
}

Loading…
Cancel
Save