Merge branch 'test-temp-wj-250117-pack' into uat-temp-wj-2502060000-chongqing-step

uat-temp-wj-shenshanorder
王杰 3 months ago
commit 72998c5878

@ -5,6 +5,8 @@ import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import java.util.List;
/** /**
* @Description : * @Description :
* @Reference : * @Reference :
@ -15,10 +17,10 @@ import io.swagger.annotations.ApiOperation;
public interface IMesPackingRuleService { public interface IMesPackingRuleService {
@ApiOperation(value = "根据物料代码,零件类型查询成品包装明细规则") @ApiOperation(value = "根据物料代码,零件类型查询成品包装明细规则")
MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType); List<MesPackingRuleDetail> getPackingRuleDetailList(String organizeCode, String partNo, String partType);
@ApiOperation(value = "根据包装代码查询成品包装规则") @ApiOperation(value = "根据包装代码查询成品包装规则")
MesPackingRule getPackingRule(String organizeCode, String packageCode); List<MesPackingRule> getPackingRuleList(String organizeCode, List<String> packageCodeList);
@ApiOperation(value = "根据箱类别代号查询包装定义") @ApiOperation(value = "根据箱类别代号查询包装定义")
MesPackingDefine getPackingDefine(String organizeCode, String packCode); MesPackingDefine getPackingDefine(String organizeCode, String packCode);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi; package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage; import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
/** /**
@ -15,4 +16,16 @@ public interface IMesPackageExtService {
@ApiOperation(value = "根据ID查询包装信息") @ApiOperation(value = "根据ID查询包装信息")
MesPackage getMesPackage(String organizeCode, Long id); MesPackage getMesPackage(String organizeCode, Long id);
@ApiOperation(value = "根据包装条码查询包装信息")
MesPackage getPackageDb(String organizeCode, String packageNo);
@ApiOperation(value = "根据包装条码查询一条包装明细信息")
MesPackageDetail getPackageDetailByPackageNo(String organizeCode, String packageNo);
@ApiOperation(value = "根据零件条码查询一条包装明细信息")
MesPackageDetail getPackageDetailByProductSn(String organizeCode, String productSn);
@ApiOperation(value = "根据零件条码及字段名称查询一条包装明细信息")
MesPackageDetail getPackageDetailByProductSnWithProperty(String organizeCode, String productSn, String propertyName);
} }

@ -28,4 +28,7 @@ public interface IMesProduceSnPrintService {
@ApiOperation(value = "打印队列查询") @ApiOperation(value = "打印队列查询")
List<MesPrintQueue> findMesPrintQueueList(MesPrintQueue printQueue); List<MesPrintQueue> findMesPrintQueueList(MesPrintQueue printQueue);
@ApiOperation(value = "根据包装条码补打印包装条码标签")
MesProduceSnPrintModel doRePrintPackByPackageNo(MesProduceSnPrintModel mesProduceSnPrintModel);
} }

@ -20,10 +20,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -175,4 +172,20 @@ public class MesProduceSnPrintController {
} }
} }
@PostMapping("/by-packageno/reprint-pack")
@ApiOperation(value = "根据包装条码补打印包装条码标签")
public ResultBean doRePrintPackByPackageNo(@RequestBody MesProduceSnPrintModel mesProduceSnPrintModel) {
try {
ValidatorBean.checkNotNull(mesProduceSnPrintModel.getPackageNo(), "包装条码不能为空");
ValidatorBean.checkNotNull(mesProduceSnPrintModel.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(mesProduceSnPrintModel.getUserName(), "操作人不能为空");
return ResultBean.success("查询成功").setResultObject(mesProduceSnPrintService.doRePrintPackByPackageNo(mesProduceSnPrintModel));
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
} }

@ -2,7 +2,9 @@ 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.api.base.IMesPackingRuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule;
import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail;
@ -11,8 +13,12 @@ import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleRepository; import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* @Description : * @Description :
* @Reference : * @Reference :
@ -33,19 +39,21 @@ public class MesPackingRuleService implements IMesPackingRuleService {
private MesPackingDefineRepository packingDefineRepository; private MesPackingDefineRepository packingDefineRepository;
@Override @Override
public MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType) { public List<MesPackingRuleDetail> getPackingRuleDetailList(String organizeCode, String partNo, String partType) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(partType)) return null; if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(partType)) return null;
return packingRuleDetailRepository.getByProperty( return packingRuleDetailRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PART_TYPE}, 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}); new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo, partType});
} }
@Override @Override
public MesPackingRule getPackingRule(String organizeCode, String packageCode) { public List<MesPackingRule> getPackingRuleList(String organizeCode, List<String> packageCodeList) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageCode)) return null; if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(packageCodeList)) return null;
return packingRuleRepository.getByProperty( packageCodeList = packageCodeList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACKAGE_CODE}, DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packageCode}); if (packageCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(packageCodeList.get(0), MesPcnExtConstWords.PACKAGE_CODE, packBean);
else DdlPreparedPack.getInPackList(packageCodeList, MesPcnExtConstWords.PACKAGE_CODE, packBean);
return packingRuleRepository.findByHqlWhere(packBean);
} }
@Override @Override

@ -2,11 +2,16 @@ 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.api.busi.IMesPackageExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage; import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesPackageDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository; import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/** /**
* @Description : * @Description :
@ -21,10 +26,48 @@ public class MesPackageExtService implements IMesPackageExtService {
@Autowired @Autowired
private MesPackageRepository packageRepository; private MesPackageRepository packageRepository;
@Autowired
private MesPackageDetailRepository packageDetailRepository;
@Override @Override
public MesPackage getMesPackage(String organizeCode, Long id) { public MesPackage getMesPackage(String organizeCode, Long id) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null;
return packageRepository.getByProperty( return packageRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ID}, 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}); new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id});
} }
@Override
public MesPackage getPackageDb(String organizeCode, String packageNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageNo)) return null;
return packageRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACKAGE_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packageNo});
}
@Override
public MesPackageDetail getPackageDetailByPackageNo(String organizeCode, String packageNo) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageNo)) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packageNo, MesPcnExtConstWords.PACKAGE_NO, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
return packageDetailRepository.getByProperty(packBean);
}
@Override
public MesPackageDetail getPackageDetailByProductSn(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null;
MesPackageDetail packageDetail = getPackageDetailByProductSnWithProperty(organizeCode, productSn, MesPcnExtConstWords.SERIAL_NUMBER);
if (null == packageDetail) packageDetail = getPackageDetailByProductSnWithProperty(organizeCode, productSn, MesPcnExtConstWords.PRODUCT_SN);
if (null == packageDetail || StringUtils.isEmpty(packageDetail.getPackageNo())) return null;
return packageDetail;
}
@Override
public MesPackageDetail getPackageDetailByProductSnWithProperty(String organizeCode, String productSn, String propertyName) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productSn, propertyName, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
return packageDetailRepository.getByProperty(packBean);
}
} }

@ -2,10 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPrintedSnLogService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnPrintService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.IPrintQueueStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.IPrintQueueStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; 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.apiservice.util.MesPcnException;
@ -111,6 +108,9 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
@Autowired @Autowired
private IMesWorkOrderService mesWorkOrderService; private IMesWorkOrderService mesWorkOrderService;
@Autowired
private IMesPackageExtService packageExtService;
// 仅查询 // 仅查询
public static final Integer CUT_QUERY_MODE_BY_QUERY = 1; public static final Integer CUT_QUERY_MODE_BY_QUERY = 1;
// 打印 // 打印
@ -501,4 +501,36 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
snLog.setOrganizeCode(workOrder.getOrganizeCode()); snLog.setOrganizeCode(workOrder.getOrganizeCode());
return snLog; return snLog;
} }
@Override
public MesProduceSnPrintModel doRePrintPackByPackageNo(MesProduceSnPrintModel mesProduceSnPrintModel) {
//根据包装条码查询包装信息
MesPackage packageDb = packageExtService.getPackageDb(mesProduceSnPrintModel.getOrganizeCode(), mesProduceSnPrintModel.getPackageNo());
if (null == packageDb) MesPcnException.throwBusiException("包装条码[%s]信息不存在!", mesProduceSnPrintModel.getPackageNo());
if (StringUtils.isEmpty(packageDb.getPackageLabelTemplate())) MesPcnException.throwBusiException("包装条码[%s]信息未关联包装条码模版代码!", mesProduceSnPrintModel.getPackageNo());
if (StringUtils.isEmpty(packageDb.getIsSealed()) || packageDb.getIsSealed().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)
MesPcnException.throwBusiException("包装条码[%s]当前状态[未封装],不支持补打印!", mesProduceSnPrintModel.getPackageNo());
//查询模版信息
MesLabelTemplate labelTemplate = mesTemplateService.getMesLabelTemplate(packageDb.getPackageLabelTemplate(), mesProduceSnPrintModel.getOrganizeCode());
if (StringUtils.isEmpty(labelTemplate.getMethodCode()))
MesPcnException.throwBusiException("包装条码[%s]关联的包装条码模版代码[%s]未维护方法策略!", mesProduceSnPrintModel.getPackageNo(), packageDb.getPackageLabelTemplate());
IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode());
if (null == strategyService) MesPcnException.throwBusiException("包装条码[%s]关联的包装条码模版代码[%s]未维护有效的方法策略!", mesProduceSnPrintModel.getPackageNo(), packageDb.getPackageLabelTemplate());
mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate);
mesProduceSnPrintModel.setPartNo(packageDb.getPartNo());
mesProduceSnPrintModel.setPartName(packageDb.getPartName());
mesProduceSnPrintModel.getPackageList().addAll(Stream.of(packageDb).collect(Collectors.toList()));
mesProduceSnPrintModel = strategyService.execute(null, mesProduceSnPrintModel, null, null, null, false);
//保存打印记录日志
printedSnLogRepository.saveAll(mesProduceSnPrintModel.getMesPrintedSnLogList());
return mesProduceSnPrintModel;
}
} }

@ -54,7 +54,7 @@ public class MesNoSortCustSnNumberRuleStrategyService implements INumberRulePack
} }
@Override @Override
public String transform(String serialNo) { public String transform(GenSerialNoModel genSerialNoModel, String serialNo) {
if (StringUtils.isEmpty(serialNo)) return serialNo; if (StringUtils.isEmpty(serialNo)) return serialNo;
return customerSnTransformService.transformBarCodeGm(serialNo); return customerSnTransformService.transformBarCodeGm(serialNo);
} }

@ -1,61 +0,0 @@
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,84 @@
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 org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Description : MES-
* @Reference :
* @Author : wangjie
* @CreateDate 2024/10/28 16:47
* @Modify:
**/
@Component
public class YfaiPackageNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {
// 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}
@Override
public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
Map<String, Object> dataMap = genSerialNoModel.getDataMap();
MesPackageRuleContext packageRuleContext = !CollectionUtils.isEmpty(dataMap) ? (MesPackageRuleContext) dataMap.get(MesPackageRuleContext.class.getSimpleName()) : null;
Double qty = (!CollectionUtils.isEmpty(dataMap) && dataMap.containsKey(MesPcnExtConstWords.QTY)) ? (Double) dataMap.get(MesPcnExtConstWords.QTY) : null;
if (StringUtils.isEmpty(qty)) qty = null != packageRuleContext ? packageRuleContext.getPackSpecQty() : null;
if (StringUtils.isEmpty(qty)) MesPcnException.throwBusiException("生成包装条码缺少必要参数[包装数量]");
String unit = (!CollectionUtils.isEmpty(dataMap) && dataMap.containsKey(MesPcnExtConstWords.UNIT)) ? (String) dataMap.get(MesPcnExtConstWords.UNIT) : null;
if (StringUtils.isEmpty(unit)) unit = null != packageRuleContext ? packageRuleContext.getUnit() : null;
if (StringUtils.isEmpty(unit)) MesPcnException.throwBusiException("生成包装条码缺少必要参数[单位]");
genSerialNoModel.setDynamicRule(
new StringJoiner(MesPcnExtConstWords.COMMA)
.add(((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SHORT)).format(new Date())))
.add(String.format("%.1f", qty))
.add(unit)
.toString()
);
return genSerialNoModel;
}
// 生成一维码,存到dataMap中
// YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223|
// YFNSC901C241223042722 截取原始条码的 第7位到27位
@Override
public String transform(GenSerialNoModel genSerialNoModel, String serialNo) {
String packageOneCode;
// packageOneCode = serialNo.length() >= 27 ? serialNo.substring(6, 27) : serialNo;
try {
//截取前2个 "|" 之间的字符串
Integer indexVerticalBar = serialNo.indexOf(MesPcnExtConstWords.VERTICAL_BAR) + 1;
packageOneCode = serialNo.substring(indexVerticalBar, serialNo.indexOf(MesPcnExtConstWords.VERTICAL_BAR, indexVerticalBar));
} catch (Exception e) {
packageOneCode = serialNo;
}
genSerialNoModel.putDataMap(serialNo, packageOneCode);
return serialNo;
}
}

