tags/yfai-pcn-ext-v1.0
gsz 1 year ago
commit 2438909a65

@ -20,6 +20,7 @@ public interface IMesEquipVariableRwExtService {
@ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag);
@ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(String value, MesEquipmentVariable equipmentVariable, String kepwareFlag);
}

@ -13,6 +13,9 @@ public interface IMesProduceSnExtService {
@ApiOperation(value = "根据零件条码查询零件条码信息")
List<MesProduceSn> getProduceSnList(String organizeCode, List<String> productSnList);
@ApiOperation(value = "根据零件条码ID查询零件条码信息")
MesProduceSn getProduceSn(String organizeCode, Long id);
@ApiOperation(value = "根据零件条码查询零件条码信息")
Map<String, List<MesProduceSn>> getProduceSnMap(String organizeCode, List<String> productSnList);
@ -25,5 +28,4 @@ public interface IMesProduceSnExtService {
@ApiOperation(value = "根据零件条码ID修改条码状态,工位")
void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List<Long> idList);
}

@ -27,7 +27,7 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "获取上下文加工结果")
String getProductResultContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文加工结果", notes = "加工结果:成功/报废/可疑 【写入的值是变量类别代码】【报废/可疑: 在保存逻辑条码时有特殊业务处理】")
@ApiOperation(value = "保存上下文加工结果", notes = "加工结果:成功/报废/可疑 【写入的值是变量类别代码对应的条码质量状态】【报废/可疑: 在保存逻辑条码时有特殊业务处理】")
Boolean saveProductResultContext(StationRequestBean reqBean, String productResult);
@ApiOperation(value = "删除上下文加工结果")

@ -35,9 +35,9 @@ public class MesSaveVariableJob extends BaseMesScheduleJob {
log.info("保存工艺参数job -- START ");
String jobParam = this.getJobParam();
JSONObject jsonObject= JSONUtil.parseObj(jobParam);
String organizeCode = jsonObject.getStr("organizeCode");
/*String jobParam = this.getJobParam();
JSONObject jsonObject= JSONUtil.parseObj(jobParam);*/
String organizeCode = "CK01";
if (null == organizeCode){
log.error("请添加需要报工的工厂代码!");

@ -24,6 +24,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
@ -120,7 +121,12 @@ public class MesEquipmentLogService implements IMesEquipmentLogService {
mesEquipmentLogDetail.setCraftCode(mesEquipmentRecord.getCraftCode());
mesEquipmentLogDetail.setProcessCode(mesEquipmentRecord.getProcessCode());
mesEquipmentLogDetail.setWorkCenterCode(mesEquipmentRecord.getWorkCenterCode());
mesEquipmentLogDetail.setExtend(mesEquipmentRecord.getProduceSnJson());
String jsonStr = mesEquipmentRecord.getProduceSnJson();
if (!StringUtils.isEmpty(jsonStr)) {
mesEquipmentLogDetail.setExtend(mesEquipmentRecord.getProduceSnJson());
}
mesEquipmentLogDetails.add(mesEquipmentLogDetail);
}
mesEquipmentLogDetailRepository.saveAll(mesEquipmentLogDetails);

@ -61,6 +61,9 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
@Autowired
private MesPackageResultRepository mesPackageResultRDao;
@Autowired
private MesPackageSnRepository mesPackageSnRDao;
@Override
public ListPager<MesPackageDetail> queryMesPackageDetailByPager(MesPackage mesPackage, Pager pager) {
@ -79,24 +82,36 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
MesPackage mesPackage = getMesPackage(mesPackageDetail.getOrganizeCode(), mesPackageDetail.getPackageNo());
if (Objects.nonNull(mesPackage)) {
return mesPackage;
}else{
MesPart mesPart;
Double qty;
String packageOneCode = "";
//获取包装定义
MesPackingDefine packingDefine = getMesPackingDefine(mesPackageDetail);
//WMS打印的条码信息
MesPackageSn mesPackageSn = getMesPackageSn(mesPackageDetail.getOrganizeCode(), mesPackageDetail.getPackageNo());
if(!Objects.isNull(mesPackageSn)){
mesPart = getPart(mesPackageSn.getOrganizeCode(),mesPackageSn.getPartNo());
qty = mesPackageSn.getQty();
packageOneCode = mesPackageSn.getPackageOneCode();
}else{
//解析获取信息保存
if (StringUtils.isEmpty(packingDefine.getSplitChar())) {
MesPcnException.throwMesBusiException("箱类别代号【%s】分隔符不能为空", packingDefine.getPackCode());
}
String[] split = mesPackageDetail.getPackageNo().split("\\" + packingDefine.getSplitChar());
//获取序列号
checkSerial(packingDefine, split);
//工厂校验
checkOrganizeCode(mesPackageDetail, packingDefine, split);
//获取物料信息是否存在
mesPart = getMesPart(mesPackageDetail, packingDefine, split);
//获取数量信息是否存在
qty = getQty(packingDefine, split);
}
MesPackage packages = getMesPackage(mesPackageDetail, mesPart, qty, packingDefine,packageOneCode);
return mesPackageRDao.insert(packages);
}
//获取包装定义
MesPackingDefine packingDefine = getMesPackingDefine(mesPackageDetail);
//解析获取信息保存
if (StringUtils.isEmpty(packingDefine.getSplitChar())) {
MesPcnException.throwMesBusiException("箱类别代号【%s】分隔符不能为空", packingDefine.getPackCode());
}
String[] split = mesPackageDetail.getPackageNo().split("\\" + packingDefine.getSplitChar());
//获取序列号
checkSerial(packingDefine, split);
//工厂校验
checkOrganizeCode(mesPackageDetail, packingDefine, split);
//获取物料信息是否存在
MesPart mesPart = getMesPart(mesPackageDetail, packingDefine, split);
//获取数量信息是否存在
Double qty = getQty(packingDefine, split);
MesPackage packages = getMesPackage(mesPackageDetail, mesPart, qty, packingDefine);
return mesPackageRDao.insert(packages);
} else {
checkNotNull(mesPackageDetail);
//校验过程条码是否存在
@ -425,7 +440,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
return Double.parseDouble(split[packingDefine.getQtyIndex() - 1]);
}
private MesPackage getMesPackage(MesPackageDetail mesPackageDetail, MesPart mesPart, Double qty, MesPackingDefine packingDefine) {
private MesPackage getMesPackage(MesPackageDetail mesPackageDetail, MesPart mesPart, Double qty, MesPackingDefine packingDefine,String packageOneCode) {
//保存包装信息
MesPackage packages = new MesPackage();
packages.setPackageNo(mesPackageDetail.getPackageNo());
@ -436,6 +451,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
packages.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
packages.setPrintStatus(MesPcnEnumUtil.PACKAGE_PRINT_STATUS.UNPRINTED.getValue());
packages.setPackageSn(packingDefine.getPackCode());
packages.setPackageOneCode(packageOneCode);
packages.setOrganizeCode(mesPackageDetail.getOrganizeCode());
ConvertBean.serviceModelInitialize(packages, mesPackageDetail.getCreateUser());
return packages;
@ -447,6 +463,12 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
return mesPackageRDao.getByProperty(packBean);
}
private MesPackageSn getMesPackageSn(String organizeCode, String packageNo) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(packageNo, "packageNo", packBean);
return mesPackageSnRDao.getByProperty(packBean);
}
private MesPackingDefine getMesPackingDefine(MesPackageDetail mesPackageDetail) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getScanType(), "scanType", packBean);

@ -45,6 +45,15 @@ public class MesProduceSnExtService implements IMesProduceSnExtService {
return produceSnRepository.findByHqlWhere(packBean);
}
//根据零件条码ID查询零件条码信息
@Override
public MesProduceSn getProduceSn(String organizeCode, Long id) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null;
return produceSnRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ID},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id});
}
//根据零件条码查询零件条码信息
@Override
public Map<String, List<MesProduceSn>> getProduceSnMap(String organizeCode, List<String> productSnList) {

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import java.util.List;
import java.util.Map;
/**
* @Description : , content dataList
@ -18,5 +19,5 @@ public interface IPrintTemplateStrategyService {
* @param sn
* @return
*/
List<Object> execute(MesProductionPsOutContext sn , String organizeCode);
Map<String,Object> execute(MesProductionPsOutContext sn , String organizeCode);
}

@ -0,0 +1,96 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerOriganze;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerOriganizeRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesLabelTemplateRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @Description : 广使
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/6 17:03
* @Modify:
**/
@Service
@Slf4j
public class AionPrintStrategy implements IPrintTemplateStrategyService {
@Autowired
private MesPartRepository mesPartRao;
@Override
public Map<String,Object> execute(MesProductionPsOutContext sn, String organizeCode) {
//零件条码中获取 serialNo
String productSn = sn.getProductSn();
//构造标签
Map<String,Object> map = new HashMap<>();
String partNo = sn.getPartNo();
String partName = sn.getPartName();
String factoryName = AuthUtil.getOrganize().getName();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDateTime now = LocalDateTime.now();
String productDate = now.format(formatter);
int no = 1;
String noStr = String.format("%07d", no);
//构造二维码
StringBuilder barcode = new StringBuilder();
barcode.append("+");
//第二位 是零件简号 零件扩展信息中的 零件条码参数 字段
DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo,"partNo",partPackBean);
List<MesPart> parts = mesPartRao.findByHqlWhere(partPackBean);
if (!parts.isEmpty()){
MesPart mesPart = parts.get(0);
String partSnParam = mesPart.getPartSnParam();
if (partSnParam!=null && !partSnParam.isEmpty()){
barcode.append(partSnParam);
}else {
log.error("零件号:{},缺少配置零件扩展属性的 零件条码参数",partNo);
}
}
//第三位 供应商代码 // 配置表
String supplierCode = "VD501";
barcode.append(supplierCode);
//第四位 生产线代号 // 配置表
String workCenterCode = "1";
barcode.append(workCenterCode);
//第五位 生产年月日
int year = now.getYear();
int month = now.getMonth().getValue();
int day = now.getDayOfMonth();
String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(year);
String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(month);
String dayStr = MesExtEnumUtil.NUM_SCALE_34.valueOfDescription(day);
barcode.append(yearStr);
barcode.append(monthStr);
barcode.append(dayStr);
//第六位 供应商生产流水号
//第七位 软件版本代号
map.put("partNo",partNo);
map.put("partName",partName);
map.put("factoryName",factoryName);
map.put("productDate",productDate);
map.put("no",noStr);
map.put("barcode",barcode.toString());
return map;
}
}

@ -0,0 +1,55 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:10
* @Modify:
**/
@Service
@Slf4j
public class GqaaPrintStrategy implements IPrintTemplateStrategyService {
@Override
public Map<String, Object> execute(MesProductionPsOutContext sn, String organizeCode) {
Map<String,Object> map = new HashMap<>();
String partNo = sn.getPartNo();
String partName = sn.getPartName();
String factoryName = AuthUtil.getOrganize().getName();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy/MM/dd");
LocalDateTime now = LocalDateTime.now();
String productDate = now.format(formatter);
//构造二维码
StringBuilder barcode = new StringBuilder();
//第三位 供应商代码 // 配置表
String supplierCode = "VD501";
barcode.append(supplierCode);
//第四位 生产线代号 // 配置表
String workCenterCode = "1";
barcode.append(workCenterCode);
int no = 1;
String noStr = String.format("%07d", no);
map.put("no",noStr);
map.put("partNo", partNo);
map.put("partName", partName);
map.put("factoryName", factoryName);
map.put("productDate", productDate);
map.put("barcode", barcode.toString());
return map;
}
}

@ -0,0 +1,55 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:10
* @Modify:
**/
@Service
@Slf4j
public class GqxnyPrintStrategy implements IPrintTemplateStrategyService {
@Override
public Map<String, Object> execute(MesProductionPsOutContext sn, String organizeCode) {
Map<String,Object> map = new HashMap<>();
String partNo = sn.getPartNo();
String partName = sn.getPartName();
String factoryName = AuthUtil.getOrganize().getName();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy/MM/dd");
LocalDateTime now = LocalDateTime.now();
String productDate = now.format(formatter);
//构造二维码
StringBuilder barcode = new StringBuilder();
//第三位 供应商代码 // 配置表
String supplierCode = "VD501";
barcode.append(supplierCode);
//第四位 生产线代号 // 配置表
String workCenterCode = "1";
barcode.append(workCenterCode);
int no = 1;
String noStr = String.format("%07d", no);
map.put("no",noStr);
map.put("partNo", partNo);
map.put("partName", partName);
map.put("factoryName", factoryName);
map.put("productDate", productDate);
map.put("barcode", barcode.toString());
return map;
}
}

