服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-12-19 eb0ad83719de660e5c4f7676aea4710625b6bd51
WMS增加标准上下架功能事务
已复制1个文件
已修改20个文件
已重命名20个文件
已添加11个文件
4115 ■■■■ 文件已修改
Tiger.Api/Autofac/SingleInstance.json 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Controllers/Test/TestController.R.cs 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Program.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Common/WorkBatch.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/WorkAction/YadaAssembly.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode.Analysis.cs 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Barcode.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Inventory.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Minsun/CustSupplyChecking.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Minsun/InStorage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Minsun/iWMS.Minsun.cs 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Tiger.Business.WMS.csproj 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/In_Default.cs 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/CustSupplyCheckingNew.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/CustomerSupplyInNew.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/InFinished.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/InMatStorage.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/InProductionReturn.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/InReceipt.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/LocationTransfer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OtherInLocation.cs 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OtherInLocationChecking.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutNoBillcode.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutOther.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutSale.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutSplit.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutTransfer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/OutWorkOrder.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/ProductionMaterialReq.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Old/Resell.cs 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Out_Default.cs 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/WMSTransactionBase.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/WmsCount.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/WMS_ITEM_Biz.cs 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/iWMS/RePrintBarcode.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/iWMS/iWMS.Minsun.cs 2090 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Controllers.WMS/Controllers/WMSController.In_Default.cs 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Controllers.WMS/Controllers/WMSController.Out_Default.cs 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/IInventory.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/IWmsItem.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/Minsun/IInventroyInfo.cs 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/Transaction/IIn_Default.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/Transaction/IOutNoBillcode.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/Transaction/IOut_Default.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/Api/BaseInput.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/Api/Output_Entitys.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/Api/ProdReqInput.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_SHELF.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Tiger.Model.Net.csproj 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Autofac/SingleInstance.json
@@ -95,13 +95,13 @@
      "injectProperties": true,
      "instanceScope": "SingleInstance" //生命周期
    },
    {
      "type": "Tiger.Business.WMS.RePrintBarcode,Tiger.Business.WMS",
      "services": [ { "type": "Tiger.IBusiness.IRePrintBarcode,Tiger.IBusiness.WMS" } ],
      "autoActivate": true,
      "injectProperties": true,
      "instanceScope": "SingleInstance" //生命周期
    },
    //{
    //  "type": "Tiger.Business.WMS.RePrintBarcode,Tiger.Business.WMS",
    //  "services": [ { "type": "Tiger.IBusiness.IRePrintBarcode,Tiger.IBusiness.WMS" } ],
    //  "autoActivate": true,
    //  "injectProperties": true,
    //  "instanceScope": "SingleInstance" //生命周期
    //},
    {
      "type": "Tiger.Business.BizContext,Tiger.Business",
      "services": [ { "type": "Tiger.IBusiness.IBizContext,Tiger.IBusiness" } ],
Tiger.Api/Controllers/Test/TestController.R.cs
@@ -235,6 +235,37 @@
        [HttpGet]
        public async Task<IActionResult> D1Async(string param)
        {
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=01"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 01 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=02"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 02 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=03"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 03 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=04"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 04 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=05"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 05 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=06"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 06 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=07"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 07 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=08"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 08 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=09"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 09 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=10"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 10 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=11"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 11 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=12"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 12 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=13"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 13 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=14"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 14 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=15"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 15 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=16"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 16 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=17"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 17 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=18"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 18 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=19"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 19 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=20"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 20 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=21"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 21 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=22"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 22 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=23"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 23 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=24"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 24 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=25"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 25 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=26"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 26 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=27"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 27 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=28"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 28 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=29"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 29 Finished", ConsoleColor.Blue); });
            Work.DoAsync(() => { HttpHelper.GetAsync("http://172.16.80.40:9529/api/_Test/DoSomething?duration=10&code=30"); ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - 30 Finished", ConsoleColor.Blue); });
            ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss.fff} - Send Finished", ConsoleColor.Blue);
            //Logger.Scheduler.Info("这是一次成功的测试");
            //var data = iBiz.Biz.Db.Queryable<BAS_CODE_RULE>()
            //    .IncludesAllFirstLayer()
@@ -310,17 +341,18 @@
        [HttpGet]
        public async Task<IActionResult> DoSomething(int duration, string code)
        {
            Barcode b = new("asdasd");
            var begin = DateTime.Now;
            while ((DateTime.Now - begin).TotalSeconds <= duration)
            {
                Thread.Sleep(1000);
                var total = (DateTime.Now - begin).TotalSeconds;
                var percent = total / duration;
                ConsoleExt.WriteLine($"Working {begin:mmssfff} ... {(percent > 1 ? 1 : percent):P0} ...", ConsoleColor.Green);
            }
            Logger.Default.Info($"{begin:mmssfff} completed");
            return Ok($"{begin:mmssfff} completed {b.DateCode}");
            Work.Do(() => {
                while ((DateTime.Now - begin).TotalSeconds <= duration)
                {
                    //Thread.Sleep(1000);
                    var total = (DateTime.Now - begin).TotalSeconds;
                    var percent = total / duration;
                    //ConsoleExt.WriteLine($"Working {begin:mmssfff} ... {(percent > 1 ? 1 : percent):P0} ...", ConsoleColor.Green);
                }
                Logger.Default.Info($"{begin:mmssfff} completed");
            });
            return Ok($"{code.IsNullOrEmpty("", code + ": ")}{begin:mmssfff} completed");
        }
        [HttpPost]
Tiger.Api/Language.db
Binary files differ
Tiger.Api/Program.cs
@@ -47,11 +47,13 @@
    ConsoleExt.Write($"Link Start{(IsRunAsAdmin ? $" As Admin" : "")}", ConsoleColor.Cyan);
    ConsoleExt.WriteLine($"  < <-<--<---<----< ==== < ===== < ====== ", ConsoleColor.DarkCyan);
    Logger.Console.Info($"Begin to load {prod}");
    var options = new WebApplicationOptions
    System.Net.ServicePointManager.DefaultConnectionLimit = 1024;
    var options = new WebApplicationOptions
    {
        Args = args,
        ContentRootPath = pathToContentRoot
        ContentRootPath = pathToContentRoot,
    };
    var builder = WebApplication.CreateBuilder(options);
@@ -68,6 +70,7 @@
        });
        //builder.RegisterType<TestService>().As<ITest>();
    });
    Logger.Console.Info($"AutoFac container inject successful");
    var startup = new Startup(builder.Configuration);
    startup.ConfigureServices(builder.Services);
@@ -84,7 +87,6 @@
        opt.Limits.MaxConcurrentUpgradedConnections = null;
        opt.Limits.MinRequestBodyDataRate = null;
    });
    System.Net.ServicePointManager.DefaultConnectionLimit = 1024;
    if (isService)
    {
Tiger.Business.MES/Common/WorkBatch.cs
@@ -10,7 +10,6 @@
using Tiger.IBusiness;
using Tiger.Model.Entitys.MES.Position;
using Tiger.Business.MES;
using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
using Org.BouncyCastle.Ocsp;
using System.IO;
Tiger.Business.MES/WorkAction/YadaAssembly.cs
@@ -205,16 +205,16 @@
                        }
                    }
                    //如果当前物料存在备料表中存在推荐批次,则上料物料必须属于其推荐批次的物料
                    var suggest = MoPickList.Where(q => q.Code == item.ItemInfo.ITEM_CODE && !q.SuggestedBatch.IsNullOrEmpty()).Select(q => q.SuggestedBatch).ToList();
                    if (isOK && suggest.Any())
                    {
                        isOK = false;
                        //在推荐批次所属工单的条码中存在
                        if (MainDB.Queryable<BIZ_MES_WO_SN>().Any(q => suggest.Contains(q.WORK_ORDER) && (q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN)))
                        {
                            isOK = true;
                        }
                    }
                    //var suggest = MoPickList.Where(q => q.Code == item.ItemInfo.ITEM_CODE && !q.SuggestedBatch.IsNullOrEmpty()).Select(q => q.SuggestedBatch).ToList();
                    //if (isOK && suggest.Any())
                    //{
                    //    isOK = false;
                    //    //在推荐批次所属工单的条码中存在
                    //    if (MainDB.Queryable<BIZ_MES_WO_SN>().Any(q => suggest.Contains(q.WORK_ORDER) && (q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN)))
                    //    {
                    //        isOK = true;
                    //    }
                    //}
                    //验证通过则保存上料信息
                    if (isOK)
                    {
Tiger.Business.WMS/Common/Barcode.Analysis.cs
copy from Tiger.Model.Net/Entitys/Barcode.cs copy to Tiger.Business.WMS/Common/Barcode.Analysis.cs
Îļþ´Ó Tiger.Model.Net/Entitys/Barcode.cs ¸´ÖÆ
@@ -6,220 +6,13 @@
using System.Text;
using System.Text.RegularExpressions;
namespace Tiger.Model
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åŸºç±»
    /// æ¡ç åˆ†æžåŸºç±»
    /// </summary>
    public class Barcode
    public class BarcodeAnalysis
    {
        public Barcode(string metaSn)
        {
            Analyse(MetaSn = metaSn);
        }
        /// <summary>
        /// æ¡ç ï¼ˆè§£æžåŽçš„æ¡ç ï¼‰
        /// </summary>
        public string SN { get; set; }
        /// <summary>
        /// å…ƒæ¡ç ï¼ˆæ‰«æåˆ°çš„æ¡ç ï¼‰
        /// </summary>
        public string MetaSn { get; set; }
        /// <summary>
        /// æ¡ç ç±»åž‹
        /// </summary>
        public Types Type { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public string ItemCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string ItemName { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public ItemTypes ItemType { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸç¼–码
        /// </summary>
        public string DateCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        public string ProdDateStr { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        public DateTime? ProdDate { get => GetDateTime(ProdDateStr) ?? 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 OEMItemCode { get; set; }
        /// <summary>
        /// æµæ°´ç 
        /// </summary>
        public string SerialNoStr { get; set; }
        /// <summary>
        /// æµæ°´ç 
        /// </summary>
        public int? SerialNo { get => GetSerialNo(SerialNoStr); }
        /// <summary>
        /// å•位
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public string QtyStr { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public decimal? Qty { get => Convert.ToDecimal(GetDouble(QtyStr)); }
        /// <summary>
        /// æ¯›é‡
        /// </summary>
        public string GrossWeightStr { get; set; }
        /// <summary>
        /// æ¯›é‡
        /// </summary>
        public double? GrossWeight { get => GetDouble(QtyStr); }
        /// <summary>
        /// æ–™å·é•¿åº¦
        /// </summary>
        public int ItemLength { get; set; }
        /// <summary>
        /// æ–™å·é•¿åº¦
        /// </summary>
        public Exception AnalyseException { get; set; }
        /// <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 => 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>
            /// å°åŒ…标签
            /// </summary>
            [Description("小包标签")]
            Small,
            /// <summary>
            /// ä¸­åŒ…标签
            /// </summary>
            [Description("中包标签")]
            Middle,
            /// <summary>
            /// å¤–包标签
            /// </summary>
            [Description("外包标签")]
            Outer,
            /// <summary>
            /// æ ˆæ¿æ¡ç 
            /// </summary>
            [Description("栈板条码")]
            Pallet,
            /// <summary>
            /// æˆå“æ ‡ç­¾æ¡ç 
            /// </summary>
            [Description("成品标签")]
            Product,
            /// <summary>
            /// å…¶ä»–标签条码
            /// </summary>
            [Description("其他标签")]
            Other,
        }
        public enum ItemTypes
        {
            [Description("未知类型")]
            Unknown,
            [Description("湿敏元件")]
            HumidityMaterial,
            [Description("SMT半成品")]
            SmtSemiProduct,
            [Description("DIP半成品")]
            DipSemiProduct,
            [Description("成品")]
            Product,
            [Description("PCB")]
            PCB,
            [Description("辅料")]
            SubsidiaryMaterial,
            [Description("原材料")]
            RawMaterial,
        }
        /// <summary>
        /// æ¡ç åˆ†æž
        /// </summary>
Tiger.Business.WMS/Common/Barcode.cs
ÎļþÃû´Ó Tiger.Model.Net/Entitys/Barcode.cs ÐÞ¸Ä
@@ -6,7 +6,7 @@
using System.Text;
using System.Text.RegularExpressions;
namespace Tiger.Model
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åŸºç±»
Tiger.Business.WMS/Common/Inventory.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.IBusiness;
using Tiger.Model;
namespace Tiger.Business.WMS
{
    /// <summary>
    /// æ¡ç åº“存信息,包括仓库,储区,货架,储位,父条码,包装明细等
    /// </summary>
    public class Inventory : IInventory
    {
        public string SN { get; set; }
        public Barcode Barcode { get; set; }
        public bool IsQRCode => Barcode.IsQRCode;
        public WMS_ITEM_EXT ExtInfo { get; set; }
        public BAS_ITEM ItemInfo { get; set; }
        public WMS_WAREHOUSE Warehouse { get; set; }
        public WMS_REGION Region { get; set; }
        public WMS_SHELF Shelf { get; set; }
        public WMS_LOCATION Location { get; set; }
        public WMS_ITEM_PKG ParentPkg { get; set; }
        public List<WMS_ITEM_PKG> Packages { get; set; } = new List<WMS_ITEM_PKG>();
        public List<WMS_ITEM> Items { get; set; } = new List<WMS_ITEM>();
        public List<WMS_ITEM_EXT> ItemsExt { get; set; } = new List<WMS_ITEM_EXT>();
        public List<WMS_ITEM_HIS> History { get; set; } = new List<WMS_ITEM_HIS>();
        public List<WMS_ITEM.STATUSs> StatusList => Items.GroupBy(q => q.STATUS).Select(q => new { Status = q.Key.GetEnum<WMS_ITEM.STATUSs>(), Count = q.Count() }).OrderByDescending(q => q.Count).Select(q => q.Status).ToList();
        public bool isNormalStatus => Items.Select(q => q.STATUS).Distinct().Count() == 1;
        public WMS_ITEM.STATUSs Status => StatusList?.FirstOrDefault() ?? WMS_ITEM.STATUSs.NotExists;
        public WMS_ITEM_PKG CurPkg => Packages.FirstOrDefault(q => q.SN == SN);
        public bool isExists => CurPkg != null;
        public bool isMinPackage => Items.Count == 1 && Items.Single().SN == SN;
    }
}
Tiger.Business.WMS/Minsun/CustSupplyChecking.cs
@@ -35,7 +35,7 @@
        #region Propertys & Variables
        public string UserCode { get; set; }
        public static long UserId { get; set; }
        public long UserId { get; set; }
        public string VenderCode { get; set; }
        public string LotNo { get; set; }
        public string SecondVenderCode { get; set; }
Tiger.Business.WMS/Minsun/InStorage.cs
@@ -255,7 +255,7 @@
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<CustSupplyInOutput> CustSupplyInIncompleteList(CustSupplyIncompleteInput input)
        public static async Task<CustSupplyInOutput> CustSupplyInIncompleteList(CustSupplyIncompleteInput input)
        {
            var otherInScanList = await Biz.Db.Queryable<WMS_OTHERINSTOCK_SCAN>()
                        .Where(t => t.BUSINESSCODE.ToUpper() == input.receiptNo.ToUpper()
Tiger.Business.WMS/Minsun/iWMS.Minsun.cs
Tiger.Business.WMS/Tiger.Business.WMS.csproj
@@ -10,11 +10,21 @@
  </PropertyGroup>
  <ItemGroup>
    <Compile Remove="Minsun\**" />
    <EmbeddedResource Remove="Minsun\**" />
    <None Remove="Minsun\**" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Tiger.Business\Tiger.Business.csproj" />
    <ProjectReference Include="..\Tiger.IBusiness.WMS\Tiger.IBusiness.WMS.csproj" />
    <ProjectReference Include="..\Tiger.IBusiness\Tiger.IBusiness.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Transaction\Yada\" />
  </ItemGroup>
  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="xcopy /r/y/i $(ProjectDir)$(OutDir)$(AssemblyName).dll $(SolutionDir)Tiger.Api\$(OutDir)&#xD;&#xA;xcopy /r/y/i $(ProjectDir)$(OutDir)$(AssemblyName).pdb $(SolutionDir)Tiger.Api\$(OutDir)" />
  </Target>
Tiger.Business.WMS/Transaction/In_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,382 @@
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tiger.Model;
using Tiger.IBusiness;
using Tiger.Model.Sharetronic.Shelf;
using Tiger.Business.WMS.Sharetronic.Shelf;
using Microsoft.IdentityModel.Tokens;
namespace Tiger.Business.WMS.Transaction
{
    /// <summary>
    /// æ ‡å‡†ä¸Šæž¶äº‹åŠ¡
    /// </summary>
    public class In_Default : WMSTransactionBase, IIn_Default
    {
        public IIn_Default Init(string id, string userCode, string apiHost, string orgCode)
        {
            TransID = id;
            UserCode = userCode;
            ApiHost = apiHost;
            OrgCode = orgCode;
            Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
            return this;
        }
        #region Propertys & Variables
        public string UserCode { get; set; }
        public long UserId { get; set; }
        public string OrgCode { get; set; }
        public Inventory CurInvItem { get; set; }
        public ScanShelfInfo CurScanShelf { get; set; }
        #endregion
        #region Functions
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果物料已经完成移库则货架上亮灯提醒储位
        /// </summary>
        public async Task<ApiAction> ScanItem(BaseInput input)
        {
            var action = new ApiAction();
            try
            {
                if (input.SN.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("条码不能为空");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.SnEmptyFailure");
                    return action;
                }
                //货架为空则扫描的认为是货架
                if (string.IsNullOrEmpty(CurScanShelf?.RackCode))
                {
                    var _action = await ScanShelf(input.SN);
                    action.LocaleMsg = _action.LocaleMsg;
                    action.IsSuccessed = _action.IsSuccessed;
                    action.Data = _action.Data;
                    return action;
                }
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var inv = result.Data as Inventory;
                //验证条码是否正确
                if (!inv.isNormalStatus || inv.Status.GetValue() != WMS_ITEM.STATUSs.NotExists.GetValue() && inv.Status.GetValue() <= WMS_ITEM.STATUSs.InStore.GetValue())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("状态[{0}]异常,请重新扫描");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(q => q.GetDesc())));
                    return action;
                }
                //物料验证
                if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("物料编码[{0}]不存在或者该物料未启用");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                    return action;
                }
                if (!inv.IsNullOrEmpty())
                {
                    if (inv.Items.Count == 0)
                    {
                        List<WMS_ITEM_HIS> ItemHistorys = new List<WMS_ITEM_HIS>();
                        WMS_ITEM Item;
                        WMS_ITEM_PKG ItemPkgs;
                        Item = new()
                        {
                            SN = inv.Barcode.SN,
                            ITEM_CODE = inv.Barcode.ItemCode,
                            AUTH_ORG = input.AuthOption.CurOrg,
                            STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(),
                            QTY = inv.Barcode.Qty.ToDecimal(),
                            PROD_DATE = inv.Barcode.DateCode.ToDateTime(),
                            ERP_WH = CurScanShelf.WarehouseCode,
                            UNIT = inv.Barcode.Unit,
                        };
                        WMS_ITEM_HIS his = new(Item, $"标准上架入库");
                        ItemHistorys.Add(his);
                        ItemPkgs = new()
                        {
                            SN = inv.Barcode.SN,
                            AUTH_ORG = input.AuthOption.CurOrg,
                            ITEM_CODE = inv.Barcode.ItemCode,
                            QTY = inv.Barcode.Qty.ToDecimal(),
                            ERP_WH = CurScanShelf.WarehouseCode,
                            UNIT = inv.Barcode.Unit,
                        };
                        var noExt = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                        //扩展表不存在时新建
                        foreach (var item in noExt)
                        {
                            inv.ItemsExt.Add(new()
                            {
                                SN = item.SN,
                                META_SN = inv.Barcode.MetaSn,
                                QR_CODE = inv.Barcode.MetaSn
                            });
                        }
                        inv.Items.Add(Item);
                        inv.History.Add(his);
                        inv.Packages.Add(ItemPkgs);
                    }
                    else if (inv.Items.Count == 1)
                    {
                        inv.Items.First().QTY = inv.Barcode.Qty.ToDecimal();
                        inv.Items.First().ERP_WH = CurScanShelf.WarehouseCode;
                        inv.Items.First().AUTH_ORG = input.AuthOption.CurOrg;
                        inv.Packages.First().QTY = inv.Barcode.Qty.ToDecimal();
                        inv.Packages.First().ERP_WH = CurScanShelf.WarehouseCode;
                        inv.Packages.First().AUTH_ORG = input.AuthOption.CurOrg;
                    }
                    //如果扫描外箱的不能更新数量
                    else
                    {
                        foreach (var item in inv.Items)
                        {
                            item.ERP_WH = CurScanShelf.WarehouseCode;
                            item.AUTH_ORG = input.AuthOption.CurOrg;
                        }
                        foreach (var item in inv.Packages)
                        {
                            item.ERP_WH = CurScanShelf.WarehouseCode;
                            item.AUTH_ORG = input.AuthOption.CurOrg;
                        }
                    }
                }
                var nLocation = new WMS_LOCATION();
                // åˆ¤æ–­æ˜¯å¦æ™ºèƒ½è´§æž¶
                if (CurScanShelf.Shelf.IsLightShelf)
                {
                    ShelfApiResult shelfApiResult = await Share.Shelf.PutOn(TransID, CurScanShelf.Shelf, inv.Items[0]);
                    if (!shelfApiResult.IsSuccess)
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = Biz.L(shelfApiResult.GetData<string>());
                        return action;
                    }
                    var reaultShelf = shelfApiResult.GetData<ShelfChangeModel>();
                    nLocation = reaultShelf.GetLocation();
                    if (nLocation == null)
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L($"货架[{0}]中不存在id为[{1}]的储位,请先维护货架信息");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationNotExistsInShelf", CurScanShelf.Shelf.SHELF_CODE, reaultShelf.ledAddr);
                        return action;
                    }
                    var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.ID).First();
                    if (!locationData.IsNullOrEmpty())
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("储位[{0}]已存有物料[{1}],请检查系统库存信息");
                        action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", nLocation.LOCATION_CODE, locationData.SN);
                        return action;
                    }
                    CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
                }
                else
                {
                    if (CurScanShelf.LocationCode.IsNullOrEmpty() || CurScanShelf.WarehouseCode.IsNullOrEmpty())
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("请输入或扫描有效的货架/储位码");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
                        return action;
                    }
                    nLocation = await Biz.Db.Queryable<WMS_LOCATION>().Where(t => t.LOCATION_CODE == CurScanShelf.LocationCode && t.AUTH_ORG == OrgCode).FirstAsync();
                }
                //判断储位是否单放
                if (nLocation.IS_SINGLE == "Y" && inv.Items.Count > 1)
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("储位[{0}]只能存放一个物料");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationSingleFailure", nLocation.LOCATION_CODE);
                    return action;
                }
                //执行上架
                foreach (var item in inv.Items)
                {
                    item.TRANS_CODE = "In_Default";
                    item.TRANS_NO = $"In_Default_{DateTime.Now:yyyyMMdd}";
                }
                Result<PutOnInfo> putonResult = WMS_ITEM_Biz.WmsItem.PutOn(inv, input.AuthOption, nLocation.LOCATION_CODE);
                if (!putonResult.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = putonResult.LocaleMsg;
                    return action;
                }
                PutOnInfo putOnInfo = putonResult.Data;
                //保存到数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    //入库
                    db.Storageable(putOnInfo.Items, UserCode).ExecuteCommand();
                    db.Storageable(putOnInfo.Packages, UserCode).ExecuteCommand();
                    db.Insertable(putOnInfo.History, UserCode).ExecuteCommand();
                    var x = db.Storageable(putOnInfo.ItemsExt, UserCode).ToStorage();
                    x.AsInsertable.ExecuteCommand();//不存在插入
                    x.AsUpdateable.ExecuteCommand();//存在更新
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
                    throw dbTran.ErrorException;
                }
                // è¿”回其他入库对象
                action.Data = new DefaultInStoreOutput
                {
                    Barcode = inv.SN,
                    MaterialCode = inv.ItemInfo.ITEM_CODE,
                    MaterialName = inv.ItemInfo.ITEM_NAME,
                    CurrentQty = inv.Items[0].QTY,
                    Unit = inv.Items[0].UNIT,
                    DateCode = inv.Items[0].PROD_DATE,
                    WarehouseCode = putOnInfo.Warehouse.WH_CODE,
                    RegionCode = putOnInfo.Region.REGION_CODE,
                    ShelfCode = putOnInfo.Shelf.SHELF_CODE,
                    LocationCode = putOnInfo.Location.LOCATION_CODE,
                };
                //action.LocaleMsg = Biz.L($"扫描条码[{0}]上架到储位[{1}]成功");
                action.LocaleMsg = Biz.L("WMS.Default.ScanItem.PutOnSucceeded", inv.SN, putOnInfo.Location.LOCATION_CODE);
            }
            catch (Exception ex)
            {
                //取消当前操作
                ResetInfo();
                //action.CatchExceptionWithLog(ex, $"扫描条码[{input.SN}]复核异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
            }
            return action;
        }
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
        /// </summary>
        public async Task<ApiAction<ScanShelfInfo>> ScanShelf(string Code)
        {
            var action = new ApiAction<ScanShelfInfo>();
            try
            {
                if (Code.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("请输入或扫描有效的货架/储位码");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
                    return action;
                }
                CurScanShelf = new ScanShelfInfo();
                // æŸ¥è¯¢è´§æž¶ä¿¡æ¯
                var whUnit = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.SHELF_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                // æ‰«æè´§æž¶ä»£ç ï¼Œä¸”为智能货架
                if (whUnit != null && whUnit.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue())
                {
                    CurScanShelf.Shelf = whUnit.Shelf;
                    CurScanShelf.WarehouseCode = whUnit.WH_CODE;
                    CurScanShelf.RegionCode = whUnit.REGION_CODE;
                    CurScanShelf.ShelfCode = whUnit.SHELF_CODE;
                    CurScanShelf.LocationCode = whUnit.LOCATION_CODE;
                    CurScanShelf.ShelfType = whUnit.SHELF_TYPE;
                    CurScanShelf.IsSmartRack = true;
                }
                // æ‰«æåº“位代码
                else
                {
                    var nLocation = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.LOCATION_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).FirstAsync();
                    if (nLocation == null)
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("储位[{0}]不存在");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.LocationNotExist", Code);
                        return action;
                    }
                    if (nLocation.IS_ACTIVE == "N")
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("扫描的储位[{0}]未启用");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfOrLocationDisabled", Code);
                        return action;
                    }
                    if (nLocation.Shelf.IsLightShelf || nLocation.Location.IS_SINGLE == "Y")
                    {
                        var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
                        if (!locationData.IsNullOrEmpty())
                        {
                            action.IsSuccessed = false;
                            //action.LocaleMsg = Biz.L("储位[{0}]已存有物料[{1}],请检查系统库存信息");
                            action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", Code, locationData.SN);
                            return action;
                        }
                    }
                    CurScanShelf.Location = nLocation.Location;
                    CurScanShelf.WarehouseCode = nLocation.WH_CODE;
                    CurScanShelf.RegionCode = nLocation.REGION_CODE;
                    CurScanShelf.ShelfCode = nLocation.SHELF_CODE;
                    CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
                    CurScanShelf.IsSmartRack = false;
                }
                CurScanShelf.IsScanShelf = true;
                //action.LocaleMsg = Biz.L("扫描货架/储位[{0}]成功");
                action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ScanSucceeded", Code);
                action.Data = CurScanShelf;
            }
            catch (Exception ex)
            {
                //取消当前操作
                ResetInfo();
                //action.CatchExceptionWithLog(ex, $"扫描货架/储位[{0}]异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code));
            }
            return action;
        }
        #endregion
        /// <summary>
        /// é‡ç½®å½“前操作,有需要则重写此方法
        /// </summary>
        public override void ResetInfo()
        {
            base.ResetInfo();
            CurInvItem = null;
            CurScanShelf = null;
        }
        public override bool Close(bool needSaveHistoryLog = false)
        {
            this.IsFinished = true;
            return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished;
        }
    }//endClass
}
Tiger.Business.WMS/Transaction/Old/CustSupplyCheckingNew.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/CustSupplyCheckingNew.cs ÐÞ¸Ä
@@ -38,7 +38,7 @@
        #region Propertys & Variables
        public string UserCode { get; set; }
        public static long UserId { get; set; }
        public long UserId { get; set; }
        public string VenderCode { get; set; }
        public string LotNo { get; set; }
        public string SecondVenderCode { get; set; }