@ -22,7 +22,7 @@ import org.springframework.util.CollectionUtils;
import java.util.*; import java.util.*;
/** /**
* @Description : * @Description :
* @Reference : * @Reference :
* @Author : wangjie * @Author : wangjie
* @CreateDate : 2024/9/29 16:43 * @CreateDate : 2024/9/29 16:43
@ -30,7 +30,7 @@ import java.util.*;
**/ **/
@Component @Component
@Slf4j @Slf4j
public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService { public class YfaiPackageNoPrintStrategy implements IPrintTemplateStrategyService {
@Autowired @Autowired
private IMesCustomerPartService mesCustomerPartService; private IMesCustomerPartService mesCustomerPartService;
@ -49,12 +49,11 @@ public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService
// 返回的结果集合 // 返回的结果集合
List<Map<String, Object>> printDataMapList = new ArrayList<>(); List<Map<String, Object>> printDataMapList = new ArrayList<>();
if (!isStep) { if (!isStep) {
//TODO 包装条码补打 model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart)));
model.setPrintContextList(printDataMapList);
} else { } else {
model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart))); model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart)));
List<Map<String, Object>> resultMapList = new ArrayList<>(); model.getPrintContextList().add(packResultMap(model, printDataMapList));
resultMapList.add(packResultMap(model, printDataMapList));
model.setPrintContextList(resultMapList);
} }
return model; return model;
@ -90,9 +89,7 @@ public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService
resultMap.put(MesPcnExtConstWords.UNIT, packageDb.getUnit()); resultMap.put(MesPcnExtConstWords.UNIT, packageDb.getUnit());
resultMap.put(MesPcnExtConstWords.PACK_SPEC_QTY, packageDb.getPackSpecQty().intValue()); resultMap.put(MesPcnExtConstWords.PACK_SPEC_QTY, packageDb.getPackSpecQty().intValue());
resultMap.put(MesPcnExtConstWords.LOT_NO, packageDb.getLotNo().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R)); resultMap.put(MesPcnExtConstWords.LOT_NO, packageDb.getLotNo().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R));
// YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223| resultMap.put(MesPcnExtConstWords.BAR_CODE, packageDb.getPackageOneCode());
// 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)); resultMap.put(MesPcnExtConstWords.MODIFY_DATE_TIME, packageDb.getModifyDatetime().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R));
model.getMesPrintedSnLogList().add(getMesPrintedSnLog(packageDb, model.getUserName(), JSONObject.toJSONString(resultMap))); model.getMesPrintedSnLogList().add(getMesPrintedSnLog(packageDb, model.getUserName(), JSONObject.toJSONString(resultMap)));
return resultMap; return resultMap;

@ -2,16 +2,24 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
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.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationCustomDialogBean; import cn.estsh.i3plus.pojo.mes.model.StationCustomDialogBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -23,9 +31,51 @@ import java.util.stream.Collectors;
public class MesFunctionDialogElectronicInspectionService extends BaseSwsService implements IFsmModuleFunctionService { public class MesFunctionDialogElectronicInspectionService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired @Autowired
private IShippingDispatchService shippingDispatchService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService; private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override @Override
public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()),
String.format("生产线[%s]工位[%s]电子化检验弹框提交信息成功!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()),
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
//functionValue=电子化检验的判断结果
List<String> inspectionList = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : Arrays.asList(buttonDynamicModel.getFunctionValue().split(MesPcnExtConstWords.COMMA));
Boolean isSaveFlag = false;
//获取上下文产出条码数据信息集合
if (!CollectionUtils.isEmpty(inspectionList)) {
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (!CollectionUtils.isEmpty(productionPsOutContextList)) {
for (MesProductionPsOutContext productionPsOutContext : productionPsOutContextList) {
if (null == productionPsOutContext) continue;
if (productionPsOutContext.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) != 0
|| !inspectionList.contains(productionPsOutContext.getProductSn())) continue;
//电子化检验弹框判可疑
productionPsOutContext.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue());
isSaveFlag = true;
}
//保存上下文产出条码数据信息集合
if (isSaveFlag) productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
}
}
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode());
reqBean.setButtonCode(buttonDynamicModel.getButtonCode());
reqBean.setStepDialogStatus(true);
shippingDispatchService.sendScanQueueNextExec(reqBean);
return true;
}
@Override
public StationCustomDialogBean stepDialogDispatch(StationRequestBean reqBean, StationCustomDialogBean dialogBean) { public StationCustomDialogBean stepDialogDispatch(StationRequestBean reqBean, StationCustomDialogBean dialogBean) {
//获取上下文产出条码数据信息集合 //获取上下文产出条码数据信息集合
@ -36,7 +86,7 @@ public class MesFunctionDialogElectronicInspectionService extends BaseSwsService
List<String> snList = productionPsOutContext.stream().filter(o -> !StringUtils.isEmpty(o.getProductSn())).map(MesProductionPsOutContext::getProductSn).distinct().collect(Collectors.toList()); List<String> snList = productionPsOutContext.stream().filter(o -> !StringUtils.isEmpty(o.getProductSn())).map(MesProductionPsOutContext::getProductSn).distinct().collect(Collectors.toList());
// 条码列表为空则表示不需要弹框 // 条码列表为空则表示不需要弹框
if (CollectionUtils.isEmpty(snList)) return dialogBean.unDialog(); if (CollectionUtils.isEmpty(snList)) return dialogBean.unDialog();
else return dialogBean.asyn().obj(snList); else return dialogBean.obj(snList);
} else return dialogBean.unDialog(); } else return dialogBean.unDialog();
} }