@ -1,29 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.pojo.mes.repository.MesLabelTemplateRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Description : 广使
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/6 17:03
* @Modify:
**/
@Service
@Slf4j
public class GzPrintSnStrategy implements IPrintTemplateStrategyService {
@Autowired
private MesLabelTemplateRepository labelTemplateRao;
@Override
public List<Object> execute(MesProductionPsOutContext sn, String organizeCode) {
//1.根据 templateCode
return null;
}
}

@ -0,0 +1,41 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:43
* @Modify:
**/
@Service
@Slf4j
public class NoSortBarCodeGzNewStrategy implements IPrintTemplateStrategyService {
@Override
public Map<String, Object> execute(MesProductionPsOutContext sn, String organizeCode) {
//从条码中截取流水号,流水号 后四位
String productSn = sn.getProductSn();
Map<String,Object> map = new HashMap<>();
String partNo = sn.getPartNo();
String partName = sn.getPartName();
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String productDateTime = now.format(formatter);
map.put("partNo",partNo);
map.put("partName",partName);
map.put("productDateTime",productDateTime);
map.put("barcode",productSn);
return map;
}
}

@ -0,0 +1,54 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
/**
* @Description :
* @Reference :
* @Author : Castle
* @CreateDate : 2024/6/17 16:31
* @Modify:
**/
@Service
@Slf4j
public class NoSortBarCodeGzStrategy implements IPrintTemplateStrategyService {
@Override
public Map<String, Object> execute(MesProductionPsOutContext sn, String organizeCode) {
Map<String,Object> map = new HashMap<>();
String partNo = sn.getPartNo();
String partName = sn.getPartName();
String factoryName = AuthUtil.getOrganize().getName();
String supplierCode = "VD501";
int no = 1;
String noStr = String.format("%04d", no);
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String productDateTime = now.format(formatter);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String productDate = now.format(dateFormatter);
StringBuilder barcode = new StringBuilder(partNo);
barcode.append(partName);
barcode.append(productDate);
barcode.append(noStr);
map.put("partNo", partNo);
map.put("partName", partName);
map.put("factoryName", factoryName);
map.put("supplierCode", supplierCode);
map.put("productDate", productDateTime);
map.put("no", noStr);
map.put("barcode", barcode.toString());
return map;
}
}

@ -1,6 +1,8 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleSortCfg;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
@ -27,9 +29,11 @@ public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDis
if (numberRuleList.get(0) instanceof MesProdRuleNosortCfg) numberRuleList.forEach(o -> matchNumberRule(organizeCode, sn, resultList, o, "mesNumberRuleMatchRegularExpressionService",o, ((MesProdRuleNosortCfg) o).getInPartNoRule()));
if (numberRuleList.get(0) instanceof MesProdRuleSortCfg) numberRuleList.forEach(o -> matchNumberRule(organizeCode, sn, resultList, o, "mesNumberRuleMatchRegularExpressionService",o, ((MesProdRuleNosortCfg) o).getInPartNoRule()));
if (numberRuleList.get(0) instanceof MesProductionAssemblyNosortContext) numberRuleList.forEach(o -> matchNumberRule(organizeCode, sn, resultList, o, "mesNumberRuleMatchRegularExpressionService",o, ((MesProductionAssemblyNosortContext) o).getMatchRule()));
if (numberRuleList.get(0) instanceof MesProductionAssemblySortContext) numberRuleList.forEach(o -> matchNumberRule(organizeCode, sn, resultList, o, "mesNumberRuleMatchRegularExpressionService",o, ((MesProductionAssemblySortContext) o).getMatchRule()));
return resultList;
}

@ -80,72 +80,4 @@ public class MesNumberRuleMatchRegularExpressionService implements IMesNumberRul
String matchRule = "1574110000*";
System.out.println(sn.matches(matchRule));
}
/*
/// <summary>
/// 装配件BarCode规则是否匹配
/// </summary>
/// <param name="ruleStr">规则字串</param>
/// <param name="barCode">条码</param>
/// <returns></returns>
public static Boolean BarcodeRuleIsMatch(String ruleStr, String barCode)
{
if (String.IsNullOrEmpty(ruleStr))
return false;
if (!ruleStr.Contains("*") && !ruleStr.Contains("?") && !ruleStr.Contains(","))
{
if (ruleStr.ToLower() == barCode.ToLower())
return true;
else
return false;
}
///首先规则可以是多种以逗号隔开,将其先拆到数组中
string[] rules = ruleStr.Split(new char[] { ',', '' }, StringSplitOptions.RemoveEmptyEntries);
///以当前扫入的条码匹配每一条规则当某条匹配上后直接返回true
foreach (var rule in rules)
{
if (rule.Contains("yyyyMMdd"))
{
Regex reg = new Regex(@"\d{4}[年/.-]?\d{1,2}[月./-]?(\d{1,2}日?)?");
MatchCollection mc = reg.Matches(barCode);
if (reg.IsMatch(barCode.ToLower())) return true;
}
else if (rule.Contains("yyyy.MM.dd"))
{
Regex reg = new Regex(@"\d{4}[年/.-]?\d{1,2}[月./-]?(\d{1,2}日?)?");
MatchCollection mc = reg.Matches(barCode);
if (reg.IsMatch(barCode.ToLower())) return true;
}
else if (rule.Contains("yyyy/MM/dd"))
{
Regex reg = new Regex(@"\d{4}[年/.-]?\d{1,2}[月./-]?(\d{1,2}日?)?");
MatchCollection mc = reg.Matches(barCode);
if (reg.IsMatch(barCode.ToLower())) return true;
}
else if (rule.Contains("yyyy-MM-dd"))
{
Regex reg = new Regex(@"\d{4}[年/.-]?\d{1,2}[月./-]?(\d{1,2}日?)?");
MatchCollection mc = reg.Matches(barCode);
if (reg.IsMatch(barCode.ToLower())) return true;
}
else if (rule.Contains("yyyy-MM-dd hh:mm:ss"))
{
Regex reg = new Regex(@"\d{4}[年/.-]?\d{1,2}[月./-]?(\d{1,2}日?)?");
MatchCollection mc = reg.Matches(barCode);
if (reg.IsMatch(barCode.ToLower())) return true;
}
string ruleNoSpecialChar = StringUtil.TrimSpecialChars2(rule);
string barcodeNoSpecialChar = StringUtil.TrimSpecialChars2(barCode);
///将规则转换为正则表达式,使用正则表达式进行匹配,正则中去除二维码的起始特殊符号
//update by huxj 2020.04.07 添加二维码前缀正则匹配
var regStr = "^" + ruleNoSpecialChar.ToLower().Replace(")", @"\)").Replace("?", @"(?:.|\n){1}").Replace("*", @"(?:.|-\n)*").Replace("[", @"\[") + "$";
//Regex rgx = new Regex("^" + ruleNoSpecialChar.ToLower().Replace("?", @"(?:.|\n){1}").Replace("*", @"(?:.|\n)*") + "$");
Regex rgx = new Regex(regStr);
//end update
if (rgx.IsMatch(barcodeNoSpecialChar.ToLower())) return true;
if (rule == barCode) return true;
}
return false;
}*/
}