@@ -135,53 +135,53 @@
                    return action;
                }
                input.AuthOption.OrgCode = input.AuthOption.OrgCode.IsNullOrEmpty() ? input.AuthOption.CurOrg : input.AuthOption.OrgCode;
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, false);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, false);
                if (result.Flag != Result.Flags.Success)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var curBarcode = result.Data;
                if (!curBarcode.IsQRCode)
                var curInv = result.Data as Inventory;
                if (!curInv.IsQRCode)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", curBarcode.Barcode.MetaSn);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", curInv.Barcode.MetaSn);
                    return action;
                }
                //判断条码是否为最少包装
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curBarcode.Barcode.Type))
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curBarcode.SN);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curInv.SN);
                    return action;
                }
                if (curBarcode.Items.Any())
                if (curInv.Items.Any())
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ExistItem", curBarcode.ItemInfo?.ITEM_CODE);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ExistItem", curInv.ItemInfo?.ITEM_CODE);
                    return action;
                }
                if (string.IsNullOrEmpty(curBarcode.ItemInfo?.ITEM_CODE))
                if (string.IsNullOrEmpty(curInv.ItemInfo?.ITEM_CODE))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotFound", curBarcode.ItemInfo?.ITEM_CODE);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotFound", curInv.ItemInfo?.ITEM_CODE);
                    return action;
                }
                // å…¶å®ƒå…¥åº“清点不能扫入拆包后带-1的标签
                if (curBarcode.isNormalStatus && curBarcode.Status == WMS_ITEM.STATUSs.WaitIn)
                if (curInv.isNormalStatus && curInv.Status == WMS_ITEM.STATUSs.WaitIn)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotAllowIn", curBarcode.ItemInfo?.ITEM_CODE);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotAllowIn", curInv.ItemInfo?.ITEM_CODE);
                    return action;
                }
                //物料验证
                if (curBarcode.ItemInfo.IsNullOrEmpty() || curBarcode.ItemInfo.IS_ACTIVE == "N")
                if (curInv.ItemInfo.IsNullOrEmpty() || curInv.ItemInfo.IS_ACTIVE == "N")
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", curBarcode.ItemInfo.ITEM_CODE.IsNullOrEmpty(curBarcode.Barcode.ItemCode));
                    action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", curInv.ItemInfo.ITEM_CODE.IsNullOrEmpty(curInv.Barcode.ItemCode));
                    return action;
                }
                OrgCode = input.AuthOption.CurOrg;
@@ -203,10 +203,10 @@
                    ID = Guid.NewGuid().ToString(),
                    BUSINESSCODE = UserCode,
                    WAREHOUSECODE = WarehouseCode,
                    SN = curBarcode.SN,
                    ITEM_CODE = curBarcode.ItemInfo.ITEM_CODE,
                    QTY = curBarcode.Barcode.Qty ?? 0,
                    DATECODE = curBarcode.Barcode.ProdDate ?? DateTime.MinValue,
                    SN = curInv.SN,
                    ITEM_CODE = curInv.ItemInfo.ITEM_CODE,
                    QTY = curInv.Barcode.Qty ?? 0,
                    DATECODE = curInv.Barcode.ProdDate ?? DateTime.MinValue,
                    LOTNO = LotNo, //item.Barcode.LotNo,
                    STATUS = WMS_ITEM.STATUSs.Counted.GetValue(),
                    META_SN = input.SN,
@@ -225,17 +225,17 @@
                    STATUS = scanResult.STATUS,
                    WH_CODE = scanResult.WAREHOUSECODE,
                    WH_NAME = WarehouseName,
                    MName = curBarcode.ItemInfo.ITEM_NAME,
                    MDesc = curBarcode.ItemInfo.SPEC,
                    MUom = curBarcode.ItemInfo.UNIT
                    MName = curInv.ItemInfo.ITEM_NAME,
                    MDesc = curInv.ItemInfo.SPEC,
                    MUom = curInv.ItemInfo.UNIT
                };
                //验证条码是否已做过清点
                var nLogs = Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(t => t.SN.ToUpper() == curBarcode.SN.ToUpper()).First();
                var nLogs = Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(t => t.SN.ToUpper() == curInv.SN.ToUpper()).First();
                if (nLogs != null)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.BarcodeCounted", curBarcode.SN);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.BarcodeCounted", curInv.SN);
                    return action;
                }
@@ -247,7 +247,7 @@
                    AUTH_ORG = input.AuthOption.CurOrg,
                    CREATE_USER = UserCode,
                    OrderNo = UserCode,
                    Barcodes = curBarcode.SN,
                    Barcodes = curInv.SN,
                    CustomsNo = CustomsNo.Replace(",", ",").Trim().Split(',')[0],
                    AccountingNo = CustomsNo.Replace(",", ",").Trim().Split(',')[1],
                    CountsType = BIZ_ERP_CUSTOMS.CountsEnum.Incoming
Tiger.Business.WMS/Transaction/Old/CustomerSupplyInNew.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/CustomerSupplyInNew.cs ÐÞ¸Ä
@@ -144,14 +144,14 @@
                }
                var nLocation = new WMS_LOCATION();
                input.AuthOption.OrgCode.IsNullOrEmpty(input.AuthOption.CurOrg);
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var inv = result.Data;
                var inv = result.Data as Inventory;
                //判断是否一维码
                if (!inv.IsQRCode)
Tiger.Business.WMS/Transaction/Old/InFinished.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/InFinished.cs ÐÞ¸Ä
@@ -137,14 +137,14 @@
                    return action;
                }
                var nLocation = new WMS_LOCATION();
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var inv = result.Data;
                var inv = result.Data as Inventory;
                //验证条码是否正确
                if (!inv.isNormalStatus || inv.Status != WMS_ITEM.STATUSs.WaitIn)
Tiger.Business.WMS/Transaction/Old/InMatStorage.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/InMatStorage.cs ÐÞ¸Ä
@@ -70,14 +70,14 @@
                    return action;
                }
                var nLocation = new WMS_LOCATION();
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var inv = result.Data;
                var inv = result.Data as Inventory;
                //判断是否一维码
                if (!inv.IsQRCode)
                {
Tiger.Business.WMS/Transaction/Old/InProductionReturn.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/InProductionReturn.cs ÐÞ¸Ä
@@ -84,7 +84,7 @@
                }
                var nLocation = new WMS_LOCATION();
                Result<Inventory> result = new();
                Result<IInventory> result = new();
                if (WarehouseName.Contains("客供"))
                {
                    result = WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, true);
@@ -99,8 +99,8 @@
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                //
                var inv = result.Data;
                var inv = result.Data as Inventory;
                if (!inv.IsQRCode)
                {
                    action.IsSuccessed = false;
Tiger.Business.WMS/Transaction/Old/InReceipt.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/InReceipt.cs ÐÞ¸Ä
@@ -30,7 +30,7 @@
        #region Propertys & Variables
        public string UserCode { get; set; }
        public static long UserId { get; set; }
        public long UserId { get; set; }
        public string VenderCode { get; set; }
        public string SecondVenderCode { get; set; }
        public string WarehouseCode { get; set; }
@@ -92,14 +92,14 @@
                #endregion æŠ¥å…³å•号判断
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, false);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, false);
                if (result.Flag != Result.Flags.Success)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                inv = result.Data;
                inv = result.Data as Inventory;
                #region åˆ¤æ–­å½“前条码对应的SRM状态
Tiger.Business.WMS/Transaction/Old/LocationTransfer.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/LocationTransfer.cs ÐÞ¸Ä
@@ -100,14 +100,14 @@
                    return action;
                }
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var inv = result.Data;
                var inv = result.Data as Inventory;
                //验证条码是否正确
                if (!inv.isNormalStatus || !new[] { WMS_ITEM.STATUSs.InStore }.Contains(inv.Status))