@ -0,0 +1,248 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.IMesPackageNoGenerateStepService;
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.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
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.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.model.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
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.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description :
**/
@Slf4j
@Service
public class MesFunctionPackagePartService extends BaseSwsService implements IFsmModuleFunctionService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesPackageNoGenerateStepService packageNoGenerateStepService;
@Autowired
private IFsmRouteDataService fsmRouteDataService;
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//页面渲染数据集
Map<String, Object> resultMap = new HashMap<>();
//工步结果,用于信息传递的对象
StepResult stepResult;
//前端传递的参数
MesPackageDataContext packageDataContext = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class);
//初始化界面
if (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getBusiType())) {
//获取上下文产出零件信息
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//验证是否存在加工单
Boolean isExistOrder = checkIsExistOrder(productionPartContextList);
//列名称
List<AttrBean> attrBeanList = dataAttrList(isExistOrder);
resultMap.put(MesPcnExtConstWords.ATTR_BEAN_LIST, attrBeanList);
//获取上下文产品加工规则数据信息
List<MesProdRuleContext> prodRuleContextList = null;
if (CollectionUtils.isEmpty(productionPartContextList)) prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//当前没有产成零件时,设置 IS_SELECT_PART=1 则支持开窗选零件
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(prodRuleContextList)) resultMap.put(MesPcnExtConstWords.IS_SELECT_PART, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(prodRuleContextList) && (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getPartNo()))) {
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue());
return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:请选择打包零件编码!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
}
//获取包装规则信息
Map<String, MesPackageRuleContext> packageRuleContextMap = productionProcessContextStepService.getPackageRuleContext(reqBean);
if (CollectionUtils.isEmpty(packageRuleContextMap)) packageRuleContextMap = new HashMap<>();
Integer initQty = packageRuleContextMap.size();
//列表数据
List<MesPackageDataContext> resultList = new ArrayList<>();
stepResult = StepResult.getSuccessComplete();
//根据上下文产出零件信息封装列表数据
if (!CollectionUtils.isEmpty(productionPartContextList)) packResultList2Ppc(reqBean, stepResult, productionPartContextList, isExistOrder, packageRuleContextMap, resultList);
//根据上下文产品加工规则数据信息封装列表数据
else if (!CollectionUtils.isEmpty(prodRuleContextList)) packResultList2Prc(reqBean, stepResult, prodRuleContextList, packageRuleContextMap, resultList);
//根据用户选择的零件信息封装列表数据
else packResultList2PartNo(reqBean, stepResult, packageDataContext.getPartNo(), packageRuleContextMap, resultList);
//保存包装规则信息
if (initQty != packageRuleContextMap.size()) productionProcessContextStepService.dispatchPackageRuleContext(reqBean, packageRuleContextMap);
if (!StringUtils.isEmpty(stepResult.getMsg())) {
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:%s!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg()));
}
resultMap.put(MesPcnExtConstWords.DATA, resultList);
return resultMap;
}
resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(String.format("零件号[%s]数量[%s]包装规格数量[%s]", packageDataContext.getPartNo(), packageDataContext.getQty(), packageDataContext.getPackSpecQty()));
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
if (StringUtils.isEmpty(packageDataContext.getPartNo()) || StringUtils.isEmpty(packageDataContext.getQty()) || StringUtils.isEmpty(packageDataContext.getPackageCode())) {
return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:零件编码[%s]缺少必要主数据!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPartNo()));
}
stepResult = StepResult.getSuccessComplete();
//零件打包不写包装明细数据, 默认赋值[仅统计包装], 生成虚拟条码
packageDataContext.setGenerateType(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue());
try {
//零件打包业务处理
stepResult.setDataCollection(new ArrayList());
packageNoGenerateStepService.doHandlePackagePart(reqBean, resultBean, stepResult, packageDataContext);
} catch (ImppBusiException e) {
stepResult.msg(e.getErrorDetail());
} catch (Exception e) {
String error = String.format("生产线[%s]工位[%s]零件打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.cacheException(reqBean, StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), error, e, false);
stepResult.msg(error);
}
//判断零件打包的执行结果
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]零件打包成功!包装条码%s打印成功!",
packageDataContext.getPartNo(), ((List<MesPackage>) stepResult.getDataCollection()).stream().filter(o -> null != o).map(MesPackage::getPackageNo).collect(Collectors.toList()).toString()));
}
//返回提示信息
private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map<String, Object> 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 Boolean checkIsExistOrder(List<MesProductionPartContext> productionPartContextList) {
Optional<MesProductionPartContext> optional = CollectionUtils.isEmpty(productionPartContextList) ? null :
productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst();
return (null != optional && optional.isPresent()) ? true : false;
}
//列名称
public List<AttrBean> dataAttrList(Boolean isExistOrder) {
List<AttrBean> attrBeanList = new ArrayList<>();
if (isExistOrder) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.WORK_ORDER_NO, "加工单号");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NO, "零件编码");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NAME, "零件名称");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.QTY, "装箱个数");
PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PACK_SPEC_QTY, "包装规格数量");
return attrBeanList;
}
//根据上下文产出零件信息封装列表数据
private void packResultList2Ppc(StationRequestBean reqBean, StepResult stepResult, List<MesProductionPartContext> productionPartContextList, Boolean isExistOrder,
Map<String, MesPackageRuleContext> packageRuleContextMap, List<MesPackageDataContext> resultList) {
List<MesProductionPartContext> filterList;
if (isExistOrder) {
filterList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))
.distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProductionPartContext::getWorkOrderNo))), ArrayList::new));
} else {
filterList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))
.distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProductionPartContext::getPartNo))), ArrayList::new));
}
for (MesProductionPartContext productionPartContext : filterList) {
if (null == productionPartContext) continue;
MesPackageDataContext packageDataContext = new MesPackageDataContext();
MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(productionPartContext.getPartNo());
if (null == packageRuleContext) {
packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, productionPartContext.getPartNo(), true);
if (null != packageRuleContext) packageRuleContextMap.put(productionPartContext.getPartNo(), packageRuleContext);
}
if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext);
packageDataContext.setWorkOrderNo(productionPartContext.getWorkOrderNo());
packageDataContext.setQty(isExistOrder ? productionPartContext.getQty() : packageDataContext.getPackSpecQty());
resultList.add(packageDataContext);
}
}
//根据上下文产品加工规则数据信息封装列表数据
private void packResultList2Prc(StationRequestBean reqBean, StepResult stepResult, List<MesProdRuleContext> prodRuleContextList,
Map<String, MesPackageRuleContext> packageRuleContextMap, List<MesPackageDataContext> resultList) {
List<MesProdRuleContext> filterList = prodRuleContextList.stream().filter(o -> null != o)
.distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProdRuleContext::getOutPartNo))), ArrayList::new));
for (MesProdRuleContext prodRuleContext : filterList) {
if (null == prodRuleContext) continue;
MesPackageDataContext packageDataContext = new MesPackageDataContext();
MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(prodRuleContext.getOutPartNo());
if (null == packageRuleContext) {
packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, prodRuleContext.getOutPartNo(), true);
if (null != packageRuleContext) packageRuleContextMap.put(prodRuleContext.getOutPartNo(), packageRuleContext);
}
if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext);
packageDataContext.setQty(packageDataContext.getPackSpecQty());
resultList.add(packageDataContext);
}
}
//根据用户选择的零件信息封装列表数据
private void packResultList2PartNo(StationRequestBean reqBean, StepResult stepResult, String partNo,
Map<String, MesPackageRuleContext> packageRuleContextMap, List<MesPackageDataContext> resultList) {
MesPackageDataContext packageDataContext = new MesPackageDataContext();
MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(partNo);
if (null == packageRuleContext) {
packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, partNo, true);
if (null != packageRuleContext) packageRuleContextMap.put(partNo, packageRuleContext);
}
if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext);
packageDataContext.setQty(packageDataContext.getPackSpecQty());
resultList.add(packageDataContext);
}
}

@ -7,15 +7,21 @@ 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.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
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.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage; import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel; import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
@ -46,6 +52,7 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements
@Transactional(propagation = Propagation.NOT_SUPPORTED) @Transactional(propagation = Propagation.NOT_SUPPORTED)
public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
//页面渲染数据集
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
//获取打包数据 //获取打包数据
@ -60,6 +67,7 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements
//封装返回列表 //封装返回列表
List<MesPackageDataContext> resultList = new ArrayList<>(); List<MesPackageDataContext> resultList = new ArrayList<>();
//封装页面数据
for (String partNo : packageDataContextMap.keySet()) { for (String partNo : packageDataContextMap.keySet()) {
if (StringUtils.isEmpty(partNo)) continue; if (StringUtils.isEmpty(partNo)) continue;
@ -69,81 +77,170 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements
//列表展示: 包装条码, 装箱个数, 包装规格数量, 装箱开始时间, 装箱结束时间 //列表展示: 包装条码, 装箱个数, 包装规格数量, 装箱开始时间, 装箱结束时间
resultList.add(new MesPackageDataContext( resultList.add(new MesPackageDataContext(
packageDataContextList.get(0).getPartNo(), packageDataContextList.get(0).getPartName(), packageDataContextList.get(0).getPartNo(), packageDataContextList.get(0).getPartName(),
packageDataContextList.get(0).getPackageNo(), new Double(packageDataContextList.size()), packageDataContextList.get(0).getPackageNo(), new Double(packageDataContextList.size()), packageDataContextList.get(0).getPackSpecQty(),
packageDataContextList.get(0).getPackSpecQty(), packageDataContextList.get(0).getCreateDatetime(), packageDataContextList.get(0).getModifyDatetime()) packageDataContextList.get(0).getCreateDatetime(), packageDataContextList.get(0).getModifyDatetime(), packageDataContextList.get(0).getGenerateType())
); );
} }
//页面数据更新时间倒序
resultList = resultList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPackageDataContext::getModifyDatetime).reversed()).collect(Collectors.toList()); resultList = resultList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPackageDataContext::getModifyDatetime).reversed()).collect(Collectors.toList());
resultMap.put(MesPcnExtConstWords.DATA, resultList); resultMap.put(MesPcnExtConstWords.DATA, resultList);
//打包进度页面业务操作[查询]
if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) return resultMap; if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) return resultMap;
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
//打包进度页面业务操作的当前数据
MesPackageDataContext packageDataContext = JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class); MesPackageDataContext packageDataContext = JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class);
resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(packageDataContext.getPackageNo()); resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(packageDataContext.getPackageNo());
if (null == packageDataContext) { if (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getBusiType())) {
return packResultMap(reqBean, resultBean, resultMap, return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,参数异常!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); String.format("生产线[%s]工位[%s]打包进度操作按钮执行失败,参数异常!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
} }
if (CollectionUtils.isEmpty(packageDataContextMap) || !packageDataContextMap.containsKey(packageDataContext.getPartNo())) { if (CollectionUtils.isEmpty(packageDataContextMap) || !packageDataContextMap.containsKey(packageDataContext.getPartNo())) {
return packResultMap(reqBean, resultBean, resultMap, return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,当前已无零件号[%s]未封箱状态的包装信息!",
String.format("生产线[%s]工位[%s]强制打包失败,当前已无零件号[%s]未封箱状态的包装信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPartNo())); reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPartNo()));
} }
//打包进度页面业务操作的当前数据对应的实际包装数据
List<MesPackageDataContext> packageDataContextList = JSONObject.parseArray(packageDataContextMap.get(packageDataContext.getPartNo()), MesPackageDataContext.class); List<MesPackageDataContext> packageDataContextList = JSONObject.parseArray(packageDataContextMap.get(packageDataContext.getPartNo()), MesPackageDataContext.class);
if (CollectionUtils.isEmpty(packageDataContextList) || !packageDataContextList.get(0).getPackageNo().equals(packageDataContext.getPackageNo())) { if (CollectionUtils.isEmpty(packageDataContextList) || !packageDataContextList.get(0).getPackageNo().equals(packageDataContext.getPackageNo())) {
return packResultMap(reqBean, resultBean, resultMap, return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,打包进度列表中已经不存在包装条码[%s],请刷新重试!",
String.format("生产线[%s]工位[%s]强制打包失败,打包进度列表中已经不存在包装条码[%s],请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo()));
} }
//根据包装ID查询包装信息
MesPackage packageDb = packageNoGenerateStepService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId()); MesPackage packageDb = packageNoGenerateStepService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId());
if (null == packageDb) { if (null == packageDb) {
return packResultMap(reqBean, resultBean, resultMap, return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,包装条码[%s]信息已经不存在,请刷新重试!",
String.format("生产线[%s]工位[%s]强制打包失败,包装条码[%s]信息已经不存在,请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo()));
}
if (packageDb.getIsSealed().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) {
return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,包装条码[%s]信息当前状态[已封箱],请刷新重试!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo()));
} }
//修改数量
if (BUSI_TYPE.THREE.getValue().equals(packageDataContext.getBusiType())) {
//仅统计包装才支持修改数量
if (packageDataContextList.get(0).getGenerateType().compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue()) != 0) {
return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]包装条码[%s]不支持修改数量,请刷新重试!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo()));
}
if (packageDataContextList.size() == packageDataContext.getQty()) {
return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]包装条码[%s]修改数量操作无效,请刷新重试!",
reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo()));
}
//修改包装信息的数量
packageNoGenerateStepService.savePackageData(reqBean, packageDb, packageDataContext.getQty());
//打包数据更新数量(判断是增加还是减少数量)
if (MathOperation.compareTo(packageDataContext.getQty(), new Double(packageDataContextList.size())) < 0) {
packageDataContextList = packageDataContextList.subList(0, packageDataContext.getQty().intValue());
} else {
for (int i = 0; i < (packageDataContext.getQty().intValue() - packageDataContextList.size()); i ++) {
MesPackageDataContext addPackageDataContext = new MesPackageDataContext();
BeanUtils.copyProperties(packageDataContextList.get(0), addPackageDataContext);
addPackageDataContext.setModifyDatetime(TimeTool.getNowTime(true));
packageDataContextList.add(addPackageDataContext);
}
}
//打包数据更新数量
packageDataContextMap.put(packageDataContext.getPartNo(), JSONObject.toJSONString(packageDataContextList));
//页面数据更新数量
resultList.stream().filter(o -> (null != o && o.getPackageNo().equals(packageDataContext.getPackageNo()))).findFirst().get().qty(packageDataContext.getQty(), TimeTool.getNowTime(true));
} else {
//强制打包
if (BUSI_TYPE.ONE.getValue().equals(packageDataContext.getBusiType())) {
StepResult stepResult = StepResult.getSuccessComplete(); StepResult stepResult = StepResult.getSuccessComplete();
try { try {
//强制打包业务处理
packageNoGenerateStepService.doForcePrint(reqBean, resultBean, stepResult, packageDataContextList, packageDb); packageNoGenerateStepService.doForcePrint(reqBean, resultBean, stepResult, packageDataContextList, packageDb);
} catch (ImppBusiException e) { } catch (ImppBusiException e) {
stepResult.msg(e.getErrorDetail()); stepResult.msg(e.getErrorDetail());
} catch (Exception e) { } catch (Exception e) {
String error = String.format("生产线[%s]工位[%s]强制打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); String error = String.format("生产线[%s]工位[%s]强制打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
this.cacheException(reqBean, reqBean.getStepName(), error, e, false); this.cacheException(reqBean, StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), error, e, false);
stepResult.msg(error); stepResult.msg(error);
} }
//判断强制打包的执行结果
if (!StringUtils.isEmpty(stepResult.getMsg())) { if (!StringUtils.isEmpty(stepResult.getMsg())) {
return packResultMap(reqBean, resultBean, resultMap, return packResultMap(reqBean, resultBean, resultMap,
String.format("生产线[%s]工位[%s]强制打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg())); String.format("生产线[%s]工位[%s]强制打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg()));
} }
} else {
//删除包装信息
packageNoGenerateStepService.deletePackageData(reqBean, packageDb, packageDataContextList.get(0).getGenerateType());
}
//打包数据移除当前零件的包装信息
packageDataContextMap.remove(packageDataContext.getPartNo()); packageDataContextMap.remove(packageDataContext.getPartNo());
productionCustomContextStepService.dispatchPackageDataContext(reqBean, packageDataContextMap);
//页面数据移除当前零件的包装信息
resultList = resultList.stream().filter(o -> (null != o && !o.getPackageNo().equals(packageDataContext.getPackageNo()))).collect(Collectors.toList()); resultList = resultList.stream().filter(o -> (null != o && !o.getPackageNo().equals(packageDataContext.getPackageNo()))).collect(Collectors.toList());
}
//保存打包数据
productionCustomContextStepService.dispatchPackageDataContext(reqBean, packageDataContextMap);
//重载页面数据
if (CollectionUtils.isEmpty(resultList)) resultMap.remove(MesPcnExtConstWords.DATA); if (CollectionUtils.isEmpty(resultList)) resultMap.remove(MesPcnExtConstWords.DATA);
else resultMap.put(MesPcnExtConstWords.DATA, resultList); else resultMap.put(MesPcnExtConstWords.DATA, resultList);
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue()); resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue());
return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]强制封箱成功!", packageDataContext.getPartNo())); return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]%s成功!", packageDataContext.getPartNo(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType())));
} }
//返回提示信息
private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map<String, Object> resultMap, String message) { private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map<String, Object> resultMap, String message) {
this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
resultMap.put(MesPcnExtConstWords.MESSAGE, message); resultMap.put(MesPcnExtConstWords.MESSAGE, message);
return resultMap; return resultMap;
} }
private void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
List<MesPackageDataContext> packageDataContextList, MesPackage packageDb, Map<String, String> packageDataContextMap) {
//打包进度页面业务操作
enum BUSI_TYPE {
ONE("1", "强制打包"),
TWO("2", "删除包装"),
THREE("3", "修改数量");
private String value;
private String description;
BUSI_TYPE(String value, String description) {
this.value = value;
this.description = description;
}
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
public static String valueOfDescription(String val) {
String tmp = null;
for (int i = 0; i < values().length; i++) {
if (val.equals(values()[i].value)) {
tmp = values()[i].description;
}
}
return tmp;
} }
}
} }