@ -22,18 +22,16 @@ public abstract class AbstractWriteVariableService {
* @param equipmentVariable
* @param kepwareFlag
*/
public MesEquipVariableRwResult writeVariable(StationRequestBean reqBean, String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey) {
public MesEquipVariableRwResult writeVariable(StationRequestBean reqBean, String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey, Integer index) {
// 需要不同的策略不同的转换方式
String newValue = transferValue(reqBean, value, foreignKey);
String newValue = transferValue(reqBean, value, foreignKey, index);
MesEquipVariableRwResult mesEquipVariableRwResult = equipVariableRwExtService.writeVariable(newValue, equipmentVariable, kepwareFlag);
/* if (mesEquipVariableRwResult.getIsSuccessed()) {
handlerValue();
}*/
return mesEquipVariableRwResult;
}
public abstract String transferValue(StationRequestBean reqBean, String value, Integer foreignKey);
public abstract String transferValue(StationRequestBean reqBean, String value, Integer foreignKey, Integer index);
/* public abstract void handlerValue();

@ -12,7 +12,7 @@ public class CommonWriteVariableService extends AbstractWriteVariableService{
@Override
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey) {
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey, Integer index) {
return value;
}
}

@ -2,7 +2,9 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -24,24 +26,21 @@ public class OrderWriteVariableService extends AbstractWriteVariableService{
private String orderNo;
@Override
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey) {
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey, Integer index) {
List<MesProductionPartContext> productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);
MesProductionPartContext mesProductionPartContext = productionPartContextList.stream().filter(pductionPartContext -> Objects.equals(pductionPartContext.getForeignKey(), foreignKey)).findFirst().orElse(null);
MesProductionPartContext mesProductionPartContext = null;
if (index != null && foreignKey == null) {
mesProductionPartContext = productionPartContextList.get(index);
if (mesProductionPartContext == null || Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), mesProductionPartContext.getIsFinishCode())) {
return null;
}
}
mesProductionPartContext = productionPartContextList.stream().filter(pductionPartContext -> Objects.equals(pductionPartContext.getForeignKey(), foreignKey)).findFirst().orElse(null);
if (mesProductionPartContext != null) {
return mesProductionPartContext.getWorkOrderNo();
}
/*
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
if (orderNoList.contains(mesProductionPartContext.getWorkOrderNo())) {
continue;
}
orderNo = mesProductionPartContext.getWorkOrderNo();
return mesProductionPartContext.getWorkOrderNo();
}*/
return null;
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -25,7 +26,7 @@ public class PartWriteVariableService extends AbstractWriteVariableService{
private String orderNo;
@Override
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey) {
public String transferValue(StationRequestBean reqBean, String value, Integer foreignKey, Integer index) {
List<MesProductionPartContext> productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);

@ -83,7 +83,7 @@ public class MesProductionNoSortModuleService extends BaseModuleService {
// 整合班次加工数量
List<StationKvBean> productionStatisticsContext = productionCustomContextStepService.getProductionStatisticsContext(reqBean);
if (CollectionUtils.isEmpty(productionStatisticsContext)) {
productionStatisticsContext = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(new StringJoiner(MesPcnExtConstWords.AND).add(mesProdShiftKvBean.getShiftGroup()).add(mesProdShiftKvBean.getShiftCode()).toString(), "加数", "0"),
productionStatisticsContext = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(new StringJoiner(MesPcnExtConstWords.AND).add(mesProdShiftKvBean.getShiftGroup()).add(mesProdShiftKvBean.getShiftCode()).toString(), "加数", "0"),
new StationKvBean("color", "颜色", MesExtEnumUtil.COLOR.BLACK.getValue()));
}
StationResultBean shiftCountBean = getStationResultBean(reqBean, productionStatisticsContext,mesWorkCell);

@ -22,6 +22,7 @@ import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
@ -62,6 +63,11 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!");
//从上下文中取出生产线对象
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
@ -71,125 +77,220 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService {
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//获取上下文生产扫/读信息:装配件条码
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean);
//删除上下文扫/读信息:装配件条码
if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean);
//计算实际需要的加工规则个数
Integer needProdRuleContextSize = calcNeedProdRuleContextSize(productionPartContextList, productionPsInContextList, cellEquipContext);
//未知腔数[工位参数]
String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG);
if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) //存在产出零件 存在进料主条码
doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList, needProdRuleContextSize);
doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionPartContextList, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList);
else if (!CollectionUtils.isEmpty(productionPartContextList)) //存在产出零件 不存在进料主条码
doMatchAssemblyHasPp(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, prodRuleContextList, equipVariableCollectContextList, needProdRuleContextSize);
doMatchAssemblyHasPp(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, prodRuleContextList, equipVariableCollectContextList);
else if (!CollectionUtils.isEmpty(productionPsInContextList)) //不存在产出零件 存在进料主条码
doMatchAssemblyHasPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList, needProdRuleContextSize);
doMatchAssemblyHasPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList);
else if (StringUtils.isEmpty(cavityUnknownCfg)) //不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则
doMatchAssemblyHasCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList, needProdRuleContextSize);
doMatchAssemblyHasCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList);
else //不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则
doMatchAssemblyUnknowCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList);
return stepResult;
}
//存在产出零件 存在进料主条码
private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList,
List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
//存在产出零件 存在进料主条码 不存在待验证装配件条码
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return hasUnBindAssembly(prodRuleContextList) ?
stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,但还存在未装配的装配件清单!") :
(productionPartContextList.size() == productionPsInContextList.size() ? stepResult :
stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(
String.format("当前上下文中不存在待验证的装配件条码,请扫描第[%s]腔主条码,共[%s]腔!", productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size())));
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
return stepResult;
//没有装配件的条件
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
}
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
//计算实际需要的加工规则个数
private Integer calcNeedProdRuleContextSize(List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, MesCellEquipContext cellEquipContext) {
//遍历装配件清单
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
List<MesProductionPartContext> ppList = CollectionUtils.isEmpty(productionPartContextList) ? null :
productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
//已装配
if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
List<MesProductionPsInContext> ppiList = CollectionUtils.isEmpty(productionPsInContextList) ? null :
productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
//遍历装配件条码
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {
if (!CollectionUtils.isEmpty(ppList)) return ppList.size();
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
if (!CollectionUtils.isEmpty(ppiList)) return ppiList.size();
//匹配规则
List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>)
numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList()));
//匹配失败
if (CollectionUtils.isEmpty(filterList)) continue;
//匹配成功
equipVariableCollectContext.isConsume();
return cellEquipContext.getCavity();
//装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue());
}
}
//存在产出零件 存在进料主条码
private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Integer needProdRuleContextSize) {
//是否验证顺序装配
if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) &&
prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 &&
productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) break;
if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!");
}
//存在产出零件 存在进料主条码 不存在待验证装配件条码
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, productionPsInContextList, prodRuleContextList, needProdRuleContextSize);
prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList);
//TODO 发送设备加工参数
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0) doSendEquipProdParam(reqBean, resultBean, stepResult, prodRuleContext, productionAssemblyNosortContextList);
}
List<MesEquipVariableCollectContext> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) {
Boolean hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
if ((!hasUnBindAssembly && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) == 0) || equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0)
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
return stepResult;
String msg = String.format("当前上下文中的装配件条码%s匹配完成", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString());
return hasUnBindAssembly ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) :
(productionPartContextList.size() == productionPsInContextList.size() ? stepResult.msg(msg) :
stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(
String.format("%s,请扫描第[%s]腔主条码,共[%s]腔!", msg, productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size())));
} else {
String msg = String.format("当前上下文中的装配件条码%s匹配失败", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString());
return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) :
(productionPartContextList.size() == productionPsInContextList.size() ? stepResult.msg(String.format("%s,但不存在未装配的装配件清单!", msg)) :
stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(
String.format("%s,请扫描第[%s]腔主条码,共[%s]腔!", msg, productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size())));
}
}
//存在产出零件 存在进料主条码 不存在待验证装配件条码
private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList, Integer needProdRuleContextSize) {
}
//验证是否存在待绑定数据
private Boolean hasUnBindAssembly(List<MesProdRuleContext> prodRuleContextList) {
Boolean hasUnBindAssembly = false;
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
Optional<MesProductionAssemblyNosortContext> optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) continue;
hasUnBindAssembly = true;
break;
}
return hasUnBindAssembly;
}
//存在产出零件 不存在进料主条码
private StepResult doMatchAssemblyHasPp(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPartContext> productionPartContextList, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
//存在产出零件 存在进料主条码 不存在待验证装配件条码
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,但还存在未装配的装配件清单!") : stepResult;
//遍历产品加工规则
for (MesProdRuleContext prodRuleContext : prodRuleContextList) {
//没有装配件的条件
if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue;
//获取非排序装配件清单
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
Optional<MesProductionAssemblyNosortContext> optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
//遍历装配件清单
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
if (null == optional || !optional.isPresent()) continue;
//已装配
if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue;
hasUnBindAssembly = true;
//遍历装配件条码
for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) {
break;
//已被消费
if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue;
}
return hasUnBindAssembly ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,但存在未装配的装配件清单!") :
(needProdRuleContextSize.compareTo(prodRuleContextList.size()) != 0 ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,当前上下文中的主条码数量未满足腔数!请扫描第") : stepResult);
//匹配规则
List<MesProductionAssemblyNosortContext> filterList = (List<MesProductionAssemblyNosortContext>)
numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList()));
}
//匹配失败
if (CollectionUtils.isEmpty(filterList)) continue;
//匹配成功
equipVariableCollectContext.isConsume();
//装配件清单该数据标记已装配
productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue());
}
//是否验证顺序装配
if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) &&
prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 &&
productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) break;
}
prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList);
//TODO 发送设备加工参数
if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0) doSendEquipProdParam(reqBean, resultBean, stepResult, prodRuleContext, productionAssemblyNosortContextList);
}
List<MesEquipVariableCollectContext> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) {
Boolean hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList);
if ((!hasUnBindAssembly && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) == 0) || equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0)
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
String msg = String.format("当前上下文中的装配件条码%s匹配完成", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString());
return hasUnBindAssembly ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : stepResult.msg(msg);
} else {
String msg = String.format("当前上下文中的装配件条码%s匹配失败", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString());
return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : stepResult.msg(msg);
}
//存在产出零件 不存在进料主条码
private void doMatchAssemblyHasPp(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPartContext> productionPartContextList, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Integer needProdRuleContextSize) {
}
//不存在产出零件 存在进料主条码
private void doMatchAssemblyHasPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Integer needProdRuleContextSize) {
private void doMatchAssemblyHasPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
}
//不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则
private void doMatchAssemblyHasCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList, Integer needProdRuleContextSize) {
private void doMatchAssemblyHasCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
}
//不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则
private void doMatchAssemblyUnknowCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
}
//TODO 发送设备加工参数
private void doSendEquipProdParam(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProdRuleContext prodRuleContext, List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList) {
Optional<MesProductionAssemblyNosortContext> optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst();
if (null != optional && optional.isPresent()) return;
}
}

@ -0,0 +1,135 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblySaveNosortStepService")
public class MesAssemblySaveNosortStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!");
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在产出零件条码信息,请重置工序解决!");
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
Map<Integer, MesProductionPsOutContext> ppMap = CollectionUtils.isEmpty(productionPsOutContextList) ? null : productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProductionPsOutContext::getForeignKey, o -> o));
//保存装配记录
prodRuleContextList.stream().filter(o -> null != o).forEach(o -> saveProductionAssemblyData(reqBean, resultBean, stepResult, productionProcessContext, o, ppMap, cellEquipContext));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存装配记录成功!");
}
private void saveProductionAssemblyData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesProdRuleContext prodRuleContext, Map<Integer, MesProductionPsOutContext> ppMap, MesCellEquipContext cellEquipContext) {
if (StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) return;
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
MesProductionPsOutContext productionPsOutContext = CollectionUtils.isEmpty(ppMap) ? null : ppMap.get(prodRuleContext.getForeignKey());
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
if (null == productionAssemblyNosortContext) continue;
MesProductionAssembly productionAssembly = new MesProductionAssembly();
BeanUtils.copyProperties(productionAssemblyNosortContext, productionAssembly);
productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue());
productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
productionAssembly.setAreaCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCellCode(reqBean.getWorkCellCode());
productionAssembly.setProcessCode(reqBean.getProcessCode());
productionAssembly.setProcessName(productionProcessContext.getProcessName());
productionAssembly.setCraftCode(productionProcessContext.getCraftCode());
productionAssembly.setCraftName(productionProcessContext.getCraftName());
productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionAssembly.setProductionRecordId(prodRuleContext.getProductionRecordId());
productionAssembly.setMouldNo(prodRuleContext.getMouldNo());
if (null != productionPsOutContext) {
productionAssembly.setPartNo(productionPsOutContext.getPartNo());
productionAssembly.setPartName(productionPsOutContext.getPartName());
productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber());
productionAssembly.setProductSn(productionPsOutContext.getProductSn());
productionAssembly.setCustSn(productionPsOutContext.getCustSn());
}
//TODO 赋开模记录ID
//productionAssembly.setMouldRecordId();
productionAssembly.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo());
productionAssemblyRepository.insert(productionAssembly);
}
}
}

@ -0,0 +1,55 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblySaveStepService")
public class MesAssemblySaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//排序线 保存装配记录工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesAssemblySaveSortStepService")).execute(reqBean);
//非排序线 保存装配记录工步
return ((IStepService) SpringContextsUtil.getBean("mesAssemblySaveNosortStepService")).execute(reqBean);
}
}

@ -85,7 +85,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
Integer initSize = prodRuleContextList.size();
//封装非排序加工规则
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
if (prodRuleContextList.size() != initSize) {
//保存上下文产品加工规则信息集合
@ -102,24 +104,24 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "装配件扫描项已查询完毕,请查看!");
}
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前场景是直接匹配装配件规则来获取产品加工规则】
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return;
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return stepResult;
//根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
if (CollectionUtils.isEmpty(productionPartContextList)) doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPsInContextList);
if (CollectionUtils.isEmpty(productionPartContextList)) return doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPsInContextList);
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
else doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
else return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
}
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据
private void doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//加工规则的数据已与产出零件的数量一致
if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return;
if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return stepResult;
//拿到当前最大的foreignKey
Optional<MesProductionPartContext> maxForeignKeyOptional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPartContext::getForeignKey));
@ -129,15 +131,15 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
List<String> outPartNoList = productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
if (CollectionUtils.isEmpty(productionPsInContextList)) doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
if (CollectionUtils.isEmpty(productionPsInContextList)) return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
else doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
}
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
private StepResult doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty());
@ -154,18 +156,19 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//【非排序线】获取产品加工规则对应的装配件信息
if (prodRuleNosortCfgList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode()).
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).
copy(prodRuleNosortCfgList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())));
if (prodRuleNosortCfgList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", prodRuleNosortCfgList.size(), JSONObject.toJSONString(productionPartContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
return stepResult;
}
//没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,存在多条则直接跳过,后续通过装配件规则匹配加工规则)
private void doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList) {
private StepResult doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null);
@ -190,13 +193,15 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//【非排序线】获取产品加工规则对应的装配件信息
if (filterList.size() == 1) prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode()).copy(prodRuleNosortCfgList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())));
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).copy(prodRuleNosortCfgList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())));
if (filterList.size() > 1) this.sendMessage(reqBean, resultBean, String.format(
"显示装配件匹配非排序产品加工规则[%s]条,直接跳过,后续通过装配件规则匹配加工规则,数据源:[%s]!", filterList.size(), JSONObject.toJSONString(productionPsInContext)), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
return stepResult;
}
private List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList) {
@ -210,8 +215,8 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
}
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据
private void doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
private StepResult doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList);
@ -246,9 +251,14 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue;
filter = innerfilterList.get(0);
//TODO 验证时效性
//if (!StringUtils.isEmpty(productionPsInContext.getPartNo()) && !checkTimeEfficientCfg(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filter.getId(), dataSource, stepResult).isComplete()) return stepResult;
productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey());
filter = innerfilterList.get(0);
productSn = productionPsInContext.getProductSn();
break;
@ -259,10 +269,12 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//【非排序线】获取产品加工规则对应的装配件信息
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode()).copy(filter).workOrderNo(productionPartContext.getWorkOrderNo()).productSn(productSn).foreignKey(productionPartContext.getForeignKey())));
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).copy(filter).workOrderNo(productionPartContext.getWorkOrderNo()).productSn(productSn)).foreignKey(productionPartContext.getForeignKey()));
}
return stepResult;
}
//搜集进料零件号匹配的产品加工规则
@ -281,7 +293,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
}
//显示装配件信息
private Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList) {
public Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList) {
Map<Integer, MesProductionPartContext> productionPartMap = productionPartContextList.stream().filter(o -> null != o && o.getForeignKey() != null).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));