Tiger.Business.WMS/Transaction/Old/OtherInLocation.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OtherInLocation.cs ÐÞ¸Ä
@@ -12,6 +12,7 @@
using Tiger.IBusiness;
using Tiger.Model.Sharetronic.Shelf;
using Tiger.Business.WMS.Sharetronic.Shelf;
using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
namespace Tiger.Business.WMS.Transaction
{
@@ -71,7 +72,7 @@
                //当input.ReqType为0时:无工单入库
                if (input.ReqType == 0)
                {
                    Result<Inventory> res = new();
                    Result<IInventory> res = new();
                    if (WarehouseName.Contains("客供"))
                    {
                        res = WMS_ITEM_Biz.WmsItem.GetK(input.SN, new() { UserId = "admin" }, true);
@@ -80,11 +81,12 @@
                    {
                        res = WMS_ITEM_Biz.WmsItem.Get(input.SN, new() { UserId = "admin" }, true);
                    }
                    var inv = res.Data as Inventory;
                    //判断是否一维码
                    if (!res.Data.IsQRCode)
                    if (!inv.IsQRCode)
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", res.Data.Barcode.MetaSn);
                        action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", inv.Barcode.MetaSn);
                        return action;
                    }
                    if (!res.IsSuccessed)
@@ -93,110 +95,110 @@
                        action.LocaleMsg = res.LocaleMsg;
                        return action;
                    }
                    if (res.Data.Status.GetValue() != WMS_ITEM.STATUSs.NotExists.GetValue() && res.Data.Status.GetValue() <= WMS_ITEM.STATUSs.InStore.GetValue())
                    if (inv.Status.GetValue() != WMS_ITEM.STATUSs.NotExists.GetValue() && inv.Status.GetValue() <= WMS_ITEM.STATUSs.InStore.GetValue())
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = Biz.L("状态异常{0}", string.Join(',', res.Data.StatusList.Select(x => x.GetDesc()))); //Biz.L("WMS.CustSupChk.ScanItem.StatusException", string.Join(',', res.Data.StatusList.Select(x => x.GetDesc())));
                        action.LocaleMsg = Biz.L("状态异常{0}", string.Join(',', inv.StatusList.Select(x => x.GetDesc()))); //Biz.L("WMS.CustSupChk.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(x => x.GetDesc())));
                        return action;
                    }
                    //验证条码是否正确
                    //if (!res.Data.isNormalStatus || !new[] { WMS_ITEM.STATUSs.WaitIn }.Contains(res.Data.Status))
                    //if (!inv.isNormalStatus || !new[] { WMS_ITEM.STATUSs.WaitIn }.Contains(inv.Status))
                    //{
                    //    action.IsSuccessed = false;
                    //    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.StatusException", string.Join(',', res.Data.StatusList));
                    //    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.StatusException", string.Join(',', inv.StatusList));
                    //    return action;
                    //}
                    //物料验证
                    if (res.Data.ItemInfo.IsNullOrEmpty() || res.Data.ItemInfo.IS_ACTIVE == "N")
                    if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", res.Data.ItemInfo.ITEM_CODE.IsNullOrEmpty(res.Data.Barcode.ItemCode));
                        action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                        return action;
                    }
                    List<WMS_ITEM_HIS> ItemHistorys = new List<WMS_ITEM_HIS>();
                    WMS_ITEM Item;
                    WMS_ITEM_PKG ItemPkgs;
                    var IsNull = false;
                    if (!res.Data.IsNullOrEmpty())
                    if (!inv.IsNullOrEmpty())
                    {
                        if (res.Data.Items.Count == 0)
                        if (inv.Items.Count == 0)
                        {
                            IsNull = true;
                            Item = new()
                            {
                                SN = res.Data.Barcode.SN,
                                ITEM_CODE = WarehouseName.Contains("客供") && !res.Data.Barcode.ItemCode.StartsWith("K") ? ("K" + res.Data.Barcode.ItemCode) : (res.Data.Barcode.ItemCode),
                                SN = inv.Barcode.SN,
                                ITEM_CODE = WarehouseName.Contains("客供") && !inv.Barcode.ItemCode.StartsWith("K") ? ("K" + inv.Barcode.ItemCode) : (inv.Barcode.ItemCode),
                                AUTH_ORG = input.AuthOption.CurOrg,
                                STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(),
                                QTY = res.Data.Barcode.Qty.ToDecimal(),
                                PROD_DATE = res.Data.Barcode.DateCode.ToDateTime(),
                                QTY = inv.Barcode.Qty.ToDecimal(),
                                PROD_DATE = inv.Barcode.DateCode.ToDateTime(),
                                ERP_WH = WarehouseCode,
                                UNIT = res.Data.Barcode.Unit,
                                UNIT = inv.Barcode.Unit,
                            };
                            WMS_ITEM_HIS his = new WMS_ITEM_HIS(Item, $"无单据入库");
                            ItemHistorys.Add(his);
                            ItemPkgs = new()
                            {
                                SN = res.Data.Barcode.SN,
                                SN = inv.Barcode.SN,
                                AUTH_ORG = input.AuthOption.CurOrg,
                                ITEM_CODE = WarehouseName.Contains("客供") && !res.Data.Barcode.ItemCode.StartsWith("K") ? ("K" + res.Data.Barcode.ItemCode) : (res.Data.Barcode.ItemCode),
                                QTY = res.Data.Barcode.Qty.ToDecimal(),
                                ITEM_CODE = WarehouseName.Contains("客供") && !inv.Barcode.ItemCode.StartsWith("K") ? ("K" + inv.Barcode.ItemCode) : (inv.Barcode.ItemCode),
                                QTY = inv.Barcode.Qty.ToDecimal(),
                                ERP_WH = WarehouseCode,
                                UNIT = res.Data.Barcode.Unit,
                                UNIT = inv.Barcode.Unit,
                            };
                            res.Data.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => res.Data.Items.Any(s => s.SN == q.SN)).ToList();//扩展表
                            //var data = result.Data.Items.Select(i => i.SN).ToList().Except(result.Data.ItemsExt.Select(i => i.SN).ToList());
                            var data = res.Data.Items.Where(q => !res.Data.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            inv.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => inv.Items.Any(s => s.SN == q.SN)).ToList();//扩展表
                            //var data = inv.Items.Select(i => i.SN).ToList().Except(inv.ItemsExt.Select(i => i.SN).ToList());
                            var data = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            //扩展表不存在时新建
                            if (data.Count > 0)
                            {
                                foreach (var item in data)
                                {
                                    res.Data.ItemsExt.Add(new()
                                    inv.ItemsExt.Add(new()
                                    {
                                        SN = item.SN,
                                        SUPP_ITEM_CODE = res.Data.Barcode.OEMItemCode,
                                        META_SN = res.Data.Barcode.MetaSn,
                                        QR_CODE = res.Data.Barcode.MetaSn
                                        SUPP_ITEM_CODE = inv.Barcode.OEMItemCode,
                                        META_SN = inv.Barcode.MetaSn,
                                        QR_CODE = inv.Barcode.MetaSn
                                    });
                                }
                            }
                            res.Data.Items.Add(Item);
                            res.Data.History.Add(his);
                            res.Data.Packages.Add(ItemPkgs);
                            inv.Items.Add(Item);
                            inv.History.Add(his);
                            inv.Packages.Add(ItemPkgs);
                        }
                        else if (res.Data.Items.Count == 1)
                        else if (inv.Items.Count == 1)
                        {
                            res.Data.Items.First().QTY = res.Data.Barcode.Qty.ToDecimal();
                            res.Data.Items.First().ERP_WH = WarehouseCode;
                            res.Data.Items.First().AUTH_ORG = input.AuthOption.CurOrg;
                            inv.Items.First().QTY = inv.Barcode.Qty.ToDecimal();
                            inv.Items.First().ERP_WH = WarehouseCode;
                            inv.Items.First().AUTH_ORG = input.AuthOption.CurOrg;
                            res.Data.Packages.First().QTY = res.Data.Barcode.Qty.ToDecimal();
                            res.Data.Packages.First().ERP_WH = WarehouseCode;
                            res.Data.Packages.First().AUTH_ORG = input.AuthOption.CurOrg;
                            inv.Packages.First().QTY = inv.Barcode.Qty.ToDecimal();
                            inv.Packages.First().ERP_WH = WarehouseCode;
                            inv.Packages.First().AUTH_ORG = input.AuthOption.CurOrg;
                        }
                        //如果扫描外箱的不能更新数量 2024-09-23 Ben Lin
                        else
                        {
                            foreach (var item in res.Data.Items)
                            foreach (var item in inv.Items)
                            {
                                //item.QTY = res.Data.Barcode.Qty.ToDecimal();
                                //item.QTY = inv.Barcode.Qty.ToDecimal();
                                item.ERP_WH = WarehouseCode;
                                item.AUTH_ORG = input.AuthOption.CurOrg;
                            }
                            foreach (var item in res.Data.Packages)
                            foreach (var item in inv.Packages)
                            {
                                //item.QTY = res.Data.Barcode.Qty.ToDecimal();
                                //item.QTY = inv.Barcode.Qty.ToDecimal();
                                item.ERP_WH = WarehouseCode;
                                item.AUTH_ORG = input.AuthOption.CurOrg;
                            }
                        }
                        //CustomerSupplyPuton.LocationCode = nLocation.LOCATION_CODE;
                    }
                    foreach (var item in res.Data.Items)
                    foreach (var item in inv.Items)
                    {
                        item.SOURCE_CODE = item.TRANS_CODE;
                        item.SOURCE_LINE = item.TRANS_LINE;
@@ -208,7 +210,7 @@
                    // åˆ¤æ–­æ˜¯å¦æ™ºèƒ½è´§æž¶
                    if (CustomerSupplyPuton.IsSmartRack)
                    {
                        ShelfApiResult shelfApiResult = await Share.Shelf.PutOn(TransID, Shelf, res.Data.Items[0]);
                        ShelfApiResult shelfApiResult = await Share.Shelf.PutOn(TransID, Shelf, inv.Items[0]);
                        if (!shelfApiResult.IsSuccess)
                        {
                            action.IsSuccessed = false;
@@ -247,7 +249,7 @@
                    }
                    //判断储位是否单放
                    if (nLocation.IS_SINGLE == "Y" && res.Data.Items.Count > 1)
                    if (nLocation.IS_SINGLE == "Y" && inv.Items.Count > 1)
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.LocationSingleFailure"); //$"储位只能单放一个物料";
@@ -255,7 +257,7 @@
                    }
                    //执行入库
                    Result<PutOnInfo> putonResult = WMS_ITEM_Biz.WmsItem.PutOn(res.Data, input.AuthOption, nLocation.LOCATION_CODE);
                    Result<PutOnInfo> putonResult = WMS_ITEM_Biz.WmsItem.PutOn(inv, input.AuthOption, nLocation.LOCATION_CODE);
                    if (!putonResult.IsSuccessed)
                    {
                        action.IsSuccessed = false;
@@ -293,35 +295,35 @@
                    // è¿”回其他入库对象
                    action.Data = new Model.Minsun.OtherInstockBarcodeOutput
                    {
                        Barcode = res.Data.SN,
                        MaterialCode = res.Data.Items[0].ITEM_CODE,
                        //MaterialName = res.Data.Items[0].ITEM_NAME,
                        //MaterialStandard = res.Data.ItemInfo.SPEC,
                        InitialQty = res.Data.Barcode.Qty ?? 0,
                        CurrentQty = res.Data.Barcode.Qty ?? 0,
                        Unit = res.Data.Items[0].UNIT,
                        DateCode = res.Data.Barcode.ProdDate ?? DateTime.MinValue,
                        LotNo = res.Data.SN,  //批次号默认为外包装条码
                        Barcode = inv.SN,
                        MaterialCode = inv.Items[0].ITEM_CODE,
                        //MaterialName = inv.Items[0].ITEM_NAME,
                        //MaterialStandard = inv.ItemInfo.SPEC,
                        InitialQty = inv.Barcode.Qty ?? 0,
                        CurrentQty = inv.Barcode.Qty ?? 0,
                        Unit = inv.Items[0].UNIT,
                        DateCode = inv.Barcode.ProdDate ?? DateTime.MinValue,
                        LotNo = inv.SN,  //批次号默认为外包装条码
                                              //SourceBillCode = billCode,
                        LocationCode = nLocation.LOCATION_CODE,
                        //ReceiptCode = barcodeScanned?.BUSINESSCODE,
                        //IncompleteTips = isCompleted ? "数量:0 (0盘)" : iWMS.GetIncompleteTipsNew(barcodeScanned?.BUSINESSCODE, barcodeScanned?.ITEM_CODE),
                        IsScanShelf = false
                    };
                    action.LocaleMsg = Biz.L("入库成功{0}", res.Data.SN);
                    action.LocaleMsg = Biz.L("入库成功{0}", inv.SN);
                }
                //其他入库
                if (input.ReqType == 1)
                {
                    Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                    if (!result.IsSuccessed)
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = result.LocaleMsg;
                        return action;
                    }
                    var inv = result.Data;
                    var inv = result.Data as Inventory;
                    //验证条码是否正确
                    if (!inv.isNormalStatus || !new[] { WMS_ITEM.STATUSs.WaitIn }.Contains(inv.Status))
Tiger.Business.WMS/Transaction/Old/OtherInLocationChecking.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OtherInLocationChecking.cs ÐÞ¸Ä
@@ -33,7 +33,7 @@
        #region Propertys & Variables
        public string UserCode { get; set; }
        public static long UserId { get; set; }
        public long UserId { get; set; }
        public string VenderCode { get; set; }
        public string LotNo { get; set; }
        public string SecondVenderCode { get; set; }
@@ -109,49 +109,49 @@
                    return action;
                }
                input.AuthOption.OrgCode = input.AuthOption.OrgCode.IsNullOrEmpty() ? input.AuthOption.CurOrg : input.AuthOption.OrgCode;
                Result<Inventory> result = WarehouseName.Contains("客供") ? WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, false) : WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, false);
                Result<IInventory> result = WarehouseName.Contains("客供") ? WMS_ITEM_Biz.WmsItem.GetK(input.SN, input.AuthOption, false) : WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, false);
                if (result.Flag != Result.Flags.Success)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var curBarcode = result.Data;
                if (!curBarcode.IsQRCode)
                var curInv = result.Data as Inventory;
                if (!curInv.IsQRCode)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", curBarcode.Barcode.MetaSn);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotQrCode", curInv.Barcode.MetaSn);
                    return action;
                }
                //判断条码是否为最少包装
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curBarcode.Barcode.Type))
                if (!new[] { Barcode.Types.Small, Barcode.Types.Other }.Contains(curInv.Barcode.Type))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curBarcode.SN);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.TypeError", curInv.SN);
                    return action;
                }
                //判断条码状态为不存在或已下架可以清点(!nDisassembleBarcode.isNormalStatus ||)
                //物料验证
                if (curBarcode.ItemInfo.IsNullOrEmpty() || curBarcode.ItemInfo.IS_ACTIVE == "N")
                if (curInv.ItemInfo.IsNullOrEmpty() || curInv.ItemInfo.IS_ACTIVE == "N")
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", curBarcode.ItemInfo.ITEM_CODE.IsNullOrEmpty(curBarcode.Barcode.ItemCode));
                    action.LocaleMsg = Biz.L("WMS.ProdMReq.ScanItem.ItemCodeNotExistsOrNotActive", curInv.ItemInfo.ITEM_CODE.IsNullOrEmpty(curInv.Barcode.ItemCode));
                    return action;
                }
                if (!new[] { WMS_ITEM.STATUSs.NotExists, WMS_ITEM.STATUSs.OffShelf }.Contains(curBarcode.Status))
                if (!new[] { WMS_ITEM.STATUSs.NotExists, WMS_ITEM.STATUSs.OffShelf }.Contains(curInv.Status))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ExistItem", curBarcode.ItemInfo.ITEM_CODE);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ExistItem", curInv.ItemInfo.ITEM_CODE);
                    return action;
                }
                BIZ_ERP_OTH_IN_SNExt snExt = new();
                // BIZ_ERP_OTH_IN_SN scanResult = Business.Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(q=>q.SN==curBarcode.Barcode.SN).First();
                //验证条码是否已做过清点
                var scanResult = Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(t => t.SN.ToUpper() == curBarcode.SN.ToUpper()).First();
                var scanResult = Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(t => t.SN.ToUpper() == curInv.SN.ToUpper()).First();
                if (!scanResult.IsNullOrEmpty() && scanResult.STATUS > WMS_ITEM.STATUSs.Counted.GetValue())
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.BarcodeCounted", curBarcode.SN);
                    action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.BarcodeCounted", curInv.SN);
                    return action;
                }
                var isNo = true;
@@ -164,10 +164,10 @@
                    scanResult.CREATE_USER = UserCode;
                    scanResult.BUSINESSCODE = "OTH_" + UserCode;
                    scanResult.WAREHOUSECODE = WarehouseCode;
                    scanResult.SN = curBarcode.Barcode.SN;
                    scanResult.ITEM_CODE = curBarcode.Barcode.ItemCode;
                    scanResult.QTY = curBarcode.Barcode.Qty ?? 0;
                    scanResult.DATECODE = curBarcode.Barcode.ProdDate ?? DateTime.MinValue;
                    scanResult.SN = curInv.Barcode.SN;
                    scanResult.ITEM_CODE = curInv.Barcode.ItemCode;
                    scanResult.QTY = curInv.Barcode.Qty ?? 0;
                    scanResult.DATECODE = curInv.Barcode.ProdDate ?? DateTime.MinValue;
                    scanResult.LOTNO = LotNo; //item.Barcode.LotNo;
                    scanResult.STATUS = WMS_ITEM.STATUSs.Counted.GetValue();
                    scanResult.META_SN = input.SN;
@@ -179,10 +179,10 @@
                    //scanResult.ID = Guid.NewGuid().ToString();
                    scanResult.BUSINESSCODE = "OTH_" + UserCode;
                    scanResult.WAREHOUSECODE = WarehouseCode;
                    scanResult.SN = curBarcode.SN;
                    scanResult.ITEM_CODE = curBarcode.ItemInfo.ITEM_CODE;
                    scanResult.QTY = curBarcode.Barcode.Qty ?? 0;
                    scanResult.DATECODE = curBarcode.Barcode.ProdDate ?? DateTime.MinValue;
                    scanResult.SN = curInv.SN;
                    scanResult.ITEM_CODE = curInv.ItemInfo.ITEM_CODE;
                    scanResult.QTY = curInv.Barcode.Qty ?? 0;
                    scanResult.DATECODE = curInv.Barcode.ProdDate ?? DateTime.MinValue;
                    scanResult.LOTNO = LotNo; //item.Barcode.LotNo;
                    scanResult.STATUS = WMS_ITEM.STATUSs.Counted.GetValue();
                    scanResult.META_SN = input.SN;
@@ -201,9 +201,9 @@
                snExt.STATUS = scanResult.STATUS;
                snExt.WH_CODE = scanResult.WAREHOUSECODE;
                snExt.WH_NAME = WarehouseName;
                snExt.MName = curBarcode.ItemInfo?.ITEM_NAME;
                snExt.MDesc = curBarcode.ItemInfo?.SPEC;
                snExt.MUom = curBarcode.ItemInfo?.UNIT;
                snExt.MName = curInv.ItemInfo?.ITEM_NAME;
                snExt.MDesc = curInv.ItemInfo?.SPEC;
                snExt.MUom = curInv.ItemInfo?.UNIT;
                //保存到数据库
                var db = Business.Biz.Db;
@@ -213,7 +213,7 @@
                    AUTH_ORG = input.AuthOption.CurOrg,
                    CREATE_USER = UserCode,
                    OrderNo = UserCode,
                    Barcodes = curBarcode.SN,
                    Barcodes = curInv.SN,
                    CustomsNo = CustomsNo.Replace(",", ",").Trim().Split(',')[0],
                    AccountingNo = CustomsNo.Replace(",", ",").Trim().Split(',')[1],
                    CountsType = BIZ_ERP_CUSTOMS.CountsEnum.OtherInput
Tiger.Business.WMS/Transaction/Old/OutNoBillcode.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutNoBillcode.cs ÐÞ¸Ä
@@ -67,9 +67,9 @@
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果物料已经完成移库则货架上亮灯提醒储位
        /// </summary>
        public async Task<ApiAction<NoWorkOrderOutput>> ScanItem(BaseInput input)
        public async Task<ApiAction<DefaultScanItemOutput>> ScanItem(BaseInput input)
        {
            var action = new ApiAction<NoWorkOrderOutput>();
            var action = new ApiAction<DefaultScanItemOutput>();
            try
            {
                if (input.SN.IsNullOrEmpty())
@@ -80,14 +80,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
@@ -215,7 +215,7 @@
                    throw dbTran.ErrorException;
                }
                action.Data = new NoWorkOrderOutput()
                action.Data = new DefaultScanItemOutput()
                {
                    SN = CurInv.SN,
                    ItemCode = CurInv.ItemInfo.ITEM_CODE,
Tiger.Business.WMS/Transaction/Old/OutOther.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutOther.cs ÐÞ¸Ä
@@ -351,14 +351,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/Transaction/Old/OutSale.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutSale.cs ÐÞ¸Ä
@@ -277,14 +277,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/Transaction/Old/OutSplit.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutSplit.cs ÐÞ¸Ä
@@ -62,14 +62,14 @@
                    return action;
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                if (string.IsNullOrEmpty(CurInv.ItemInfo?.ITEM_CODE))
                {
                    action.IsSuccessed = false;
Tiger.Business.WMS/Transaction/Old/OutTransfer.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutTransfer.cs ÐÞ¸Ä
@@ -284,14 +284,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/Transaction/Old/OutWorkOrder.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/OutWorkOrder.cs ÐÞ¸Ä
@@ -371,14 +371,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/Transaction/Old/ProductionMaterialReq.cs
ÎļþÃû´Ó Tiger.Business.WMS/Transaction/ProductionMaterialReq.cs ÐÞ¸Ä
@@ -497,14 +497,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/Transaction/Old/Resell.cs
Tiger.Business.WMS/Transaction/Out_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,256 @@
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tiger.Model;
using Tiger.IBusiness;
using Org.BouncyCastle.Ocsp;
namespace Tiger.Business.WMS.Transaction
{
    /// <summary>
    /// æ ‡å‡†ä¸‹æž¶äº‹åŠ¡
    /// </summary>
    public class Out_Default : WMSTransactionBase, IOut_Default
    {
        public IOut_Default Init(string id, string userCode, string apiHost, string orgCode)
        {
            TransID = id;
            UserCode = userCode;
            ApiHost = apiHost;
            OrgCode = orgCode;
            Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
            return this;
        }
        #region Propertys & Variables
        public string UserCode { get; set; }
        public long UserId { get; set; }
        public string OrgCode { get; set; }
        public Inventory CurInvItem { get; set; }
        public ScanShelfInfo CurScanShelf { get; set; }
        #endregion
        #region Functions
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果是智能货架则亮灯提醒储位
        /// </summary>
        public async Task<ApiAction<DefaultScanItemOutput>> ScanItem(BaseInput input)
        {
            var action = new ApiAction<DefaultScanItemOutput>();
            try
            {
                if (input.SN.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("条码不能为空");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.SnEmptyFailure");
                    return action;
                }
                //解析条码
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInvItem = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInvItem.isNormalStatus || CurInvItem.Status != WMS_ITEM.STATUSs.InStore)
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L($"状态[{0}]异常,请重新扫描");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', CurInvItem.StatusList.Select(x => x.GetDesc())));
                    return action;
                }
                //储位验证
                if (CurInvItem.Location.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L($"条码[{0}]库存信息异常: æ²¡æœ‰å‚¨ä½ä¿¡æ¯ï¼Œè¯·å…ˆä¸Šæž¶åŽå†æ‰«æ(储位Id: {1})");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationIsNull", CurInvItem.CurPkg.SN, CurInvItem.CurPkg.LOCATION_ID);
                    return action;
                }
                //物料验证
                if (CurInvItem.ItemInfo.IsNullOrEmpty() || CurInvItem.ItemInfo.IS_ACTIVE == "N")
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L($"物料编码[{0}]不存在或者该物料未启用");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", CurInvItem.ItemInfo.ITEM_CODE.IsNullOrEmpty(CurInvItem.Barcode.ItemCode));
                    return action;
                }
                //出库下架
                foreach (var item in CurInvItem.Items)
                {
                    item.TRANS_CODE = "Out_Default";
                    item.TRANS_NO = $"Out_Default_{DateTime.Now:yyyyMMdd}";
                }
                Result<TakeDownInfo> downResult = WMS_ITEM_Biz.WmsItem.TakeDown(CurInvItem, input.AuthOption, WMS_ITEM.STATUSs.Sended);
                if (!downResult.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = downResult.LocaleMsg;
                    return action;
                }
                TakeDownInfo downInfo = downResult.Data;
                //灭灯
                if (CurInvItem.Shelf.IsLightShelf)
                {
                    await Share.Shelf.DownSingle(TransID, CurInvItem.Location);
                }
                //保存数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    //下架
                    db.Updateable(downInfo.Items, UserCode).ExecuteCommand();
                    db.Insertable(downInfo.History, UserCode).ExecuteCommand();
                    db.Updateable(downInfo.Packages, UserCode).ExecuteCommand();
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
                    throw dbTran.ErrorException;
                }
                action.Data = new DefaultScanItemOutput()
                {
                    SN = CurInvItem.SN,
                    ItemCode = CurInvItem.ItemInfo.ITEM_CODE,
                    MaterialName = CurInvItem.ItemInfo.ITEM_NAME,
                    Qty = CurInvItem.CurPkg.QTY,
                    Unit = CurInvItem.CurPkg.UNIT,
                    regionCode = CurInvItem.Region.REGION_CODE,
                    locationCode = CurInvItem.Location?.LOCATION_CODE,
                    DateCode = CurInvItem.Items[0].PROD_DATE,
                    ScanAfCut = CurInvItem.Warehouse.SCAN_AF_CUT
                };
                //action.LocaleMsg = Biz.L($"扫描条码[{0}]从储位[{1}]下架成功");
                action.LocaleMsg = Biz.L("WMS.Default.ScanItem.TakeDownSucceeded", action.Data.SN, action.Data.locationCode);
            }
            catch (Exception ex)
            {
                ResetInfo();
                //action.CatchExceptionWithLog(ex, $"扫描条码[{input.SN}]复核异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", action.Data.SN));
            }
            return action;
        }
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位(供亮灯货架使用)
        /// </summary>
        public async Task<ApiAction<ScanShelfInfo>> ScanShelf(string Code)
        {
            var action = new ApiAction<ScanShelfInfo>();
            try
            {
                if (Code.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("请输入或扫描有效的货架/储位码");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
                    return action;
                }
                CurScanShelf = new ScanShelfInfo();
                // æŸ¥è¯¢è´§æž¶ä¿¡æ¯
                var whUnit = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.SHELF_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                // æ‰«æè´§æž¶ä»£ç ï¼Œä¸”为智能货架
                if (whUnit != null && whUnit.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue())
                {
                    CurScanShelf.Shelf = whUnit.Shelf;
                    CurScanShelf.WarehouseCode = whUnit.WH_CODE;
                    CurScanShelf.RegionCode = whUnit.REGION_CODE;
                    CurScanShelf.ShelfCode = whUnit.SHELF_CODE;
                    CurScanShelf.LocationCode = whUnit.LOCATION_CODE;
                    CurScanShelf.ShelfType = whUnit.SHELF_TYPE;
                    CurScanShelf.IsSmartRack = true;
                }
                // æ‰«æå‚¨ä½ä»£ç 
                else
                {
                    var nLocation = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.LOCATION_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).FirstAsync();
                    if (nLocation == null)
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("储位[{0}]不存在");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.LocationNotExist", Code);
                        return action;
                    }
                    if (nLocation.IS_ACTIVE == "N")
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("扫描的储位[{0}]未启用");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfOrLocationDisabled", Code);
                        return action;
                    }
                    //if (nLocation.Shelf.IsLightShelf || nLocation.Location.IS_SINGLE == "Y")
                    //{
                    //    var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
                    //    if (!locationData.IsNullOrEmpty())
                    //    {
                    //        action.IsSuccessed = false;
                    //        //action.LocaleMsg = Biz.L("储位[{0}]已存有物料[{1}],请检查系统库存信息");
                    //        action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", Code, locationData.SN);
                    //        return action;
                    //    }
                    //}
                    CurScanShelf.Location = nLocation.Location;
                    CurScanShelf.WarehouseCode = nLocation.WH_CODE;
                    CurScanShelf.RegionCode = nLocation.REGION_CODE;
                    CurScanShelf.ShelfCode = nLocation.SHELF_CODE;
                    CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
                    CurScanShelf.IsSmartRack = false;
                }
                CurScanShelf.IsScanShelf = true;
                //action.LocaleMsg = Biz.L("扫描货架/储位[{0}]成功");
                action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ScanSucceeded", Code);
                action.Data = CurScanShelf;
            }
            catch (Exception ex)
            {
                //取消当前操作
                ResetInfo();
                //action.CatchExceptionWithLog(ex, $"扫描货架/储位[{0}]异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code));
            }
            return action;
        }
        #endregion
        /// <summary>
        /// é‡ç½®å½“前操作,有需要则重写此方法
        /// </summary>
        public override void ResetInfo()
        {
            base.ResetInfo();
            CurInvItem = null;
            CurScanShelf = null;
        }
        public override bool Close(bool needSaveHistoryLog = false)
        {
            this.IsFinished = true;
            return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished;
        }
    }//endClass
}
Tiger.Business.WMS/Transaction/WMSTransactionBase.cs
@@ -62,7 +62,28 @@
        /// æ‰§è¡Œä¸­æ¡ç 
        /// </summary>
        public string ProcessingSn {  get; set; }
        /// <summary>
        /// é‡ç½®äº‹åŠ¡æ“ä½œ
        /// </summary>
        /// <returns></returns>
        public ApiAction Reset()
        {
            var action = new ApiAction();
            ResetInfo();
            action.IsSuccessed = true;
            //action.LocaleMsg = new($"操作已重置,请重新扫描");
            action.LocaleMsg = new("WMS.Transaction.Reset");
            return action;
        }
        /// <summary>
        /// é‡ç½®å½“前操作,有需要则重写此方法
        /// </summary>
        public virtual void ResetInfo()
        {
            ProcessingSn = null;
        }
        #endregion
        #region MQTT
