Merge remote-tracking branch 'origin/mes-uat-changshu0609-temp-wj-250616-xisu-merge-nht' into uat-temp-nht-2506120000-jialiao

mes-uat-changshu0609^2
jason 3 weeks ago
commit 963c87f432

@ -273,6 +273,9 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService {
if (null == productionAssemblyNosortContext) continue;
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblyNosortContext.getMatchType()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblyNosortContext.getMatchType())));
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) {
//已被消费

@ -271,6 +271,9 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
if (null == productionAssemblyNosortContext) continue;
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblyNosortContext.getMatchType()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblyNosortContext.getMatchType())));
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) {
//已被消费

@ -114,7 +114,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
Boolean isSkip = checkIsSkip(productionProcessContext, equipVariableCollectContextList);
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
Boolean result = doHandleMatchAssembly(reqBean, stepResult, productionProcessContext.getWorkCenter(), prodRuleContextList, equipVariableCollectContextList, isSkip);
Boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, productionProcessContext.getWorkCenter(), prodRuleContextList, equipVariableCollectContextList, isSkip);
//验证是否存在待绑定数据
hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
@ -236,7 +236,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip) {
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip) {
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
@ -256,6 +256,9 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//已装配
if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblyNosortContext.getMatchType()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblyNosortContext.getMatchType())));
//遍历装配件条码
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {

@ -106,7 +106,7 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
Boolean isCavitySkip = checkIsCavitySkip(productionProcessContext, equipVariableCollectContextList);
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
Boolean result = doHandleMatchAssembly(reqBean, stepResult, productionProcessContext.getWorkCenter(), prodRuleContextList, equipVariableCollectContextList, isSkip, isCavitySkip);
Boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, productionProcessContext.getWorkCenter(), prodRuleContextList, equipVariableCollectContextList, isSkip, isCavitySkip);
//验证是否存在待绑定数据
hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
@ -199,7 +199,7 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
}
//处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成]
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip, Boolean isCavitySkip) {
private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Boolean isSkip, Boolean isCavitySkip) {
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
@ -219,6 +219,9 @@ public class MesAssemblyMatchSortStepService extends BaseStepService {
//已装配
if (null == productionAssemblySortContext || productionAssemblySortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblySortContext.getMatchType()))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblySortContext.getMatchType())));
//遍历装配件条码
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {

@ -39,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import rx.internal.util.LinkedArrayList;
import javax.persistence.EntityManager;
import java.util.*;
@ -122,9 +123,11 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
List<Integer> foreignKeyList = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsPackage()) && o.getIsPackage().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).map(MesProdRuleContext::getForeignKey).collect(Collectors.toList());
//搜集数据关联键集合对应的[合格状态]的产出条码,根据零件号分组
Map<String, List<String>> productSnMap2Part = productionPsOutContextList.stream()
/**Map<String, List<String>> productSnMap2Part = productionPsOutContextList.stream()
.filter(o -> (null != o && o.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) == 0 && foreignKeyList.contains(o.getForeignKey())))
.collect(Collectors.groupingBy(MesProductionPsOutContext::getPartNo, Collectors.mapping(MesProductionPsOutContext::getProductSn, Collectors.toList())));
.collect(Collectors.groupingBy(MesProductionPsOutContext::getPartNo, Collectors.mapping(MesProductionPsOutContext::getProductSn, Collectors.toList())));**/
Map<String, LinkedList<String>> productSnMap2Part = new HashMap<>();
productionPsOutContextList.forEach(o -> productSnMap2Part.computeIfAbsent(o.getPartNo(), k -> new LinkedList<>()).addAll(generateVirtualPs(o.getQty(), o.getProductSn())));
//获取包装规则信息
Map<String, MesPackageRuleContext> packageRuleContextMap = productionProcessContextStepService.getPackageRuleContext(reqBean);
@ -134,7 +137,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
Map<String, String> packageDataContextMap = productionCustomContextStepService.getPackageDataContext(reqBean);
//不同的零件号分别打包处理
for (Map.Entry<String, List<String>> entry : productSnMap2Part.entrySet()) {
for (Map.Entry<String, LinkedList<String>> entry : productSnMap2Part.entrySet()) {
if (null == entry) continue;
@ -150,6 +153,8 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
} else {
//获取包装规则信息
packageRuleContext = getPackageRuleContext(reqBean, stepResult, entry.getKey(), false);
Optional<MesProdRuleContext> optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsPrintPackage()) && o.getIsPrintPackage().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) packageRuleContext.setIsPrintPackage(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
}
//无生产过程打包规则时, 忽略当前零件
@ -297,7 +302,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//生成包装及明细, 根据标包数量判断是否执行打印 [递归]
@Override
public List<MesPackageDataContext> doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
List<MesPackageDataContext> packageDataContextList, List<String> productSnList, Boolean isAsyn) {
List<MesPackageDataContext> packageDataContextList, LinkedList<String> productSnList, Boolean isAsyn) {
//缓存的包装条码明细数量
Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size();
@ -307,9 +312,9 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
if (needQty < 0) needQty = MesPcnExtConstWords.ZERO;
//当前满足标包的差额条码
List<String> productSnList2Cur = null;
LinkedList<String> productSnList2Cur = null;
//除去当前满足标包的差额条码后的剩余条码
List<String> productSnList2Remain = null;
LinkedList<String> productSnList2Remain = null;
//当前零件剩余未打包条码 如果小于等于 当前满足标包的差额数量, 则直接将 未打包条码赋给当前满足标包的差额条码, 否则 截取条码
if (productSnList.size() <= needQty) {
@ -320,8 +325,8 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
productSnList2Remain = productSnList;
} else {
//根据需要的个数进行截取条码
productSnList2Cur = productSnList.subList(0, needQty);
productSnList2Remain = productSnList.subList(needQty, productSnList.size());
productSnList2Cur = new LinkedList<>(productSnList.subList(0, needQty));
productSnList2Remain = new LinkedList<>(productSnList.subList(needQty, productSnList.size()));
}
}
@ -454,46 +459,49 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据
private List<MesPackageDataContext> insertPackageDetailAndBackUnSealedResultList(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext,
MesPackage packageDb, List<String> productSnList2Cur, Boolean isSealed) {
MesPackage packageDb, LinkedList<String> productSnList2Cur, Boolean isSealed) {
//当前未满包的包装条码明细数据
List<MesPackageDataContext> resultList = null;
if (CollectionUtils.isEmpty(productSnList2Cur)) return resultList;
//包装条码明细ID
Long detailId = null;
//遍历当前满足标包的差额条码
for (String productSn : productSnList2Cur) {
if (StringUtils.isEmpty(productSn)) continue;
//遍历当前满足标包的差额条码, 这边根据条码分组(因为可能存在重复条码[适配弹框输入的工单数量])
Map<String, Integer> productSnMap = productSnList2Cur.stream().collect(Collectors.groupingBy(o -> o, Collectors.summingInt(o -> 1)));
for (Map.Entry<String, Integer> entry : productSnMap.entrySet()) {
if (null == entry) continue;
//判断统计方式,是否生成包装明细信息
if (packageRuleContext.getGenerateType().compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE_DETAIL.getValue()) == 0) {
detailId = insertMesPackageDetail(reqBean, packageDb, productSn);
detailId = insertMesPackageDetail(reqBean, packageDb, entry.getKey(), entry.getValue());
}
//判断不满包则 赋值给 当前未满包的包装条码明细数据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);
for (Integer i = 0; i < entry.getValue(); i++) {
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(entry.getKey());
packageDataContext.setCreateDatetime(packageDb.getCreateDatetime());
packageDataContext.setModifyDatetime(TimeTool.getNowTime(true));
resultList.add(packageDataContext);
}
}
}
return resultList;
}
//生成包装明细信息
private Long insertMesPackageDetail(StationRequestBean reqBean, MesPackage packageDb, String productSn) {
private Long insertMesPackageDetail(StationRequestBean reqBean, MesPackage packageDb, String productSn, Integer qty) {
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.setQty(new Double(qty));
packageDetailDb.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
packageDetailDb.setFid(UUID.randomUUID().toString());
packageDetailDb.setOrganizeCode(reqBean.getOrganizeCode());
@ -526,6 +534,11 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
@Override
public MesProduceSnPrintModel doPrintPackageNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList, Boolean isAsyn) {
MesProduceSnPrintModel printModel = null;
if (packageRuleContext.getIsPrintPackage().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) return printModel;
if (null == strategyService) {
//查询模版信息
labelTemplate = templateService.getLabelTemplate(packageRuleContext.getPackageTemplate(), reqBean.getOrganizeCode());
@ -545,8 +558,6 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
mesProduceSnPrintModel.setPartName(packageRuleContext.getPartName());
mesProduceSnPrintModel.getPackageList().addAll(packageList);
MesProduceSnPrintModel printModel = null;
try {
printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, !StringUtils.isEmpty(reqBean.getWorkCellCode()));
} catch (ImppBusiException e) {
@ -698,12 +709,22 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//生成虚拟条码,零件打包不写包装明细数据, 只是为了适配工步中的方法去递归生成包装条码
@Override
public List<String> generateVirtualPs(Double qty) {
List<String> virtualPsList = new ArrayList<>();
public LinkedList<String> generateVirtualPs(Double qty) {
LinkedList<String> virtualPsList = new LinkedList<>();
for (int i = 0; i < qty.intValue(); i ++) {
virtualPsList.add(String.valueOf(i));
}
return virtualPsList;
}
//生成一样的虚拟条码, 适配弹框输入工单数量
@Override
public LinkedList<String> generateVirtualPs(Double qty, String productSn) {
LinkedList<String> virtualPsList = new LinkedList<>();
for (int i = 0; i < qty.intValue(); i ++) {
virtualPsList.add(productSn);
}
return virtualPsList;
}
}

@ -215,7 +215,7 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService {
productionAssemblyContext.setAssemblySn(null);
productionAssemblyContext.setMatchDatetime(null);
}
stepResult.isCompleted(false).msg(String.format("站点扣减装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getPartNo()));
stepResult.isCompleted(false).msg(String.format("站点扣减装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getAssemblyPartNo()));
break;
} else {
productionAssemblyContext.setAssemblySn(barCodeList.get(0));

@ -185,7 +185,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService {
productionAssemblyContext.setAssemblySn(null);
productionAssemblyContext.setMatchDatetime(null);
}
stepResult.isCompleted(false).msg(String.format("站点匹配装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getPartNo()));
stepResult.isCompleted(false).msg(String.format("站点匹配装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getAssemblyPartNo()));
break;
} else {
productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue());

@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.LinkedList;
import java.util.List;
public interface IMesPackageNoGenerateStepService {
@ -42,13 +43,16 @@ public interface IMesPackageNoGenerateStepService {
@ApiOperation(value = "生成包装及明细, 根据标包数量判断是否执行打印")
List<MesPackageDataContext> doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
List<MesPackageDataContext> packageDataContextList, List<String> productSnList, Boolean isAsyn);
List<MesPackageDataContext> packageDataContextList, LinkedList<String> productSnList, Boolean isAsyn);
@ApiOperation(value = "进行打印")
MesProduceSnPrintModel doPrintPackageNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList, Boolean isAsyn);
@ApiOperation(value = "生成虚拟条码,零件打包不写包装明细数据, 只是为了适配工步中的方法去递归生成包装条码")
List<String> generateVirtualPs(Double qty);
LinkedList<String> generateVirtualPs(Double qty);
@ApiOperation(value = "生成一样的虚拟条码, 适配弹框输入工单数量")
LinkedList<String> generateVirtualPs(Double qty, String productSn);
}

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@ -59,9 +60,12 @@ public class MesPackageRuleContext implements Serializable {
public String printer;
@ApiParam(name = "同步状态WMS")
public Integer systemSyncStatusWms = 2;
public Integer systemSyncStatusWms = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
@ApiParam("零件打包加工单号")
public String partPackWorkOrderNo;
@ApiParam("是否打印包装条码")
private Integer isPrintPackage = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
}

@ -92,6 +92,9 @@ public class MesProdRuleContext implements Serializable {
@ApiParam(name = "是否包装")
private Integer isPackage;
@ApiParam(name = "是否打印包装条码")
private Integer isPrintPackage;
@ApiParam(name = "成品站点")
private String partLocation;

@ -133,6 +133,9 @@ public class MesProductionAssemblyContext implements Serializable {
@ApiParam("容器匹配信息")
public String containerSnData;
@ApiParam("是否已经验证过原料调配")
public String isCheckedRawMix;
public String repeatKeyToString() {
if (StringUtils.isEmpty(this.equipmentCode) || StringUtils.isEmpty(this.matchType) || (StringUtils.isEmpty(this.matchRule) && StringUtils.isEmpty(this.assemblyPartNo))) return null;
return String.format("%s:%s&%s:%s&%s:%s&%s:%s",

@ -8,6 +8,8 @@ import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* -()

Loading…
Cancel
Save