@ -82,7 +82,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
Integer initSize = prodRuleContextList.size();
//封装排序加工规则
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
if (prodRuleContextList.size() != initSize) {
//保存上下文产品加工规则信息集合
@ -104,7 +104,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
}
//查询排序线加工规则装配件数据信息
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext,
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//上下文中不存在进料主条码数据信息
@ -121,9 +121,9 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
if (null == productionPsInContext || productionPsInContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue;
//【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单)
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleSortContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(
productionPartContextList.stream().filter(o -> (null != o && o.getWorkOrderNo().equals(productionPsInContext.getWorkOrderNo()))).findFirst().get().foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()).getForeignKey())));
prodRuleContextList.add(prodRuleCfgExtService.getProdRuleSortContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(
productionPartContextList.stream().filter(o -> (null != o && o.getWorkOrderNo().equals(productionPsInContext.getWorkOrderNo()))).findFirst().get().foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()).getForeignKey())));
}

@ -189,16 +189,22 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
public StepResult savePartDataMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<MesProductionPartContext> productionPartContextList, Boolean isBackError) {
//从上下文中取出零件信息集合
Map<String, MesPart> partDataMap = productionDispatchContextStepService.getPartDataContext(reqBean);
//从一模多腔信息中搜集零件编码并去重
List<String> partNoList = (productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
return savePartDataMap(reqBean, resultBean, stepResult, partNoList, isBackError);
}
public StepResult savePartDataMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<String> partNoList, Boolean isBackError) {
if (CollectionUtils.isEmpty(partNoList)) return stepResult;
//从上下文中取出零件信息集合
Map<String, MesPart> partDataMap = productionDispatchContextStepService.getPartDataContext(reqBean);
//验证上下文中取出零件信息集合是否匹配一模多腔信息中搜集零件编码
if (!CollectionUtils.isEmpty(partDataMap) && !CollectionUtils.isEmpty(partNoList) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return stepResult;
if (!CollectionUtils.isEmpty(partDataMap) && !CollectionUtils.isEmpty(partNoList) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return stepResult.obj(partDataMap);
//根据物料编码集合查询物料信息
Map<String, MesPart> finalPartDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList);
@ -208,7 +214,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
//保存上下文零件数据信息
if (!CollectionUtils.isEmpty(finalPartDataMap) && CollectionUtils.isEmpty(filterList))
return stepResult.isCompleted(productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap)).msg(!stepResult.isCompleted() ? "零件数据信息保存上下文操作执行失败,请重试!" : null);
return stepResult.isCompleted(productionDispatchContextStepService.savePartDataContext(reqBean, finalPartDataMap)).obj(finalPartDataMap).msg(!stepResult.isCompleted() ? "零件数据信息保存上下文操作执行失败,请重试!" : null);
//验证错误 根据isBackError判断是否抛出异常
stepResult.isCompleted(false).msg(String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(finalPartDataMap) ? partNoList.toString() : filterList.toString()));

@ -95,12 +95,10 @@ public class MesMouldRecordGenerateStepService extends BaseStepService {
DdlPreparedPack.getStringEqualPack(equipmentCode, "equipmentCode", packBean);
DdlPreparedPack.getStringEqualPack(mouldNo, "mouldNo", packBean);
MesMouldMappingCfg mesMouldMappingCfg = mesMouldMappingCfgRepository.getByProperty(packBean);
//配置错误 抛出异常 todo 没找到不能报错,就不填这个字段
if (mesMouldMappingCfg == null) execExpSendMsgAndThrowEx(reqBean, resultBean,
String.format("请检查模具映射关系维护,根据设备[%s],模具号[%s]", equipmentCode, mouldNo));
MesProdMouldRecord mesProductionRecord = getMesProdMouldRecord(mesCellEquipContext, mouldNo, mesMouldMappingCfg);
ConvertBean.serviceModelInitialize(mesProductionRecord, reqBean.getUserInfo());
mesProdMouldRecords.add(mesProductionRecord);
}
@ -111,8 +109,8 @@ public class MesMouldRecordGenerateStepService extends BaseStepService {
private MesProdMouldRecord getMesProdMouldRecord(MesCellEquipContext mesCellEquipContext, String mouldNo, MesMouldMappingCfg mesMouldMappingCfg) {
MesProdMouldRecord mesProdMouldRecord = new MesProdMouldRecord();
mesProdMouldRecord.setEquipId(mesCellEquipContext.getEquipId());
mesProdMouldRecord.setMeterName(mesMouldMappingCfg.getMeterName());
mesProdMouldRecord.setAssetNum(mesMouldMappingCfg.getAssetNum());
mesProdMouldRecord.setMeterName(mesMouldMappingCfg == null ? null : mesMouldMappingCfg.getMeterName());
mesProdMouldRecord.setAssetNum(mesMouldMappingCfg == null ? null : mesMouldMappingCfg.getAssetNum());
mesProdMouldRecord.setMouldNo(mouldNo);
mesProdMouldRecord.setEquipmentCode(mesCellEquipContext.getEquipmentCode());
return mesProdMouldRecord;

@ -73,7 +73,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
// 获取加工结果
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 如果是报废或者可疑需要编辑条码状态为不合格、并且nc判定需要新增一条记录
if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue(), result)) {
if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getCode(), result)) {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工结果合格,无需记录异常");
}
// 获取条码列表
@ -111,7 +111,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService {
partInspection.setPartNo(mesProduceSn.getPartNo());
partInspection.setPartName(mesProduceSn.getPartName());
partInspection.setDefectTypeCode(mesDefectType.getDefectTypeCode());
partInspection.setInspectionDate(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER));
partInspection.setInspectionDate(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
partInspection.setLotNo(mesProduceSn.getLotNo());
if (!Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
partInspection.setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.SCRAP.getValue());

@ -137,7 +137,7 @@ public class MesProductResultReadStepService extends BaseStepService {
matchVariableCategoryMap(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, variableCategoryMap);
//保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果
if (stepResult.isCompleted()) productionDispatchContextStepService.saveProductResultContext(reqBean, (String) stepResult.getObj());
if (stepResult.isCompleted()) productionDispatchContextStepService.saveProductResultContext(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfCodeStr((String) stepResult.getObj()));
return stepResult;

@ -1,200 +1,214 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPojoVersionService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
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.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPojoVersion;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.hutool.core.date.DateUtil;
import com.google.common.base.Objects;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service
@Service("mesProductSnGenerateStepService")
public class MesProductSnGenerateStepService extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesPartRepository mesPartRepository;
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private ISyncFuncService syncFuncService;
private MesFirstMouldNoReadStepService firstMouldNoReadStepService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
@Autowired
private ISyncFuncService syncFuncService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
private IMesProduceSnExtService produceSnExtService;
@Autowired
private IMesPojoVersionService mesPojoVersionService;
private MesProduceSnRepository produceSnRepository;
/**todo
* todo
* @param reqBean
* @return
*/
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
// 获取产出零件信息
List<MesProductionPartContext> productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);
if (CollectionUtils.isEmpty(productionPartContextList)) {
foundExThrow(reqBean, "必过工步不允许跳过");
}
// 获取零件号,可能存在多个
List<String> partNoList = productionPartContextList.stream().map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
// 根据零件号组装产品条码信息
List<MesProduceSn> mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList, result);
// 保存条码信息
mesProduceSnRepository.saveAll(mesProduceSns);
savePojoVersion(mesProduceSns);
List<MesProductionPsOutContext> mesProductionPsOutContexts = new ArrayList<>();
for (MesProduceSn mesProduceSn : mesProduceSns) {
MesProductionPsOutContext mesProductionPsOutContext = new MesProductionPsOutContext();
BeanUtils.copyProperties(mesProduceSn, mesProductionPsOutContext);
mesProductionPsOutContexts.add(mesProductionPsOutContext);
}
// 放到上下文
mesProductionDispatchContextStepService.saveProductionPsOutContext(reqBean, mesProductionPsOutContexts);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成零件条码成功");
}
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//排序线 直接跳过
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return stepResult;
//已经生成过零件条码
if (productionDispatchContextStepService.checkProductionPsOutIsExistContext(reqBean)) return stepResult;
private void savePojoVersion(List<MesProduceSn> mesProduceSns) {
mesProduceSns.forEach(mesProduceSn -> {
MesPojoVersion version = new MesPojoVersion();
version.setRefId(mesProduceSn.getId());
version.setRefClass(mesProduceSn.getClass().getName());
version.setBean(JsonUtilTool.encode(mesProduceSn));
version.setCreateUser(version.getCreateUser());
version.setModifyUser(version.getModifyUser());
version.setVersionMethodName("insert");
version.setOrganizeCode(mesProduceSn.getOrganizeCode());
mesPojoVersionService.recordPojoVersion(version);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在加工规则信息,请重置工序解决!");
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == prodShiftContext) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在生产开班记录,请重新开班!");
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//获取上下文零件数据信息
List<String> partNoList = (prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getOutPartNo()))).map(MesProdRuleContext::getOutPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, partNoList, false);
//获取上下文加工结果
String productResult = productionDispatchContextStepService.getProductResultContext(reqBean);
Map<Integer, MesProductionPartContext> ppMap = CollectionUtils.isEmpty(productionPartContextList) ? null : productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o));
Map<Integer, MesProductionPsInContext> psMap = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProductionPsInContext::getForeignKey, o -> o));
Map<String, MesPart> partMap = (Map<String, MesPart>) stepResult.getObj();
//循环生成零件条码,并写入产出零件
List<MesProductionPsOutContext> productionPsOutContextList = new ArrayList<>();
prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getOutPartNo()))).forEach(o -> {
MesProductionPsOutContext productionPsOutContext = insertProduceSnData(reqBean, resultBean, stepResult, productionProcessContext, o, ppMap, psMap, partMap, prodShiftContext, productResult);
if (null != productionPsOutContext) productionPsOutContextList.add(productionPsOutContext);
});
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.saveProductionPsOutContext(reqBean, productionPsOutContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成零件条码成功!");
}
/**
*
* @param reqBean
* @param productionProcessContext
* @param mesWorkCell
* @param partNoList
* @return
*/
private List<MesProduceSn> generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List<String> partNoList, String result) {
List<MesProduceSn> mesProduceSns = new ArrayList<>();
for (String partNo : partNoList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean);
MesPart mesPart = mesPartRepository.getByProperty(packBean);
if (mesPart == null) {
MesPcnException.throwFlowException("零件号不存在");
}
// 根据条码规则生成条码
String sn = generateByRule(mesPart);
// 组装条码信息
MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean, result);
ConvertBean.serviceModelInitialize(mesProduceSn, reqBean.getUserInfo());
mesProduceSns.add(mesProduceSn);
//生成零件条码
private MesProductionPsOutContext insertProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProdRuleContext prodRuleContext,
Map<Integer, MesProductionPartContext> ppMap, Map<Integer, MesProductionPsInContext> psMap, Map<String, MesPart> partMap, MesProdShiftContext prodShiftContext, String productResult) {
//产出零件数据信息
MesProductionPartContext productionPartContext = !CollectionUtils.isEmpty(ppMap) ? ppMap.get(prodRuleContext.getForeignKey()) : null;
//料零件条码
MesProductionPsInContext productionPsInContext = !CollectionUtils.isEmpty(psMap) ? psMap.get(prodRuleContext.getForeignKey()) : null;
//零件信息
MesPart part = partMap.get(prodRuleContext.getOutPartNo());
//加工规则中进料零件与产出零件是否一致
Boolean isSamePart = isSamePart(prodRuleContext.getInPartNo(), prodRuleContext.getOutPartNo());
//进出一致, 无需生成
if (isSamePart) return new MesProductionPsOutContext().copy(produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), null != productionPsInContext ? productionPsInContext.getId() : null), prodRuleContext.getForeignKey());
//判断存在主条码的时候是否此前已生成当前工位的未知条码
MesProduceSn produceSn = (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getRelateId())) ? null : produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getRelateId());
if (null == produceSn) produceSn = new MesProduceSn();
try {
produceSn.setProductSn((null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) ? productionPsInContext.getProductSn() :
syncFuncService.syncSerialNo(new GenSerialNoModel(getProduceSnNumberRule(reqBean, resultBean, part)).partNo(part.getPartNo()), reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString());
produceSn.setSerialNumber(syncFuncService.syncSerialNo(new GenSerialNoModel(MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE).prodLocation(reqBean.getWorkCenterCode()), reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString());
} catch (ImppBusiException e) {
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail());
}
produceSn.setCustSn(produceSn.getProductSn());
produceSn.setQty(new Double(1));
if (null != productionPartContext && !StringUtils.isEmpty(productionPartContext.getWorkOrderNo())) {
produceSn.setWorkOrderNo(productionPartContext.getWorkOrderNo());
produceSn.setCustCode(productionPartContext.getCustCode());
produceSn.setCustPartNo(productionPartContext.getCustPartNo());
}
return mesProduceSns;
produceSn.setAreaCode(reqBean.getAreaCode());
produceSn.setWorkCenterCode(reqBean.getWorkCenterCode());
produceSn.setWorkCellCode(reqBean.getWorkCellCode());
produceSn.setPartNo(part.getPartNo());
produceSn.setPartName(part.getPartName());
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue());
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue());
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
produceSn.setPrintCount(MesPcnExtConstWords.ZERO);
produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
produceSn.setOrganizeCode(reqBean.getOrganizeCode());
if (StringUtils.isEmpty(produceSn.getId())) ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo());
else ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
if (StringUtils.isEmpty(produceSn.getId())) produceSn = produceSnRepository.insert(produceSn);
else produceSnRepository.save(produceSn);
return new MesProductionPsOutContext().copy(produceSn, prodRuleContext.getForeignKey()).isCalcCompleteQty(produceSn.getWorkOrderNo());
}
/**
*
* @param mesPart
* @return
*/
private String generateByRule(MesPart mesPart) {
//生成工单号
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(ORDER_NO_JIS_SORT);
genSerialNoModel.setPartNo(mesPart.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesPart.getCreateUser(), mesPart.getOrganizeCode(), 1).getResultList();
return resultList.get(0);
private String getProduceSnNumberRule(StationRequestBean reqBean, StationResultBean resultBean, MesPart part) {
if (StringUtils.isEmpty(part.getProductMatchRule())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo()));
return part.getProductMatchRule();
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, MesWorkCell mesWorkCell,MesProductionProcessContext productionProcessContext, StationRequestBean reqBean, String result) {
long serialNum = snowflakeIdMaker.nextId();
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setSerialNumber(serialNum + "");
mesProduceSn.setProductSn(sn);
mesProduceSn.setCustSn(sn);
mesProduceSn.setPartNo(mesPart.getPartNo());
mesProduceSn.setPartName(mesPart.getPartName());
mesProduceSn.setAreaCode(mesWorkCell.getAreaCode());
mesProduceSn.setWorkCenterCode(mesWorkCell.getWorkCenterCode());
mesProduceSn.setWorkCellCode(mesWorkCell.getWorkCellCode());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setQty(1d);
mesProduceSn.setSnStatus(10);
Integer qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue();
if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue();
} else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue();
}
mesProduceSn.setQcStatus(qcStatus);
mesProduceSn.setLotNo(DateUtil.format(new Date(), "YYYYMMDD"));
mesProduceSn.setRouteCode(reqBean.getRouteCode());
mesProduceSn.setProcessCode(productionProcessContext.getProcessCode());
mesProduceSn.setCraftCode(productionProcessContext.getCraftCode());
mesProduceSn.setPrintCount(0);
mesProduceSn.setPrintStatus(10);
mesProduceSn.setOrganizeCode(reqBean.getOrganizeCode());
return mesProduceSn;
private Boolean isSamePart(String inPartNo, String outPartNo) {
if (!StringUtils.isEmpty(inPartNo) && inPartNo.equals(outPartNo)) return true;
else return false;
}
}