Tiger.Business.WMS/Transaction/WmsCount.cs
@@ -205,14 +205,14 @@
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                //验证条码是否正确
                if (!CurInv.isNormalStatus || CurInv.Status != WMS_ITEM.STATUSs.InStore)
Tiger.Business.WMS/WMS_ITEM_Biz.cs
@@ -31,11 +31,12 @@
            /// <param name="option">授权查询选项</param>
            /// <param name="doUnPack">是否同时执行拆包操作,解除与父条码之间的包装关系</param>
            /// <returns></returns>
            public Result<Inventory> Get(string sn, AuthOption option, bool doUnPack)
            public Result<IInventory> Get(string sn, AuthOption option, bool doUnPack)
            {
                var result = new Result<Inventory>(Result.Flags.Success, new Inventory());
                var result = new Result<IInventory>(Result.Flags.Success);
                try
                {
                    var inv = new Inventory();
                    Barcode barcode = new Barcode(sn);
                    if (sn.IsNullOrEmpty())
                    {
@@ -61,24 +62,24 @@
                        //包装表中找到条码
                        if (!query.IsNullOrEmpty() && query.QTY > 0)
                        {
                            result.Data.SN = barcode.SN;
                            result.Data.Barcode = barcode;
                            result.Data.ExtInfo = query.ExtInfo;
                            result.Data.ItemInfo = query.ItemInfo;
                            result.Data.Warehouse = query.Warehouse;
                            result.Data.Region = query.Region;
                            result.Data.Shelf = query.Shelf;
                            result.Data.Location = query.Location;
                            result.Data.Packages = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM_PKG>("pkg_wms_get_item_pkg", new SugarParameter("root", barcode.SN));
                            result.Data.Items = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM>("pkg_wms_get_items", new SugarParameter("root", barcode.SN));
                            result.Data.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => result.Data.Items.Any(s => s.SN == q.SN)).ToList();
                            //var data = result.Data.Items.Select(i => i.SN).ToList().Except(result.Data.ItemsExt.Select(i => i.SN).ToList());
                            var data = result.Data.Items.Where(q => !result.Data.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            inv.SN = barcode.SN;
                            inv.Barcode = barcode;
                            inv.ExtInfo = query.ExtInfo;
                            inv.ItemInfo = query.ItemInfo;
                            inv.Warehouse = query.Warehouse;
                            inv.Region = query.Region;
                            inv.Shelf = query.Shelf;
                            inv.Location = query.Location;
                            inv.Packages = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM_PKG>("pkg_wms_get_item_pkg", new SugarParameter("root", barcode.SN));
                            inv.Items = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM>("pkg_wms_get_items", new SugarParameter("root", barcode.SN));
                            inv.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => inv.Items.Any(s => s.SN == q.SN)).ToList();
                            //var data = inv.Items.Select(i => i.SN).ToList().Except(inv.ItemsExt.Select(i => i.SN).ToList());
                            var data = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            if (data.Count > 0)
                            {
                                foreach (var item in data)
                                {
                                    result.Data.ItemsExt.Add(new()
                                    inv.ItemsExt.Add(new()
                                    {
                                        SN = item.SN,
                                        SUPP_ITEM_CODE = barcode.OEMItemCode,
@@ -90,12 +91,12 @@
                            result.LocaleMsg = new($"WMS.WmsItem.Barcode.Get{(doUnPack ? "UnPack" : "")}Success", barcode.SN, query.Parent?.SN);
                            if (!query.Parent.IsNullOrEmpty() && doUnPack && query.Parent.SN != query.SN)
                            {
                                result.Data.ParentPkg = null;
                                inv.ParentPkg = null;
                                //保存数据到数据库
                                var db = Biz.Db;
                                var dbTran = db.UseTran(() =>
                                {
                                    var unPackQty = result.Data.Items.Sum(q => q.QTY);
                                    var unPackQty = inv.Items.Sum(q => q.QTY);
                                    db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.PARENT_SN == null).Where(q => q.ID == query.ID).ExecuteCommand();
                                    db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.QTY == q.QTY - unPackQty).Where(q => q.ID == query.Parent.ID).ExecuteCommand();
                                    if (!Biz.Db.Queryable<WMS_ITEM_PKG>().Any(q => q.PARENT_SN == query.PARENT_SN && q.SN != query.SN))
@@ -110,17 +111,18 @@
                            }
                            else
                            {
                                result.Data.ParentPkg = query.Parent;
                                inv.ParentPkg = query.Parent;
                            }
                        }
                        else
                        {
                            result.Data.SN = barcode.SN;
                            result.Data.Barcode = barcode;
                            result.Data.ItemInfo = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == barcode.ItemCode).First();
                            inv.SN = barcode.SN;
                            inv.Barcode = barcode;
                            inv.ItemInfo = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == barcode.ItemCode).First();
                            result.LocaleMsg = new($"WMS.WmsItem.Barcode.NotFound", barcode.SN);
                        }
                    }
                    result.Data = inv;
                }
                catch (Exception ex)
                {
@@ -137,11 +139,12 @@
            /// <param name="option">授权查询选项</param>
            /// <param name="doUnPack">是否同时执行拆包操作,解除与父条码之间的包装关系</param>
            /// <returns></returns>
            public Result<Inventory> GetK(string sn, AuthOption option, bool doUnPack)
            public Result<IInventory> GetK(string sn, AuthOption option, bool doUnPack)
            {
                var result = new Result<Inventory>(Result.Flags.Success, new Inventory());
                var result = new Result<IInventory>(Result.Flags.Success, new Inventory());
                try
                {
                    var inv = new Inventory();
                    Barcode barcode = new Barcode(sn);
                    barcode.ItemCode = (barcode.ItemCode.IsNullOrEmpty("K").StartsWith("K") ? "" : "K") + barcode.ItemCode;
                    if (sn.IsNullOrEmpty())
@@ -167,25 +170,25 @@
                        //包装表中找到条码
                        if (!query.IsNullOrEmpty() && query.QTY > 0)
                        {
                            result.Data.SN = barcode.SN;
                            result.Data.Barcode = barcode;
                            result.Data.ExtInfo = query.ExtInfo;
                            result.Data.ItemInfo = query.ItemInfo;
                            result.Data.Warehouse = query.Warehouse;
                            result.Data.Region = query.Region;
                            result.Data.Shelf = query.Shelf;
                            result.Data.Location = query.Location;
                            result.Data.Packages = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM_PKG>("pkg_wms_get_item_pkg", new SugarParameter("root", barcode.SN));
                            result.Data.Items = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM>("pkg_wms_get_items", new SugarParameter("root", barcode.SN));
                            result.Data.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => result.Data.Items.Any(s => s.SN == q.SN)).ToList();//扩展表
                            //var data = result.Data.Items.Select(i => i.SN).ToList().Except(result.Data.ItemsExt.Select(i => i.SN).ToList());
                            var data = result.Data.Items.Where(q => !result.Data.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            inv.SN = barcode.SN;
                            inv.Barcode = barcode;
                            inv.ExtInfo = query.ExtInfo;
                            inv.ItemInfo = query.ItemInfo;
                            inv.Warehouse = query.Warehouse;
                            inv.Region = query.Region;
                            inv.Shelf = query.Shelf;
                            inv.Location = query.Location;
                            inv.Packages = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM_PKG>("pkg_wms_get_item_pkg", new SugarParameter("root", barcode.SN));
                            inv.Items = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM>("pkg_wms_get_items", new SugarParameter("root", barcode.SN));
                            inv.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => inv.Items.Any(s => s.SN == q.SN)).ToList();//扩展表
                            //var data = inv.Items.Select(i => i.SN).ToList().Except(inv.ItemsExt.Select(i => i.SN).ToList());
                            var data = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                            //扩展表不存在时新建
                            if (data.Count > 0)
                            {
                                foreach (var item in data)
                                {
                                    result.Data.ItemsExt.Add(new()
                                    inv.ItemsExt.Add(new()
                                    {
                                        SN = item.SN,
                                        SUPP_ITEM_CODE = barcode.OEMItemCode,
@@ -198,12 +201,12 @@
                            if (!query.Parent.IsNullOrEmpty() && doUnPack && query.Parent.SN != query.SN)
                            {
                                result.Data.ParentPkg = null;
                                inv.ParentPkg = null;
                                //保存数据到数据库
                                var db = Biz.Db;
                                var dbTran = db.UseTran(() =>
                                {
                                    var unPackQty = result.Data.Items.Sum(q => q.QTY);
                                    var unPackQty = inv.Items.Sum(q => q.QTY);
                                    db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.PARENT_SN == null).Where(q => q.ID == query.ID).ExecuteCommand();
                                    db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.QTY == q.QTY - unPackQty).Where(q => q.ID == query.Parent.ID).ExecuteCommand();
                                    if (!Biz.Db.Queryable<WMS_ITEM_PKG>().Any(q => q.PARENT_SN == query.PARENT_SN && q.SN != query.SN))
@@ -218,17 +221,18 @@
                            }
                            else
                            {
                                result.Data.ParentPkg = query.Parent;
                                inv.ParentPkg = query.Parent;
                            }
                        }
                        else
                        {
                            result.Data.SN = barcode.SN;
                            result.Data.Barcode = barcode;
                            result.Data.ItemInfo = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == barcode.ItemCode).First();
                            inv.SN = barcode.SN;
                            inv.Barcode = barcode;
                            inv.ItemInfo = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == barcode.ItemCode).First();
                            result.LocaleMsg = new($"WMS.WmsItem.Barcode.NotFound", barcode.SN);
                        }
                    }
                    result.Data = inv;
                }
                catch (Exception ex)
                {
@@ -245,11 +249,12 @@
            /// <param name="targetLocation">要上架的储位代码</param>
            /// <param name="isTransfer">是否移库操作</param>
            /// <returns></returns>
            public Result<PutOnInfo> PutOn(Inventory inventory, AuthOption option, string targetLocation, bool isTransfer = false)
            public Result<PutOnInfo> PutOn(IInventory inventory, AuthOption option, string targetLocation, bool isTransfer = false)
            {
                var result = new Result<PutOnInfo>(Result.Flags.Success, new PutOnInfo());
                try
                {
                    var inv = inventory as Inventory;
                    var location = Biz.Db.Queryable<V_WH_UNIT>().Where(q => q.LOCATION_CODE == targetLocation && q.AUTH_ORG == option.CurOrg).IncludesAllFirstLayer().First();
                    if (!location.IsNullOrEmpty())
                    {
@@ -260,7 +265,7 @@
                        foreach (var item in inventory.Items)
                        {
                            item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
                            item.SUPP_LOTNO = inventory.Barcode.LotNo;
                            item.SUPP_LOTNO = inv.Barcode.LotNo;
                            item.FIRST_IN_DATE = item.FIRST_IN_DATE <= DateTime.MinValue ? DateTime.Now : item.FIRST_IN_DATE;
                            item.PROD_DATE = item.PROD_DATE <= DateTime.MinValue ? item.FIRST_IN_DATE : item.PROD_DATE;
                            item.WH_ID = location.WH_ID;
@@ -279,8 +284,8 @@
                        foreach (var item in inventory.ItemsExt)
                        {
                            item.AUTH_ORG = option.OrgCode;
                            item.SN = inventory.Barcode.SN;
                            item.SUPP_ITEM_CODE = inventory.Barcode.OEMItemCode;
                            item.SN = inv.Barcode.SN;
                            item.SUPP_ITEM_CODE = inv.Barcode.OEMItemCode;
                        }
                        result.Data.Items = inventory.Items;
@@ -307,8 +312,9 @@
            /// <param name="inventory">要下架的库存对象</param>
            /// <param name="option">授权查询选项</param>
            /// <param name="status">下架后状态</param>
            /// <param name="clearLocation">是否清理储区货架储位信息</param>
            /// <returns></returns>
            public Result<TakeDownInfo> TakeDown(Inventory inventory, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true)
            public Result<TakeDownInfo> TakeDown(IInventory inventory, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true)
            {
                var result = new Result<TakeDownInfo>(Result.Flags.Success, new TakeDownInfo());
                try
Tiger.Business.WMS/iWMS/RePrintBarcode.cs
@@ -20,11 +20,11 @@
    public class RePrintBarcode : IRePrintBarcode
    {
        #region Propertys & Variables
        public static string UserCode { get; set; }
        public static long UserId { get; set; }
        public static string OrgCode { get; set; }
        public static List<Inventory> invs { get; set; } = new();
        public static Inventory CurInv { get; set; }
        public string UserCode { get; set; }
        public long UserId { get; set; }
        public string OrgCode { get; set; }
        public List<Inventory> invs { get; set; } = new();
        public Inventory CurInv { get; set; }
        #endregion
        /// <summary>
        /// è¡¥å°æ¡ç 
@@ -47,14 +47,14 @@
                OrgCode = input.AuthOption.OrgCode;
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                CurInv = result.Data;
                CurInv = result.Data as Inventory;
                if (!CurInv.isExists)
                {
@@ -289,14 +289,14 @@
                    return action;
                }
                //解析条码
                Result<Inventory> result = WMS_ITEM_Biz.WmsItem.Get(input.Barcode, new AuthOption { ByOrg = true, CurOrg = "DGXC", UserId = "admin" }, false);
                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.Barcode, new AuthOption { ByOrg = true, CurOrg = "DGXC", UserId = "admin" }, false);
                if (!result.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = result.LocaleMsg;
                    return action;
                }
                var CurInv = result.Data;
                var CurInv = result.Data as Inventory;
                var newItem = CurInv.isExists ? CurInv.Items[0] : new WMS_ITEM()
                {
                    AUTH_ORG = "DGXC",
Tiger.Business.WMS/iWMS/iWMS.Minsun.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2090 @@
using Rhea.Common;
using Tiger.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using Newtonsoft.Json;
using Tiger.Model.Minsun;
using System.Globalization;
using System.Data;
using System.Text.RegularExpressions;
using Tiger.IBusiness;
using Autofac;
namespace Tiger.Business.WMS
{
    public partial class iWMS
    {
        /// <summary>
        /// é€šç”¨æ‰¹é‡å…¥åº“
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static ApiAction MultiInStorageAsync(MultiInvInStorageInput input)
        {
            var action = new ApiAction();
            try
            {
                string flag = "";
                //保存到数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    //插入或更新  InvBarcode
                    var x = db.Storageable(input.InvBarcodes)
                       .WhereColumns(t => new { t.BARCODE })
                       .ToStorage();
                    x.AsInsertable.ExecuteCommand();
                    x.AsUpdateable.IgnoreColumns(t => t.Id).ExecuteCommand();
                    flag = "InvBarcode更新成功";
                    #region æ’å…¥ InvStorageLotInfo
                    var y = db.Storageable(input.InvStorageLotInfos)
                       .WhereColumns(t => new { t.BARCODE })
                       .ToStorage();
                    y.AsInsertable.ExecuteCommand();
                    y.AsUpdateable.IgnoreColumns(t => t.Id).ExecuteCommand();
                    flag += "; InvStorageLotInfo更新成功";
                    #endregion
                    #region æ’å…¥ InvStorageInfo
                    var z = db.Storageable(input.InvStorageInfos)
                       .WhereColumns(t => new { t.WAREHOUSECODE, t.MATERIALCODE })
                       .ToStorage();
                    z.AsInsertable.ExecuteCommand();
                    z.AsUpdateable.IgnoreColumns(t => t.Id).ExecuteCommand();
                    #endregion
                    flag += "; InvStorageInfo更新成功";
                    #region æ’å…¥ InvScanMain å’Œ InvScanDetail
                    var m = db.Storageable(input.InvScanMains)
                        .ToStorage();
                    m.AsInsertable.IgnoreColumns(t => t.LastModificationTime).ExecuteCommand();
                    var o = db.Storageable(input.InvScanDetails)
                        .WhereColumns(t => new { t.SCANMAINID, t.SOURCEDETAILLINE, t.WAREHOUSECODE, t.MATERIALCODE })
                        .ToStorage();
                    o.AsInsertable.ExecuteCommand();
                    o.AsUpdateable.IgnoreColumns(t => t.Id).ExecuteCommand();
                    #endregion
                    flag += "; InvScanMain更新成功";
                    #region æ’å…¥ InvBarcodeLog
                    db.Insertable(input.InvBarcodeLogs).ExecuteCommand();
                    #endregion
                    flag += "; å…¥åº“成功";
                });
                if (!dbTran.IsSuccess)
                {
                    action.IsSuccessed = false;
                    action.Message = $"{flag} Error:{dbTran.ErrorException.Message}";
                    action.Data = new MultiInvInStorageOutput
                    {
                        Message = $"{flag} Error:{dbTran.ErrorException.Message}",
                        InvBarcodes = input.InvBarcodes
                    };
                    //throw dbTran.ErrorException;
                }
            }
            catch (System.Exception ex)
            {
                action.CatchExceptionWithLog(ex, $"入库异常");
            }
            action.Message = "OK";
            action.Data = new MultiInvInStorageOutput
            {
                Message = "OK",
                InvBarcodes = input.InvBarcodes
            };
            return action;
        }
        /// <summary>
        /// èŽ·å¾—åˆ°è´§å•å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetERP_RECEIPTTips(string billcode, string materialCode)
        {
            var tips = "";
            var otherInDetails = Biz.Db.Queryable<BIZ_ERP_RECEIPT_SN>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()).ToList();
            //if (otherInDetails.Any())
            {
                tips += $"数量:{otherInDetails.Sum(q => q.SCANQTY):N0}";
            }
            var otherInScanList = Biz.Db.Queryable<BIZ_ERP_RECEIPT_SN>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()).ToList();
            //if (otherInScanList.Any())
            {
                tips += $" ({otherInScanList.Count()} ç›˜)";
            }
            return tips;
        }
        /// <summary>
        /// èŽ·å¾—åˆ°è´§å•å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetERP_ReturnTips(string billcode, string materialCode)
        {
            var tips = "";
            var otherInDetails = Biz.Db.Queryable<BIZ_ERP_PROD_RETURN_SN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                //&& t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()).ToList();
            //if (otherInDetails.Any())
            {
                tips += $"数量:{otherInDetails.Sum(q => q.QTY):N0}";
            }
            var otherInScanList = Biz.Db.Queryable<BIZ_ERP_PROD_RETURN_SN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()
                                //&& t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
                                ).ToList();
            //if (otherInScanList.Any())
            {
                tips += $" ({otherInScanList.Count()} ç›˜)";
            }
            return tips;
        }
        /// <summary>
        /// èŽ·å¾—å…¶ä»–å…¥åº“å•å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetERP_OTH_INTips(string billcode, string materialCode)
        {
            var tips = "";
            var otherInDetails = Biz.Db.Queryable<BIZ_ERP_OTH_IN_DTL>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
                                && t.LINESTATUS == BIZ_ERP_OTH_IN.STATUSs.WORKING.GetValue()).OrderBy(t => new { t.BILLCODE, t.BILLLINE }).ToList();
            //if (otherInDetails.Any())
            {
                tips += $"数量:{otherInDetails.Sum(q => q.PRQTY - q.QTY):N0}";
            }
            var otherInScanList = Biz.Db.Queryable<BIZ_ERP_OTH_IN_SN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()).ToList();
            //if (otherInScanList.Any())
            {
                tips += $" ({otherInScanList.Count()} ç›˜)";
            }
            return tips;
        }
        /// <summary>
        /// èŽ·å¾—å…¶ä»–å…¥åº“å•å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetFinishedTips(string billcode, string materialCode)
        {
            var tips = "";
            var otherInDetails = Biz.Db.Queryable<BIZ_ERP_PROD_IN_DTL>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
                                && t.LINESTATUS == BIZ_ERP_OTH_IN.STATUSs.WORKING.GetValue()).OrderBy(t => new { t.BILLCODE, t.BILLLINE }).ToList();
            //if (otherInDetails.Any())
            {
                tips += $"数量:{otherInDetails.Sum(q => q.PRQTY - q.INVENTORYQTY):N0}";
            }
            var otherInScanList = Biz.Db.Queryable<BIZ_ERP_PROD_IN_SN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()
                                && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()).ToList();
            //if (otherInScanList.Any())
            {
                tips += $" ({otherInScanList.Count()} ç›˜)";
            }
            return tips;
        }
        /// <summary>
        /// èŽ·å¾—å…¶ä»–å…¥åº“å•å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetBIZ_ERP_PROD_INips(string billcode)
        {
            var tips = "";
            //var otherInDetails = Biz.Db.Queryable<BIZ_ERP_OTH_IN_DTL>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
            //                    && t.ITEM_CODE.ToUpper() == materialCode.ToUpper()
            //                    && t.LINESTATUS == BIZ_ERP_OTH_IN.STATUSs.WORKING.GetValue()).OrderBy(t => new { t.BILLCODE, t.BILLLINE }).ToList();
            ////if (otherInDetails.Any())
            //{
            //    tips += $"数量:{otherInDetails.Sum(q => q.PRQTY - q.QTY):N0}";
            //}
            var otherInScanList = Biz.Db.Queryable<BIZ_ERP_PROD_IN_SN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                && t.STATUS <= WMS_ITEM.STATUSs.WaitIn.GetValue()).ToList();
            //if (otherInScanList.Any())
            {
                tips += $" æ€»æ•°ï¼š({otherInScanList.Count()})";
            }
            return tips;
        }
        /// <summary>
        /// èŽ·å¾—å®Œæˆä¿¡æ¯
        /// </summary>
        /// <param name="billcode"></param>
        /// <param name="materialCode"></param>
        /// <returns></returns>
        public static string GetIncompleteTips(string billcode, string materialCode)
        {
            var tips = "";
            var otherInDetails = Biz.Db.Queryable<WMS_OTHERINSTOCK_D>().Where(t => t.BILLCODE.ToUpper() == billcode.ToUpper()
                                && t.MATERIALCODE.ToUpper() == materialCode.ToUpper()
                                && t.LINESTATUS == OtherInstockSides.Status.WORKING.ToString()).OrderBy(t => new { t.BILLCODE, t.BILLLINE }).ToList();
            if (otherInDetails.Any())
            {
                tips += $"数量:{otherInDetails.Sum(q => q.PRQTY - q.QTY):N0}";
            }
            var otherInScanList = Biz.Db.Queryable<WMS_OTHERINSTOCK_SCAN>().Where(t => t.BUSINESSCODE.ToUpper() == billcode.ToUpper()
                                && t.MATERIALCODE.ToUpper() == materialCode.ToUpper()).OrderBy(t => new { t.BUSINESSCODE, t.BUSINESSLINE }).ToList();
            if (otherInScanList.Any())
            {
                tips += $" ({otherInScanList.Count()} ç›˜)";
            }
            return tips;
        }
        /// <summary>
        /// å®¢ä¾›æ–™å…¥åº“完成信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<CustSupplyInOutput> CustSupplyInIncompleteList(CustSupplyIncompleteInput input)
        {
            var otherInScanList = await Biz.Db.Queryable<WMS_OTHERINSTOCK_SCAN>()
                        .Where(t => t.BUSINESSCODE.ToUpper() == input.receiptNo.ToUpper()
                                && t.MATERIALCODE.ToUpper() == input.materialCode.ToUpper())
                        .ToListAsync();
            var incompleteList = otherInScanList.OrderBy(q => q.STATUS == "Billed" ? 1 : (q.STATUS == "Complete" ? 3 : 2))
                .Select(q => new
                {
                    Barcode = q.BARCODE,
                    Qty = (int)q.QTY,
                    Status = q.STATUS == "Billed" ? "待入库" : (q.STATUS == "Complete" ? "已入库" : $"其他({q.STATUS})")
                });
            return new CustSupplyInOutput() { result = JsonConvert.SerializeObject(incompleteList) };
        }
        /// <summary>
        /// ç‰©æ–™åŒ…装管理    ç‰©æ–™åŒ…装层级:小包归属于哪个中包、中包归属于哪个外包  wms_barcode æœ‰
        /// </summary>
        /// <param name="sn"></param>
        /// <returns></returns>
        public List<iPackageInfo> GetPackageInfo(string sn)
        {
            var query = new List<iPackageInfo>();
            return query;
        }
        /// <summary>
        /// ç‰©æ–™å…¥åº“信息    ç‰©æ–™åç§°ã€ç‰©æ–™ä»£ç ã€ç‰©æ–™ä¾›åº”商、数量、库位、储位、批次、入库时间
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public List<iInStoreInfo> GetInStoreInfo(iParams param)
        {
            var query = Biz.Db.Queryable<WMS_STORAGELOTINFO, WMS_BARCODE, WMS_BARCODE_LOG, WMS_MesMaterial>((t, b, l, m) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.BARCODE == b.BARCODE,
                                    JoinType.Left, t.BARCODE == l.BARCODE,
                                    JoinType.Left, t.MATERIALCODE == m.MCode
                                    ))
            .Where((t, b, l, m) => l.INOUTTYPE == 10)
            .WhereIF(!string.IsNullOrEmpty(param.sn), (t, b, l, m) => t.BARCODE == param.sn)
            .WhereIF(!string.IsNullOrEmpty(param.startDate), (t, b, l, m) => l.CreationTime >= Convert.ToDateTime(param.startDate))
            .WhereIF(!string.IsNullOrEmpty(param.endDate), (t, b, l, m) => l.CreationTime < Convert.ToDateTime(param.endDate))
            .Select((t, b, l, m) => new iInStoreInfo
            {
                sn = t.BARCODE,
                MaterialCode = t.MATERIALCODE,
                MaterialName = m.MDesc,
                VendorCode = b.SUPPLIERCODE,
                WarehouseCode = t.WAREHOUSECODE,
                LocationCode = t.LOCATIONCODE,
                LotNo = b.LOTNO,
                SourceCode = b.SOURCEBARCODE,
                QTY = t.QTY,
                CreateDate = l.CreationTime,
                UpdateDate = l.LastModificationTime
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// ç‰©æ–™å‡ºåº“信息    é¢†æ–™å•号、领料料号、数量、库位、储位、出库时间
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public List<iOutStoreInfo> GetOutStoreInfo(iParams param)
        {
            var query = Biz.Db.Queryable<WMS_BARCODE_LOG, WMS_MesMaterial>((t, m) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.MATERIALCODE == m.MCode
                                    ))
            .Where((t, m) => t.INOUTTYPE == 20 && !SqlFunc.IsNullOrEmpty(t.BILLCODE))
            .WhereIF(!string.IsNullOrEmpty(param.sn), (t, m) => t.BARCODE == param.sn)
            .WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
            .WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
            .Select((t, m) => new iOutStoreInfo
            {
                sn = t.BARCODE,
                MaterialCode = t.MATERIALCODE,
                MaterialName = m.MDesc,
                WarehouseCode = t.WAREHOUSECODE,
                LocationCode = t.LOCATIONCODE,
                BillCode = t.BILLCODE,
                QTY = t.QTY,
                CreateDate = t.CreationTime,
                UpdateDate = t.LastModificationTime
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// ç‰©æ–™é€€æ–™ä¿¡æ¯    é€€æ–™æ–™å·ã€é€€æ–™æ—¶é—´ã€é€€æ–™æ¡ç ã€é€€æ–™åº“位、称重清点结果
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public List<iReturnInfo> GetReturnInfo(iParamsBase param)
        {
            var query = Biz.Db.Queryable<WMS_BARCODE_LOG, WMS_MesMaterial>((t, m) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.MATERIALCODE == m.MCode
                                    ))
                .Where(t => t.SOURCEBILLTYPE == 25)
                .WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
                .WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
                .Select((t, m) => new iReturnInfo
                {
                    sn = t.BARCODE,
                    MaterialCode = t.MATERIALCODE,
                    MaterialName = m.MDesc,
                    WarehouseCode = t.WAREHOUSECODE,
                    CreateDate = t.CreationTime
                })
                .ToList();
            return query;
        }
        /// <summary>
        /// ç‰©æ–™åº“存信息
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public List<iStorageInfo> GetStorageInfo(iParamsBase param)
        {
            var query = Biz.Db.Queryable<WMS_STORAGELOTINFO, WMS_BARCODE, WMS_MesMaterial, MesVender>((t, b, m, v) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.BARCODE == b.BARCODE,
                                    JoinType.Left, t.MATERIALCODE == m.MCode,
                                    JoinType.Left, b.SUPPLIERCODE == v.VenderCode
                                    ))
            .WhereIF(!string.IsNullOrEmpty(param.startDate), (t, b, m, v) => t.CreationTime >= Convert.ToDateTime(param.startDate))
            .WhereIF(!string.IsNullOrEmpty(param.endDate), (t, b, m, v) => t.CreationTime < Convert.ToDateTime(param.endDate))
            .Select((t, b, m, v) => new iStorageInfo
            {
                MaterialCode = t.MATERIALCODE,
                MaterialName = m.MDesc,
                VenderCode = b.SUPPLIERCODE,
                VenderName = v.VenderName,
                Unit = m.MUom,
                QTY = t.QTY,
                UpdateDate = t.LastModificationTime ?? t.CreationTime
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// å¤‡æ–™åˆ†åŒ…装信息    æ‹†åŒ…备料,重新组包的包装号关系:拆包编号、组包后编号、组包后数量、备领料单号、料号
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public List<iSplitInfo> GetSplitInfo(iParams param)
        {
            var query = Biz.Db.Queryable<WMS_BARCODE, WMS_MesMaterial>((t, m) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.MATERIALCODE == m.MCode
                                    ))
            .WhereIF(!string.IsNullOrEmpty(param.sn), (t, m) => t.BARCODE.Contains(param.sn))
            .WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
            .WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
            .Select((t, m) => new iSplitInfo
            {
                sn = t.BARCODE,
                MaterialCode = t.MATERIALCODE,
                MaterialName = m.MDesc,
                ParentBoxBarcode = t.PARENTBOXBARCODE,
                SourceCode = t.SOURCECODE,
                QTY = t.PACKQTY,
                UpdateDate = t.LastModificationTime
            })
            .ToList();
            return query;
        }
        private static readonly IReceiptInfo _IReceiptInfo = BizContext.Container.Resolve<IReceiptInfo>();
        /// <summary>
        /// åˆ°è´§å•生成接口    æ¸…点系统 --> wms,  æŽ¥å£éœ€wms定义
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public ApiAction GenerateReceipt(iReceiptInput input)
        {
            var action = new ApiAction();
            bool isIQCOk = true;
            try
            {
                string msg = "";
                if (!input.iReceipts.Any())
                {
                    action.IsSuccessed = false;
                    msg += $"{msg.IsNullOrEmpty("", ";")}没有可以提交的清点数据";
                    action.Message = msg;
                    return action;
                }
                var judian = BizConfig.Configuration["JuDian"];
                var requestJson = JsonConvert.SerializeObject(input);
                var response = HttpHelper.PostAsync("http://172.18.8.56:9631/api/WMS/GenerateReceiptNew/", requestJson).Result;
                action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                return action;
                //if (input.StrongHold != judian)
                //{
                //    var requestJson = JsonConvert.SerializeObject(input);
                //    //if (input.StrongHold == "AHXC")
                //    //{
                //    //    var response = HttpHelper.PostAsync("http://172.18.8.56:9529/api/WMS/GenerateReceipt", requestJson).Result;
                //    //    action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                //    //    return action;
                //    //}
                //    if (input.StrongHold == "DGXC" || input.StrongHold == "AHXC")
                //    {
                //        //return _IReceiptInfo.GenerateReceipt(input);
                //        var response = HttpHelper.PostAsync("http://172.18.8.56:9631/api/WMS/GenerateReceiptNew/", requestJson).Result;
                //        action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                //        return action;
                //    }
                //    if (input.StrongHold == "XCSJ")
                //    {
                //        var response = HttpHelper.PostAsync("http://172.18.8.56:9527/api/WMS/GenerateReceipt/", requestJson).Result;
                //        action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                //        return action;
                //    }
                //}
                var usercode = "00000";
                switch (input.CompanyCode)
                {
                    case "XCQX":
                        usercode = "LX0001";
                        break;
                    case "XCHF":
                        usercode = "AA0001";
                        break;
                    case "XCTH":
                        //usercode = "AA0001";
                        break;
                    case "XCTX":
                        usercode = "TA0001";
                        break;
                }
                //待提交数据按来源单号分组(ASN/PO)
                var srcBills = input.iReceipts
                        .Select(p => new { BillCode = p.DeliveryNo })
                        .GroupBy(p => p.BillCode)
                        .ToList();
                List<WMS_RECEIPT_H> receiptHeaders = new List<WMS_RECEIPT_H>();
                List<WMS_RECEIPT_D> receiptDetails = new List<WMS_RECEIPT_D>();
                List<WMS_RECEIPT_SCAN> receiptScans = new List<WMS_RECEIPT_SCAN>();
                List<Detail> details = new List<Detail>();
                List<WMS_IQC_H> iqcHeaders = new List<WMS_IQC_H>();
                List<WMS_PO_D> poDetails = new List<WMS_PO_D>();
                int billid = 1;
                foreach (var srcBill in srcBills)
                {
                    var asnHeader = Biz.Db.Queryable<WMS_SRM_ASN>().Where(x => x.DeliveryNo == srcBill.Key).First();
                    if (asnHeader == null)
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到数据";
                        action.Message = msg;
                        return action;
                    }
                    //获取ASN行明细
                    var asnLines = Biz.Db.Queryable<WMS_SRM_ASN_LINES>().Where(x => x.DeliveryNo == srcBill.Key).ToList();
                    if (asnLines == null)
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到ASN行明细";
                        action.Message = msg;
                        return action;
                    }
                    var asnBarcodeList = Biz.Db.Queryable<WMS_SRMSNList>().Where(x => x.DeliveryNo == srcBill.Key).ToList();
                    if (asnBarcodeList == null)
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到ASN行明细";
                        action.Message = msg;
                        return action;
                    }
                    if (asnBarcodeList.Count > input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Count)
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]还有条码未扫描清点,不能生成到货单";
                        action.Message = msg;
                        return action;
                    }
                    if (Biz.Db.Queryable<WMS_RECEIPT_SCAN>().Where(x => x.BILLCODE == srcBill.Key).Any())
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]已经扫描过不能再扫描";
                        action.Message = msg;
                        return action;
                    }
                    List<string> asnLinesNum = new List<string>();
                    asnLinesNum = asnLines.Select(x => x.productCode).Distinct().ToList();
                    List<string> tempBarcodesNum = new List<string>();
                    tempBarcodesNum = input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Select(x => x.MaterialCode).Distinct().ToList();
                    if (asnLinesNum.Count > tempBarcodesNum.Count)
                    {
                        action.IsSuccessed = false;
                        msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]还有料号未扫描清点,不能生成到货单";
                        return action;
                    }
                    msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]总数[{asnBarcodeList.Count}],扫描总数[{input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Count}]";
                    // ç”Ÿæˆæ”¶æ–™å•
                    // æ–°å»ºä¸€ä¸ª Header
                    var nReceiptHeader = new WMS_RECEIPT_H
                    {
                        BILLCODE = GetBillNoByType("RECEIPT"),
                        BILLDATE = DateTime.Now,
                        STATUS = (int)WMS_RECEIPT_H.ReceiptStatus.Add,
                        BIZTYPE = (int)WMS_RECEIPT_H.ReceiptBizType.PO,
                        SUPPLIERCODE = asnHeader.innerVendorCode,
                        CreationTime = DateTime.Now,
                        CreatorUserId = 1
                    };
                    var nHeaderId = Biz.Db.Insertable(nReceiptHeader).ExecuteReturnBigIdentity();
                    nReceiptHeader.Id = nHeaderId;
                    // ç”Ÿæˆæ”¶æ–™å•行明细
                    var nLineSeq = 1;
                    foreach (var asnLine in asnLines)
                    {
                        //订单物料行(唯一)
                        int poline = Convert.ToInt32(asnLine.poLineNo.Split('-')[0]);
                        var nOrderDetail = Biz.Db.Queryable<WMS_PO_D>().Where(x => x.BILLCODE.ToUpper() == asnLine.poErpNo.ToUpper() && x.BILLLINE == poline).First();
                        if (asnBarcodeList == null)
                        {
                            action.IsSuccessed = false;
                            msg += $"{msg.IsNullOrEmpty("", ";")}订单中查不到数据";
                            return action;
                        }
                        nOrderDetail.ARRIVALQTY = (nOrderDetail.ARRIVALQTY ?? 0) + asnLine.deliveryQty;
                        poDetails.Add(nOrderDetail);
                        //插入收料单行
                        var nReceiptDetail = new WMS_RECEIPT_D
                        {
                            BILLCODE = nReceiptHeader.BILLCODE,
                            BILLLINE = nLineSeq++,
                            BILLID = nHeaderId,
                            LINESTATUS = (int)WMS_RECEIPT_H.ReceiptLineStatus.Add,
                            MATERIALCODE = asnLine.productCode,
                            UNITCODE = "",
                            QTY = asnLine.deliveryQty,
                            QTYPASS = 0,
                            INSTOCKQTY = 0,
                            RETURNQTY = 0,
                            PRINTQTY = 0,
                            ISGIVEAWAY = false,
                            SOURCETYPE = (int)WMS_RECEIPT_H.SourceType.Asn,
                            SOURCECODE = asnLine.DeliveryNo,
                            SOURCELINE = string.IsNullOrEmpty(asnLine.extendN01) ? asnLine.lineNo : Convert.ToInt32(asnLine.extendN01 ?? "0"), //asnLine.lineNo,
                            PONO = asnLine.poErpNo,
                            POLINE = poline,
                            LastModificationTime = DateTime.Now,
                            CreationTime = DateTime.Now,
                            CreatorUserId = 1
                        };
                        receiptDetails.Add(nReceiptDetail);
                        details.Add(new Detail
                        {
                            pmdtseq = nLineSeq.ToString(),
                            pmdt001 = string.IsNullOrEmpty(nReceiptDetail.PONO) ? asnLine.DeliveryNo : asnLine.poErpNo,
                            pmdt002 = asnLine.lineNo.ToString(), //string.IsNullOrEmpty(nReceiptDetail.PONO) ? asnLine.lineNo.ToString() : poline.ToString(), é‡‡è´­é¡¹æ¬¡
                            pmdt003 = "1",
                            pmdt004 = asnLine.poLineNo.Split('-').Length > 2 ? asnLine.poLineNo.Split('-')[2] : (asnLine.poLineNo ?? "1"), //采购分批序
                            pmdt006 = asnLine.productCode, //"K7015AA016141",
                                                           //pmdt018 = "创米科技",
                            pmdt020 = asnLine.deliveryQty.ToString(),  //"100.00000",
                            pmdtud011 = "0"
                        });
                        //创建送检单
                        Result<WMS_IQC_H> result = CreateIqcHeader(nReceiptDetail, "Y", Biz.Db);
                        if (result.Flag != Result.Flags.Success)
                        {
                            action.IsSuccessed = false;
                            action.Message = result.Message;
                            return action;
                        }
                        iqcHeaders.Add(result.Data);
                        billid++;
                    }
                    //var asnScanTemp = await _tempRepository.GetAll().Where(x => x.CreatorUserId == (AbpSession.UserId ?? 0) && x.BillCode.ToUpper() == srcBill.Key.ToUpper()).ToListAsync();
                    foreach (var scanTemp in input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList())
                    {
                        WMS_RECEIPT_SCAN scanObj = new WMS_RECEIPT_SCAN
                        {
                            Id = Guid.NewGuid().ToString(),
                            BILLCODE = scanTemp.DeliveryNo,
                            BILLLINE = 0,
                            SOURCETYPE = (int)WMS_RECEIPT_H.SourceType.Asn,
                            MATERIALCODE = scanTemp.MaterialCode,
                            BARCODE = scanTemp.SmallBarcode,
                            SCAN_BARCODE = scanTemp.SCAN_BARCODE,
                            CARTON = scanTemp.BigBarcode,
                            PALLET = scanTemp.OuterBarcode,
                            SUPPLIERCODE = scanTemp.innerVendorCode,
                            DATECODE = DateTime.Now,
                            //LOTNO = scanTemp.LotNo,
                            SCANQTY = scanTemp.SCANQTY,
                            //UNIT = scanTemp.Unit,
                            //ISGIVEAWAY = scanTemp.IsGiveAway,
                            RECEIPTNO = nReceiptHeader.BILLCODE,
                            RECEIPTLINE = 0,
                            STATEFLAG = WMS_RECEIPT_H.ReceiptLineStatus.PreInstock.ToString(),
                            LastModificationTime = DateTime.Now,
                            CreationTime = DateTime.Now,
                            CreatorUserId = 1
                        };
                        receiptScans.Add(scanObj);
                    }
                    //调用T100接口生成到货单
                    var ret = ErpT100.GenerateCustReceipt(new CustReceiptInputParameter
                    {
                        parameter = new Parameter<Detail>
                        {
                            pmds000 = "1",
                            pmdsdocno = "3438",
                            pmdsdocdt = DateTime.Now.ToString("yyyy-MM-dd"), //"2023-04-26", //当天时间
                            pmds002 = usercode, // "00000", //UserCode == "admin" ? "00000" : UserCode, //"L36783", //用户ID
                            pmds003 = "",
                            pmds007 = nReceiptHeader.SUPPLIERCODE, //"C0006", //供应商代码
                            pmds010 = srcBill.Key, //"测试客供料无采购收货", //送货单号
                                                   //pmdsud001 = SecondVenderCode, //"CM017", //二级供应编号
                            detail = details
                        },
                        datakey = new Datakey
                        {
                            EntId = ApiConfig.IsTestServer ? "108" : "88",
                            CompanyId = input.StrongHold
                        }
                    });
                    if (ret.payload.std_data.execution.code == "0") //成功
                    {
                        nReceiptHeader.ERP_BILL_CODE = ret.payload.std_data.parameter.docno;
                        nReceiptHeader.STATUS = 3;
                        receiptHeaders.Add(nReceiptHeader);
                        action.Message += $"{action.Message.IsNullOrEmpty("", ";")}{ret.payload.std_data.execution.description},返回的收货单号:[{ret.payload.std_data.parameter.docno}]";
                        #region ç”Ÿæˆé€æ£€å•
                        foreach (var item in iqcHeaders)
                        {
                            var retIns = ErpT100.GenerateInspection(new InsInputParameter
                            {
                                parameter = new InsParameter
                                {
                                    pmdsdocno = ret.payload.std_data.parameter.docno,
                                    pmdsdocdt = DateTime.Now.ToString("yyyy-MM-dd"),
                                    pmdtseq = item.SOURCELINE.ToString(),
                                    pmdt020 = item.QCQTY.ToString(),
                                    qcbadocno = "3701",
                                },
                                datakey = new Datakey
                                {
                                    EntId = ApiConfig.IsTestServer ? "108" : "88",
                                    CompanyId = input.StrongHold
                                }
                            });
                            if (retIns.payload.std_data.execution.code != "0")
                            {
                                isIQCOk = false;
                                action.IsSuccessed = false;
                                action.Message = $"到货单[{ret.payload.std_data.parameter.docno}],当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{retIns.payload.std_data.execution.description}"; ;
                                //return action;
                            }
                            else
                            {
                                action.Message += $"到货单[{ret.payload.std_data.parameter.docno}],当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{retIns.payload.std_data.execution.description}";
                                item.ERP_BILL_CODE = retIns.payload.std_data.parameter.docno;
                            }
                        }
                        #endregion
                    }
                    else //失败
                    {
                        action.IsSuccessed = false;
                        action.Message = $"当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{ret.payload.std_data.execution.description}";
                        return action;
                    }
                }
                var db = Business.Biz.Db;
                //保存到数据库
                var dbTran = db.UseTran(() =>
                {
                    if (receiptHeaders.Any())
                    {
                        db.Updateable(receiptHeaders, "system").ExecuteCommand();
                    }
                    if (poDetails.Any())
                    {
                        db.Updateable(poDetails, "system").ExecuteCommand();
                    }
                    if (receiptDetails.Any())
                    {
                        db.Insertable(receiptDetails, "system").ExecuteCommand();
                    }
                    if (receiptScans.Any())
                    {
                        db.Insertable(receiptScans, "system").ExecuteCommand();
                    }
                    if (action.IsSuccessed && isIQCOk)
                    {
                        db.Insertable(iqcHeaders).ExecuteCommand();
                    }
                });
                if (!dbTran.IsSuccess)
                {
                    if (receiptHeaders.Any())
                    {
                        db.Deleteable(receiptHeaders).ExecuteCommand();
                    }
                    action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"到货单生成异常");
                }
                action.Message += $"{msg.IsNullOrEmpty("", ";")}到货单和送检单生成成功!";
                return action;
            }
            catch (Exception ex)
            {
                return action.GetResponse().CatchExceptionWithLog(ex, $"到货单生成异常");
            }
        }
        private static readonly IProdMaterialReq _IProdMaterialReq = BizContext.Container.Resolve<IProdMaterialReq>();
        /// <summary>
        /// èŽ·å–T100领料单数据
        /// </summary>
        /// <param name="prd_hs"></param>
        /// <returns></returns>
        public ApiAction GetMaterialReq(List<WMS_PRDPICK_H> prd_hs)
        {
            var action = new ApiAction();
            try
            {
                if (prd_hs.Count > 0)
                {
                    Work.DoAsync(() =>
                    {
                        Logger.Interface.Info($"开始异步推送到新数据库");
                        _IProdMaterialReq.GetMaterialReq(prd_hs);
                    });
                    return action;
                    //var judian = BizConfig.Configuration["JuDian"];
                    //foreach (var group in prd_hs.Select(q => q.ENTERPRISECODE).Distinct())
                    //{
                    //    List<WMS_PRDPICK_H> entity_h = new();
                    //    List<WMS_PRDPICK_D> entity_d = new();
                    //    //查询出来的列表
                    //    List<WMS_PRDPICK_D> list_d = new();
                    //    DbClient db;
                    //    List<WMS_PRDPICK_H> dtls=new();
                    //    if (group == 88)
                    //    {
                    //        dtls = prd_hs.Where(q=>q.STRONGHOID== judian && q.ENTERPRISECODE==group).ToList();
                    //        db = Business.Biz.Db;
                    //        foreach (var ju in prd_hs.Where(q=>q.STRONGHOID!=judian).Select(q => q.STRONGHOID).Distinct())
                    //        {
                    //            if (ju == "AHXC")
                    //            {
                    //                var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
                    //                var response = HttpHelper.PostAsync("http://172.18.8.56:9529/api/WMS/GetMaterialReq", requestJson).Result;
                    //                action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                    //            }
                    //            if (ju == "DGXC")
                    //            {
                    //                //var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
                    //                //var response = HttpHelper.PostAsync("http://172.18.8.56:9528/api/WMS/GetMaterialReq/", requestJson).Result;
                    //                //action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                    //            }
                    //            if (ju == "XCSJ")
                    //            {
                    //                var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
                    //                var response = HttpHelper.PostAsync("http://172.18.8.56:9527/api/WMS/GetMaterialReq/", requestJson).Result;
                    //                action = JsonConvert.DeserializeObject<ApiAction>(response.Message);
                    //            }
                    //        }
                    //    }
                    //    else
                    //    {
                    //        //dtls = prd_hs.Where(q =>  q.ENTERPRISECODE !=88 ).ToList();
                    //        db = Biz.DataSource["Test"].Client;
                    //    }
                    //    foreach (var item_h in dtls)
                    //    {
                    //        var prd_h = Biz.Db.Queryable<WMS_PRDPICK_H>().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
                    //        if (prd_h?.STATUS != "COMPLETE")
                    //        {
                    //            prd_h = prd_h ?? new WMS_PRDPICK_H()
                    //            {
                    //                STATUS = "INIT",
                    //                BIZTYPE = "1",
                    //                CreationTime = DateTime.Now,
                    //                CreatorUserId = 1,
                    //            };
                    //            prd_h.BILLCODE = item_h.BILLCODE;
                    //            prd_h.BILLDATE = item_h.BILLDATE;
                    //            prd_h.SOURCETYPE = item_h.SOURCETYPE;
                    //            prd_h.STATUS = prd_h.STATUS == "DELETE"? "INIT": prd_h.STATUS;
                    //            prd_h.REMARK = item_h.REMARK;
                    //            prd_h.SOURCECODE = item_h.SOURCECODE;
                    //            prd_h.LastModificationTime = DateTime.Now;
                    //            //prd_h.ENTERPRISECODE = item_h.ENTERPRISECODE;
                    //            //prd_h.STRONGHOID = item_h.STRONGHOID;
                    //            entity_h.Add(prd_h);
                    //        }
                    //    }
                    //    //保存到数据库
                    //    var dbTran = db.UseTran(() =>
                    //    {
                    //        db.Storageable(entity_h, "system").ExecuteCommand();
                    //    });
                    //    if (!dbTran.IsSuccess)
                    //    {
                    //        action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
                    //    }
                    //    //异步拉取单身列表
                    //    Work.DoAsync(() =>
                    //    {
                    //        GenerateReqDetail(dtls,db);
                    //    });
                    //    action.Message += $"拉取领料单单头完成,调用异步拉单身。";
                    //}
                }
                return action;
            }
            catch (Exception ex)
            {
                return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
            }
        }
        /// <summary>
        /// æ ¹æ®é¢†æ–™å•头拉单身
        /// </summary>
        /// <param name="dtls"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        private static ApiAction GenerateReqDetail(List<WMS_PRDPICK_H> dtls, DbClient db)
        {
            Thread.Sleep(5000);
            var action = new ApiAction();
            try
            {
                var judian = BizConfig.Configuration["JuDian"];
                List<WMS_PRDPICK_H> entity_h = new();
                List<WMS_PRDPICK_D> entity_d = new();
                List<WMS_TRANSFER_H> transferH = new();
                List<WMS_SCTRWO_TRANSFER> sctrwos = new();
                //查询出来的列表
                List<WMS_PRDPICK_D> list_dOld = new();
                foreach (var item_h in dtls)
                {
                    var prd_h = Biz.Db.Queryable<WMS_PRDPICK_H>().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
                    if (prd_h?.STATUS != "COMPLETE")
                    {
                        var list_d = Biz.Db.Queryable<WMS_PRDPICK_D>().Where(s => s.BILLCODE == item_h.BILLCODE).ToList();
                        var item_h_list = new List<WMS_PRDPICK_D>();
                        var ret = DI.Resolve<IErpT100>().GetMaterialReqDetail(new ReqInputParameter
                        {
                            parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
                            datakey = new Datakey
                            {
                                EntId = item_h.ENTERPRISECODE.ToString(),
                                CompanyId = judian
                            }
                        });
                        List<reqParameterReturn> ret_list = new List<reqParameterReturn>();
                        if (ret.payload.std_data.execution.code != "0")
                        {
                            action.IsSuccessed = false;
                            action.Message = $"错误信息:[{ret.payload.std_data.execution.description}]";
                            Logger.Default.Info(action.Message);
                            var dt = DateTime.Now;
                            while ((dt - DateTime.Now).TotalSeconds < 10)
                            {
                            }
                            var ret1 = DI.Resolve<IErpT100>().GetMaterialReqDetail(new ReqInputParameter
                            {
                                parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
                                datakey = new Datakey
                                {
                                    EntId = item_h.ENTERPRISECODE.ToString(),
                                    CompanyId = judian
                                }
                            });
                            if (ret1.payload.std_data.execution.code != "0")
                            {
                                action.IsSuccessed = false;
                                action.Message = $"错误信息:[{ret1.payload.std_data.execution.description}]";
                                Logger.Default.Info(action.Message);
                                return action;
                            }
                            else
                            {
                                ret_list = ret1.payload.std_data.parameter.@return;
                            }
                        }
                        else
                        {
                            ret_list = ret.payload.std_data.parameter.@return;
                        }
                        foreach (var item in ret_list)
                        {
                            WMS_PRDPICK_D d = new WMS_PRDPICK_D
                            {
                                BILLCODE = item.sfdcdocno,
                                BILLLINE = Convert.ToInt32(item.sfdcseq),
                                UNITCODE = item.sfdc006,
                                MATERIALCODE = item.sfdc004,
                                PRQTY = Convert.ToDecimal(item.sfdc007),
                                DELIVERYDATE = Convert.ToDateTime(item.sfdareqdt),
                                WAREHOUSECODE = item.sfdc012,
                                SOURCETYPE = Convert.ToInt32(item.sfdc003),
                                SOURCECODE = item.sfdc001,
                                SOURCELINE = Convert.ToInt32(item.sfdc002),
                            };
                            item_h_list.Add(d);
                        }
                        //保存委外工单号对应关系
                        WMS_SCTRWO_TRANSFER sctr = new WMS_SCTRWO_TRANSFER
                        {
                            ID = Guid.NewGuid().ToString("N"),
                            ORIGINAL_WORKORDER = ret_list[0]?.sfdc001,
                            TARGET_WORKORDER = ret_list[0]?.sfdc001_1
                        };
                        sctrwos.Add(sctr);
                        action.Message += $",领料单明细获取成功,[{string.Join(",", item_h_list.Select(x => x.BILLCODE + ";" + x.MATERIALCODE).ToList())},获取总数[{item_h_list.Count}],数据库中总数[{list_d.Count}]";
                        action.Message += $",委外工单,[{string.Join(",", sctrwos.Select(x => x.ORIGINAL_WORKORDER + ";" + x.TARGET_WORKORDER).ToList())}";
                        if (list_d.Count != item_h_list.Count)
                        {
                            foreach (var d in list_d) { d.PRQTY = 0; } //需求数量都弄成0
                        }
                        int n = 0;
                        List<WMS_PRDPICK_D> prdDList = new List<WMS_PRDPICK_D>();
                        foreach (var item_d in item_h_list)
                        {
                            //根据单据重新到数据查找相应的单据明细
                            var prd_d = list_d.Where(s => s.BILLCODE == item_d.BILLCODE && s.BILLLINE == item_d.BILLLINE).FirstOrDefault();
                            prd_d = prd_d ?? new WMS_PRDPICK_D()
                            {
                                LINESTATUS = "INIT",
                                QTY = Convert.ToDecimal(0),
                                CreationTime = DateTime.Now,
                                CreatorUserId = 1,
                            };
                            prd_d.BILLCODE = item_d.BILLCODE;
                            prd_d.BILLLINE = item_d.BILLLINE;
                            prd_d.UNITCODE = item_d.UNITCODE;
                            prd_d.MATERIALCODE = item_d.MATERIALCODE;
                            prd_d.PRQTY = Convert.ToDecimal(item_d.PRQTY);
                            prd_d.DELIVERYDATE = Convert.ToDateTime(item_d.DELIVERYDATE);
                            prd_d.WAREHOUSECODE = item_d.WAREHOUSECODE;
                            prd_d.LINESTATUS = prd_d.PRQTY == prd_d.QTY ? "COMPLETE" : Convert.ToDecimal(item_d.PRQTY) == 0 ? "COMPLETE" : prd_d.LINESTATUS == "DELETE" ? "INIT" : prd_d.LINESTATUS;
                            prd_d.SOURCETYPE = item_d.SOURCETYPE;
                            prd_d.SOURCECODE = item_d.SOURCECODE;
                            prd_d.SOURCELINE = item_d.SOURCELINE;
                            prd_d.LastModificationTime = item_d.LastModificationTime;
                            list_d.RemoveAll(q => q.BILLCODE == item_d.BILLCODE && q.BILLLINE == item_d.BILLLINE);
                            if (prd_d.LINESTATUS == "COMPLETE") { n++; }
                            prdDList.Add(prd_d);
                            entity_d.Add(prd_d);
                        }
                        if (prdDList.Count == n) { prd_h.STATUS = "COMPLETE"; }
                        entity_h.Add(prd_h);
                        list_dOld.AddRange(list_d);
                        //检查有没有调拨单,有就更新状态为完成
                        var transferList = Biz.Db.Queryable<WMS_TRANSFER_H>().Where(s => s.SOURCECODE == prd_h.BILLCODE).ToList();
                        if (transferList.Any())
                        {
                            foreach (var item in transferList)
                            {
                                item.STATUS = "COMPLETE2";
                                item.LastModificationTime = DateTime.Now;
                                item.SOURCECODE = prd_h.BILLCODE;
                                transferH.Add(item);
                                action.Message += $",领料单[{prd_h.BILLCODE}]对应调拨单[{item.BILLCODE}]完成";
                            }
                        }
                    }
                }
                //保存到数据库
                var dbTran = db.UseTran(() =>
                {
                    db.Storageable(entity_h, "system").ExecuteCommand();
                    db.Storageable(entity_d, "system").ExecuteCommand();
                    if (transferH.Any())
                    {
                        db.Updateable(transferH).ExecuteCommand();
                    }
                    if (sctrwos.Any())
                    {
                        //db.Insertable(sctrwos).ExecuteCommand();
                        var y = db.Storageable(sctrwos)
                        .WhereColumns(t => new { t.ORIGINAL_WORKORDER, t.TARGET_WORKORDER })
                        .ToStorage();
                        y.AsInsertable.ExecuteCommand();
                        y.AsUpdateable.IgnoreColumns(t => t.ID).ExecuteCommand();
                    }
                    if (list_dOld.Any())
                    {
                        db.Deleteable(list_dOld).ExecuteCommand();
                    }
                });
                if (!dbTran.IsSuccess)
                {
                    action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
                }
                Logger.Default.Info(action.Message);
                return action;
            }
            catch (System.Exception ex)
            {
                return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
            }
        }
        /// <summary>
        /// æ‹†è§£æ¡ç 
        /// </summary>
        /// <param name="nFullBarcode"></param>
        /// <param name="nPackageBarcode"></param>
        /// <returns></returns>
        public static Result<InputBarcodeDto> SplitFullBarcode(string nFullBarcode, bool nPackageBarcode = false)
        {
            Result<InputBarcodeDto> result = new(Result.Flags.Success, $"解析条码[{nFullBarcode}]成功");
            //识别新的识别二维码规则,以V开头,否则按旧识别模式
            if (nFullBarcode.Substring(0, 1).ToUpper() == "V")
            {
                return SplitFullBarcodeNew(nFullBarcode, nPackageBarcode);
            }
            // æ—§æ ¼å¼æ¡ç ï¼Œéƒ½æ˜¯æœ€å°æ‰¹æ¬¡æ ‡ç­¾ï¼ŒéžåŒ…装标签
            nPackageBarcode = false;
            //新条码解析
            var nSplitArray = nFullBarcode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            if (nSplitArray.Length == 1) //一维码
            {
                result.Data = new InputBarcodeDto
                {
                    Barcode = nFullBarcode
                };
                return result;
            }
            var nOrderNo = "";
            var nMaterialCode = "";
            var nBarcodeLotNo = "";
            var nLotQty = "";
            var nLotDate = "";
            var nStateFlag = "";
            bool isBox = false;
            var nLotNo = "";
            foreach (string item in nSplitArray)
            {
                string itemKey = item.Substring(0, 1).ToUpper();
                string itemValue = item.Substring(1);
                if (itemKey == "V")
                { //采购订单号
                    nOrderNo = itemValue;
                }
                else if (itemKey == "P")
                { //条码料号
                    nMaterialCode = itemValue;
                }
                else if (itemKey == "S")
                { //来料外包条码
                    nBarcodeLotNo = itemValue;
                    //nBarcodeLotNo = item;//PAG ID è§£æžå‡ºæ¥çš„æ•°æ®å‰ç¼€â€œS”不用去掉
                    //if (itemValue.StartsWith("C") || itemValue.StartsWith("P")) //中箱(C)和栈板(P),需要再次去掉一位
                    //    nBarcodeLotNo = itemValue.Substring(1);
                }
                else if (itemKey == "Q")
                { //条码数量
                    nLotQty = itemValue;
                }
                else if (itemKey == "D")
                { //生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
                    nLotDate = itemValue;
                    //nLotDate = itemValue.Replace("-", "");
                }
                else if (itemKey == "L")
                { //批号
                    nLotNo = itemValue;
                }
            }
            if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码数据有误";
                return result;
            }
            // åˆ¤æ–­æ ‡ç­¾æ•°é‡æ˜¯å¦åˆæ³•
            if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码格式错误:未取到正确的条码数量";
                return result;
            }
            // è§£æžDateCode
            DateTime nDateCode = DateTime.MinValue;
            if (nLotDate != "")
            {
                //string dateTimeStr = nLotDate.Substring(0, 4) + "-" + nLotDate.Substring(4, 2) + "-" + nLotDate.Substring(6, 2);
                //if (!DateTime.TryParse(dateTimeStr, out nDateCode))
                ////if (!DateTime.TryParse(nLotDate, out DateTime nDateCode))
                //{
                //    throw new UserFriendlyException("条码格式错误:未取到正确的批次日期");
                //}
                /// åŽŸå§‹DateCode ä¸ºæ—¥æœŸ
                if (nLotDate.Length > 6)
                {
                    var sDate = nLotDate;
                    if (nLotDate.Length == 7) { sDate = $"{nLotDate.Substring(0, 4)}0{nLotDate.Substring(4)}"; }
                    IFormatProvider ifp = new CultureInfo("zh-CN", true);
                    DateTime.TryParseExact(sDate, "yyyyMMdd", ifp, DateTimeStyles.None, out nDateCode);
                }
                /// åŽŸå§‹DateCode ä¸ºå¹´ã€å‘¨æ¬¡ï¼ˆYYYYWW / YYWW)
                int yw = 0;
                if (nLotDate.Length <= 6 && int.TryParse(nLotDate, out yw))
                {
                    nDateCode = GetWeekStartTime(nLotDate);
                }
                if (nDateCode == DateTime.MinValue)
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"条码格式错误:未取到正确的批次日期";
                    return result;
                }
            }
            // åˆ¤æ–­ç‰©æ–™ä»£ç æ˜¯å¦åˆæ³•
            var nMaterial = Biz.Db.Queryable<WMS_MesMaterial>().Where(q => q.MCode.ToUpper() == nMaterialCode.ToUpper() || q.MCode.ToUpper() == "K" + nMaterialCode.ToUpper()).First();
            if (nMaterial == null)
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码对应的物料不存在";
                return result;
            }
            // åˆ¤æ–­åŒ…装条码格式是否合法
            if (nPackageBarcode && nBarcodeLotNo.Length != 12)
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
                return result;
            }
            if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
                return result;
            }
            if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
                return result;
            }
            if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"物料条码批次格式错误,应至少包含15位字符";
                return result;
            }
            result.Data = new InputBarcodeDto
            {
                OrderNo = nOrderNo,
                Barcode = nBarcodeLotNo,
                MaterialCode = nMaterial?.MCode,
                MaterialName = nMaterial?.MName,
                MaterialStandard = nMaterial?.MDesc,
                MGroupCode = nMaterial?.MGroupCode,
                Unit = nMaterial?.MUom,
                LotQty = nBarcodeQty,
                LotDate = nDateCode,
                LotDateString = nLotDate,
                PeriodDays = nMaterial.PERIODDAYS,
                FIFO = nMaterial.FIFO,
                SafeStorageQty = nMaterial.SAFEQTY,
                StateFlag = nStateFlag,
                IsBox = isBox,
                //SnList = snList,
                LotNo = nBarcodeLotNo,
            };
            return result;
        }
        /// <summary>
        /// æœ€æ–°è§£ç è§„则,SRM æ ‡ç­¾
        /// æ‹†è§£æ¡ç 
        ///        ä¾æ¬¡æ˜¯ï¼š
        ///V:PO(MO)
        ///P:C P/N:料号
        ///N:Name(物料名称)
        ///Q:QTY(数量)
        ///U:Unit(单位)
        ///M:Mfr P/N(供应商内部管控的物料的料号)
        ///D:Date Code(生产日期,物料的生产日期)
        ///L:Lot Code(生产的批次)
        ///S:PAG ID(小包批次代码,也就是来料外包条码)
        /// </summary>
        /// <param name="nFullBarcode"></param>
        /// <param name="nPackageBarcode"></param>
        /// <returns></returns>
        public static Result<InputBarcodeDto> SplitFullBarcodeNew(string nFullBarcode, bool nPackageBarcode = false)
        {
            Result<InputBarcodeDto> result = new(Result.Flags.Success, $"解析条码[{nFullBarcode}]成功");
            var nSplitArray = nFullBarcode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var nOrderNo = "";
            var nMaterialCode = "";
            var nBarcodeLotNo = "";
            var nLotQty = "";
            var nLotDate = "";
            var nStateFlag = "";
            bool isBox = false;
            var nLotNo = "";
            List<Tuple<string, decimal>> snList = new List<Tuple<string, decimal>>();
            foreach (string item in nSplitArray)
            {
                string itemKey = item.Substring(0, 1).ToUpper();
                string itemValue = item.Substring(1);
                if (itemKey == "V")
                { //采购订单号
                    nOrderNo = itemValue;
                }
                else if (itemKey == "P")
                { //条码料号
                    nMaterialCode = itemValue;
                }
                else if (itemKey == "S")
                { //来料外包条码
                    nBarcodeLotNo = itemValue;
                }
                else if (itemKey == "Q")
                { //条码数量
                    nLotQty = itemValue;
                }
                else if (itemKey == "D")
                {
                    //生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
                    nLotDate = Regex.Replace(itemValue, @"[^0-9]+", "");
                }
                else if (itemKey == "L")
                { //批号
                    nLotNo = itemValue;
                }
            }
            //判断条码是否拆分过,拆分过的不判断是否为ASN 2022/12/17 Ben Lin
            //if (!nBarcodeLotNo.Contains("-1") && !nBarcodeLotNo.Contains("-2"))
            if (nBarcodeLotNo.Substring(nBarcodeLotNo.Length - 3, 2) != "-1" && nBarcodeLotNo.Substring(nBarcodeLotNo.Length - 3, 2) != "-2") //调整判断拆包标签的标准2023-1-2,weikaiyong
            {
                // åˆ¤æ–­å•据编号是否为ASN, å¦‚果是ASN,调用ASN标签解析
                if (BillIsAsn(nOrderNo))
                {
                    return SplitFullBarcodeAsn(nSplitArray, nPackageBarcode);
                }
            }
            if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码数据有误";
                return result;
            }
            var nInputSnDto = Biz.Db.Queryable<WMS_SRMSNList>().Where(q => q.OuterBarcode == nBarcodeLotNo || q.BigBarcode == nBarcodeLotNo).ToList();
            if (nInputSnDto.Any())
            {
                isBox = true;
                snList = nInputSnDto.Select(t => new Tuple<string, decimal>(t.SmallBarcode, t.IncludeQty)).ToList();
            }
            if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
            {
                //throw new UserFriendlyException("条码格式错误:未取到正确的条码数量");
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码数据有误";
                return result;
            }
            DateTime nDateCode = DateTime.Now;
            if (nLotDate != "")
            {
                // åŽŸå§‹DateCode ä¸ºæ—¥æœŸ
                if (nLotDate.Length > 6)
                {
                    IFormatProvider ifp = new CultureInfo("zh-CN", true);
                    DateTime.TryParseExact(nLotDate, "yyyyMMdd", ifp, DateTimeStyles.None, out nDateCode);
                }
                // åŽŸå§‹DateCode ä¸ºå¹´ã€å‘¨æ¬¡ï¼ˆYYYYWW / YYWW)
                int yw = 0;
                if (nLotDate.Length <= 6 && int.TryParse(nLotDate, out yw))
                {
                    nDateCode = GetWeekStartTime(nLotDate);
                }
                if (nDateCode == DateTime.MinValue)
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"条码[{nFullBarcode}]格式错误:未取到正确的批次日期";
                    return result;
                }
            }
            var nMaterial = Biz.Db.Queryable<WMS_MesMaterial>().Where(q => q.MCode.ToUpper() == nMaterialCode.ToUpper()).First();
            if (nMaterial == null)
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码对应的物料不存在";
                return result;
            }
            if (!nPackageBarcode)
            {
                if (nPackageBarcode && nBarcodeLotNo.Length != 12)
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"物料条码批次格式错误,应至少包含15位字符";
                    return result;
                }
            }
            result.Data = new InputBarcodeDto
            {
                OrderNo = nOrderNo,
                Barcode = nBarcodeLotNo,
                MaterialCode = nMaterialCode,
                MaterialName = nMaterial?.MName,
                MaterialStandard = nMaterial?.MDesc,
                MGroupCode = nMaterial?.MGroupCode,
                Unit = nMaterial?.MUom,
                LotQty = nBarcodeQty,
                LotDateString = nLotDate,
                LotDate = nDateCode,
                PeriodDays = nMaterial.PERIODDAYS,
                FIFO = nMaterial.FIFO,
                SafeStorageQty = nMaterial.SAFEQTY,
                StateFlag = nStateFlag,
                IsBox = isBox,
                SnList = snList,
                LotNo = nBarcodeLotNo,
            };
            return result;
        }
        /// <summary>
        /// ASN标签条码解析
        /// æ‹†è§£æ¡ç ï¼Œä¾æ¬¡æ˜¯ï¼š
        /// V:PO(MO)
        /// P:C P/N:料号
        /// N:Name(物料名称)
        /// Q:QTY(数量)
        /// U:Unit(单位)
        /// M:Mfr P/N(供应商内部管控的物料的料号)
        /// D:Date Code(生产日期,物料的生产日期)
        /// L:Lot Code(生产的批次)
        /// S:PAG ID(小包批次代码,也就是来料外包条码)
        /// </summary>
        /// <param name="nFullBarcode"></param>
        /// <param name="nBarcodeType"></param>
        /// <returns></returns>
        public static Result<InputBarcodeDto> SplitFullBarcodeAsn(string[] nSplitArray, bool nPackageBarcode = false)
        {
            Result<InputBarcodeDto> result = new(Result.Flags.Success, $"解析Asn条码成功");
            #region æ–¹æ³•变量
            // æ¡ç å˜é‡
            var nAsnNo = "";
            var nVendorCode = "";
            var nMaterialCode = "";
            var nBarcodeLotNo = "";
            var nLotQty = "";
            var nLotDate = "";
            var nStateFlag = "";
            bool isBox = false;
            var nLotNo = "";
            // æœ€å°åŒ…装条码列表
            List<Tuple<string, decimal>> snList = new List<Tuple<string, decimal>>();
            // é€è´§å•行明细
            List<InputAsnLineDto> asnLineList = new List<InputAsnLineDto>();
            // æœ€å°åŒ…装条码明细
            List<WMS_SRMSNList> snBarcodeList = new List<WMS_SRMSNList>();
            var nCartonNo = "";
            var nPalletNo = "";
            // å˜é‡èµ‹å€¼
            foreach (string item in nSplitArray)
            {
                string itemKey = item.Substring(0, 1).ToUpper();
                string itemValue = item.Substring(1);
                if (itemKey == "V")
                { //送货单号
                    nAsnNo = itemValue;
                }
                else if (itemKey == "P")
                { //条码料号
                    nMaterialCode = itemValue;
                }
                else if (itemKey == "S")
                { //来料外包条码
                    nBarcodeLotNo = itemValue;
                    //nBarcodeLotNo = item;//PAG ID è§£æžå‡ºæ¥çš„æ•°æ®å‰ç¼€â€œS”不用去掉
                    //if(itemValue.StartsWith("C")|| itemValue.StartsWith("P")) //中箱(C)和栈板(P),需要再次去掉一位
                    //    nBarcodeLotNo = itemValue.Substring(1);
                }
                else if (itemKey == "Q")
                { //条码数量
                    nLotQty = itemValue;
                }
                else if (itemKey == "D")
                { //生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
                  //nLotDate = itemValue.Replace("-", "");
                    nLotDate = Regex.Replace(itemValue, @"[^0-9]+", "");
                }
                else if (itemKey == "L")
                { //批号
                    nLotNo = itemValue;
                }
            }
            #endregion
            #region æ¡ç æ•°æ®æ ¡éªŒ
            if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
            {
                //throw new UserFriendlyException("条码数据有误");
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码数据有误";
                return result;
            }
            // èŽ·å–æ¡ç åˆ—è¡¨ snBarcodeList
            snBarcodeList = GetSrmBarcodeList(nBarcodeLotNo);
            // å¦‚果最小包装标签记录数大于1,则为包装标签,否则为最小包装标签
            if (BarcodeIsBox(nBarcodeLotNo))
            {
                isBox = true;
            }
            if (snBarcodeList.Any())
            {
                snList = snBarcodeList.Select(t => new Tuple<string, decimal>(t.SmallBarcode, t.IncludeQty)).ToList();
                snBarcodeList = snBarcodeList.Select(t => new WMS_SRMSNList
                {
                    BILLCODE = t.BILLCODE,
                    MATERIALCODE = t.MATERIALCODE,
                    SmallBarcode = t.SmallBarcode,
                    BigBarcode = t.BigBarcode,
                    OuterBarcode = t.OuterBarcode,
                    IncludeQty = t.IncludeQty
                }).ToList();
                // åˆ¤æ–­æ ‡ç­¾æ¡ç ç±»åž‹
                // æ˜¯æœ€å°åŒ…装条码
                var smallBarcode = snBarcodeList.Where(t => t.SmallBarcode == nBarcodeLotNo).FirstOrDefault();
                if (smallBarcode != null && !smallBarcode.SmallBarcode.IsNullOrEmpty())
                {
                    isBox = false;
                    nCartonNo = smallBarcode.BigBarcode;
                    nPalletNo = smallBarcode.OuterBarcode;
                }
                // æ˜¯å¤–箱条码
                var bigBarcode = snBarcodeList.Where(t => t.BigBarcode == nBarcodeLotNo).FirstOrDefault();
                if (bigBarcode != null && !bigBarcode.BigBarcode.IsNullOrEmpty())
                {
                    isBox = true;
                    nCartonNo = bigBarcode.BigBarcode;
                    nPalletNo = bigBarcode.OuterBarcode;
                }
                // æ˜¯æ ˆæ¿æ¡ç 
                var outerBarcode = snBarcodeList.Where(t => t.OuterBarcode == nBarcodeLotNo).FirstOrDefault();
                if (outerBarcode != null && !outerBarcode.OuterBarcode.IsNullOrEmpty())
                {
                    isBox = true;
                    nCartonNo = outerBarcode.BigBarcode;
                    nPalletNo = outerBarcode.OuterBarcode;
                }
            }
            // éªŒè¯æ¡ç æ ‡ç­¾æ•°é‡æ ¼å¼æ˜¯å¦æ­£ç¡®
            if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
            {
                //throw new UserFriendlyException("条码格式错误:未取到正确的条码数量");
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码格式错误:未取到正确的条码数量";
                return result;
            }
            // éªŒè¯æ¡ç æ ‡ç­¾æ•°é‡ä¸ŽSRM æœ€å°åŒ…装数量合计是否一致
            decimal snQtyTotal = snBarcodeList.Sum(t => t.IncludeQty);
            if (nBarcodeQty != snQtyTotal)
            {
                //throw new UserFriendlyException("标签数量与SRM最小包装总数量不一致");
                result.Flag = Result.Flags.Failed;
                result.Message = $"标签数量与SRM最小包装总数量不一致";
                return result;
            }
            DateTime nDateCode = DateTime.Now;
            if (nLotDate != "")
            {
                //增加判断日期的抛错提示 2022/07/27 Ben Lin, 2022/07/29 Ben Lin å†æ¬¡æ›´æ–°
                try
                {
                    string dateTimeStr = nLotDate.Substring(0, 4) + "-" + nLotDate.Substring(4, 2) + "-" + nLotDate.Substring(6, 2);
                    if (nLotDate.Length < 7)
                    {
                        if (nLotDate.StartsWith("2") && nLotDate.Length == 6)
                        {
                            dateTimeStr = $"20{nLotDate.Substring(0, 2)}-{nLotDate.Substring(2, 2)}-{nLotDate.Substring(4, 2)}";
                        }
                        else
                        {
                            result.Flag = Result.Flags.Failed;
                            result.Message = $"条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期";
                            return result;
                        }
                    }
                    if (!DateTime.TryParse(dateTimeStr, out nDateCode))
                    //if (!DateTime.TryParse(nLotDate, out DateTime nDateCode))
                    {
                        result.Flag = Result.Flags.Failed;
                        result.Message = $"条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期";
                        return result;
                    }
                }
                catch (System.Exception ex)
                {
                    //Logger.Info($"ASN标签条码解析 =>条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期,{ex.Message}");
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"条条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期,{ex.Message}";
                    return result;
                }
            }
            var nMaterial = Biz.Db.Queryable<WMS_MesMaterial>().Where(t => t.MCode.ToUpper() == nMaterialCode.ToUpper()).First();
            if (nMaterial == null)
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"条码对应的物料[{nMaterialCode}]不存在";
                return result;
            }
            if (!nPackageBarcode)
            {
                if (nPackageBarcode && nBarcodeLotNo.Length != 12)
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
                    return result;
                }
                else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
                {
                    result.Flag = Result.Flags.Failed;
                    result.Message = $"物料条码批次格式错误,应至少包含15位字符";
                    return result;
                }
            }
            #endregion
            #region èŽ·å–é€è´§å•æ•°æ®
            // å¦‚果标签没有送货单号,根据标签条码获取送货单号
            if (nAsnNo.IsNullOrEmpty())
            {
                var asnList = GetSrmAsn(nBarcodeLotNo);
                var asn = asnList.FirstOrDefault();
                if (asn != null)
                {
                    nAsnNo = asn.DeliveryNo;
                    nVendorCode = asn.VendorCode;
                }
            }
            // èŽ·å–é€è´§å•è¡Œæ˜Žç»† poLineList
            List<InputAsnLineDto> asnLines = GetSrmAsnLines(nAsnNo, nMaterialCode);
            if (asnLines != null && asnLines.Count > 0)
            {
                foreach (var line in asnLines)
                {
                    // åˆ†å‰²poLineNo(1-1-1),用-分割,取第一段,获取 PoErpLine
                    string[] splitLineNo = line.PoLineNo.Split('-');
                    if (splitLineNo != null && splitLineNo.Count() > 0)
                    {
                        int erpPoLine = 0;
                        int.TryParse(splitLineNo[0], out erpPoLine);
                        line.PoErpLine = erpPoLine;
                    }
                }
            }
            #endregion
            result.Data = new InputBarcodeDto
            {
                AsnNo = nAsnNo,
                Barcode = nBarcodeLotNo,
                VendorCode = nVendorCode,
                MaterialCode = nMaterialCode,
                MaterialName = nMaterial?.MName,
                MaterialStandard = nMaterial?.MDesc,
                MGroupCode = nMaterial?.MGroupCode,
                Unit = nMaterial?.MUom,
                LotQty = nBarcodeQty,
                LotDateString = nLotDate,
                LotDate = nDateCode,
                PeriodDays = nMaterial.PERIODDAYS,
                FIFO = nMaterial.FIFO,
                SafeStorageQty = nMaterial.SAFEQTY,
                StateFlag = nStateFlag,
                IsBox = isBox,
                SnList = snList,
                LotNo = nBarcodeLotNo,
                AsnLineList = asnLines,
                SnBarcodeList = snBarcodeList,
                CartonNo = nCartonNo,
                PalletNo = nPalletNo
            };
            return result;
        }
        private static bool BarcodeIsBox(string barcode)
        {
            bool isBox = false;
            // ä»ŽWMS_SRM_ASN表查找单据编号,判断是否为ASN
            if (Biz.Db.Queryable<WMS_SRMSNList>().Where(t => t.OuterBarcode == barcode || t.BigBarcode == barcode).Any())
                isBox = true;
            return isBox;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="inputBarcode"></param>
        /// <returns></returns>
        public static List<SRMSNStatus> GetSrmAsn(string inputBarcode)
        {
            var query = Biz.Db.Queryable<WMS_SRMSNList, WMS_SRM_ASN>((t, m) =>
                                new JoinQueryInfos(
                                    JoinType.Left, t.DeliveryNo == m.DeliveryNo
                                    ))
            .Where((t, m) => t.SmallBarcode == inputBarcode || t.BigBarcode == inputBarcode || t.OuterBarcode == inputBarcode)
            .Select((t, m) => new SRMSNStatus
            {
                DeliveryNo = t.DeliveryNo,
                VendorCode = m.innerVendorCode,
                Status = m.status
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// èŽ·å– SRM ASN è¡Œ
        /// </summary>
        /// <param name="inputAsnNo"></param>
        /// <returns></returns>
        public static List<InputAsnLineDto> GetSrmAsnLines(string inputAsnNo)
        {
            var query = Biz.Db.Queryable<WMS_SRM_ASN_LINES>()
            .Where(t => t.DeliveryNo == inputAsnNo)
            .Select(t => new InputAsnLineDto
            {
                DeliveryNo = t.DeliveryNo,
                LineNo = t.lineNo,
                ProductCode = t.productCode,
                PurchaseType = t.purchaseType,
                PoErpNo = t.poErpNo,
                PoLineNo = t.poLineNo,
                DeliveryQty = t.deliveryQty
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// èŽ·å– SRM ASN è¡Œ
        /// </summary>
        /// <param name="inputAsnNo"></param>
        /// <param name="inputMaterialCode"></param>
        /// <returns></returns>
        public static List<InputAsnLineDto> GetSrmAsnLines(string inputAsnNo, string inputMaterialCode)
        {
            var query = Biz.Db.Queryable<WMS_SRM_ASN_LINES>()
            .Where(t => t.DeliveryNo == inputAsnNo && t.productCode == inputMaterialCode)
            .Select(t => new InputAsnLineDto
            {
                DeliveryNo = t.DeliveryNo,
                LineNo = t.lineNo,
                ProductCode = t.productCode,
                PurchaseType = t.purchaseType,
                PoErpNo = t.poErpNo,
                PoLineNo = t.poLineNo,
                DeliveryQty = t.deliveryQty
            })
            .ToList();
            return query;
        }
        /// <summary>
        /// èŽ·å– SRM æ¡ç åˆ—表
        /// </summary>
        /// <param name="inputBarcode"></param>
        /// <returns></returns>
        public static List<WMS_SRMSNList> GetSrmBarcodeList(string inputBarcode)
        {
            return Biz.Db.Queryable<WMS_SRMSNList>().Where(t => t.OuterBarcode == inputBarcode || t.BigBarcode == inputBarcode || t.SmallBarcode == inputBarcode).ToList();
        }
        /// <summary>
        /// å½“前周的第一天(星期一)
        /// </summary>
        /// <param name="yearWeek">周数,格式:yyyywww</param>
        /// <returns></returns>
        private static DateTime GetWeekStartTime(string yearWeek)
        {
            //年份
            int year = 0;
            //周数
            int weekNum = 0;
            if (yearWeek.Length == 4)
            {
                year = 2000 + int.Parse(yearWeek.Substring(0, 2));
                weekNum = int.Parse(yearWeek.Substring(2));
            }
            if (yearWeek.Length == 6)
            {
                year = int.Parse(yearWeek.Substring(0, 4));
                weekNum = int.Parse(yearWeek.Substring(4));
            }
            //本年1月1日
            DateTime firstOfYear = new DateTime(year, 1, 1);
            //本年1月1日与本周星期一相差的天数
            int dayDiff = (firstOfYear.DayOfWeek == DayOfWeek.Sunday ? 7 : Convert.ToInt32(firstOfYear.DayOfWeek)) - 1;
            //第一周的星期一
            DateTime firstDayOfFirstWeek = firstOfYear.AddDays(-dayDiff);
            //当前周的星期一
            DateTime firstDayOfThisWeek = firstDayOfFirstWeek.AddDays((weekNum - 1) * 7);
            return firstDayOfThisWeek;
        }
        // æ ¹æ®å•据编号判断是都为 ASN
        private static bool BillIsAsn(string billCode)
        {
            // ä»ŽWMS_SRM_ASN表查找单据编号,判断是否为ASN
            return Biz.Db.Queryable<WMS_SRMSNList>().Where(q => q.DeliveryNo == billCode).Any();
        }
        /// <summary>
        /// èŽ·å–å•å·æ ¹æ®å•æ®ç±»åž‹
        /// </summary>
        /// <param name="billType"></param>
        /// <returns></returns>
        public static string GetBillNoByType(string billType)
        {
            //根据BillType去表中找到相关前缀、日期码、流水号、长度
            var billNoRule = Biz.Db.Queryable<MesBillNoHelper>().Where(t => t.BillType.Equals(billType)).ToList();
            if (billNoRule.Count == 1)
            {
                var nowRule = billNoRule[0];
                string prefix = nowRule.BillPrefix.Trim();
                string datecode = nowRule.DateCode.Trim();
                string today = DateTime.Now.ToString("yyyyMMdd");
                int serial = nowRule.SerialNo;
                int maxSerial = GetMaxNumByLength(nowRule.SerialNoLength);
                if (serial >= maxSerial)
                {
                    return "over";
                }
                else
                {
                    if (datecode != string.Empty && datecode != today)
                    {
                        serial = 0;
                        datecode = today;
                    }
                    string serialNo = (serial + 1).ToString().PadLeft(nowRule.SerialNoLength, '0');
                    //update serialNo
                    nowRule.DateCode = datecode;
                    nowRule.SerialNo = serial + 1;
                    Biz.Db.Updateable(nowRule).ExecuteCommand();
                    //返回编号
                    return prefix + datecode + serialNo;
                }
            }
            else
            {
                return "";
            }
        }
        private static int GetMaxNumByLength(int length)
        {
            if (length == 0)
            {
                return 0;
            }
            else
            {
                string strNum = string.Empty;
                for (int i = 1; i <= length; i++)
                {
                    strNum += "9";
                }
                return Convert.ToInt32(strNum);
            }
        }
        /// <summary>
        /// ç”Ÿæˆé€æ£€å•
        /// </summary>
        /// <param name="detail"></param>
        /// <param name="nUrgent"></param>
        /// <returns></returns>
        private static Result<WMS_IQC_H> CreateIqcHeader(WMS_RECEIPT_D detail, string nUrgent, DbClient db)
        {
            Result<WMS_IQC_H> result = new(Result.Flags.Success, $"生成送检单成功");
            var nMaterial = Biz.Db.Queryable<WMS_MesMaterial>().Where(t => t.MCode.ToUpper() == detail.MATERIALCODE.ToUpper()).First();
            var nAql = Biz.Db.Queryable<WMS_IQCMATERIAL_AQL>().Where(t => t.MATERIALID.Equals(nMaterial.Id)).First();
            var nIqcHeader = new WMS_IQC_H
            {
                BILLCODE = iWMS.GetBillNoByType("IQC"),
                SOURCETYPE = (int)InventoryTransferSides.BillType.CustSupplyInStock,
                SOURCECODE = detail.BILLCODE,
                SOURCELINE = detail.BILLLINE,
                PONO = detail.SOURCECODE,
                POLINE = detail.POLINE ?? 0,
                MEASURE = nUrgent,
                QCTIMES = 0,
                QCSTATUS = (int)IqcManagementSides.QCStatus.UnFinish, /*(int)IqcManagementSides.QCStatus.UnFinish,*/
                QCRESULT = (int)IqcManagementSides.QCResult.Wait,
                QCREVIEW = (int)IqcManagementSides.QCReview.UnReview,
                CreationTime = DateTime.Now,
                CreatorUserId = 1,
                MATERIALCODE = detail.MATERIALCODE
                //ReceiveQty = detail.Qty, //生成送检单加上接收数量 2022/07/27 Ben Lin 2022/09/03 Ben Lin æ³¨é‡Š
            };
            var nIQCMaterial = Biz.Db.Queryable<WMS_IQCMATERIAL>().Where(t => t.MATERIALID.Equals(nMaterial.Id)).First();
            if (nIQCMaterial == null)
            {
                nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalI;
            }
            //免检
            else if (nIQCMaterial.CHECKTYPE == "Exemption")
            {
                nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.Exemption;
            }
            //抽检
            else if (nIQCMaterial.CHECKTYPE == "Sampling")
            {
                var nIQCMaterial2AQL = Biz.Db.Queryable<WMS_IQCMATERIAL_AQL>().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
                if (nIQCMaterial2AQL.Any())
                {
                    var nIQCMaterial2CheckItem = Biz.Db.Queryable<WMS_IQCMATERIAL_CHECKITEM>().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
                    if (nIQCMaterial2CheckItem.Any())
                    {
                        //高检II,抽检物料,AQL和检验项目都维护了
                        nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.HighII;
                        Result<WMS_IQC_H> result1 = GetAqlSettingAsync(nAql, nIqcHeader, detail, db);
                        if (result1.Flag != Result.Flags.Success)
                        {
                            result.Flag = result1.Flag;
                            result.Message = result1.Message;
                        }
                        else
                        {
                            nIqcHeader = result1.Data;
                        }
                    }
                    else
                    {
                        //高检I,抽检物料,维护了AQL、但是没有维护检验项目
                        nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.HighI;
                        Result<WMS_IQC_H> result2 = GetAqlSettingAsync(nAql, nIqcHeader, detail, db);
                        if (result2.Flag != Result.Flags.Success)
                        {
                            result.Flag = result2.Flag;
                            result.Message = result2.Message;
                        }
                        else
                        {
                            nIqcHeader = result2.Data;
                        }
                    }
                }
                else
                {
                    var nIQCMaterial2CheckItem = Biz.Db.Queryable<WMS_IQCMATERIAL_CHECKITEM>().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
                    if (nIQCMaterial2CheckItem.Any())
                    {
                        //普检II,抽检物料,没有维护AQL、但是维护了检验项目
                        nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalII;
                    }
                    else
                    {
                        //普检I,抽检物料,但是没有维护AQL和检验项目
                        nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalI;
                    }
                }
            }
            //全检
            else if (nIQCMaterial.CHECKTYPE == "FullInspection")
            {
                nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.FullInspection;
                nIqcHeader.SAMPLENGQTY = detail.QTY;
            }
            result.Data = nIqcHeader;
            return result;
        }
        private static Result<WMS_IQC_H> GetAqlSettingAsync(WMS_IQCMATERIAL_AQL nAql, WMS_IQC_H nIqcHeader, WMS_RECEIPT_D nDetail, DbClient db)
        {
            Result<WMS_IQC_H> result = new(Result.Flags.Success, $"获取Aql成功");
            if (nAql.AUTOSTRICT == true)
            {
                nIqcHeader.STRICTLEVEL = nAql.CURRENTSTRICT.IsNullOrEmpty() ? nAql.DEFAULTSTRICT : nAql.CURRENTSTRICT;
                nIqcHeader.LEVELCODE = nIqcHeader.STRICTLEVEL.ToUpper() == "NORMAL" ? nAql.NORMALLEVEL : (nIqcHeader.STRICTLEVEL.ToUpper() == "STRICT" ? nAql.STRICTLEVEL : nAql.RELAXLEVEL);
                nIqcHeader.AQL = nIqcHeader.STRICTLEVEL.ToUpper() == "NORMAL" ? nAql.NORMALAQLLEVEL : (nIqcHeader.STRICTLEVEL.ToUpper() == "STRICT" ? nAql.STRICTAQLLEVEL : nAql.RELAXAQLLEVEL);
            }
            else
            {
                nIqcHeader.STRICTLEVEL = nAql.DEFAULTSTRICT;
                nIqcHeader.LEVELCODE = nAql.DEFAULTLEVEL;
                nIqcHeader.AQL = nAql.DEFAULTAQL;
            }
            //找到该 LevelCode和AqlCode配置下,符合的批次数量范围
            var nAqlDetail = Biz.Db.Queryable<WMS_AQL_D>()
                .Where(t => t.LEVELCODE.ToUpper() == nIqcHeader.LEVELCODE.ToUpper() && t.AQLCODE.ToUpper() == nIqcHeader.AQL.ToUpper())
                .Where(t => t.LOTMAXQTY >= nDetail.QTY && t.LOTMAXQTY <= nDetail.QTY)
                .First();
            if (nAqlDetail == null)
            {
                result.Flag = Result.Flags.Failed;
                result.Message = $"未能在水准[{nIqcHeader.LEVELCODE}]下的AQL[{nIqcHeader.AQL}]下找到符合[{nDetail.QTY}]的批次范围";
            }
            nIqcHeader.BEGINQTY = nAqlDetail.LOTMINQTY;
            nIqcHeader.ENDQTY = nAqlDetail.LOTMAXQTY;
            nIqcHeader.SAMPLEQTY = nAqlDetail.SAMPLEQTY > nDetail.QTY ? nDetail.QTY : nAqlDetail.SAMPLEQTY;
            result.Data = nIqcHeader;
            return result;
        }
    }//endClass
}
Tiger.Controllers.WMS/Controllers/WMSController.In_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
using System;
using System.Threading.Tasks;
using Rhea.Common;
using Tiger.Model;
using Tiger.IBusiness;
using Microsoft.AspNetCore.Mvc;
using Tiger.Model.Minsun;
using Autofac;
namespace Tiger.Api.Controllers.WMS
{
    public partial class WMSController : ControllerBase
    {
        /// <summary>
        /// GetTransaction(ApiAction(Data:UserId))
        /// æ ¹æ®ApiAction的id返回一个标准上架事务
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/In_Default/GetTransaction")]
        public IActionResult In_Default_GetTransaction([FromBody] ApiAction<USER> action)
        {
            ApiAction response;
            IIn_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_Default;
                }
                else
                {
                    trans = AutoFacContainer.Instance.Resolve<IIn_Default>().Init(action.ID, action.Data?.USER_CODE, Request.Host.Value, action.Data?.ORG_CODE);
                    iBiz.WMS.Context.NewTransaction(HttpContext, trans);
                }
                response = action.GetResponse();
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// CloseTransaction(ApiAction)
        /// å…³é—­äº‹åŠ¡
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/In_Default/CloseTransaction")]
        public IActionResult In_Default_CloseTransaction([FromBody] ApiAction action)
        {
            ApiAction response;
            IIn_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(trans.Close());
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.Close()); }
                        }
                        response.Message = $"标准上架事务[ID:{action.ID}]关闭{(response.IsSuccessed ? "成功" : "失败")}";
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]已经关闭", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]已经关闭", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// æ‰«æå…¥åº“
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/In_Default/ScanItem")]
        public async Task<IActionResult> In_Default_ScanItemAsync([FromBody] ApiAction<BaseInput> action)
        {
            ApiAction response;
            IIn_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.ScanItem(action.Data));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.ScanItem(action.Data).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]已经关闭,请重新打开标准上架功能", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]数据丢失,请重新打开标准上架功能", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/In_Default/ScanShelf")]
        public async Task<IActionResult> In_Default_ScanShelfAsync([FromBody] ApiAction action)
        {
            ApiAction response;
            IIn_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.ScanShelf(action.Data?.ToString()));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.ScanShelf(action.Data?.ToString()).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]已经关闭,请重新打开上架功能", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸Šæž¶äº‹åŠ¡[ID:{action.ID}]数据丢失,请重新打开上架功能", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
    }
}
Tiger.Controllers.WMS/Controllers/WMSController.Out_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
using System;
using System.Threading.Tasks;
using Rhea.Common;
using Tiger.Model;
using Tiger.IBusiness;
using Microsoft.AspNetCore.Mvc;
using Tiger.Model.Minsun;
using Autofac;
namespace Tiger.Api.Controllers.WMS
{
    public partial class WMSController : ControllerBase
    {
        /// <summary>
        /// GetTransaction(ApiAction(Data:UserId))
        /// æ ¹æ®ApiAction的id返回一个标准下架事务
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/Out_Default/GetTransaction")]
        public IActionResult Out_Default_GetTransaction([FromBody] ApiAction<USER> action)
        {
            ApiAction response;
            IOut_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_Default;
                }
                else
                {
                    trans = AutoFacContainer.Instance.Resolve<IOut_Default>().Init(action.ID, action.Data?.USER_CODE, Request.Host.Value, action.Data?.ORG_CODE);
                    iBiz.WMS.Context.NewTransaction(HttpContext, trans);
                }
                response = action.GetResponse();
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// CloseTransaction(ApiAction)
        /// å…³é—­äº‹åŠ¡
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/Out_Default/CloseTransaction")]
        public IActionResult Out_Default_CloseTransaction([FromBody] ApiAction action)
        {
            ApiAction response;
            IOut_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(trans.Close());
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.Close()); }
                        }
                        response.Message = $"标准下架事务[ID:{action.ID}]关闭{(response.IsSuccessed ? "成功" : "失败")}";
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]已经关闭", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]已经关闭", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// æ‰«æå…¥åº“
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/Out_Default/ScanItem")]
        public async Task<IActionResult> Out_Default_ScanItemAsync([FromBody] ApiAction<BaseInput> action)
        {
            ApiAction response;
            IOut_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.ScanItem(action.Data));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.ScanItem(action.Data).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]已经关闭,请重新打开标准下架功能", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]数据丢失,请重新打开标准下架功能", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/Out_Default/ScanShelf")]
        public async Task<IActionResult> Out_Default_ScanShelfAsync([FromBody] ApiAction action)
        {
            ApiAction response;
            IOut_Default trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_Default;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.ScanShelf(action.Data?.ToString()));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.ScanShelf(action.Data?.ToString()).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]已经关闭,请重新打开标准下架功能", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: æ ‡å‡†ä¸‹æž¶äº‹åŠ¡[ID:{action.ID}]数据丢失,请重新打开标准下架功能", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
    }
}
Tiger.IBusiness.WMS/IInventory.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model;
namespace Tiger.IBusiness
{
    public interface IInventory
    {
        public string SN { get; set; }
        //public Barcode Barcode { get; set; }
        //public bool IsQRCode => Barcode.IsQRCode;
        public WMS_ITEM_EXT ExtInfo { get; set; }
        public BAS_ITEM ItemInfo { get; set; }
        public WMS_WAREHOUSE Warehouse { get; set; }
        public WMS_REGION Region { get; set; }
        public WMS_SHELF Shelf { get; set; }
        public WMS_LOCATION Location { get; set; }
        public WMS_ITEM_PKG ParentPkg { get; set; }
        public List<WMS_ITEM_PKG> Packages { get; set; }
        public List<WMS_ITEM> Items { get; set; }
        public List<WMS_ITEM_EXT> ItemsExt { get; set; }
        public List<WMS_ITEM_HIS> History { get; set; }
        public List<WMS_ITEM.STATUSs> StatusList { get; }
        public bool isNormalStatus { get; }
        public WMS_ITEM.STATUSs Status { get; }
        public WMS_ITEM_PKG CurPkg { get; }
        public bool isExists { get; }
        public bool isMinPackage { get; }
    }
}
Tiger.IBusiness.WMS/IWmsItem.cs
@@ -17,7 +17,7 @@
        /// <param name="option">授权查询选项</param>
        /// <param name="doUnPack">是否同时执行拆包操作,解除与父条码之间的包装关系</param>
        /// <returns></returns>
        public Result<Inventory> Get(string sn, AuthOption option, bool doUnPack);
        public Result<IInventory> Get(string sn, AuthOption option, bool doUnPack);
        /// <summary>
        /// å®¢ä¾›æ–™ä¸“用:获取条码库存信息,包括仓库,储区,货架,储位,父条码,包装明细等
        ///     æ³¨ï¼šç‰©æ–™ç¼–码自动加K判断和处理