@ -122,14 +122,11 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
//搜集装配件条码 //搜集装配件条码
String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString();
//未知腔数配置【工位参数】, 不验证装配件条码的个数
String cavityUnknownCfg = getCavityUnknownCfg(reqBean);
//根据设备代码获取可复用条码的个数 //根据设备代码获取可复用条码的个数
Integer repeatAssemblySnCount = productionCustomContextStepService.getRepeatAssemblySnCount(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode()); Integer repeatAssemblySnCount = productionCustomContextStepService.getRepeatAssemblySnCount(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode());
Integer repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : 1); Integer repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity());
//非未知腔数,验证装配件条码个数是否匹配 腔数或者未匹配的主条码个数*每腔个数 //验证装配件条码个数是否匹配 腔数或者未匹配的主条码个数*每腔个数
if (StringUtils.isEmpty(cavityUnknownCfg) && (equipVariableCollectContextList.size() + repeatAssemblySnAmount) != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) { if ((equipVariableCollectContextList.size() + repeatAssemblySnAmount) != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) {
String suffix = repeatAssemblySnAmount == 0 ? MesPcnExtConstWords.EMPTY : String.format(",可复用个数[%s]", repeatAssemblySnAmount); String suffix = repeatAssemblySnAmount == 0 ? MesPcnExtConstWords.EMPTY : String.format(",可复用个数[%s]", repeatAssemblySnAmount);
if (!CollectionUtils.isEmpty(curProductionPsInContextList)) { if (!CollectionUtils.isEmpty(curProductionPsInContextList)) {
productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toList())); productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toList()));
@ -141,13 +138,16 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
} }
} }
//当前反向匹配最外层的遍历次数
Integer loopTimes = !CollectionUtils.isEmpty(productionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity();
//获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组
Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext); Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext);
//无主条码则无加工规则, 有主条码可能无加工规则 //无主条码则无加工规则, 有主条码可能无加工规则
prodRuleContextList = CollectionUtils.isEmpty(prodRuleContextList) ? new ArrayList<>() : prodRuleContextList; prodRuleContextList = CollectionUtils.isEmpty(prodRuleContextList) ? new ArrayList<>() : prodRuleContextList;
//生成零件号业务处理 //生成零件号业务处理
prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, cavityUnknownCfg, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList); prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, loopTimes, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList);
String suffix = !CollectionUtils.isEmpty(curProductionPsInContextList) ? String.format("当前主条码%s", curProductionPsInContextList.stream().filter(o -> null != o).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString()) : MesPcnExtConstWords.EMPTY; String suffix = !CollectionUtils.isEmpty(curProductionPsInContextList) ? String.format("当前主条码%s", curProductionPsInContextList.stream().filter(o -> null != o).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString()) : MesPcnExtConstWords.EMPTY;
@ -193,12 +193,6 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
} }
//未知腔数配置【工位参数】
private String getCavityUnknownCfg(StationRequestBean reqBean) {
String cavityUnknownCfg = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG);
return (!StringUtils.isEmpty(cavityUnknownCfg) && cavityUnknownCfg.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? cavityUnknownCfg : null;
}
//获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组
private Map<Long, List<MesProductionAssemblyNosortContext>> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) { private Map<Long, List<MesProductionAssemblyNosortContext>> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) {
@ -224,7 +218,7 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
} }
//生成零件号业务处理 //生成零件号业务处理
private List<MesProdRuleContext> doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, String cavityUnknownCfg, private List<MesProdRuleContext> doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, Integer loopTimes,
MesProductionProcessContext productionProcessContext, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList, MesProductionProcessContext productionProcessContext, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList,
Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap, List<MesEquipVariableCollectContext> equipVariableCollectContextList) { Map<Long, List<MesProductionAssemblyNosortContext>> assemblyNosortCfgMap, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
@ -235,6 +229,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
Optional<MesProdRuleContext> maxForeignKeyOptional = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProdRuleContext::getForeignKey)); Optional<MesProdRuleContext> maxForeignKeyOptional = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProdRuleContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO; Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;
for (int i = 0; i < loopTimes; i ++) {
//遍历非排序加工规则ID //遍历非排序加工规则ID
for (Map.Entry<Long, List<MesProductionAssemblyNosortContext>> entry : assemblyNosortCfgMap.entrySet()) { for (Map.Entry<Long, List<MesProductionAssemblyNosortContext>> entry : assemblyNosortCfgMap.entrySet()) {
@ -248,8 +244,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = entry.getValue().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) && MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedScan(o.getMatchType()))).collect(Collectors.toList()); List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = entry.getValue().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) && MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedScan(o.getMatchType()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(productionAssemblyNosortContextList)) continue; if (CollectionUtils.isEmpty(productionAssemblyNosortContextList)) continue;
//没有未知腔数配置, 剔除装配件规则个数不等于每腔个数的数据 //剔除装配件规则个数不等于每腔个数的数据
if (StringUtils.isEmpty(cavityUnknownCfg) && cellEquipContext.getBindQty().compareTo(productionAssemblyNosortContextList.size()) != 0) continue; if (cellEquipContext.getBindQty().compareTo(productionAssemblyNosortContextList.size()) != 0) continue;
//收集未消费的临时数据 //收集未消费的临时数据
List<MesEquipVariableCollectContext> equipVariableCollectContextListTemp = DeepCloneUtil.deepCloneList(unConsumeList); List<MesEquipVariableCollectContext> equipVariableCollectContextListTemp = DeepCloneUtil.deepCloneList(unConsumeList);
@ -386,6 +382,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService
} }
}
return prodRuleContextList; return prodRuleContextList;
} }

@ -133,7 +133,7 @@ public class MesAssemblyScanStepService extends BaseStepService {
if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList)) productionDispatchContextStepService.removeScanAssemblySnContext(reqBean); if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList)) productionDispatchContextStepService.removeScanAssemblySnContext(reqBean);
//当前已扫描的装配件条码数量 + 可复用数量 * 当前未匹配的主条码数量 //当前已扫描的装配件条码数量 + 可复用数量 * 当前未匹配的主条码数量
repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : 1); repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity());
Integer scanedQty = (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList) ? cachedEquipVariableCollectContextList.size() : MesPcnExtConstWords.ZERO) + repeatAssemblySnAmount; Integer scanedQty = (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList) ? cachedEquipVariableCollectContextList.size() : MesPcnExtConstWords.ZERO) + repeatAssemblySnAmount;
//判断当前已存在数量是否超过需要数量 //判断当前已存在数量是否超过需要数量

