using Microsoft.AspNetCore.Http.HttpResults; using System; using System.Text.RegularExpressions; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; namespace ZR.Service.Utils { public class MaterialUtils : BaseService { private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 解析测试 /// /// 测试字符串 /// public string ResolutionTestUtil(string str) { try { // 定义正则表达式模式 string partnumberPattern = @"ERP(\w+)PQ"; // 产品零件号 string quantityPattern = @"PQ(\d+)D"; // 产品数量 string batchCodePattern = @"D(\d+)S"; // 产品生产批次 // 使用正则表达式进行匹配 Match partnumberMatch = Regex.Match(str, partnumberPattern); Match quantityMatch = Regex.Match(str, quantityPattern); Match batchCodeMatch = Regex.Match(str, batchCodePattern); // 创建接收 string partnumber = ""; string quantity = ""; string batchCode = ""; // 判断解析是否成功 if (!partnumberMatch.Success) { throw new Exception("解析零件号失败"); } if (!quantityMatch.Success) { throw new Exception("解析产品数量失败"); } if (!batchCodeMatch.Success) { throw new Exception("解析产品生产批次失败"); } partnumber = partnumberMatch.Groups[1].Value; quantity = quantityMatch.Groups[1].Value; batchCode = batchCodeMatch.Groups[1].Value; return batchCode; } catch (Exception e) { throw new Exception("解析失败" + e.Message); } } //解析外箱标签码 public ResultionPackageCodeDto ResolutionPackage(string code) { if (code.Contains('^')) { // 初步进行解析检测,增加解析成功率 string[] splitstr = code.Split('^'); if (splitstr.Length < 1) { return null; } // 第一类 if (splitstr[0].Contains("Code=")) { return ResolutionPackagecode1(code); } // 第二类 if (splitstr[3].Contains("Cd=")) { return ResolutionPackagecode2(code); } } // 解析失败 return null; } /// /// 1-解析鲨鱼鳍外箱标签码 /// /// /// private ResultionPackageCodeDto ResolutionPackagecode1(string packagecode) { ResultionPackageCodeDto resultionPackageCode = new ResultionPackageCodeDto(); try { resultionPackageCode.originalCode = packagecode; // 解析外箱标签码 string[] splitstr = packagecode.Split('^'); // 解析批次号 resultionPackageCode.PatchCode = splitstr[0].Substring(5); // 解析零件号 string partnumber = splitstr[1].Substring(11); // 有的零件号带了-FL,不是很标准 resultionPackageCode.PartNumner = partnumber; // 解析工单号 工单号会带个W,需要去掉 string workoderidid = splitstr[2].Substring(7); resultionPackageCode.WorkoderID = workoderidid; // 解析生产时间 工单号生产时间提取 resultionPackageCode.ProductionTime = string.Concat("20", workoderidid.AsSpan(0, 6)); // 解析箱子中产品数量 string product_num = splitstr[3].Substring(4); resultionPackageCode.Quantity = int.Parse(product_num); // 解析产品描述 partnumber 从物料列表抓取数据 WmMaterial material = Context.Queryable().Where(it => it.Partnumber == partnumber).First(); if (material == null) { resultionPackageCode.ProductionDescribe = "物料记录未录入此零件号信息!"; return resultionPackageCode; } string des1 = material.Description; string des2 = material.ProductName; if (!string.IsNullOrEmpty(des1)) { resultionPackageCode.ProductionDescribe = des1; } else if (!string.IsNullOrEmpty(des2)) { resultionPackageCode.ProductionDescribe = des2; } return resultionPackageCode; } catch (Exception ex) { logger.Error($"外箱标签码,解析失败 {ex.Message}"); return null; } } // 2-解析门把手 private ResultionPackageCodeDto ResolutionPackagecode2(string packagecode) { ResultionPackageCodeDto resultionPackageCode = new ResultionPackageCodeDto(); try { // 原始编码 resultionPackageCode.originalCode = packagecode; // 解析外箱标签码 string[] splitstr = packagecode.Split('^'); // 解析批次号 resultionPackageCode.PatchCode = splitstr[3].Substring(3); // 解析零件号 string partnumber = splitstr[5].Substring(3); resultionPackageCode.PartNumner = partnumber; // 解析工单号 string workoderidid = splitstr[3].Substring(6, 9); resultionPackageCode.WorkoderID = workoderidid; // 生产时间 resultionPackageCode.ProductionTime = "20" + workoderidid.Substring(0, 6); //todo 解析箱子中产品数量 string product_num = splitstr[4].Substring(3); resultionPackageCode.Quantity = int.Parse(product_num); // 解析产品描述 partnumber 从物料列表抓取数据 WmMaterial material = Context.Queryable().Where(it => it.Partnumber == partnumber).First(); if (material == null) { resultionPackageCode.ProductionDescribe = "物料记录未录入此零件号信息!"; return resultionPackageCode; } string des1 = material.Description; string des2 = material.ProductName; if (!string.IsNullOrEmpty(des1)) { resultionPackageCode.ProductionDescribe = des1; } else if (!string.IsNullOrEmpty(des2)) { resultionPackageCode.ProductionDescribe = des2; } else { resultionPackageCode.ProductionDescribe = "物料记录内未填写详情信息!"; } return resultionPackageCode; } catch (Exception ex) { logger.Error($"外箱标签码,解析失败 {ex.Message}"); return null; } } } }