@@ -26,7 +26,7 @@
        /// <param name="option">授权查询选项</param>
        /// <param name="doUnPack">是否同时执行拆包操作,解除与父条码之间的包装关系</param>
        /// <returns></returns>
        public Result<Inventory> GetK(string sn, AuthOption option, bool doUnPack);
        public Result<IInventory> GetK(string sn, AuthOption option, bool doUnPack);
        /// <summary>
        /// ä¸Šæž¶
        /// </summary>
@@ -35,7 +35,7 @@
        /// <param name="targetLocation">要上架的储位代码</param>
        /// <param name="isTransfer">是否移库操作</param>
        /// <returns></returns>
        public Result<PutOnInfo> PutOn(Inventory inventory, AuthOption option, string targetLocation, bool isTransfer = false);
        public Result<PutOnInfo> PutOn(IInventory inventory, AuthOption option, string targetLocation, bool isTransfer = false);
        /// <summary>
        /// ä¸‹æž¶
        /// </summary>
@@ -43,7 +43,7 @@
        /// <param name="option">授权查询选项</param>
        /// <param name="status">下架后状态,默认为下架(WMS_ITEM.STATUSs.OffShelf)</param>
        /// <returns></returns>
        public Result<TakeDownInfo> TakeDown(Inventory inventory, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true);
        public Result<TakeDownInfo> TakeDown(IInventory inventory, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true);
        /// <summary>
        /// æ ¹æ®SN获取二维码内容
        /// </summary>