@ -9,15 +9,13 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepServ
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.IMesPackageNoGenerateStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.IMesPackageNoGenerateStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
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.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; 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.actor.shipping.dispatch.IFsmRouteDataService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.platform.common.tool.TimeTool;
@ -39,8 +37,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -117,10 +113,17 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//获取上下文产出条码数据信息集合 //获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); //获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//产出条码根据零件号分组 if (CollectionUtils.isEmpty(productionPsOutContextList) || CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
Map<String, List<String>> productSnMap2Part = productionPsOutContextList.stream().filter(o -> null != o)
//在加工规则中搜集可以打包的数据的数据关联键集合
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()
.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())));
//获取包装规则信息 //获取包装规则信息
@ -146,7 +149,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
packageRuleContext = !CollectionUtils.isEmpty(packageDataContextList) ? packageDataContextList.get(0) : packageRuleContextMap.get(entry.getKey()); packageRuleContext = !CollectionUtils.isEmpty(packageDataContextList) ? packageDataContextList.get(0) : packageRuleContextMap.get(entry.getKey());
} else { } else {
//获取包装规则信息 //获取包装规则信息
packageRuleContext = getPackageRuleContext(reqBean, entry.getKey()); packageRuleContext = getPackageRuleContext(reqBean, stepResult, entry.getKey(), false);
} }
//无生产过程打包规则时, 忽略当前零件 //无生产过程打包规则时, 忽略当前零件
@ -172,7 +175,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//生成包装及明细, 根据标包数量判断是否执行打印 [递归] //生成包装及明细, 根据标包数量判断是否执行打印 [递归]
stepResult.setDataCollection(new ArrayList()); stepResult.setDataCollection(new ArrayList());
packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue()); packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue(), false);
//更新实时的打包数据 //更新实时的打包数据
if (CollectionUtils.isEmpty(packageDataContextMap)) packageDataContextMap = new HashMap<>(); if (CollectionUtils.isEmpty(packageDataContextMap)) packageDataContextMap = new HashMap<>();
@ -184,6 +187,12 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
doPrintPackageNo(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List<MesPackage>) stepResult.getDataCollection(), false); doPrintPackageNo(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List<MesPackage>) stepResult.getDataCollection(), false);
} }
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- PART:{} --- CACHED:{} --- PACKAGE:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), entry.getKey(),
CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.SQUARE_BRACKETS : JSONObject.toJSONString(packageDataContextList),
CollectionUtils.isEmpty(stepResult.getDataCollection()) ? MesPcnExtConstWords.SQUARE_BRACKETS : JSONObject.toJSONString(stepResult.getDataCollection()));
} }
//保存包装规则信息 //保存包装规则信息
@ -196,28 +205,40 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
} }
//获取包装规则信息 //获取包装规则信息
private MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, String partNo) { @Override
public MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, StepResult stepResult, String partNo, Boolean isAsyn) {
String message;
//根据 物料代码,零件类型=包装物 查询成品包装明细规则 //根据 物料代码,零件类型=包装物 查询成品包装明细规则
MesPackingRuleDetail packingRuleDetail = packingRuleService.getPackingRuleDetail(reqBean.getOrganizeCode(), partNo, MesExtEnumUtil.PACKING_RULE_DETAIL_PART_TYPE.P.getValue()); List<MesPackingRuleDetail> packingRuleDetailList = packingRuleService.getPackingRuleDetailList(reqBean.getOrganizeCode(), partNo, MesExtEnumUtil.PACKING_RULE_DETAIL_PART_TYPE.P.getValue());
if (null == packingRuleDetail) { if (CollectionUtils.isEmpty(packingRuleDetailList)) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]未配置包装物类型的成品包装明细规则信息!", message = String.format("零件编码[%s]未配置包装物类型的成品包装明细规则信息!", partNo);
partNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else stepResult.msg(message);
return null; return null;
} }
if (StringUtils.isEmpty(packingRuleDetail.getPackageCode()) || //根据包装代码查询成品包装规则
StringUtils.isEmpty(packingRuleDetail.getPackSpecQty()) || MathOperation.compareTo(packingRuleDetail.getPackSpecQty(), new Double(0)) == 0) { List<MesPackingRule> packingRuleList = packingRuleService.getPackingRuleList(reqBean.getOrganizeCode(),
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]配置包装物类型的成品包装明细规则信息中必要信息无效:包装代码[%s]包装规格数量[%s]!", packingRuleDetailList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPackageCode()))).map(MesPackingRuleDetail::getPackageCode).collect(Collectors.toList()));
partNo, packingRuleDetail.getPackageCode(), packingRuleDetail.getPackSpecQty()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
//过滤成品包装规则, 取默认包装对应的数据
MesPackingRule packingRule = filterPackingRule(packingRuleList);
if (null == packingRule) {
message = String.format("零件编码[%s]未配置成品包装规则信息!", partNo);
if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else stepResult.msg(message);
return null; return null;
} }
//根据包装代码查询成品包装规则 //根据默认包装获取成品包装明细规则
MesPackingRule packingRule = packingRuleService.getPackingRule(reqBean.getOrganizeCode(), packingRuleDetail.getPackageCode()); MesPackingRuleDetail packingRuleDetail = filterPackingRuleDetail(packingRuleDetailList, packingRule);
if (null == packingRule) { if (StringUtils.isEmpty(packingRuleDetail.getPackageCode()) ||
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]未配置成品包装规则信息!", StringUtils.isEmpty(packingRuleDetail.getPackSpecQty()) || MathOperation.compareTo(packingRuleDetail.getPackSpecQty(), new Double(0)) == 0) {
partNo, packingRuleDetail.getPackageCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); message = String.format("零件编码[%s]配置包装物类型的成品包装明细规则信息中必要信息无效:包装代码[%s]包装规格数量[%s]!", partNo, packingRuleDetail.getPackageCode(), packingRuleDetail.getPackSpecQty());
if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else stepResult.msg(message);
return null; return null;
} }
@ -228,20 +249,22 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//如果 packageBarcodeRule || packageTemplate || printer 有一个为空, 则需要根据 箱类别代号查询包装定义, 但是 printer 不进行强验证,可能是否的是默认打印机 //如果 packageBarcodeRule || packageTemplate || printer 有一个为空, 则需要根据 箱类别代号查询包装定义, 但是 printer 不进行强验证,可能是否的是默认打印机
if (StringUtils.isEmpty(generateTypeName) || (StringUtils.isEmpty(packingRule.getPackCode()) && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)))) { if (StringUtils.isEmpty(generateTypeName) || (StringUtils.isEmpty(packingRule.getPackCode()) && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)))) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:统计方式[%s]箱类别代号[%s]!", message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:统计方式[%s]箱类别代号[%s]!",
partNo, packingRuleDetail.getPackageCode(), StringUtils.isEmpty(generateTypeName) ? MesPcnExtConstWords.EMPTY : generateTypeName, packingRule.getPackCode()), partNo, packingRuleDetail.getPackageCode(), StringUtils.isEmpty(generateTypeName) ? MesPcnExtConstWords.EMPTY : generateTypeName, packingRule.getPackCode());
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else stepResult.msg(message);
return null; return null;
} }
//根据箱类别代号查询包装定义
MesPackingDefine packingDefine = StringUtils.isEmpty(packingRule.getPackCode()) ? null : packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode());
//判断是否需要查询包装定义 //判断是否需要查询包装定义
if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) { if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) {
//根据箱类别代号查询包装定义
MesPackingDefine packingDefine = StringUtils.isEmpty(packingRule.getPackCode()) ? null :
packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode());
if (null == packingDefine && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate))) { if (null == packingDefine && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate))) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置成品包装规则信息中的箱类别代号[%s]未维护包装定义信息!", message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置成品包装规则信息中的箱类别代号[%s]未维护包装定义信息!", partNo, packingRuleDetail.getPackageCode(), packingRule.getPackCode());
partNo, packingRuleDetail.getPackageCode(), packingRule.getPackCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else stepResult.msg(message);
return null; return null;
} }
@ -252,9 +275,9 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
//此时 packageBarcodeRule || packageTemplate 仍有一个为空则 记录日志 忽略当前零件的打包 //此时 packageBarcodeRule || packageTemplate 仍有一个为空则 记录日志 忽略当前零件的打包
if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)) { if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:编码规则[%s]模版[%s]打印机[%s]!", message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:编码规则[%s]模版[%s]打印机[%s]!", partNo, packingRuleDetail.getPackageCode(), packageBarcodeRule, packageTemplate, printer);
partNo, packingRuleDetail.getPackageCode(), packageBarcodeRule, packageTemplate, printer), if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); else stepResult.msg(message);
return null; return null;
} }
} }
@ -266,12 +289,14 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
packageRuleContext.setPackageBarcodeRule(packageBarcodeRule); packageRuleContext.setPackageBarcodeRule(packageBarcodeRule);
packageRuleContext.setPackageTemplate(packageTemplate); packageRuleContext.setPackageTemplate(packageTemplate);
packageRuleContext.setPrinter(printer); packageRuleContext.setPrinter(printer);
if (null == packingDefine || StringUtils.isEmpty(packingDefine.getIsSendAries()) ||
packingDefine.getIsSendAries().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) packageRuleContext.setSystemSyncStatusWms(MesPcnExtConstWords.ZERO);
return packageRuleContext; return packageRuleContext;
} }
//生成包装及明细, 根据标包数量判断是否执行打印 [递归] //生成包装及明细, 根据标包数量判断是否执行打印 [递归]
private List<MesPackageDataContext> doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, private List<MesPackageDataContext> doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
MesPackageRuleContext packageRuleContext, List<MesPackageDataContext> packageDataContextList, List<String> productSnList) { List<MesPackageDataContext> packageDataContextList, List<String> productSnList, Boolean isAsyn) {
//缓存的包装条码明细数量 //缓存的包装条码明细数量
Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size(); Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size();
@ -291,21 +316,22 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
productSnList2Remain = productSnList.subList(needQty, productSnList.size()); productSnList2Remain = productSnList.subList(needQty, productSnList.size());
} }
//当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数
Integer curQty = cachedQty + productSnList2Cur.size();
MesPackage packageDb = null; MesPackage packageDb = null;
//判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码 //判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码
if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId()); if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId());
//缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息 //缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息
if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext); if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext, curQty, isAsyn);
//如果包装条码未空, 说明上面生成包装条码的时候 根据编码规则生成出现问题, 则直接退出, 记录日志, 忽略当前零件的打包 //如果包装条码未空, 说明上面生成包装条码的时候 根据编码规则生成出现问题, 则直接退出, 记录日志, 忽略当前零件的打包
if (null == packageDb) return null; if (null == packageDb) return null;
//当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数 //判断当前是否满包, isAsyn=false代表是工位按钮零件打包触发,零头也直接封箱
Integer curQty = cachedQty + productSnList2Cur.size(); Boolean isSealed = !isAsyn ? curQty >= packageRuleContext.getPackSpecQty().intValue() : true;
//判断当前是否满包
Boolean isSealed = curQty >= packageRuleContext.getPackSpecQty().intValue();
//判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态
packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed, true); packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed, isAsyn);
//判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据
List<MesPackageDataContext> resultList = insertPackageDetailAndBackUnSealedResultList(reqBean, packageRuleContext, packageDb, productSnList2Cur, isSealed); List<MesPackageDataContext> resultList = insertPackageDetailAndBackUnSealedResultList(reqBean, packageRuleContext, packageDb, productSnList2Cur, isSealed);
@ -320,7 +346,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
if (CollectionUtils.isEmpty(productSnList2Remain)) return resultList; if (CollectionUtils.isEmpty(productSnList2Remain)) return resultList;
//传递剩余条码进行递归处理: 此时packageDataContextList直接为null //传递剩余条码进行递归处理: 此时packageDataContextList直接为null
return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain); return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain, isAsyn);
} }
@ -329,9 +355,18 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
public MesPackage getMesPackage(String organizeCode, Long packageId) { return packageExtService.getMesPackage(organizeCode, packageId); } public MesPackage getMesPackage(String organizeCode, Long packageId) { return packageExtService.getMesPackage(organizeCode, packageId); }
//生成包装条码信息 //生成包装条码信息
private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) { private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext, Integer curQty, Boolean isAsyn) {
//封装流水号入参对象
GenSerialNoModel serialNoModel = new GenSerialNoModel(packageRuleContext.getPackageBarcodeRule())
.putDataMap(MesPackageRuleContext.class.getSimpleName(), packageRuleContext)
.partNo(packageRuleContext.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
//后面的savePackageDb那边只判断了跨天封箱情况下才会重新生成包装条码, 所以这里如果是正常工步创建则使用标包数量,如是是零件打包创建则使用实际数量生成包装条码,因为可能存在零头数量
if (isAsyn) serialNoModel.putDataMap(MesPcnExtConstWords.QTY, new Double(curQty));
//根据编码规则生成包装条码 //根据编码规则生成包装条码
String packageNo = doGereratePackageNo(reqBean, packageRuleContext); String packageNo = doGereratePackageNo(reqBean, serialNoModel, isAsyn);
if (StringUtils.isEmpty(packageNo)) return null; if (StringUtils.isEmpty(packageNo)) return null;
MesPackage packageDb = new MesPackage(); MesPackage packageDb = new MesPackage();
packageDb.setPackageNo(packageNo); packageDb.setPackageNo(packageNo);
@ -339,6 +374,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
packageDb.setPartName(packageRuleContext.getPartName()); packageDb.setPartName(packageRuleContext.getPartName());
packageDb.setQty(new Double(1)); packageDb.setQty(new Double(1));
packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty()); packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty());
packageDb.setGenerateType(packageRuleContext.getGenerateType());
packageDb.setUnit(packageRuleContext.getUnit()); packageDb.setUnit(packageRuleContext.getUnit());
packageDb.setLotNo(TimeTool.getToday()); packageDb.setLotNo(TimeTool.getToday());
packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
@ -350,12 +386,17 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
packageDb.setPackageLabelTemplate(packageRuleContext.getPackageTemplate()); packageDb.setPackageLabelTemplate(packageRuleContext.getPackageTemplate());
packageDb.setFid(UUID.randomUUID().toString()); packageDb.setFid(UUID.randomUUID().toString());
packageDb.setOrganizeCode(reqBean.getOrganizeCode()); packageDb.setOrganizeCode(reqBean.getOrganizeCode());
packageDb.setSystemSyncStatusWms(packageRuleContext.getSystemSyncStatusWms());
ConvertBean.serviceModelInitialize(packageDb, reqBean.getUserInfo()); ConvertBean.serviceModelInitialize(packageDb, reqBean.getUserInfo());
//一维码是在编码规则的策略中调用transform方法生成的, 暂存到dataMap中,key=包装条码
if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) {
packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString());
}
return packageDb; return packageDb;
} }
//判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态
private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed, Boolean isSave) { private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed, Boolean isAsyn) {
if (!StringUtils.isEmpty(packageDb.getId())) { if (!StringUtils.isEmpty(packageDb.getId())) {
//下面直接根据ID进行修改, 所以此处置为游离态 //下面直接根据ID进行修改, 所以此处置为游离态
@ -370,23 +411,35 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
} }
if (!isSave) return packageDb;
if (StringUtils.isEmpty(packageDb.getId())) return packageRepository.insert(packageDb); if (StringUtils.isEmpty(packageDb.getId())) return packageRepository.insert(packageDb);
savePackageDbById(reqBean, packageDb); Boolean unChangePackageNo = !isSealed ? true : TimeTool.getToday().equals(packageDb.getLotNo());
if (!unChangePackageNo) {
//包装条码中因为含有批次号, 隔天封箱需要重新生成包装条码
//封装流水号入参对象
GenSerialNoModel serialNoModel = new GenSerialNoModel(packageDb.getPackageLabelTemplate())
.putDataMap(MesPcnExtConstWords.QTY, packageDb.getQty())
.putDataMap(MesPcnExtConstWords.UNIT, packageDb.getUnit())
.partNo(packageDb.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return packageDb; //根据编码规则生成包装条码
String packageNo = doGereratePackageNo(reqBean, serialNoModel, isAsyn);
if (!StringUtils.isEmpty(packageNo)) {
String sourcePackageNo = packageDb.getPackageNo();
packageDb.setPackageNo(packageNo);
if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) {
packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString());
}
packageDb.setRemark(String.format("封箱跨天,原包装条码:%s", sourcePackageNo));
//替换包装明细数据的包装条码
savePackageDetailDbByPackageNo(reqBean, packageDb, sourcePackageNo);
}
} }
private void savePackageDbById(StationRequestBean reqBean, MesPackage packageDb) { //更新操作
packageRepository.updateByPropertiesNoSync( savePackageDbById(reqBean, packageDb);
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID},
new Object[]{reqBean.getOrganizeCode(), packageDb.getId()}, return packageDb;
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});
} }
//判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据
@ -438,22 +491,26 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
} }
//根据编码规则生成包装条码 //根据编码规则生成包装条码
private String doGereratePackageNo(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) { private String doGereratePackageNo(StationRequestBean reqBean, GenSerialNoModel serialNoModel, Boolean isAsyn) {
GenSerialNoModel serialNoModel = new GenSerialNoModel(packageRuleContext.getPackageBarcodeRule())
.putDataMap(MesPackageRuleContext.class.getSimpleName(), packageRuleContext)
.partNo(packageRuleContext.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
try { try {
return syncFuncService.syncSerialNo(serialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); return syncFuncService.syncSerialNo(serialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString();
} catch (ImppBusiException e) { } catch (ImppBusiException e) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), e.getErrorDetail(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), e.getErrorDetail(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
else MesPcnException.throwBusiException(e.getErrorDetail());
} catch (Exception e) { } catch (Exception e) {
String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成包装条码%s", serialNoModel.getPartNo(), serialNoModel.getRuleCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成包装条码%s", serialNoModel.getPartNo(), serialNoModel.getRuleCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode()));
if (!isAsyn) {
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.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); this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true);
} else {
this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, false);
MesPcnException.throwBusiException(webMsg);
}
} }
return null; return null;
} }
//进行打印
private void doPrintPackageNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext, private void doPrintPackageNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext,
MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList, Boolean isAsyn) { MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List<MesPackage> packageList, Boolean isAsyn) {
if (null == strategyService) { if (null == strategyService) {
@ -508,14 +565,126 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements
printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList()); printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList());
} }
//强制打包业务处理
@Override @Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class})
public void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesPackageDataContext> packageDataContextList, MesPackage packageDb) { public void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesPackageDataContext> packageDataContextList, MesPackage packageDb) {
savePackageDb(reqBean, packageDb, packageDataContextList.size(), true, false); //包装条码中因为含有包装数量, 故强制打包需要重新生成包装条码
//封装流水号入参对象
GenSerialNoModel serialNoModel = new GenSerialNoModel(packageDataContextList.get(0).getPackageBarcodeRule())
.putDataMap(MesPcnExtConstWords.QTY, new Double(packageDataContextList.size()))
.putDataMap(MesPcnExtConstWords.UNIT, packageDb.getUnit())
.partNo(packageDb.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
//根据编码规则生成包装条码
String packageNo = doGereratePackageNo(reqBean, serialNoModel, true);
if (StringUtils.isEmpty(packageNo)) MesPcnException.throwBusiException("根据编码规则[%s]生成包装条码失败!", serialNoModel.getRuleCode());
//下面直接根据ID进行修改, 所以此处置为游离态
entityManager.detach(packageDb);
ConvertBean.serviceModelUpdate(packageDb, reqBean.getUserInfo());
packageDb.setQty(new Double(packageDataContextList.size()));
packageDb.setLotNo(TimeTool.getToday());
packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
packageDb.setPackageNo(packageNo);
if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) {
packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString());
}
packageDb.setRemark(String.format("强制封箱,原包装条码:%s", packageDataContextList.get(0).getPackageNo()));
List<MesPackage> packageList = new ArrayList<>(); List<MesPackage> packageList = new ArrayList<>();
packageList.add(packageDb); packageList.add(packageDb);
//进行打印
doPrintPackageNo(reqBean, resultBean, stepResult, packageDataContextList.get(0), null, null, packageList, true); doPrintPackageNo(reqBean, resultBean, stepResult, packageDataContextList.get(0), null, null, packageList, true);
//更新操作
savePackageDbById(reqBean, packageDb); savePackageDbById(reqBean, packageDb);
//替换包装明细数据的包装条码
savePackageDetailDbByPackageNo(reqBean, packageDb, packageDataContextList.get(0).getPackageNo());
}
//替换包装明细数据的包装条码
private void savePackageDetailDbByPackageNo(StationRequestBean reqBean, MesPackage packageDb, String sourcePackageNo) {
packageDetailRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.PACKAGE_NO},
new Object[]{reqBean.getOrganizeCode(), sourcePackageNo},
new String[]{MesPcnExtConstWords.PACKAGE_NO, MesPcnExtConstWords.REMARK,
MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{packageDb.getPackageNo(), packageDb.getRemark(),
packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
}
//更新操作
private void savePackageDbById(StationRequestBean reqBean, MesPackage packageDb) {
packageRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID},
new Object[]{reqBean.getOrganizeCode(), packageDb.getId()},
new String[]{MesPcnExtConstWords.PACKAGE_NO, MesPcnExtConstWords.PACKAGE_ONE_CODE, MesPcnExtConstWords.QTY,
MesPcnExtConstWords.IS_SEALED, MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.LOT_NO, MesPcnExtConstWords.REMARK,
MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{packageDb.getPackageNo(), packageDb.getPackageOneCode(), packageDb.getQty(),
packageDb.getIsSealed(), packageDb.getPrintStatus(), packageDb.getLotNo(), packageDb.getRemark(),
packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
}
//删除包装信息
@Override
public void deletePackageData(StationRequestBean reqBean, MesPackage packageDb, Integer generateType) {
int count = packageRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID, MesPcnExtConstWords.IS_SEALED},
new Object[]{reqBean.getOrganizeCode(), packageDb.getId(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()},
new String[]{MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
if (count == 0 || generateType.compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue()) == 0) return;
packageDetailRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.PACKAGE_NO},
new Object[]{reqBean.getOrganizeCode(), packageDb.getPackageNo()},
new String[]{MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
}
//修改包装信息的数量
@Override
public void savePackageData(StationRequestBean reqBean, MesPackage packageDb, Double qty) {
packageRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID, MesPcnExtConstWords.IS_SEALED},
new Object[]{reqBean.getOrganizeCode(), packageDb.getId(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()},
new String[]{MesPcnExtConstWords.QTY, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{qty, reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
}
//过滤成品包装规则, 取默认包装对应的数据
private MesPackingRule filterPackingRule(List<MesPackingRule> packingRuleList) {
if (CollectionUtils.isEmpty(packingRuleList)) return null;
if (packingRuleList.size() == 1) return packingRuleList.get(0);
Optional<MesPackingRule> optional = packingRuleList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getDefaultFlag()) && o.getDefaultFlag().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst();
return (null != optional && optional.isPresent()) ? optional.get() : null;
}
//根据默认包装获取成品包装明细规则
private MesPackingRuleDetail filterPackingRuleDetail(List<MesPackingRuleDetail> packingRuleDetailList, MesPackingRule packingRule) {
if (CollectionUtils.isEmpty(packingRuleDetailList)) return null;
if (packingRuleDetailList.size() == 1) return packingRuleDetailList.get(0);
Optional<MesPackingRuleDetail> optional = packingRuleDetailList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPackageCode()) && o.getPackageCode().equals(packingRule.getPackageCode()))).findFirst();
return (null != optional && optional.isPresent()) ? optional.get() : null;
}
//零件打包业务处理
@Override
public void doHandlePackagePart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageDataContext packageDataContext) {
//生成包装及明细, 根据标包数量判断是否执行打印 [递归]
doHandlePackagePrint(reqBean, stepResult, packageDataContext, null, generateVirtualPs(packageDataContext.getQty()), true);
//进行打印
doPrintPackageNo(reqBean, resultBean, stepResult, packageDataContext, null, null, (List<MesPackage>) stepResult.getDataCollection(), true);
}
//生成虚拟条码,零件打包不写包装明细数据, 只是为了适配工步中的方法去递归生成包装条码
private List<String> generateVirtualPs(Double qty) {
List<String> virtualPsList = new ArrayList<>();
for (int i = 0; i < qty.intValue(); i ++) {
virtualPsList.add(String.valueOf(i));
}
return virtualPsList;
} }
} }