@ -0,0 +1,200 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPojoVersionService;
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.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesPojoVersion;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.hutool.core.date.DateUtil;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service
public class MesProductSnGenerateStepServiceBak extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesPartRepository mesPartRepository;
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
@Autowired
private ISyncFuncService syncFuncService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Autowired
private IMesPojoVersionService mesPojoVersionService;
/**todo
* todo
* @param reqBean
* @return
*/
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
// 获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
// 获取产出零件信息
List<MesProductionPartContext> productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);
if (CollectionUtils.isEmpty(productionPartContextList)) {
foundExThrow(reqBean, "必过工步不允许跳过");
}
// 获取零件号,可能存在多个
List<String> partNoList = productionPartContextList.stream().map(MesProductionPartContext::getPartNo).collect(Collectors.toList());
// 根据零件号组装产品条码信息
List<MesProduceSn> mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList, result);
// 保存条码信息
mesProduceSnRepository.saveAll(mesProduceSns);
savePojoVersion(mesProduceSns);
List<MesProductionPsOutContext> mesProductionPsOutContexts = new ArrayList<>();
for (MesProduceSn mesProduceSn : mesProduceSns) {
MesProductionPsOutContext mesProductionPsOutContext = new MesProductionPsOutContext();
BeanUtils.copyProperties(mesProduceSn, mesProductionPsOutContext);
mesProductionPsOutContexts.add(mesProductionPsOutContext);
}
// 放到上下文
mesProductionDispatchContextStepService.saveProductionPsOutContext(reqBean, mesProductionPsOutContexts);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成零件条码成功");
}
private void savePojoVersion(List<MesProduceSn> mesProduceSns) {
mesProduceSns.forEach(mesProduceSn -> {
MesPojoVersion version = new MesPojoVersion();
version.setRefId(mesProduceSn.getId());
version.setRefClass(mesProduceSn.getClass().getName());
version.setBean(JsonUtilTool.encode(mesProduceSn));
version.setCreateUser(version.getCreateUser());
version.setModifyUser(version.getModifyUser());
version.setVersionMethodName("insert");
version.setOrganizeCode(mesProduceSn.getOrganizeCode());
mesPojoVersionService.recordPojoVersion(version);
});
}
/**
*
* @param reqBean
* @param productionProcessContext
* @param mesWorkCell
* @param partNoList
* @return
*/
private List<MesProduceSn> generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List<String> partNoList, String result) {
List<MesProduceSn> mesProduceSns = new ArrayList<>();
for (String partNo : partNoList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean);
MesPart mesPart = mesPartRepository.getByProperty(packBean);
if (mesPart == null) {
MesPcnException.throwFlowException("零件号不存在");
}
// 根据条码规则生成条码
String sn = generateByRule(mesPart);
// 组装条码信息
MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean, result);
ConvertBean.serviceModelInitialize(mesProduceSn, reqBean.getUserInfo());
mesProduceSns.add(mesProduceSn);
}
return mesProduceSns;
}
/**
*
* @param mesPart
* @return
*/
private String generateByRule(MesPart mesPart) {
//生成工单号
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(ORDER_NO_JIS_SORT);
genSerialNoModel.setPartNo(mesPart.getPartNo());
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesPart.getCreateUser(), mesPart.getOrganizeCode(), 1).getResultList();
return resultList.get(0);
}
private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, MesWorkCell mesWorkCell,MesProductionProcessContext productionProcessContext, StationRequestBean reqBean, String result) {
long serialNum = snowflakeIdMaker.nextId();
MesProduceSn mesProduceSn = new MesProduceSn();
mesProduceSn.setSerialNumber(serialNum + "");
mesProduceSn.setProductSn(sn);
mesProduceSn.setCustSn(sn);
mesProduceSn.setPartNo(mesPart.getPartNo());
mesProduceSn.setPartName(mesPart.getPartName());
mesProduceSn.setAreaCode(mesWorkCell.getAreaCode());
mesProduceSn.setWorkCenterCode(mesWorkCell.getWorkCenterCode());
mesProduceSn.setWorkCellCode(mesWorkCell.getWorkCellCode());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate());
mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate());
mesProduceSn.setQty(1d);
mesProduceSn.setSnStatus(10);
Integer qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue();
if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue();
} else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue(), result)) {
qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue();
}
mesProduceSn.setQcStatus(qcStatus);
mesProduceSn.setLotNo(DateUtil.format(new Date(), "YYYYMMDD"));
mesProduceSn.setRouteCode(reqBean.getRouteCode());
mesProduceSn.setProcessCode(productionProcessContext.getProcessCode());
mesProduceSn.setCraftCode(productionProcessContext.getCraftCode());
mesProduceSn.setPrintCount(0);
mesProduceSn.setPrintStatus(10);
mesProduceSn.setOrganizeCode(reqBean.getOrganizeCode());
return mesProduceSn;
}
}

@ -18,10 +18,7 @@ import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* @Description :
@ -43,13 +40,20 @@ public class MesProductSnPrintStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
/**
* List<Map<String,Object>>
* Map<String,Object>
* String:
* content :
* data : List<Map<String,Object>> map
*/
String organizeCode = reqBean.getOrganizeCode();
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//需要打印的数据
Map<String,List<Object>> resultData = new HashMap<>();
//需要打印的数据 String 是打印模板code
Map<String, List<Map<String, Object>>> resultData = new HashMap<>();
//用于保存客户模板代码 和 模板信息关系
Map<String,MesLabelTemplate> labelTemplateMap = new HashMap<>();
Map<String, MesLabelTemplate> labelTemplateMap = new HashMap<>();
//返回打印标识 给前端
//1. 获取上下文中生成的主条码
List<MesProductionPsOutContext> productionPsOutContextList = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
@ -59,49 +63,64 @@ public class MesProductSnPrintStepService extends BaseStepService {
MesLabelTemplate labelTemplate;
// 查模板代码
if (!labelTemplateMap.containsKey(custLabelTemplate)) {
labelTemplate = getLabelTemplate(custLabelTemplate, organizeCode);
labelTemplate = getLabelTemplate(custLabelTemplate, organizeCode);
//模板信息丢失抛出异常
if (labelTemplate == null) {
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的模板代码[%s]的模板信息丢失,请配置!", sn.getPartNo(),custLabelTemplate));
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的模板代码[%s]的模板信息丢失,请配置!", sn.getPartNo(), custLabelTemplate));
}
labelTemplateMap.put(custLabelTemplate, labelTemplate);
}else {
} else {
labelTemplate = labelTemplateMap.get(custLabelTemplate);
}
//根据反射获取策略类--封装打印数据
String methodCode = labelTemplate.getMethodCode();
//模板信息丢失抛出异常
if (methodCode == null) {
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的模板代码[%s]的反射类丢失,请配置!", sn.getPartNo(),custLabelTemplate));
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的模板代码[%s]的反射类丢失,请配置!", sn.getPartNo(), custLabelTemplate));
}
IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode);
List<Object> snData = strategyService.execute(sn, organizeCode);
if (resultData.containsKey(labelTemplate.getTemplateCode())){
List<Object> printData = resultData.get(labelTemplate.getTemplateCode());
printData.addAll(snData);
}else {
resultData.put(labelTemplate.getTemplateCode(),snData);
}
Map<String, Object> snData = strategyService.execute(sn, organizeCode);
List<Map<String, Object>> printData;
if (resultData.containsKey(labelTemplate.getTemplateCode())) {
printData = resultData.get(labelTemplate.getTemplateCode());
printData.add(snData);
} else {
printData = new ArrayList<>();
printData.add(snData);
resultData.put(labelTemplate.getTemplateCode(), printData);
}
}
List<Map<String, Object>> printData = new ArrayList<>();
Set<String> labelKeys = labelTemplateMap.keySet();
for (String labelKey : labelKeys) {
List<Map<String, Object>> dataMaps = resultData.get(labelKey);
MesLabelTemplate mesLabelTemplate = labelTemplateMap.get(labelKey);
String templateContent = mesLabelTemplate.getTemplateContent();
Map<String, Object> data = new HashMap<>();
data.put("templateContent", templateContent);
data.put("data", dataMaps);
printData.add(data);
}
//前端接收到busiTyep是customComponent并且 dataType是file类型的消息就需要打印后续消息里的数据一个模板对应多个打印数据
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue());
resultBean.setResultObj(resultData);
resultBean.setResultObj(printData);
//3. 发送数据给到前端
this.sendMessage(reqBean,resultBean);
this.sendMessage(reqBean, resultBean);
return stepResult;
}
/**
* templateCode
*
* @param templateCode
* @param organizeCode
* @return
*/
private MesLabelTemplate getLabelTemplate(String templateCode,String organizeCode) {
private MesLabelTemplate getLabelTemplate(String templateCode, String organizeCode) {
DdlPackBean templatePackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(templateCode,"templateCode",templatePackBean);
DdlPreparedPack.getStringEqualPack(templateCode, "templateCode", templatePackBean);
List<MesLabelTemplate> mesLabelTemplateList = labelTemplateRao.findByHqlWhere(templatePackBean);
return mesLabelTemplateList.isEmpty() ? null : mesLabelTemplateList.get(0);
}

@ -1,10 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -15,28 +20,37 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : zxw
* @Author : wangjie
**/
@Slf4j
@Service
@Service("mesProductSnSaveStepService")
public class MesProductSnSaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesFirstMouldNoReadStepService firstMouldNoReadStepService;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
private MesProduceSnRepository produceSnRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -45,19 +59,75 @@ public class MesProductSnSaveStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
List<MesProductionPsOutContext> mesProduceSnContexts = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
List<MesProduceSn> mesProduceSns = new ArrayList<>();
if (CollectionUtils.isEmpty(mesProduceSnContexts)) {
foundExThrow(reqBean, "条码信息不能为空");
}
mesProduceSnContexts.forEach(mesProduceSnContext -> {
MesProduceSn mesProduceSn = new MesProduceSn();
//todo 要根据不同的加工结果,返回不同的结果 要分排序和非排序, 排序只保存工单对应的装配件、非排序要保存主条码和装配件记录。
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
mesProduceSns.add(mesProduceSn);
});
mesProduceSnRepository.saveAll(mesProduceSns);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存零件条码信息工步");
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在产出零件条码信息,请重置工序解决!");
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == prodShiftContext) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在生产开班记录,请重新开班!");
//获取上下文零件数据信息
List<String> partNoList = (productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsOutContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, partNoList, false);
//获取上下文加工结果
String productResult = productionDispatchContextStepService.getProductResultContext(reqBean);
Map<String, MesPart> partMap = (Map<String, MesPart>) stepResult.getObj();
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveProduceSnData(reqBean, resultBean, stepResult, productionProcessContext, o, partMap, prodShiftContext, productResult));
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存零件条码成功!");
}
private void saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext, Map<String, MesPart> partMap, MesProdShiftContext prodShiftContext, String productResult) {
//根据零件条码ID查询零件条码信息
MesProduceSn produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsOutContext.getId());
if (null == produceSn) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件条码信息,产出零件条码[%s]ID[%s]信息不存在!", productionPsOutContext.getProductSn(), productionPsOutContext.getId()));
//零件信息
MesPart part = partMap.get(produceSn.getPartNo());
produceSn.setAreaCode(reqBean.getAreaCode());
produceSn.setWorkCenterCode(reqBean.getWorkCenterCode());
produceSn.setWorkCellCode(reqBean.getWorkCellCode());
produceSn.setRouteCode(reqBean.getRouteCode());
produceSn.setProcessCode(reqBean.getProcessCode());
produceSn.setCraftCode(productionProcessContext.getCraftCode());
//TODO 获取下个工艺代码
//produceSn.setNextCraftCode();
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate());
produceSn.setProdLabelTemplate(part.getProductLabelTemplate());
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
produceSn.setOutWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
produceSnRepository.save(produceSn);
}
}