Tiger.IBusiness.WMS/Minsun/IInventroyInfo.cs
Tiger.IBusiness.WMS/Transaction/IIn_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model;
namespace Tiger.IBusiness
{
    public interface IIn_Default : IWMSTransaction
    {
        public IIn_Default Init(string id, string userCode, string apiHost, string orgCode);
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果物料已经完成移库则货架上亮灯提醒储位
        /// </summary>
        public Task<ApiAction> ScanItem(BaseInput input);
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
        /// </summary>
        public Task<ApiAction<ScanShelfInfo>> ScanShelf(string Code);
        public bool Close(bool needSaveHistoryLog = false);
    }
}
Tiger.IBusiness.WMS/Transaction/IOutNoBillcode.cs
@@ -14,7 +14,7 @@
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果物料已经完成移库则货架上亮灯提醒储位
        /// </summary>
        public Task<ApiAction<NoWorkOrderOutput>> ScanItem(BaseInput input);
        public Task<ApiAction<DefaultScanItemOutput>> ScanItem(BaseInput input);
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
Tiger.IBusiness.WMS/Transaction/IOut_Default.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
using Rhea.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model;
namespace Tiger.IBusiness
{
    public interface IOut_Default : IWMSTransaction
    {
        public IOut_Default Init(string id, string userCode, string apiHost, string orgCode);
        /// <summary>
        /// æ‰«æç‰©æ–™å¹¶å¤æ ¸ï¼Œå¦‚果物料已经完成移库则货架上亮灯提醒储位
        /// </summary>
        public Task<ApiAction<DefaultScanItemOutput>> ScanItem(BaseInput input);
        /// <summary>
        /// æ‰«æè´§æž¶æˆ–者储位
        /// </summary>
        public Task<ApiAction<ScanShelfInfo>> ScanShelf(string Code);
        public bool Close(bool needSaveHistoryLog = false);
    }
}
Tiger.Model.Net/Entitys/WMS/Api/BaseInput.cs
@@ -50,4 +50,21 @@
    {
        public bool IsItemCodeList { get; set; }
    }
    public class ScanShelfInfo
    {
        public string WarehouseCode { get; set; }
        public string RegionCode { get; set; }
        public string ShelfCode { get; set; }
        public string LocationCode { get; set; }
        public string RackCode => ShelfCode;
        public bool IsSmartRack { get; set; }
        public decimal Capacity { get; set; }
        public int LotCount { get; set; }
        public decimal MaxSize { get; set; }
        public int ShelfType { get; set; }
        public bool IsScanShelf { get; set; }
        public WMS_SHELF Shelf { get; set; }
        public WMS_LOCATION Location { get; set; }
    }
}
Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model.Minsun;
namespace Tiger.Model
{
}
Tiger.Model.Net/Entitys/WMS/Api/Output_Entitys.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model.Minsun;
namespace Tiger.Model
{
    public class DefaultScanItemOutput
    {
        public int ReqType { get; set; }
        public string ReqNo { get; set; }
        public bool isExceed { get; set; }
        public bool isCutting { get; set; }
        public string SN { get; set; }
        public string ItemCode { get; set; }
        public string MaterialName { get; set; }
        public decimal Qty { get; set; }
        public decimal CutQty { get; set; }
        public string regionCode { get; set; }
        public string locationCode { get; set; }
        public string ScanAfCut { get; set; }
        public string Unit { get; set; }
        public DateTime DateCode { get; set; }
        public string Message { get; set; }
    }
    public class DefaultInStoreOutput
    {
        public string Barcode { get; set; }
        public string MaterialCode { get; set; }
        public string MaterialName { get; set; }
        public decimal CurrentQty { get; set; }
        public string Unit { get; set; }
        public DateTime DateCode { get; set; }
        public string WarehouseCode { get; set; }
        public string RegionCode { get; set; }
        public string ShelfCode { get; set; }
        public string LocationCode { get; set; }
    }
}
Tiger.Model.Net/Entitys/WMS/Api/ProdReqInput.cs
@@ -29,26 +29,6 @@
        public string ScanAfCut { get; set; }
    }
    public class NoWorkOrderOutput
    {
        public int ReqType { get; set; }
        public string ReqNo { get; set; }
        public bool isExceed { get; set; }
        public bool isCutting { get; set; }
        public string SN { get; set; }
        public string ItemCode { get; set; }
        public string MaterialName { get; set; }
        public decimal Qty { get; set; }
        public decimal CutQty { get; set; }
        public string regionCode { get; set; }
        public string locationCode { get; set; }
        public string ScanAfCut { get; set; }
        public string Unit { get; set; }
        public DateTime DateCode { get; set; }
    }
    public class ProductionPickToMes
    {
        public string qrcode { get; set; }
Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs
@@ -252,33 +252,6 @@
    }//endClass
    /// <summary>
    /// æ¡ç åº“存信息,包括仓库,储区,货架,储位,父条码,包装明细等
    /// </summary>
    public class Inventory
    {
        public string SN { get; set; }
        public Barcode Barcode { get; set; }
        public bool IsQRCode => Barcode.IsQRCode;
        public WMS_ITEM_EXT ExtInfo { get; set; }
        public BAS_ITEM ItemInfo { get; set; }
        public WMS_WAREHOUSE Warehouse { get; set; }
        public WMS_REGION Region { get; set; }
        public WMS_SHELF Shelf { get; set; }
        public WMS_LOCATION Location { get; set; }
        public WMS_ITEM_PKG ParentPkg { get; set; }
        public List<WMS_ITEM_PKG> Packages { get; set; } = new List<WMS_ITEM_PKG>();
        public List<WMS_ITEM> Items { get; set; } = new List<WMS_ITEM>();
        public List<WMS_ITEM_EXT> ItemsExt { get; set; } = new List<WMS_ITEM_EXT>();
        public List<WMS_ITEM_HIS> History { get; set; } = new List<WMS_ITEM_HIS>();
        public List<WMS_ITEM.STATUSs> StatusList => Items.GroupBy(q => q.STATUS).Select(q => new { Status = q.Key.GetEnum<WMS_ITEM.STATUSs>(), Count = q.Count() }).OrderByDescending(q => q.Count).Select(q => q.Status).ToList();
        public bool isNormalStatus => Items.Select(q => q.STATUS).Distinct().Count() == 1;
        public WMS_ITEM.STATUSs Status => StatusList?.FirstOrDefault() ?? WMS_ITEM.STATUSs.NotExists;
        public WMS_ITEM_PKG CurPkg => Packages.FirstOrDefault(q => q.SN == SN);
        public bool isExists => CurPkg != null;
        public bool isMinPackage => Items.Count == 1 && Items.Single().SN == SN;
    }
    /// <summary>
    /// ä¸Šæž¶æ‰§è¡Œä¿¡æ¯
    /// </summary>
    public class PutOnInfo