@ -1,11 +1,13 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method; package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext;
import cn.estsh.i3plus.pojo.mes.bean.MesPackage; import cn.estsh.i3plus.pojo.mes.bean.MesPackage;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -13,8 +15,26 @@ import java.util.List;
public interface IMesPackageNoGenerateStepService { public interface IMesPackageNoGenerateStepService {
@ApiOperation(value = "根据包装ID查询包装信息")
MesPackage getMesPackage(String organizeCode, Long packageId); MesPackage getMesPackage(String organizeCode, Long packageId);
@ApiOperation(value = "强制打包业务处理")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class})
void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesPackageDataContext> packageDataContextList, MesPackage packageDb); void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesPackageDataContext> packageDataContextList, MesPackage packageDb);
@ApiOperation(value = "删除包装信息")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class})
void deletePackageData(StationRequestBean reqBean, MesPackage packageDb, Integer generateType);
@ApiOperation(value = "修改包装信息的数量")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class})
void savePackageData(StationRequestBean reqBean, MesPackage packageDb, Double qty);
@ApiOperation(value = "获取包装规则信息")
MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, StepResult stepResult, String partNo, Boolean isAsyn);
@ApiOperation(value = "零件打包业务处理")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class})
void doHandlePackagePart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageDataContext packageDataContext);
} }