@ -0,0 +1,77 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Description :
* @Author : zxw
**/
@Slf4j
@Service
public class MesProductSnSaveStepServiceBak extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
// 获取加工结果
String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean);
List<MesProductionPsOutContext> mesProduceSnContexts = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
List<MesProduceSn> mesProduceSns = new ArrayList<>();
if (CollectionUtils.isEmpty(mesProduceSnContexts)) {
foundExThrow(reqBean, "条码信息不能为空");
}
mesProduceSnContexts.forEach(mesProduceSnContext -> {
MesProduceSn mesProduceSn = new MesProduceSn();
//todo 要根据不同的加工结果,返回不同的结果 要分排序和非排序, 排序只保存工单对应的装配件、非排序要保存主条码和装配件记录。
// 如果是报废或者可疑需要编辑条码状态为不合格、并且nc判定需要新增一条记录
if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue(), result)) {
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
} else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) {
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue());
} else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue(), result)) {
mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue());
}
mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
mesProduceSns.add(mesProduceSn);
});
mesProduceSnRepository.saveAll(mesProduceSns);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存零件条码信息工步");
}
}

@ -257,7 +257,7 @@ public class MesProductSnScanNosortStepService extends BaseStepService {
}
////比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于 剩余待扫描主条码数量加上已扫描的空腔数量
////比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量
private StepResult checkFinishCodeSize(StepResult stepResult, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, Boolean scanInfoIsFinishCode) {
//没有产出零件 不需要对比空腔数量
@ -273,13 +273,13 @@ public class MesProductSnScanNosortStepService extends BaseStepService {
//剩余待扫描主条码数量
Integer remainSize = productionPartContextList.size() - (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()) - MesPcnExtConstWords.ONE;
return ppSize.compareTo(remainSize + psSize) < 0 ? stepResult : stepResult.isCompleted(false).msg(String.format("产出零件存在空腔数[%s],扫描的主条码空腔数[%s],当前主条码必须扫描空腔码!", ppSize, psSize));
return ppSize.compareTo(remainSize + psSize) <= 0 ? stepResult : stepResult.isCompleted(false).msg(String.format("产出零件存在空腔数[%s],扫描的主条码空腔数[%s],当前主条码必须扫描空腔码!", ppSize, psSize));
}
private Boolean checkIsAllFinishCode(List<MesProductionPsInContext> productionPsInContextList, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
//扫描场景 验证是否全部为空腔
Optional<MesProductionPsInContext> optional = productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
Optional<MesProductionPsInContext> optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst();
//已验证的主条码全部空腔 并且 当前待验证主条码不存在数据 则全部空腔
return ((null == optional || !optional.isPresent()) && CollectionUtils.isEmpty(equipVariableCollectContextList)) ? true : false;
}

@ -117,9 +117,23 @@ public class MesProductSnScanSortStepService extends BaseStepService {
//保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】
private StepResult saveScanProductSnContextSort(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<MesProductionPartContext> productionPartContextList) {
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
productionPartContextList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o.getWorkOrderNo(), TimeTool.getNowTime(true), o.getMessageSource())));
productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
for (MesProductionPartContext productionPartContext : productionPartContextList) {
if (null == productionPartContext) continue;
if (productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), productionPartContext.getWorkOrderNo(), TimeTool.getNowTime(true), productionPartContext.getMessageSource()));
else
productionPsInContextList.add(new MesProductionPsInContext().isFinishCode());
}
if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList);
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList);
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "根据加工单生成待验证主条码信息执行成功!");
}

@ -0,0 +1,69 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionDataSaveStepService")
public class MesProductionDataSaveStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//保存开模记录工步
//((IStepService) SpringContextsUtil.getBean("")).execute(reqBean);
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).execute(reqBean);
try {
TimeUnit.MILLISECONDS.sleep(5000L);
} catch (InterruptedException e) {
}
//加工异常处理工步【此工步未整改】
//((IStepService) SpringContextsUtil.getBean("mesProductResultErrorHandleStepService")).execute(reqBean);
//生成加工记录工步
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).execute(reqBean);
try {
TimeUnit.MILLISECONDS.sleep(5000L);
} catch (InterruptedException e) {
}
//保存装配记录工步
((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).execute(reqBean);
try {
TimeUnit.MILLISECONDS.sleep(5000L);
} catch (InterruptedException e) {
}
//生产汇报工步 【此工步未整改】
//((IStepService) SpringContextsUtil.getBean("mesReportGenerateStepService")).execute(reqBean);
//保存工单信息工步
//((IStepService) SpringContextsUtil.getBean("")).execute(reqBean);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "保存加工结果成功!");
}
}