Tiger.Model.Net/Entitys/WMS/WMS_SHELF.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using Tiger.Model.Extensions;
namespace Tiger.Model
{
@@ -94,13 +95,15 @@
        /// å¤‡æ³¨
        /// </summary>
        public string REMARK { get; set; }
        #endregion
        #endregion
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        [SugarColumn(IsIgnore = true)]
        public bool IsLightShelf => SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue() || SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.QRCode.GetValue();
        #endregion
        #region æžšä¸¾å˜é‡
Tiger.Model.Net/Tiger.Model.Net.csproj
@@ -229,6 +229,8 @@
    <Compile Include="Entitys\SYS\SYS_CS_LOGIN.cs" />
    <Compile Include="Entitys\SYS\SYS_LOW_CODE.cs" />
    <Compile Include="Entitys\SYS\SYS_PDA_LOGIN.cs" />
    <Compile Include="Entitys\WMS\Api\Input_Entitys.cs" />
    <Compile Include="Entitys\WMS\Api\Output_Entitys.cs" />
    <Compile Include="Entitys\WMS\Api\Resell.cs" />
    <Compile Include="Entitys\WMS\Api\InFinished.cs" />
    <Compile Include="Entitys\WMS\Api\InReceiptCheckingInput.cs" />
@@ -556,7 +558,6 @@
    <Compile Include="Entitys\DigitalTwin\SeaStone\WebHook.cs" />
    <Compile Include="Entitys\SYS\USER.cs" />
    <Compile Include="Entitys\AnonymousEntity.cs" />
    <Compile Include="Entitys\Barcode.cs" />
    <Compile Include="Entitys\ImportEntity.cs" />
    <Compile Include="Entitys\WMS\AgvActionResult.cs" />
    <Compile Include="Entitys\WMS\KanBan\WareHousing.cs" />