@ -0,0 +1,292 @@
#\u9879\u76EE\u7AEF\u53E3
server.port=8350
#\u672C\u673Aip
impp.server.ip=localhost
#impp.server.ip=192.168.0.105
#andon ip
impp.andon.url=http://10.195.88.71:8750
#ptl-pcn ip
impp.ptl-pcn.url=http://10.195.88.71:8750
#pcn plc\u5168\u5C40\u4E1A\u52A1\u5F00\u5173 1.yfai-hnc
mes.plc.callback.open=123
#console\u63A7\u5236\u53F0\u670D\u52A1\uFF08zipkin\u8FFD\u8E2A\u5168\u8DEF\u5F84\uFF09
impp.console.ip=http://10.195.88.71:8010
################ \u529F\u80FD\u914D\u7F6E1 ################
#\u5DE5\u4F5C\u533AID,\u4E0D\u540C\u670D\u52A1\u5668\u4E0D\u540CID 0 - 31
impp.snowflake.work.id=22
#\u6570\u636E\u4ED3\u533AID 0 - 31 \u6709\u9ED8\u8BA4\u56FA\u5B9AID
impp.snowflake.database.id=22
#\u82E5\u65E0\u6CD5\u8FDE\u63A5\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u662F\u5426\u9700\u8981\u4E00\u76F4\u68C0\u6D4B\u52A0\u5165
impp.cluster.fetch=false
#\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3
impp.cluster.regist.center=http://10.195.88.71:8000/eureka/
#\u65E5\u5FD7\u9ED8\u8BA4\u4F7F\u7528log4j2
logging.config=classpath:log4j2-spring.xml
mes.ws=ws://10.197.190.121:8300/ws/pcn-regist/
#mes-pcn.ws.path=ws://10.197.176.77:8350
mes-pcn.ws.path=ws://localhost:8350
pcn.code=PCN-U7
########\u5E73\u53F0\u76F8\u5173\u53C2\u6570##########
#\u662F\u5426\u5F00\u5x42Fredis\u7F13\u5B58
impp.config.redis=true
#\u662F\u5426\u5F00\u542FrabbitMQ
impp.config.rabbitmq=false
#\u662F\u5426\u5F00\u542Fswagger
impp.config.swagger=true
#\u662F\u5426\u5F00\u542Fwebsocket
impp.config.websocket=true
#\u662F\u5426\u5F00\u542F\u6587\u4EF6\u670D\u52A1
impp.config.fileserver=false
#\u662F\u5426\u5BF9\u53D1\u5E03\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.controller=true
#\u662F\u5426\u5BF9\u8C03\u7528\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790
impp.log.detail.service=true
################ \u961F\u5217\u5904\u7406 ################
#\u7AD9\u5185\u4FE1
impp.mq.queue.letter=true
#\u90AE\u4EF6
impp.mq.queue.mail=true
#\u5B9A\u65F6\u4EFB\u52A1
impp.mq.queue.schedule=true
#SWEB\u901A\u77E5\u5904\u7406\u961F\u5217
impp.mq.queue.sweb.notice=true
################################ \u5176\u4ED6\u529F\u80FD\u8BBE\u7F6E ################################
#redisIP
redis.hostName=10.195.88.71
#\u7AEF\u53E3\u53F7
redis.port=6379
#\u5982\u679C\u6709\u5BC6\u7801
redis.password=Admin123!
##\u5176\u4ED6redis\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################## rabbitMQ\u914D\u7F6E ####################
spring.rabbitmq.vhost=/
spring.rabbitmq.host=10.195.88.71
spring.rabbitmq.port=5672
spring.rabbitmq.username=estsh
spring.rabbitmq.password=estsh123
##\u5176\u4ED6rabbitMq\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904
################ \u529F\u80FD\u914D\u7F6E2 ################
#\u662F\u5426\u5F00\u542Fredis
mes.pcn.redis.open=true
#\u662F\u5426\u5141\u8BB8\u524D\u7AEF\u8DE8\u57DF\u63D0\u4EA4
impp.web.cross=true
################ \u6388\u6743\u8FC7\u6EE4\u914D\u7F6E ################
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.user.filteruri=/mes-pcn/operate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.admin.filteruri=/mes-pcn/adoperate/*
#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84
filter.shiro.saadmin.filteruri=/mes-pcn/saoperate/*
################ \u4E91\u914D\u7F6E \uFF08\u4EE5projectName\u4F5C\u4E3A\u5E94\u7528\u540D\uFF09 ################
#\u662F\u5426\u5F00\u542F\u5FAE\u670D
eureka.client.enabled=false
#\uFF08\u53C2\u6570\u914D\u7F6E\uFF09\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740 -\u300B i3plus-ics\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694
eureka.client.service-url.defaultZone=${impp.cluster.regist.center}
#\u533A\u57DF\uFF08\u6E90\u7801\u4E2D\u5305\u542BdefaultZone\uFF0C\u6241\u4EE5\u9ED8\u8BA4\u4F7F\u7528defaultZone\uFF09
#eureka.client.region=estsh
#eureka.client.service-url.estsh:http://192.168.1.20:8000/eureka/,http://192.168.1.20:8001/eureka/
################ \u672C\u673A\u5FAE\u670D\u914D\u7F6E ################
#\u672C\u670D\u52A1\u4E3B\u673Aip\uFF08\u82E5\u591A\u4E2A\u7F51\u5361\uFF0C\u5219\u9700\u8981\u8BBE\u7F6E\u672C\u670D\u52A1ip\uFF09
eureka.instance.ip-address=${impp.server.ip}
#\u672C\u670D\u52A1\u5B9E\u4F8BID
eureka.instance.instance-id=${impp.server.ip}:${server.port}
#\u672C\u670D\u52A1\u4E3B\u673A\u540D
eureka.instance.hostname=${impp.server.ip}
#\u672C\u670D\u52A1\u72B6\u6001\u9875\u9762
eureka.instance.status-page-url=http://${impp.server.ip}:${server.port}/swagger-ui.html
#\u5C06\u81EA\u5DF1\u7684IP\u6CE8\u518C\u5230Eureka Server\u3002\u82E5\u4E0D\u914D\u7F6E\u6216\u8BBE\u7F6E\u4E3Afalse\uFF0C\u8868\u793A\u6CE8\u518C\u5FAE\u670D\u52A1\u6241\u5728\u64CD\u4F5C\u7CFB\u7EDF\u7684hostname\u5230Eureka Server
eureka.instance.prefer-ip-address=false
#\u662F\u5426\u8FDB\u884C\u5065\u5EB7\u68C0\u67E5
eureka.client.healthcheck.enabled=true
################ \u68C0\u6D4B\u673A\u5236 ################
#\u5FC3\u8DF3\u95F4\u9694\u5468\u671F\uFF0C\u5B95\u673A\u9650\u5236\uFF08\u79D2\uFF09\uFF0C30\u79D2\u6CA1\u53CD\u5E94\u89C6\u4E3A\u5B95\u673A
eureka.instance.lease-expiration-duration-in-seconds=30
#\u5FC3\u8DF3\u5468\u671F
eureka.instance.lease-renewal-interval-in-seconds=20
#client\u8FDE\u63A5Eureka\u670D\u52A1\u7AEF\u540E\u7684\u7A7A\u95F2\u7B49\u5F85\u65F6\u95F4\uFF0C\u9ED8\u8BA4\u4E3A30 \u79D2
eureka.client.eureka-connection-idle-timeout-seconds=1
#\u6700\u521D\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\u6241\u9700\u7684\u65F6\u95F4\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A40\u79D2
eureka.client.initial-instance-info-replication-interval-seconds=1
#\u95F4\u9694\u591A\u957F\u65F6\u95F4\u518D\u6B21\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.instance-info-replication-interval-seconds=1
#\u4ECEeureka\u670D\u52A1\u5668\u6CE8\u518C\u8868\u4E2D\u83B7\u53D6\u6CE8\u518C\u4FE1\u606F\u7684\u65F6\u95F4\u95F4\u9694\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2
eureka.client.registry-fetch-interval-seconds=1
################ \u6253\u5F00feign\u7684\u7194\u65AD ################
feign.hystrix.enabled=true
#\u8BFB\u53D6\u6570\u636E\u65F6\u957F
ribbon.ReadTimeout=10000
#\u8FDE\u63A5\u65F6\u957F
ribbon.ConnectTimeout=10000
#\u91CD\u8BD5
ribbon.maxAutoRetries=2
#\u54CD\u5E94\u8D85\u8FC7\u65F6\u957F\uFF0C\u8FDB\u884C\u7194\u65AD\uFF08\u7194\u65AD\u8D85\u65F6\u9700\u8981\u5927\u4E8E\u8BFB\u53D6\u65F6\u957F\u53CA\u8FDE\u63A5\u65F6\u957F\uFF09
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000
#\u96C6\u7FA4\u540D
eureka.instance.metadata-map.cluster=impp_cluster
################ \u94FE\u8DEF\u8FFD\u8E2A ################
#\u4F7F\u7528web\u65B9\u5F0F\u4F20\u8F93\u4FE1\u606F
spring.zipkin.sender.type=web
#\u94FE\u8DEF\u8FFD\u8E2A\u670D\u52A1\u7684\u5730\u5740
spring.zipkin.base-url=${impp.console.ip}
#\u8FFD\u8E2A\u6DF1\u5EA6\uFF0C\u767E\u5206\u6BD4\uFF0C1\u662F\u5168\u90E8
spring.sleuth.sampler.probability=1.0
# mysql
#impp.write.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.write.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.write.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.write.datasource.username=root
#impp.write.datasource.password=estsh123
#impp.read.datasource.type=com.zaxxer.hikari.HikariDataSource
#impp.read.datasource.driver-class-name=com.mysql.jdbc.Driver
#impp.read.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
#impp.read.datasource.username=root
#impp.read.datasource.password=estsh123
#
###########################\u8BFB\u5199\u5206\u79BB#######################################
spring.shardingsphere.datasource.names=master,slave
##\u5199\u5E93
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=estsh123
spring.shardingsphere.datasource.master.maximum-pool-size=400
spring.shardingsphere.datasource.master.minimum-idle=200
spring.shardingsphere.datasource.master.idle-timeout=500000
spring.shardingsphere.datasource.master.connection-timeout=600000
spring.shardingsphere.datasource.master.max-lifetime=7000000
spring.shardingsphere.datasource.master.connection-test-query=select 1
spring.shardingsphere.datasource.master.keep-alive-time=3500000
##\u8BFB\u5E93
spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave.driver-class-name= com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=estsh123
spring.shardingsphere.datasource.slave.maximum-pool-size=200
spring.shardingsphere.datasource.slave.minimum-idle=200
spring.shardingsphere.datasource.slave.idle-timeout=500000
spring.shardingsphere.datasource.slave.connection-timeout=600000
spring.shardingsphere.datasource.slave.max-lifetime=7000000
spring.shardingsphere.datasource.slave.connection-test-query=select 1
spring.shardingsphere.datasource.slave.keep-alive-time=3500000
##\u8BFB\u5199\u5206\u79BB\u914D\u7F6E
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave
#\u9ED8\u8BA4datasource \u9ED8\u8BA4\u6570\u636E\u6E90\uFF0C\u672A\u5206\u7247\u7684\u8868\u9ED8\u8BA4\u6267\u884C\u5E93
#spring.shardingsphere.sharding.default-data-source-name=ds0
#\u7CFB\u7EDF\u5C5E\u6027\uFF0C\u663E\u793A\u6B63\u5E38\u7684sql\u8BED\u53E5
spring.shardingsphere.props.sql.show=false
#spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{[152,156,300]}
spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{1..300}
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.sharding-column=equip_id
spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.algorithm-expression=mes_equipment_log_$->{equip_id}
#spring.shardingsphere.sharding.tables.mes_equipment_log_detail.actual-data-nodes=ds0.mes_equipment_log_detail_$->{[152,156,300]}
spring.shardingsphere.sharding.tables.mes_equipment_log_detail.actual-data-nodes=ds0.mes_equipment_log_detail_$->{1..500}
spring.shardingsphere.sharding.tables.mes_equipment_log_detail.table-strategy.inline.sharding-column=equip_id
spring.shardingsphere.sharding.tables.mes_equipment_log_detail.table-strategy.inline.algorithm-expression=mes_equipment_log_detail_$->{equip_id}
#\u7ED1\u5B9A\u8868
spring.shardingsphere.sharding.binding-tables[0]=mes_equipment_log,mes_equipment_log_detail
#\u4E2D\u822A\u6570\u636E\u6E90
##############\u5B9A\u65F6\u4EFB\u52A1\u6301\u4E45\u5316##############
impp.schedule.open=true
impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver
impp.schedule.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8
impp.schedule.datasource.username=root
impp.schedule.datasource.password=estsh123
impp.schedule.datasource.max-connections=20
#\u5B9A\u65F6\u4EFB\u52A1\u5728\u670D\u52A1\u542F\u52A8\u540E\u591A\u5C11\u79D2\u6267\u884C
impp.schedule.start.after-second=20
#\u662F\u5426\u96C6\u7FA4\u90E8\u7F72
impp.schedule.datasource.is-clustered=true
#\u6267\u884C\u68C0\u6D4B\uFF08\u6BEB\u79D2\uFF09\uFF0C\u82E5\u5B95\u673A\u7531\u5176\u4ED6\u5B9A\u65F6\u5668\u6267\u884C
impp.schedule.datasource.cluster-checkin-interval=30000
#\u7EBF\u7A0B\u6570
impp.schedule.thread-count=10
#\u7EBF\u7A0B\u4F18\u5148\u7EA7\uFF081-10\uFF09\u9ED8\u8BA4\u4E3A5
impp.schedule.thread-priority=5
################ \u6570\u636E\u6C60\u8BBE\u7F6E ################
## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF0C\u9ED8\u8BA4\u662F10
spring.datasource.maximum-pool-size=100
## \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570\u91CF
spring.datasource.min-idle=10
################ JPA\u8BBE\u7F6E\u8BBE\u7F6E ################
# mysql
spring.jpa.database=MYSQL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
##Sql-server##
#spring.jpa.database=sql_server
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
##oracle##
#spring.jpa.database=oracle
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
# mysql
#spring.datasource.validationQuery=SELECT 1
##Sql-server##
spring.datasource.validationQuery=SELECT 1
##oracle##
# spring.datasource.validationQuery=SELECT 1 FROM DUAL
#ImprovedNamingStrategy / physical_naming_strategy java\u5C5E\u6027\u6620\u5C04\u5230\u6570\u636E\u5E93\u5B57\u6BB5\u65F6\u547D\u540D\u89C4\u5219
# spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy/org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u8868\u5173\u7CFBcreate,create-drop,update,validate
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#\u662F\u5426\u663E\u793Asql
spring.jpa.show-sql=true
################ \u6388\u6743\u914D\u7F6E ################
slm.api.password=4C9479EBEFA6FA6E232EF25EFA49C4D2
slm.app.id=20190513
# \u811A\u672C\u5728\u7EBF\u8C03\u8BD5\u751F\u6210\u7684\u65E5\u5FD7\u6587\u4EF6\u76F8\u5BF9\u8DEF\u5F84\uFF0Cclasspath:xx
pcn.script.logger.path=pluginlogs
pcn.schedule.job=false
server.tomcat.max-threads=300
server.tomcat.max-connections=300
plugin.mainPackage=cn.estsh.i3plus
impp.xxlJob.admin.enable=true
impp.schedule.scheduleType=xxljob
xxl.job.admin.addresses=http://10.195.88.71:10010/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
#xxl.job.executor.appname=${project.name}
xxl.job.executor.appname=i3mes-pcn
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=10.195.88.71
#xxl.job.executor.ip=
xxl.job.executor.port=12345
### xxl-job executor log-path
xxl.job.executor.logpath=
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=10
xxl.job.basePackage=cn.estsh.i3plus.lac.scheduler.schedulejob
mqtt.host=tcp://10.195.88.71:1883
mqtt.userName=estsh
mqtt.passWord=estsh123
mqtt.qos=1
mqtt.clientId=pcn
mqtt.timeout=10
mqtt.keepalive=30
mqtt.clearSession=true
pcn.mqtt.flag = true
mqtt.topic.list=ABC,ABD,ADE
xxl.job.execute.methodName=executeImppJob,execute

@ -34,9 +34,15 @@ public class MesPackageDataContext extends MesPackageRuleContext implements Seri
@ApiParam("打包结束时间") @ApiParam("打包结束时间")
private String modifyDatetime; private String modifyDatetime;
@ApiParam("业务操作类型")
private String busiType;
@ApiParam("加工单号")
private String workOrderNo;
public MesPackageDataContext() {} public MesPackageDataContext() {}
public MesPackageDataContext(String partNo, String partName, String packageNo, Double qty, Double packSpecQty, String createDatetime, String modifyDatetime) { public MesPackageDataContext(String partNo, String partName, String packageNo, Double qty, Double packSpecQty, String createDatetime, String modifyDatetime, Integer generateType) {
this.partNo = partNo; this.partNo = partNo;
this.partName = partName; this.partName = partName;
this.packageNo = packageNo; this.packageNo = packageNo;
@ -44,5 +50,12 @@ public class MesPackageDataContext extends MesPackageRuleContext implements Seri
this.packSpecQty = packSpecQty; this.packSpecQty = packSpecQty;
this.createDatetime = createDatetime; this.createDatetime = createDatetime;
this.modifyDatetime = modifyDatetime; this.modifyDatetime = modifyDatetime;
this.generateType = generateType;
}
public MesPackageDataContext qty(Double qty, String modifyDatetime) {
this.qty = qty;
this.modifyDatetime = modifyDatetime;
return this;
} }
} }

@ -58,4 +58,7 @@ public class MesPackageRuleContext implements Serializable {
@ApiParam(name = "打印机") @ApiParam(name = "打印机")
public String printer; public String printer;
@ApiParam(name = "同步状态WMS")
public Integer systemSyncStatusWms = 2;
} }

@ -246,6 +246,8 @@ public class MesPcnExtConstWords {
public static final String CUST_ORDER_NO = "custOrderNo"; public static final String CUST_ORDER_NO = "custOrderNo";
//包装条码 //包装条码
public static final String PACKAGE_NO = "packageNo"; public static final String PACKAGE_NO = "packageNo";
//包装一维码
public static final String PACKAGE_ONE_CODE = "packageOneCode";
//包条码 //包条码
public static final String PACKAGE_SN = "packageSn"; public static final String PACKAGE_SN = "packageSn";
//包类型 //包类型
@ -323,6 +325,10 @@ public class MesPcnExtConstWords {
public static final String UNIT = "unit"; public static final String UNIT = "unit";
//包装规格数量 //包装规格数量
public static final String PACK_SPEC_QTY = "packSpecQty"; public static final String PACK_SPEC_QTY = "packSpecQty";
//动态列名
public static final String ATTR_BEAN_LIST = "ATTR_BEAN_LIST";
//支持允许前端开窗选零件
public static final String IS_SELECT_PART = "IS_SELECT_PART";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)

Loading…
Cancel
Save