@ -0,0 +1,132 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionRecordGenerateStepService")
public class MesProductionRecordGenerateStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesProductionRecordRepository productionRecordRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!");
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中不存在产出零件条码信息,请重置工序解决!");
//获取上下文(头道)模具号
MesEquipVariableCollectContext equipVariableCollectContext = productionDispatchContextStepService.getFirstMouldNoContext(reqBean);
if (null == equipVariableCollectContext) equipVariableCollectContext = productionDispatchContextStepService.getMouldNoContext(reqBean);
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
Map<Integer, MesProdRuleContext> prMap = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o));
//生成加工记录
String mouldNo = null != equipVariableCollectContext ? equipVariableCollectContext.getEquipVariableValue() : null;
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveProductionRecordData(reqBean, mouldNo, prodRuleContextList, productionProcessContext, o, prMap, cellEquipContext));
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成加工记录成功!");
}
private void saveProductionRecordData(StationRequestBean reqBean, String mouldNo, List<MesProdRuleContext> prodRuleContextList,
MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext, Map<Integer, MesProdRuleContext> prMap, MesCellEquipContext cellEquipContext) {
MesProdRuleContext prodRuleContext = CollectionUtils.isEmpty(prMap) ? null : prMap.get(productionPsOutContext.getForeignKey());
MesProductionRecord productionRecord = new MesProductionRecord();
BeanUtils.copyProperties(productionPsOutContext, productionRecord);
productionRecord.setMouldNo(mouldNo);
productionRecord.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionRecord.setEquipmentName(cellEquipContext.getEquipmentName());
productionRecord.setReportType((null != prodRuleContext && !StringUtils.isEmpty(prodRuleContext.getReportType())) ? prodRuleContext.getReportType() : MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue());
if (MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue() != productionRecord.getReportType()) productionRecord.setReportPartNo(productionPsOutContext.getPartNo());
productionRecord.setReportStatus(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue() != productionRecord.getReportType() ? MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue() : MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
productionRecord.setModuleStatisticsStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
productionRecord.setAreaCode(reqBean.getWorkCenterCode());
productionRecord.setWorkCenterCode(reqBean.getWorkCenterCode());
productionRecord.setWorkCellCode(reqBean.getWorkCellCode());
productionRecord.setProcessCode(reqBean.getProcessCode());
productionRecord.setCraftCode(productionProcessContext.getCraftCode());
//TODO 赋开模记录ID
//productionRecord.setMouldRecordId();
//TODO 工序开始时间
//productionRecord.setStartDateTime();
productionRecord.setIsComplete(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
productionRecord.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(productionRecord, reqBean.getUserInfo());
productionRecord.setCompleteDateTime(productionRecord.getModifyDatetime());
productionRecord = productionRecordRepository.insert(productionRecord);
if (null != prodRuleContext) prodRuleContextList.stream().filter(o -> (null != o &&
!StringUtils.isEmpty(o.getForeignKey()) && o.getForeignKey().compareTo(productionPsOutContext.getForeignKey()) == 0)).findFirst().get().productionRecordId(productionRecord.getId()).mouldNo(mouldNo);
}
}

@ -3,22 +3,20 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -38,7 +36,7 @@ import java.util.List;
**/
@Slf4j
@Service
public class MesProductionReocrdGenerateStepService extends BaseStepService {
public class MesProductionReocrdGenerateStepServiceBak extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@ -71,13 +69,14 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
*/
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
MesProdShiftContext mesProdShiftKvBean = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
List<MesProductionPsOutContext> mesProduceSnContexts = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
List<MesProductionRecord> mesProductionRecords = new ArrayList<>();
mesProduceSnContexts.forEach(mesProductionPsOutContext -> {
MesProductionRecord mesProductionRecord = getMesProductionRecord(productionProcessContext, mesProductionPsOutContext, reqBean);
MesProductionRecord mesProductionRecord = getMesProductionRecord(productionProcessContext, mesProductionPsOutContext,mesProdShiftKvBean, reqBean);
ConvertBean.serviceModelInitialize(mesProductionRecord, reqBean.getUserInfo());
mesProductionRecords.add(mesProductionRecord);
});
@ -91,7 +90,7 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成加工记录成功");
}
private MesProductionRecord getMesProductionRecord(MesProductionProcessContext productionProcessContext, MesProductionPsOutContext mesProduceSn, StationRequestBean reqBean) {
private MesProductionRecord getMesProductionRecord(MesProductionProcessContext productionProcessContext, MesProductionPsOutContext mesProduceSn,MesProdShiftContext mesProdShiftKvBean, StationRequestBean reqBean) {
MesProductionRecord mesProductionRecord = new MesProductionRecord();
mesProductionRecord.setSerialNumber(mesProduceSn.getSerialNumber());
@ -106,8 +105,9 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
mesProductionRecord.setIsComplete(MesEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesProductionRecord.setCompleteDateTime(DateUtil.formatDateTime(new Date()));
mesProductionRecord.setLotNo(mesProduceSn.getLotNo());
//mesProductionRecord.setShiftGroup();
//mesProductionRecord.setWorkOrderNo(productionProcessContext.get);
mesProductionRecord.setShiftGroup(mesProdShiftKvBean.getShiftGroup());
mesProductionRecord.setShiftCode(mesProdShiftKvBean.getShiftCode());
mesProductionRecord.setWorkOrderNo(mesProduceSn.getWorkOrderNo());
String mouldNo = "";
MesEquipVariableCollectContext mesFirstMouldNoCollectContext = mesProductionDispatchContextStepService.getFirstMouldNoContext(reqBean);
@ -124,11 +124,10 @@ public class MesProductionReocrdGenerateStepService extends BaseStepService {
mesProductionRecord.setProcessCode(mesProduceSn.getProcessCode());
mesProductionRecord.setReportPartNo(mesProduceSn.getPartNo());
mesProductionRecord.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue());
mesProductionRecord.setShiftCode(mesProduceSn.getShiftCode());
mesProductionRecord.setShiftGroup(mesProduceSn.getShiftGroup());
mesProductionRecord.setWorkOrderNo(mesProduceSn.getWorkOrderNo());
mesProductionRecord.setWorkCellCode(mesProduceSn.getWorkCellCode());
mesProductionRecord.setWorkCenterCode(mesProduceSn.getWorkCenterCode());
return mesProductionRecord;
}

@ -1,38 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
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.api.busi.IMesWorkOrderService;
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.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.List;
/**
* @Description :
@ -46,6 +29,9 @@ public class MesReportGenerateStepService extends BaseStepService {
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesReportNoSortStepService reportNoSortStepService;
@Autowired
@ -56,15 +42,16 @@ public class MesReportGenerateStepService extends BaseStepService {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
// todo 根据产线判断是排序还是非排序,然后调用排序或者非排序的报工工步
// //产品加工规则
// List<MesProdRuleContext> prodRuleDataContext = mesProductionDispatchContextStepService.getProdRuleDataContext(reqBean);
// //获取产成零件信息
// List<MesProductionPartContext> productionPartContext = mesProductionDispatchContextStepService.getProductionPartContext(reqBean);
//产品加工规则
// List<MesProdRuleContext> prodRuleDataContext = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//获取产成零件信息
// List<MesProductionPartContext> productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean);
//1. 校验当前有没有工单---只有有工单才能报工
//如果产品加工规则中的foreignKey 和 产成零件信息 一一对应的,查询MesProductionPartContext的工单号
// List<MesProductionPsOutContext> mesProduceSns = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
@ -56,16 +57,31 @@ public class MesReportNoSortStepService extends BaseStepService {
@Autowired
private MesProductPlanRepository mesProductPlanRDao;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
// todo 先不使用缓存中的数据
//1. 校验当前有没有工单---只有有工单才能报工
//如果产品加工规则中的foreignKey 和 产成零件信息 一一对应的,查询MesProductionPartContext的工单号
//产品加工规则
List<MesProdRuleContext> prodRuleDataContext = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
//如果产品加工规则中的foreignKey 和 mesProduceSns 一一对应的,
List<MesProductionPsOutContext> mesProduceSns = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
this.doProductReport(mesProduceSns, reqBean.getOrganizeCode(), reqBean.getUserInfo(),reqBean,resultBean);
//需要报工的条码
List<MesProductionPsOutContext> needReportSn = new ArrayList<>();
for (MesProductionPsOutContext sn : mesProduceSns) {
Integer foreignKey = sn.getForeignKey();
List<MesProdRuleContext> ruleContextList = prodRuleDataContext.stream().filter(rule -> Objects.equals(rule.getForeignKey(), foreignKey)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(ruleContextList)) {
Integer reportType = ruleContextList.get(0).getReportType();
if (MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == reportType){
needReportSn.add(sn);
}
}
}
this.doProductReport(needReportSn, reqBean.getOrganizeCode(), reqBean.getUserInfo(),reqBean,resultBean);
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "报工成功");
}

@ -1,105 +0,0 @@
/*
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
*/
/**
* @Description :
* @Author : zxw
**//*
@Slf4j
@Service
public class MesSaveAssemblyStepService extends BaseStepService {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private ActorSystem actorSystem;
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private MesVariableWhenFinishedReadStepService mesVariableWhenFinishedReadStepService;
@Autowired
private MesMouldRecordGenerateStepService mesMouldRecordGenerateStepService;
@Autowired
private MesProductSnSaveStepService MesProductSnSaveStepService;
@Autowired
private MesProductionReocrdGenerateStepService mesProductionReocrdGenerateStepService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@Autowired
private MesProductResultErrorHandleStepService mesProductResultErrorHandleStepService;
@Autowired
private MesReportGenerateStepService mesReportGenerateStepService;
public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT";
private static final Map<String, ActorRef> refMap = new ConcurrentHashMap<>(200);
@Override
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
*/
/**
*
*//*
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
List<MesProductionPsOutContext> mesProduceSnContexts = mesProductionDispatchContextStepService.getProductionPsOutContext(reqBean);
List<MesProductionRecord> mesProductionRecords = new ArrayList<>();
mesProduceSnContexts.forEach(mesProductionPsOutContext -> {
MesProductionRecord mesProductionRecord = getMesProductionRecord(productionProcessContext, mesProductionPsOutContext, reqBean);
ConvertBean.serviceModelInitialize(mesProductionRecord, reqBean.getUserInfo());
mesProductionRecords.add(mesProductionRecord);
});
mesProductionRecordRepository.saveAll(mesProductionRecords);
if (Objects.equal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),mesWorkCell.getIsCountFinish())) {
// 保存班次加工数量上下文
productionCustomContextStepService.addProductionStatisticsContext(reqBean,mesProduceSnContexts.size());
}
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成加工记录成功");
}
}
*/

@ -4,24 +4,15 @@ import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ActorMessage;
import cn.estsh.i3plus.mes.pcn.config.SpringExtProvider;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -51,7 +42,7 @@ public class MesSaveProcessResultStepService extends BaseStepService {
private MesProductSnSaveStepService MesProductSnSaveStepService;
@Autowired
private MesProductionReocrdGenerateStepService mesProductionReocrdGenerateStepService;
private MesProductionRecordGenerateStepService mesProductionRecordGenerateStepService;
@Autowired
private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService;
@ -82,7 +73,7 @@ public class MesSaveProcessResultStepService extends BaseStepService {
/**
*
*/
mesProductionReocrdGenerateStepService.execute(reqBean);
mesProductionRecordGenerateStepService.execute(reqBean);
/**
*
*/

@ -29,9 +29,11 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
@ -79,6 +81,8 @@ public class MesSendCavityGroupParamsCmdStepService extends BaseStepService {
//获取腔组数据信息集合
List<MesCavityGroupDetailCfg> mesCavityGroupDetailCfgs = productionProcessContext.getCavityGroupDetailList();
mesCavityGroupDetailCfgs = mesCavityGroupDetailCfgs.stream().sorted((o1, o2) -> o1.getSeq() - o2.getSeq()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(mesCavityGroupDetailCfgs)) {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "未找到腔组信息");
}
@ -97,7 +101,10 @@ public class MesSendCavityGroupParamsCmdStepService extends BaseStepService {
* @param mesCavityGroupDetailCfgs
*/
private void sendEquipParamsCmd(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, MesCellEquipContext cellEquipContext, List<MesCavityGroupDetailCfg> mesCavityGroupDetailCfgs) {
int index = 0;
for (MesCavityGroupDetailCfg mesCavityGroupDetailCfg : mesCavityGroupDetailCfgs) {
index ++;
// 获取加工参数
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesCavityGroupDetailCfg.getId(), "sourceId", ddlPackBean);
@ -112,16 +119,16 @@ public class MesSendCavityGroupParamsCmdStepService extends BaseStepService {
if (mesEquipmentVariable == null) {
continue;
}
execSendEquipParamsCmd(equipVariableRwExtService, reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), null);
execSendEquipParamsCmd(equipVariableRwExtService, reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), null, index);
}
}
}
private void execSendEquipParamsCmd(AbstractWriteVariableService equipVariableRwExtService, StationRequestBean reqBean,
String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey) {
String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey, Integer index) {
equipVariableRwExtService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey);
equipVariableRwExtService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey, index);
}

@ -5,18 +5,18 @@ import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.strategy.Abs
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesDefectWarnConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.*;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProdParamCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -78,32 +78,30 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService {
List<MesEquipmentVariable> mesEquipmentVariableList = new ArrayList<>();
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList = new ArrayList<>();
for (MesProdRuleContext mesProdRuleContext : prodRuleContextList) {
// 获取加工参数
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesProdRuleContext.getPid(), "sourceId", ddlPackBean);
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean);
for (MesEquipmentProdParamCfg mesEquipmentProdParamCfg : mesEquipmentProdParamCfgs) {//
String strategyClass = getStrateClass(mesEquipmentProdParamCfg.getMatchRule());
AbstractWriteVariableService equipVariableRwExtService = ((AbstractWriteVariableService) SpringContextsUtil.getBean(strategyClass));
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesEquipmentProdParamCfg.getEquipVariableId(), "id", packBean);
MesEquipmentVariable mesEquipmentVariable = mesEquipmentVariableRepository.getByProperty(packBean);
if (mesEquipmentVariable == null) {
continue;
}
mesEquipmentVariableList.add(mesEquipmentVariable);
mesEquipmentProdParamCfgList.add(mesEquipmentProdParamCfg);
execSendEquipParamsCmd(equipVariableRwExtService, reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), mesProdRuleContext.getForeignKey());
// 获取加工参数 分排序和非排序
mesEquipmentProdParamCfgList = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList);
for (MesEquipmentProdParamCfg mesEquipmentProdParamCfg : mesEquipmentProdParamCfgList) {//
String strategyClass = getStrateClass(mesEquipmentProdParamCfg.getMatchRule());
AbstractWriteVariableService equipVariableRwExtService = ((AbstractWriteVariableService) SpringContextsUtil.getBean(strategyClass));
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesEquipmentProdParamCfg.getEquipVariableId(), "id", packBean);
MesEquipmentVariable mesEquipmentVariable = mesEquipmentVariableRepository.getByProperty(packBean);
if (mesEquipmentVariable == null) {
continue;
}
}
mesEquipmentVariableList.add(mesEquipmentVariable);
mesEquipmentProdParamCfgList.add(mesEquipmentProdParamCfg);
execSendEquipParamsCmd(equipVariableRwExtService, reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), null);
Map<String, List<MesEquipmentProdParamCfg>> map = mesEquipmentProdParamCfgList.stream().collect(Collectors.groupingBy(MesEquipmentProdParamCfg::getMatchRule));
}
/* Map<String, List<MesEquipmentProdParamCfg>> map = mesEquipmentProdParamCfgList.stream().collect(Collectors.groupingBy(MesEquipmentProdParamCfg::getMatchRule));
Map<String, List<MesEquipmentVariable>> mapVariable = mesEquipmentVariableList.stream().collect(Collectors.groupingBy(mesEquipmentVariable -> mesEquipmentVariable.getId() + ""));
*/
/* map.forEach((k, v) -> {
String strategyClass = getStrateClass(k);
AbstractWriteVariableService equipVariableRwExtService = ((AbstractWriteVariableService) SpringContextsUtil.getBean(strategyClass));
@ -117,10 +115,56 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService {
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "发送加工参数成功");
}
/**
*
* @param reqBean
* @param prodRuleContextList
* @param mesEquipmentProdParamCfgList
* @return
*/
private List<MesEquipmentProdParamCfg> getMesEquipmentProdParamCfgs(StationRequestBean reqBean, List<MesProdRuleContext> prodRuleContextList, List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgList) {
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
for (MesProdRuleContext mesProdRuleContext : prodRuleContextList) {
List<MesEquipmentProdParamCfg> mesEquipmentProdParamCfgs= new ArrayList<>();
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//排序线 主条码验证工步
// 获取加工参数
if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()){
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getNumEqualPack(mesProdRuleContext.getPid(), "sourceId", ddlPackBean);
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean);
} else {
MesWorkCenter mesWorkCenter = new MesWorkCenter();
mesWorkCenter.setWorkCenterCode(reqBean.getWorkCenterCode());
List<MesProductionAssemblyContext> assemblyDataContext = mesProdRuleContext.getAssemblyDataContext(mesWorkCenter);
List<Long> sourceIds = assemblyDataContext.stream().map(MesProductionAssemblyContext::getSourceId).collect(Collectors.toList());
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getInPackList(sourceIds, "sourceId", ddlPackBean);
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean);
}
if (!CollectionUtils.isEmpty(mesEquipmentProdParamCfgs)) {
mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgs.stream().distinct().collect(Collectors.toList());
mesEquipmentProdParamCfgList.addAll(mesEquipmentProdParamCfgs);
}
}
mesEquipmentProdParamCfgList = mesEquipmentProdParamCfgList.stream().distinct().collect(Collectors.toList());
return mesEquipmentProdParamCfgList;
}
private void execSendEquipParamsCmd(AbstractWriteVariableService equipVariableRwExtService, StationRequestBean reqBean,
String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey) {
equipVariableRwExtService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey);
equipVariableRwExtService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey, null);
}

