服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-12-20 834eb24341e32855a731cfaa48851d3f0a650dc5
重构Barcode到WMS Business
已删除2个文件
已修改4个文件
已添加5个文件
2229 ■■■■ 文件已修改
Tiger.Api.sln 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode.Analysis.cs 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode.cs 650 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode/Barcode.cs 718 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.cs 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/CustSupplyCheckingNew.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OtherInLocationChecking.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/WMS_ITEM_Biz.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMSTests/Common/CommonTests.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMSTests/Tiger.Business.WMSTests.csproj 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api.sln
@@ -43,12 +43,17 @@
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tiger.IBusiness.MES", "Tiger.IBusiness.MES\Tiger.IBusiness.MES.csproj", "{07B13ED4-77D9-4B9C-9375-91B7ED371422}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "05-引用依赖", "05-引用依赖", "{80347AC9-C069-4DF6-B3D3-E8B242E741F5}"
    ProjectSection(SolutionItems) = preProject
        .gitignore = .gitignore
    EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.Dependencies", "Tiger.Dependencies\Tiger.Dependencies.csproj", "{25510DCE-19CC-4FF6-926B-3036120D37B6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.Api.Core", "Tiger.Api.Core\Tiger.Api.Core.csproj", "{FE25D100-75C9-4DE3-8CDA-EA9AA4677CF4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.Controllers.System", "Tiger.Controllers.System\Tiger.Controllers.System.csproj", "{10DF128C-B6BB-496B-96B0-64512D0E1D00}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.Business.WMSTests", "Tiger.Business.WMSTests\Tiger.Business.WMSTests.csproj", "{63B2C6B6-AC76-4CC7-8142-91871D6C45D1}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -178,6 +183,14 @@
        {10DF128C-B6BB-496B-96B0-64512D0E1D00}.Release|Any CPU.Build.0 = Release|Any CPU
        {10DF128C-B6BB-496B-96B0-64512D0E1D00}.Release|x86.ActiveCfg = Release|Any CPU
        {10DF128C-B6BB-496B-96B0-64512D0E1D00}.Release|x86.Build.0 = Release|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Debug|x86.ActiveCfg = Debug|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Debug|x86.Build.0 = Debug|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Release|Any CPU.Build.0 = Release|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Release|x86.ActiveCfg = Release|Any CPU
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1}.Release|x86.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
@@ -199,6 +212,7 @@
        {25510DCE-19CC-4FF6-926B-3036120D37B6} = {80347AC9-C069-4DF6-B3D3-E8B242E741F5}
        {FE25D100-75C9-4DE3-8CDA-EA9AA4677CF4} = {FF44BF62-08C5-4B52-B24F-54CD79E96848}
        {10DF128C-B6BB-496B-96B0-64512D0E1D00} = {457563B5-E42C-448A-A924-FBEE9B585A81}
        {63B2C6B6-AC76-4CC7-8142-91871D6C45D1} = {CF29B377-FE5A-488A-AF99-DF9D9C6FCA95}
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {797A1D83-9F3C-4AEC-8A83-E3468102DBD1}
Tiger.Business.WMS/Common/Barcode.Analysis.cs
ÎļþÒÑɾ³ý
Tiger.Business.WMS/Common/Barcode.cs
ÎļþÒÑɾ³ý
Tiger.Business.WMS/Common/Barcode/Barcode.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,718 @@
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åŸºç±»
    /// </summary>
    public class Barcode
    {
        public Barcode(string metaSn)
        {
            SetAnalysisRule();
            Analyse(MetaSn = metaSn);
        }
        /// <summary>
        /// æ¡ç ï¼ˆè§£æžåŽçš„æ¡ç ï¼‰
        /// </summary>
        private List<BarcodeAnalysis> Analyses { get; set; } = new();
        /// <summary>
        /// æ¡ç ï¼ˆè§£æžåŽçš„æ¡ç ï¼‰
        /// </summary>
        public string SN { get; set; }
        /// <summary>
        /// å…ƒæ¡ç ï¼ˆæ‰«æåˆ°çš„æ¡ç ï¼‰
        /// </summary>
        public string MetaSn { get; set; }
        /// <summary>
        /// æ¡ç ç±»åž‹
        /// </summary>
        public Types Type { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public ItemTypes ItemType { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public string ItemCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string ItemName { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸç¼–码
        /// </summary>
        public string DateCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        public string ProdDateStr { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        public DateTime? ProdDate { get => BarcodeAnalysis.GetDateTime(ProdDateStr) ?? BarcodeAnalysis.GetDateTime(PrintDateStr); }
        /// <summary>
        /// æ‰“印日期
        /// </summary>
        public string PrintDateStr { get; set; }
        /// <summary>
        /// ä¾›åº”商代码
        /// </summary>
        public string SupplierCode { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        public string LotNo { get; set; }
        /// <summary>
        /// è®¢å•号
        /// </summary>
        public string OrderNo { get; set; }
        /// <summary>
        /// è®¢å•行号
        /// </summary>
        public string OrderLine { get; set; }
        /// <summary>
        /// åˆ¶é€ å•†/代工厂料号
        /// </summary>
        public string OEMItemCode { get; set; }
        /// <summary>
        /// æµæ°´ç 
        /// </summary>
        public string SerialNoStr { get; set; }
        /// <summary>
        /// æµæ°´ç 
        /// </summary>
        public int? SerialNo { get => BarcodeAnalysis.GetSerialNo(SerialNoStr); }
        /// <summary>
        /// å•位
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public string QtyStr { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public decimal? Qty { get => Convert.ToDecimal(BarcodeAnalysis.GetDouble(QtyStr)); }
        /// <summary>
        /// æ¯›é‡
        /// </summary>
        public string GrossWeightStr { get; set; }
        /// <summary>
        /// æ¯›é‡
        /// </summary>
        public double? GrossWeight { get => BarcodeAnalysis.GetDouble(GrossWeightStr); }
        /// <summary>
        /// æ–™å·é•¿åº¦
        /// </summary>
        public int ItemLength { get; set; }
        /// <summary>
        /// æ¡ç åˆ†æžå¼‚常信息
        /// </summary>
        public Exception AnalyseException { get; set; }
        /// <summary>
        /// æ¡ç æ˜¯å¦åˆ†æžå¼‚常
        /// </summary>
        public bool IsException { get => !AnalyseException.IsNullOrEmpty(); }
        /// <summary>
        /// æ¡ç æ˜¯å¦åˆæ³•
        /// </summary>
        public bool IsRegular { get => Type != Types.Illegal; }
        /// <summary>
        /// æ¡ç æ˜¯å¦åŽŸææ–™æ¡ç 
        /// </summary>
        public bool IsMaterialSN { get => !(new List<ItemTypes>() { ItemTypes.RawMaterial }).Contains(ItemType); }
        /// <summary>
        /// æ ‡ç­¾é‡æ‰“流水码字符
        /// </summary>
        public string ReprintNoStr { get; set; }
        /// <summary>
        /// æ ‡ç­¾é‡æ‰“流水码
        /// </summary>
        public int? ReprintNo => BarcodeAnalysis.GetReprintNo(ReprintNoStr);
        /// <summary>
        /// æ ‡ç­¾é‡æ‰“一级业务编码
        /// </summary>
        public string ReprintBizCode1 { get; set; }
        /// <summary>
        /// æ ‡ç­¾é‡æ‰“二级业务编码
        /// </summary>
        public string ReprintBizCode2 { get; set; }
        /// <summary>
        /// æ˜¯å¦é‡æ‰“标签
        /// </summary>
        public bool IsReprintSn => SN.Contains("_");
        /// <summary>
        /// æ˜¯å¦æˆªæ–™é‡æ‰“标签
        /// </summary>
        public bool IsCutSn => ReprintBizCode1 == "C";
        /// <summary>
        /// æ˜¯å¦é€€æ–™é‡æ‰“标签
        /// </summary>
        public bool IsReturnSn => ReprintBizCode1 == "T";
        /// <summary>
        /// æ˜¯å¦äºŒç»´ç 
        /// </summary>
        public bool IsQRCode => MetaSn.Contains(",");
        public enum Types
        {
            /// <summary>
            /// éžæ³•条码
            /// </summary>
            [Description("非法条码")]
            Illegal,
            /// <summary>
            /// å”¯ä¸€ID
            /// </summary>
            [Description("最小包装标签")]
            MiniPackage,
            /// <summary>
            /// ä¸­åŒ…标签
            /// </summary>
            [Description("内包装标签")]
            InnerPackage,
            /// <summary>
            /// å¤–包标签
            /// </summary>
            [Description("外包装标签")]
            OuterPackage,
            /// <summary>
            /// æ ˆæ¿æ¡ç 
            /// </summary>
            [Description("栈板条码")]
            Pallet,
            /// <summary>
            /// å…¶ä»–标签条码
            /// </summary>
            [Description("其他标签")]
            Other,
        }
        public enum ItemTypes
        {
            [Description("未知类型")]
            Unknown,
            [Description("湿敏元件")]
            HumidityMaterial,
            [Description("半成品")]
            SemiProduct,
            [Description("SMT半成品")]
            SmtSemiProduct,
            [Description("DIP半成品")]
            DipSemiProduct,
            [Description("成品")]
            Product,
            [Description("PCB")]
            PCB,
            [Description("辅料")]
            SubsidiaryMaterial,
            [Description("原材料")]
            RawMaterial,
        }
        /// <summary>
        /// è®¾ç½®æ¡ç åˆ†æžéªŒè¯è§„则
        /// </summary>
        public void SetAnalysisRule()
        {
            Analyses.Clear();
            Analyses.Add(new YadaBarcode());
            Analyses.Add(new BarcodeAnalysis());
        }
        /// <summary>
        /// æ¡ç åˆ†æž
        /// </summary>
        /// <param name="metaSn"></param>
        public void Analyse(string metaSn)
        {
            SN = metaSn;
            Type = Types.Illegal;
            ItemType = ItemTypes.Unknown;
            AnalyseException = null;
            try
            {
                foreach (var rule in Analyses)
                {
                    var result = rule.Analyse(this);
                    if (result.IsSuccessed)
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                AnalyseException = ex;
            }
        }
        /// <summary>
        /// æ˜¯å¦ä¸Žä¼ å…¥çš„æ¡ç ç›¸åŒçš„生产日期
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public bool IsSameProdDate(string sn)
        {
            return (ProdDate ?? DateTime.MaxValue).Date == ((new Barcode(sn)).ProdDate ?? DateTime.MinValue).Date;
        }
        /// <summary>
        /// æ˜¯å¦å°äºŽç­‰äºŽä¼ å…¥çš„æ¡ç çš„生产日期
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public bool IsPriorProdDate(string sn)
        {
            return (ProdDate ?? DateTime.MaxValue).Date <= ((new Barcode(sn)).ProdDate ?? DateTime.MinValue).Date;
        }
        ///// <summary>
        ///// æ¡ç åˆ†æž
        ///// </summary>
        ///// <param name="metaSn"></param>
        //public void Analyse(string metaSn)
        //{
        //    SN = metaSn;
        //    Type = Types.Illegal;
        //    ItemType = ItemTypes.Unknown;
        //    AnalyseException = null;
        //    try
        //    {
        //        if (!string.IsNullOrEmpty(SN))
        //        {
        //            string[] parts = (metaSn ?? "").Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
        //            if (parts.Length > 1 && parts.Any(q => q.StartsWith("S")))
        //            {
        //                foreach (var part in parts.OrderBy(q => q.FirstOrDefault()))
        //                {
        //                    var param = part.First().ToString().ToUpper();
        //                    var content = part.Substring(1);
        //                    switch (param)
        //                    {
        //                        case "S"://PAG ID (SN)
        //                            var snParts = (content ?? "").Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
        //                            SN = content;
        //                            Type = Types.Other;
        //                            if (SN.StartsWith("C") && SN.Length > 14)
        //                            {
        //                                SupplierCode = SN.Substring(1, 5);
        //                                PrintDateStr = SN.Substring(6, 8);
        //                                SerialNoStr = SN.Substring(14);
        //                                if (ProdDate != null && SerialNo != null)
        //                                {
        //                                    Type = Types.Middle;
        //                                    ItemType = ItemTypes.RawMaterial;
        //                                }
        //                            }
        //                            else if (SN.StartsWith("P") && SN.Length > 14)
        //                            {
        //                                SupplierCode = SN.Substring(1, 5);
        //                                PrintDateStr = SN.Substring(6, 8);
        //                                SerialNoStr = SN.Substring(14);
        //                                if (ProdDate != null && SerialNo != null)
        //                                {
        //                                    Type = Types.Outer;
        //                                    ItemType = ItemTypes.RawMaterial;
        //                                }
        //                            }
        //                            else if (SN.Length > 13)
        //                            {
        //                                SupplierCode = SN.Substring(0, 5);
        //                                PrintDateStr = SN.Substring(5, 8);
        //                                SerialNoStr = SN.Substring(13);
        //                                if (ProdDate != null && SerialNo != null)
        //                                {
        //                                    Type = Types.Small;
        //                                    ItemType = ItemTypes.RawMaterial;
        //                                }
        //                            }
        //                            //是否重打判断
        //                            if(snParts.Count() >1 && snParts[1].Length > 2)
        //                            {
        //                                ReprintBizCode1 = snParts[1][0].ToString();
        //                                ReprintBizCode2 = snParts[1][1].ToString();
        //                                ReprintNoStr = snParts[1].Substring(2);
        //                            }
        //                            break;
        //                        case "V"://送货单号
        //                            OrderNo = content;
        //                            break;
        //                        case "P"://物料编码
        //                            ItemCode = content;
        //                            break;
        //                        case "N"://物料编码
        //                            ItemName = content;
        //                            break;
        //                        case "Q"://物料数量
        //                            QtyStr = content;
        //                            break;
        //                        case "U"://物料单位
        //                            Unit = content;
        //                            break;
        //                        case "M"://制造商料号
        //                            OEMItemCode = content;
        //                            break;
        //                        case "D"://生产日期
        //                            DateCode = content;
        //                            ProdDateStr = content;
        //                            break;
        //                        case "L"://生产批次
        //                            LotNo = content;
        //                            break;
        //                        case "G"://物料毛重
        //                            GrossWeightStr = content;
        //                            break;
        //                        default:
        //                            break;
        //                    }
        //                }
        //            }
        //            else if(SN.Length > 10)
        //            {
        //                var snParts = (SN ?? "").Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
        //                Type = Types.Other;
        //                if (SN.StartsWith("C") && SN.Length > 14)
        //                {
        //                    SupplierCode = SN.Substring(1, 5);
        //                    PrintDateStr = SN.Substring(6, 8);
        //                    SerialNoStr = SN.Substring(14);
        //                    if (ProdDate != null && SerialNo != null)
        //                    {
        //                        Type = Types.Middle;
        //                        ItemType = ItemTypes.RawMaterial;
        //                    }
        //                }
        //                else if (SN.StartsWith("P") && SN.Length > 14)
        //                {
        //                    SupplierCode = SN.Substring(1, 5);
        //                    PrintDateStr = SN.Substring(6, 8);
        //                    SerialNoStr = SN.Substring(14);
        //                    if (ProdDate != null && SerialNo != null)
        //                    {
        //                        Type = Types.Outer;
        //                        ItemType = ItemTypes.RawMaterial;
        //                    }
        //                }
        //                else if (SN.Length > 13)
        //                {
        //                    SupplierCode = SN.Substring(0, 5);
        //                    PrintDateStr = SN.Substring(5, 8);
        //                    SerialNoStr = SN.Substring(13);
        //                    if (ProdDate != null && SerialNo != null)
        //                    {
        //                        Type = Types.Small;
        //                        ItemType = ItemTypes.RawMaterial;
        //                    }
        //                }
        //                //是否重打判断
        //                if (snParts.Count() > 1 && snParts[1].Length > 2)
        //                {
        //                    ReprintBizCode1 = snParts[1][0].ToString();
        //                    ReprintBizCode2 = snParts[1][1].ToString();
        //                    ReprintNoStr = snParts[1].Substring(2);
        //                }
        //            }
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        AnalyseException = ex;
        //    }
        //}
        ///// <summary>
        ///// æ ¹æ®å­—符串返回流水号
        ///// </summary>
        ///// <param name="str"></param>
        ///// <returns></returns>
        //private int? GetSerialNo(string str)
        //{
        //    int serialNo;
        //    try
        //    {
        //        serialNo = Convert.ToInt32(new Regex(@"[^\d]*").Replace(str, ""));
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //    return serialNo;
        //}
        ///// <summary>
        ///// æ ¹æ®å­—符串返回重打流水号
        ///// </summary>
        ///// <param name="str"></param>
        ///// <returns></returns>
        //private int? GetReprintNo(string str)
        //{
        //    int qty;
        //    try
        //    {
        //        qty = Convert.ToInt32(str, 16);
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //    return qty;
        //}
        ///// <summary>
        ///// æ ¹æ®å­—符串返回数量
        ///// </summary>
        ///// <param name="str"></param>
        ///// <returns></returns>
        //private int? GetInt32(string str)
        //{
        //    int qty;
        //    try
        //    {
        //        qty = Convert.ToInt32(str);
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //    return qty;
        //}
        ///// <summary>
        ///// æ ¹æ®å­—符串返回数量
        ///// </summary>
        ///// <param name="str"></param>
        ///// <returns></returns>
        //private double? GetDouble(string str)
        //{
        //    double qty;
        //    try
        //    {
        //        qty = Convert.ToDouble(str);
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //    return qty;
        //}
        ///// <summary>
        ///// æ ¹æ®æ—¥æœŸç¼–码返回生产日期
        ///// </summary>
        ///// <param name="dateStr"></param>
        ///// <returns></returns>
        //public static DateTime? GetDateTime(string dateStr)
        //{
        //    DateTime proddate;
        //    dateStr = dateStr ?? "";
        //    if (dateStr.Length == 8)
        //    {
        //        try
        //        {
        //            //年月日
        //            proddate = DateTime.ParseExact(dateStr, "yyyyMMdd", new CultureInfo("zh-CN", true));
        //        }
        //        catch
        //        {
        //            return null;
        //        }
        //    }
        //    else if (dateStr.Length == 6)
        //    {
        //     try
        //     {
        //         //年月日
        //         proddate = DateTime.ParseExact(dateStr, "yyMMdd", new CultureInfo("zh-CN", true));
        //     }
        //     catch
        //     {
        //         try
        //         {
        //             //年周
        //             var firstDate = Convert.ToDateTime(dateStr.Substring(0, 4) + "-1-1");
        //             int weekNum = Convert.ToInt32(dateStr.Substring(4, 2));
        //                int daysOffset = DayOfWeek.Monday - firstDate.DayOfWeek;
        //                DateTime firstSunday = firstDate.AddDays(daysOffset);
        //                var calendar = CultureInfo.CurrentCulture.Calendar;
        //                int firstWeek = calendar.GetWeekOfYear(firstDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
        //                if (firstWeek <= 1)
        //                {
        //                    weekNum -= 1;
        //                }
        //                proddate = firstSunday.AddDays(weekNum * 7 - 1);
        //                if (proddate.Year < firstDate.Year)
        //                {
        //                    proddate = firstDate;
        //                }
        //                if (proddate.Year > firstDate.Year)
        //                {
        //                    proddate = firstDate.AddYears(1).AddDays(-1);
        //                }
        //            }
        //         catch
        //         {
        //             try
        //             {
        //                 //年月
        //                 proddate = DateTime.ParseExact(dateStr, "yyyyMM", new CultureInfo("zh-CN", true));
        //             }
        //             catch
        //             {
        //                    try
        //                    {
        //                        proddate = Convert.ToDateTime(dateStr);
        //                    }
        //                    catch
        //                    {
        //                        //proddate = DateTime.Now;
        //                        return null;
        //                    }
        //                }
        //         }
        //     }
        //    }
        //    else if (dateStr.Length == 4)
        //    {
        //        try
        //        {
        //            //年周
        //            var firstDate = DateTime.ParseExact(dateStr.Substring(0, 2), "yy", CultureInfo.CurrentCulture);
        //            int weekNum = Convert.ToInt32(dateStr.Substring(2, 2));
        //            int daysOffset = DayOfWeek.Monday - firstDate.DayOfWeek;
        //            DateTime firstSunday = firstDate.AddDays(daysOffset);
        //            var calendar = CultureInfo.CurrentCulture.Calendar;
        //            int firstWeek = calendar.GetWeekOfYear(firstDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
        //            if (firstWeek <= 1)
        //            {
        //                weekNum -= 1;
        //            }
        //            proddate = firstSunday.AddDays(weekNum * 7 - 1);
        //            if (proddate.Year < firstDate.Year)
        //            {
        //                proddate = firstDate;
        //            }
        //            if (proddate.Year > firstDate.Year)
        //            {
        //                proddate = firstDate.AddYears(1).AddDays(-1);
        //            }
        //        }
        //        catch
        //        {
        //            try
        //            {
        //                //年月
        //                proddate = DateTime.ParseExact(dateStr, "yyMM", new CultureInfo("zh-CN", true));
        //            }
        //            catch
        //            {
        //                try
        //                {
        //                    //å¹´
        //                    proddate = DateTime.ParseExact(dateStr, "yyyy", new CultureInfo("zh-CN", true));
        //                }
        //                catch
        //                {
        //                    try
        //                    {
        //                        proddate = Convert.ToDateTime(dateStr);
        //                    }
        //                    catch
        //                    {
        //                        //无法识别则使用当前时间
        //                        //proddate = DateTime.Now;
        //                        return null;
        //                    }
        //                }
        //            }
        //        }
        //    }
        //    else
        //    {
        //        try
        //        {
        //            proddate = Convert.ToDateTime(dateStr);
        //        }
        //        catch
        //        {
        //            //proddate = DateTime.Now;
        //            return null;
        //        }
        //    }
        //    return proddate;
        //}
        ///// <summary>
        ///// æ˜¯å¦ä¸Žä¼ å…¥çš„æ¡ç ç›¸åŒçš„生产日期
        ///// </summary>
        ///// <param name="sn"></param>
        ///// <returns></returns>
        //public bool IsSameProdDate(string sn)
        //{
        //    return (ProdDate ?? DateTime.MaxValue).Date == ((new Barcode(sn)).ProdDate ?? DateTime.MinValue).Date;
        //}
        ///// <summary>
        ///// æ˜¯å¦å°äºŽç­‰äºŽä¼ å…¥çš„æ¡ç çš„生产日期
        ///// </summary>
        ///// <param name="sn"></param>
        ///// <returns></returns>
        //public bool IsPriorProdDate(string sn)
        //{
        //    return (ProdDate ?? DateTime.MaxValue).Date <= ((new Barcode(sn)).ProdDate ?? DateTime.MinValue).Date;
        //}
        ///// <summary>
        ///// æ˜¯å¦éžæ³•条码
        ///// </summary>
        ///// <param name="sn"></param>
        ///// <returns></returns>
        //public static bool IsIllegal(string sn)
        //{
        //    return !new Barcode(sn).IsRegular;
        //}
        ///// <summary>
        ///// èŽ·å–æ¡ç ç±»åž‹
        ///// </summary>
        ///// <param name="sn"></param>
        ///// <returns></returns>
        //public static Types GetType(string sn)
        //{
        //    return new Barcode(sn).Type;
        //}
        ///// <summary>
        ///// åˆ¤æ–­æ˜¯å¦é‡æ‰“的条码
        ///// </summary>
        ///// <param name="sn"></param>
        ///// <returns></returns>
        //public static bool IsReprint(string sn)
        //{
        //    return new Barcode(sn).IsReprintSn;
        //}
    }//endClass
}
Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
using Autofac.Features.Metadata;
using MailKit.Search;
using Microsoft.IdentityModel.Tokens;
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using static Tiger.Business.WMS.Barcode;
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åˆ†æžåŸºç±»
    /// </summary>
    public class YadaBarcode : BarcodeAnalysis
    {
        /// <summary>
        /// æ¡ç åˆ†æž
        /// </summary>
        /// <param name="metaSn"></param>
        public override Result<Barcode> Analyse(Barcode barcode)
        {
            var result = new Result<Barcode>(Result.Flags.Failed);
            Barcode = barcode;
            if (!string.IsNullOrEmpty(Barcode.MetaSn))
            {
                string[] parts = (Barcode.MetaSn ?? "").Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
                //ASN单
                if (parts.Length == 5 && (Barcode.MetaSn.StartsWith("ASN") || Barcode.MetaSn.StartsWith("YDASN")))
                {
                    Barcode.OrderNo = parts[0];
                    Barcode.OrderLine = parts[1];
                    Barcode.ItemCode = parts[2];
                    Barcode.LotNo = parts[3];
                    Barcode.SerialNoStr = parts[4];
                    Barcode.Type = Types.MiniPackage;
                    Barcode.ItemType = ItemTypes.RawMaterial;
                    //查询条码主档,补充其他资料
                    result.Flag = Result.Flags.Success;
                }
            }
            result.Data = Barcode;
            return result;
        }
    }//endClass
}
Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using static Tiger.Business.WMS.Barcode;
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åˆ†æžåŸºç±»
    /// </summary>
    public class BarcodeAnalysis
    {
        public Barcode Barcode;
        /// <summary>
        /// æ¡ç åˆ†æž
        /// </summary>
        /// <param name="metaSn"></param>
        public virtual Result<Barcode> Analyse(Barcode barcode)
        {
            var result = new Result<Barcode>(Result.Flags.Failed);
            Barcode = barcode;
            if (!string.IsNullOrEmpty(Barcode.MetaSn))
            {
                Barcode.QtyStr = "1";
                Barcode.Type = Types.Other;
                Barcode.ItemType = ItemTypes.Unknown;
                result.Flag = Result.Flags.Success;
            }
            result.Data = Barcode;
            return result;
        }
        /// <summary>
        /// æ ¹æ®å­—符串返回流水号
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int? GetSerialNo(string str)
        {
            int serialNo;
            try
            {
                serialNo = Convert.ToInt32(new Regex(@"[^\d]*").Replace(str, ""));
            }
            catch
            {
                return null;
            }
            return serialNo;
        }
        /// <summary>
        /// æ ¹æ®å­—符串返回重打流水号
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int? GetReprintNo(string str)
        {
            int qty;
            try
            {
                qty = Convert.ToInt32(str, 16);
            }
            catch
            {
                return null;
            }
            return qty;
        }
        /// <summary>
        /// æ ¹æ®å­—符串返回数量
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int? GetInt32(string str)
        {
            int qty;
            try
            {
                qty = Convert.ToInt32(str);
            }
            catch
            {
                return null;
            }
            return qty;
        }
        /// <summary>
        /// æ ¹æ®å­—符串返回数量
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static double? GetDouble(string str)
        {
            double qty;
            try
            {
                qty = Convert.ToDouble(str);
            }
            catch
            {
                return null;
            }
            return qty;
        }
        /// <summary>
        /// æ ¹æ®æ—¥æœŸç¼–码返回生产日期
        /// </summary>
        /// <param name="dateStr"></param>
        /// <returns></returns>
        public static DateTime? GetDateTime(string dateStr)
        {
            DateTime proddate;
            dateStr = dateStr ?? "";
            if (dateStr.Length == 8)
            {
                try
                {
                    //年月日
                    proddate = DateTime.ParseExact(dateStr, "yyyyMMdd", new CultureInfo("zh-CN", true));
                }
                catch
                {
                    return null;
                }
            }
            else if (dateStr.Length == 6)
            {
                try
                {
                    //年月日
                    proddate = DateTime.ParseExact(dateStr, "yyMMdd", new CultureInfo("zh-CN", true));
                }
                catch
                {
                    try
                    {
                        //年周
                        var firstDate = Convert.ToDateTime(dateStr.Substring(0, 4) + "-1-1");
                        int weekNum = Convert.ToInt32(dateStr.Substring(4, 2));
                        int daysOffset = DayOfWeek.Monday - firstDate.DayOfWeek;
                        DateTime firstSunday = firstDate.AddDays(daysOffset);
                        var calendar = CultureInfo.CurrentCulture.Calendar;
                        int firstWeek = calendar.GetWeekOfYear(firstDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
                        if (firstWeek <= 1)
                        {
                            weekNum -= 1;
                        }
                        proddate = firstSunday.AddDays(weekNum * 7 - 1);
                        if (proddate.Year < firstDate.Year)
                        {
                            proddate = firstDate;
                        }
                        if (proddate.Year > firstDate.Year)
                        {
                            proddate = firstDate.AddYears(1).AddDays(-1);
                        }
                    }
                    catch
                    {
                        try
                        {
                            //年月
                            proddate = DateTime.ParseExact(dateStr, "yyyyMM", new CultureInfo("zh-CN", true));
                        }
                        catch
                        {
                            try
                            {
                                proddate = Convert.ToDateTime(dateStr);
                            }
                            catch
                            {
                                //proddate = DateTime.Now;
                                return null;
                            }
                        }
                    }
                }
            }
            else if (dateStr.Length == 4)
            {
                try
                {
                    //年周
                    var firstDate = DateTime.ParseExact(dateStr.Substring(0, 2), "yy", CultureInfo.CurrentCulture);
                    int weekNum = Convert.ToInt32(dateStr.Substring(2, 2));
                    int daysOffset = DayOfWeek.Monday - firstDate.DayOfWeek;
                    DateTime firstSunday = firstDate.AddDays(daysOffset);
                    var calendar = CultureInfo.CurrentCulture.Calendar;
                    int firstWeek = calendar.GetWeekOfYear(firstDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
                    if (firstWeek <= 1)
                    {
                        weekNum -= 1;
                    }
                    proddate = firstSunday.AddDays(weekNum * 7 - 1);
                    if (proddate.Year < firstDate.Year)
                    {
                        proddate = firstDate;
                    }
                    if (proddate.Year > firstDate.Year)
                    {
                        proddate = firstDate.AddYears(1).AddDays(-1);
                    }
                }
                catch
                {
                    try
                    {
                        //年月
                        proddate = DateTime.ParseExact(dateStr, "yyMM", new CultureInfo("zh-CN", true));
                    }
                    catch
                    {
                        try
                        {
                            //å¹´
                            proddate = DateTime.ParseExact(dateStr, "yyyy", new CultureInfo("zh-CN", true));
                        }
                        catch
                        {
                            try
                            {
                                proddate = Convert.ToDateTime(dateStr);
                            }
                            catch
                            {
                                //无法识别则使用当前时间
                                //proddate = DateTime.Now;
                                return null;
                            }
                        }
                    }
                }
            }
            else
            {
                try
                {
                    proddate = Convert.ToDateTime(dateStr);
                }
                catch
                {
                    //proddate = DateTime.Now;
                    return null;
                }
            }
            return proddate;
        }
        /// <summary>
        /// æ˜¯å¦éžæ³•条码
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public static bool IsIllegal(string sn)
        {
            return !new Barcode(sn).IsRegular;
        }
        /// <summary>
        /// èŽ·å–æ¡ç ç±»åž‹
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public static Barcode.Types GetType(string sn)
        {
            return new Barcode(sn).Type;
        }
        /// <summary>
        /// åˆ¤æ–­æ˜¯å¦é‡æ‰“的条码
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public static bool IsReprint(string sn)
        {
            return new Barcode(sn).IsReprintSn;
        }
    }//endClass
}
Tiger.Business.WMS/Transaction/Old/CustSupplyCheckingNew.cs
@@ -150,7 +150,7 @@
                    return action;
                }
                //判断条码是否为最少包装
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                if (!new[] { Barcode.Types.MiniPackage, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curInv.SN);
Tiger.Business.WMS/Transaction/Old/OtherInLocationChecking.cs
@@ -124,7 +124,7 @@
                    return action;
                }
                //判断条码是否为最少包装
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                if (!new[] { Barcode.Types.MiniPackage, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curInv.SN);
Tiger.Business.WMS/WMS_ITEM_Biz.cs
@@ -43,6 +43,10 @@
                        result.Flag = Result.Flags.Failed;
                        result.LocaleMsg = new("WMS.WmsItem.Barcode.EmptyFailure");
                    }
                    else if (barcode.IsException)
                    {
                        throw barcode.AnalyseException;
                    }
                    //非法条码
                    else if (!barcode.IsRegular)
                    {
@@ -152,6 +156,10 @@
                        result.Flag = Result.Flags.Failed;
                        result.LocaleMsg = new("WMS.WmsItem.Barcode.EmptyFailure");
                    }
                    else if (barcode.IsException)
                    {
                        throw barcode.AnalyseException;
                    }
                    //非法条码
                    else if (!barcode.IsRegular)
                    {
Tiger.Business.WMSTests/Common/CommonTests.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Tiger.Business.WMS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tiger.Business.WMS.Tests
{
    [TestClass()]
    public class CommonTests
    {
        [TestMethod()]
        public void AnalyseTest()
        {
            var b = new Barcode("4100-CA1010-T7#202405#1251#0002#10000");
            var b1 = new Barcode("YDASN241000427/10/10090402.0024.00/ASN241000427/42");
            ;
        }
    }
}
Tiger.Business.WMSTests/Tiger.Business.WMSTests.csproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>latest</LangVersion>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
    <PackageReference Include="MSTest" Version="3.6.1" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Tiger.Business.WMS\Tiger.Business.WMS.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
  </ItemGroup>
</Project>