@ -8,6 +8,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
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.ActorMessage;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesOrderModel;
import cn.estsh.i3plus.mes.pcn.config.SpringExtProvider;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
@ -22,9 +23,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* @Description :
@ -73,7 +76,11 @@ public class MesVariableWhenFinishedReadStepService extends BaseStepService {
// 通过上下文获取工位设备信息
MesCellEquipContext curCellEquip = productionProcessContext.getCurCellEquip();
String mesProduceSnsStr = !CollectionUtils.isEmpty(mesProduceSnContexts) ? JSONObject.toJSONString(mesProduceSnContexts) : null;
List<MesOrderModel> modelList = mesProduceSnContexts.stream().map(order ->
MesOrderModel.builder().workOrderNo(order.getWorkOrderNo()).productSn(order.getProductSn()).partNo(order.getPartNo()).build()
).collect(Collectors.toList());
String mesProduceSnsStr = !CollectionUtils.isEmpty(modelList) ? JSONObject.toJSONString(modelList) : null;
ActorMessage actorMessage = ActorMessage.builder()
.equipmentCode(curCellEquip.getEquipmentCode())
.equipId(curCellEquip.getEquipId())

@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepServ
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
@ -35,11 +36,21 @@ public class MesWorkOrderSaveStepService extends BaseStepService {
public StepResult execute(StationRequestBean reqBean) {
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//1. 获取上下文中的MesProductionPartContext
//1. 获取上下文中的MesProductionPartContext 产出零件
List<MesProductionPartContext> productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean);
if (productionPartContext.isEmpty()){
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "没有可保存的加工单信息");
}
// 判断为空腔 isFinishedCode = true 就是空腔
// stream 过滤 isFinishedCode = false 并且 foreignKey != null 并且 加工单code 为不为空;
List<MesProductionPartContext> filteredPartContext = productionPartContext.stream().filter(item -> item.getIsFinishCode() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() && item.getForeignKey() != null && item.getWorkOrderNo() != null).collect(Collectors.toList());
if (filteredPartContext.isEmpty()){
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "过滤后,没有可保存的加工单信息");
}
// 怎么判断条码生成过了? 看产出零件和入料in 要判端relateId有值也需要新增, out生成条码 上下文
// 如果没有in 需要加,
// 如果有out条码,则判断id是否为空不为空则是新生成的
//2. 判断是否为空,id是否为空如果没有则返回,id为工单id
List<MesProductionPartContext> collectContext = productionPartContext.stream().filter(item -> item.getId() != null).collect(Collectors.toList());
//3. 如果id不为空查询工单信息

@ -204,7 +204,7 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
List<StationKvBean> stationKvBeans = getProductionStatisticsContext(reqBean);
if (CollectionUtils.isEmpty(stationKvBeans)) {
String name = "加数";
String name = "加数";
String value = count + "";
List<StationKvBean> generateStationKvBeans = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(key, name, value),
new StationKvBean("color", "颜色", MesExtEnumUtil.COLOR.BLACK.getValue()));

@ -60,7 +60,7 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
return getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCT_RESULT_CONTEXT);
}
//保存上下文加工结果 加工结果:成功/报废/可疑 【写入的值是变量类别代码】【报废/可疑: 在保存逻辑条码时有特殊业务处理】
//保存上下文加工结果 加工结果:成功/报废/可疑 【写入的值是变量类别代码对应的条码质量状态】【报废/可疑: 在保存逻辑条码时有特殊业务处理】
@Override
public Boolean saveProductResultContext(StationRequestBean reqBean, String productResult) {
if (StringUtils.isEmpty(productResult)) return false;

@ -49,7 +49,6 @@ public class MesAssemblyShowContext implements Serializable {
@ApiParam("序号")
private Integer index;
public MesAssemblyShowContext index(Integer index){
this.index = index;
return this;

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiParam;
@ -91,6 +92,9 @@ public class MesEquipVariableCollectContext implements Serializable {
@ApiParam("信息来源")
private Integer messageSource;
@ApiParam("是否被消费")
private Integer isConsume = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
public MesEquipVariableCollectContext() {}
public MesEquipVariableCollectContext(Long equipVariableId) {
@ -113,4 +117,9 @@ public class MesEquipVariableCollectContext implements Serializable {
this.messageSource = MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue();
}
public MesEquipVariableCollectContext isConsume() {
this.isConsume = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
}

@ -30,6 +30,12 @@ public class MesProdRuleContext implements Serializable {
@ApiParam(name = "数据关联键")
private Integer foreignKey;
@ApiParam("加工记录ID")
private Long productionRecordId;
@ApiParam("模具号")
private String mouldNo;
@ApiParam(name = "工单号,不一定有值")
private String workOrderNo;
@ -48,6 +54,9 @@ public class MesProdRuleContext implements Serializable {
@ApiParam("工序代码")
public String processCode;
@ApiParam("工艺代码")
private String craftCode;
@ApiParam(name = "是否验证装配件扫描顺序")
private Integer isCheckBindSeq;
@ -111,11 +120,12 @@ public class MesProdRuleContext implements Serializable {
this.organizeCode = organizeCode;
}
public MesProdRuleContext(String organizeCode, String workCenterCode, String workCellCode, String processCode) {
public MesProdRuleContext(String organizeCode, String workCenterCode, String workCellCode, String processCode, String craftCode) {
this.organizeCode = organizeCode;
this.workCenterCode = workCenterCode;
this.workCellCode = workCellCode;
this.processCode = processCode;
this.craftCode = craftCode;
}
public MesProdRuleContext copy(MesProdRuleNosortCfg prodRuleNosortCfg) {
@ -139,6 +149,16 @@ public class MesProdRuleContext implements Serializable {
return this;
}
public MesProdRuleContext productionRecordId(Long productionRecordId) {
this.productionRecordId = productionRecordId;
return this;
}
public MesProdRuleContext mouldNo(String mouldNo) {
this.mouldNo = mouldNo;
return this;
}
public MesProdRuleContext inPartIsEmpty() {
this.inPartIsEmpty = true;
return this;
@ -208,7 +228,7 @@ public class MesProdRuleContext implements Serializable {
}
//非排序装配件清单
public List<MesProductionAssemblyNosortContext> getNosortAssemblyDataContext() {
public List<MesProductionAssemblyNosortContext> /**/getNosortAssemblyDataContext() {
List<MesProductionAssemblyNosortContext> nosortAssemblyList = !StringUtils.isEmpty(this.assemblyDataJson) ? JSONObject.parseArray(this.assemblyDataJson, MesProductionAssemblyNosortContext.class) : null;
return CollectionUtils.isEmpty(nosortAssemblyList) ? null : nosortAssemblyList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProductionAssemblyNosortContext::getRouteSeq)).collect(Collectors.toList());
}

@ -13,9 +13,6 @@ public class MesProductionAssemblyContext implements Serializable {
private static final long serialVersionUID = 2382117884422723639L;
@ApiParam("加工记录ID")
public Long productionRecordId;
@ApiParam("装配件零件编码")
public String assemblyPartNo;
@ -25,45 +22,24 @@ public class MesProductionAssemblyContext implements Serializable {
@ApiParam("装配件条码")
public String assemblySn;
@ApiParam("过程条码")
public String serialNumber;
@ApiParam("零件条码")
public String productSn;
@ApiParam("客户条码")
public String custSn;
@ApiParam("生产工单零件号")
public String partNo;
@ApiParam("生产工单零件名称")
public String partName;
@ApiParam("装配零件类型")
public Integer assemblyPartType;
@ApiParam("装配零件状态")
public Integer assemblyStatus;
@ApiParam("是否跳过")
public Integer isSkip;
@ApiParam("开模记录ID")
public String mouldRecordId;
@ApiParam("模具号")
public String mouldNo;
@ApiParam("装配件条码确认方式")
public Integer matchType;
@ApiParam("扫描规则")
public String matchRule;
@ApiParam("数据来源")
public Integer dataSource;
@ApiParam("来源ID")
public Long sourceId;

@ -33,8 +33,9 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
public MesProductionAssemblyNosortContext() {}
public MesProductionAssemblyNosortContext copy(MesAssemblyNosortCfg assemblyNosortCfg, MesProdRuleContext prodRuleContext) {
if (null != assemblyNosortCfg) BeanUtils.copyProperties(assemblyNosortCfg, this);
if (null != prodRuleContext) BeanUtils.copyProperties(prodRuleContext, this);
BeanUtils.copyProperties(assemblyNosortCfg, this);
BeanUtils.copyProperties(prodRuleContext, this);
this.sourceId = assemblyNosortCfg.getId();
this.partNo = prodRuleContext.getOutPartNo();
if (StringUtils.isEmpty(this.routeSeq)) this.routeSeq = MesPcnExtConstWords.ZERO;
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue();
@ -43,4 +44,14 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
return this;
}
public MesProductionAssemblyNosortContext assemblyStatus() {
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
return this;
}
public MesProductionAssemblyNosortContext assemblySn(String assemblySn) {
this.assemblySn = assemblySn;
return this;
}
}

@ -118,4 +118,14 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte
return this;
}
public MesProductionAssemblySortContext assemblyStatus() {
this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue();
return this;
}
public MesProductionAssemblySortContext assemblySn(String assemblySn) {
this.assemblySn = assemblySn;
return this;
}
}

@ -31,6 +31,12 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("生产工单号")
private String workOrderNo;
@ApiParam("客户代码")
private String custCode;
@ApiParam("客户零件号")
private String custPartNo;
@ApiParam("工单数量")
private Double qty;
@ -56,6 +62,7 @@ public class MesProductionPartContext implements Serializable {
@ApiParam("信息来源")
private Integer messageSource;
//根据一模多腔赋值
public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) {
BeanUtils.copyProperties(mouldMultiCavity, this, MesPcnExtConstWords.ID);

@ -1,8 +1,12 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
@ -14,7 +18,24 @@ public class MesProductionPsOutContext extends MesProduceSn implements Serializa
private static final long serialVersionUID = 5562937531822977296L;
@ApiParam(name = "数据关联键 非排序:snowflakeId")
private String foreignKey;
@ApiParam(name = "数据关联键")
private Integer foreignKey;
@ApiParam(name = "是否计算工单完成数量")
private Integer isCalcCompleteQty = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
public MesProductionPsOutContext() {}
public MesProductionPsOutContext copy(MesProduceSn produceSn, Integer foreignKey) {
if (null == produceSn) return null;
BeanUtils.copyProperties(produceSn, this);
this.foreignKey = foreignKey;
return this;
}
public MesProductionPsOutContext isCalcCompleteQty(String workOrderNo) {
if (!StringUtils.isEmpty(workOrderNo)) this.isCalcCompleteQty = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;
}
}

@ -0,0 +1,27 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import io.swagger.annotations.ApiParam;
import lombok.Builder;
import lombok.Data;
import javax.persistence.Column;
import java.io.Serializable;
/**
*
*/
@Data
@Builder
public class MesOrderModel implements Serializable {
@ApiParam("产品条码")
private String productSn;
@ApiParam("生产工单号")
private String workOrderNo;
@ApiParam("物料号")
private String partNo;
}

@ -215,6 +215,9 @@ public class MesPcnExtConstWords {
// :
public static final String COLON = ":";
//过程条码默认生成规则
public static final String DEFAULT_SERIAL_NUMBER_RULE = "DEFAULT_SERIAL_NUMBER_RULE";
// 定制页面名称(默认)
public static final String CUSTOM_PAGE_NAME_DEFAULT = "CUSTOM_PAGE_NAME_DEFAULT";

Loading…
Cancel
Save