using Admin.Core.Common.Config;
using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Service;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Aucma.Core.Scanner;
using static Aucma.Core.Scanner.ScannerService;
using Admin.Core.Model.Model_New;
using Quartz;
using StackExchange.Profiling.Internal;
using Aucma.Core.HwPLc;
using System.Windows.Documents;
using System.Timers;
using NetTaste;
using Org.BouncyCastle.Asn1.Tsp;
using System.Printing;

namespace Aucma.Core.BoxFoam.Business
{
    public class InStoreBusiness
    {
        #region 单例实现
        private static readonly InStoreBusiness lazy = new InStoreBusiness();
        public static InStoreBusiness Instance
        {
            get
            {
                return lazy;
            }
        }
        #endregion

        /// <summary>
        /// 已下传的任务信息
        /// </summary>
        private List<RealTaskInfo> TaskInfos = new List<RealTaskInfo>();
        private Dictionary<string, int> KeyValuePairs = new Dictionary<string, int>();
        #region 事件
        /// <summary>
        /// 扫码信息刷新
        /// </summary>
        /// <param name="materialBarCode">条码</param>
        /// <param name="materialCode">编码</param>
        /// <param name="materialName">名称</param>
        /// <param name="spaceName">货到名称</param>
        public delegate Task RefreshDataGridDelegate();
        public static event RefreshDataGridDelegate RefreshDataGridDelegateEvent;
        /// <summary>
        /// 扫码信息刷新
        /// </summary>
        /// <param name="materialBarCode">条码</param>
        /// <param name="materialCode">编码</param>
        /// <param name="materialName">名称</param>
        /// <param name="spaceName">货到名称</param>
        public delegate void RefreshScanMateriaCode(string materialBarCode, string materialCode, string materialName, string spaceName, string msg);
        public static event RefreshScanMateriaCode RefreshScanMateriaCodeEvent;
        /// <summary>
        /// 初始化入库任务
        /// </summary>
        /// <param name="message"></param>
        public delegate void RefreshInStoreTask(RealTaskInfo taskInfos);
        public static event RefreshInStoreTask RefreshInStoreTaskEvent;
        /// <summary>
        /// 日志信息刷新
        /// </summary>
        /// <param name="message"></param>
        public delegate void RefreshLogMessage(string message);
        public static event RefreshLogMessage RefreshLogMessageEvent;
        /// <summary>
        /// 入库日志事件
        /// </summary>
        /// <param name="msg"></param>
        public delegate void LogDelegate(string msg);
        public static event LogDelegate LogDelegateEvent;

        #endregion

        private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(InStoreBusiness));
        private readonly IBaseSpaceInfoServices? _baseSpaceInfoServices = App.ServiceProvider.GetService<IBaseSpaceInfoServices>();
        private readonly IRealTaskInfoServices? _realTaskInfoService = App.ServiceProvider.GetService<IRealTaskInfoServices>();
        private readonly IProductPlanInfoServices? _productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
        private readonly IRecordInStoreServices? _recordInstoreServices = App.ServiceProvider.GetService<IRecordInStoreServices>();
        private readonly IBaseStoreInfoServices? _baseStoreInfoServices = App.ServiceProvider.GetService<IBaseStoreInfoServices>();
        private readonly IBaseSpaceDetailServices? _baseSpaceDetailServices = App.ServiceProvider.GetService<IBaseSpaceDetailServices>();
        // 过点数据表,物料完成记录MaterialCompletion
        private readonly IMaterialCompletionServices? _iMaterialCompletionServices = App.ServiceProvider.GetService<IMaterialCompletionServices>();
        private readonly IPrintBarCodeServices? _printBarCodeServices = App.ServiceProvider.GetService<IPrintBarCodeServices>();
        private PlcSpaceConfig spaceConfig = PlcSpaceConfig.Instance;
        private readonly IBaseMaterialInfoServices? _baseMaterialInfoServices = App.ServiceProvider.GetService<IBaseMaterialInfoServices>();

        private SemaphoreSlim semaphore = new SemaphoreSlim(0);
        private string storeCode = Appsettings.app("StoreInfo", "BeforeStoreCode");//泡前库code
        private List<BaseSpaceInfo> allSpaces = null;
        private List<SpaceAddress> spaceAddresses = new List<SpaceAddress>();
        private SemaphoreSlim _lock = new SemaphoreSlim(1);

        public void init()
        {
         
            allSpaces = _baseSpaceInfoServices.Query(x => x.StoreCode == storeCode);
            foreach (var space in allSpaces)
            {
                spaceAddresses.Add(spaceConfig.GetSpaceAddress(storeCode, space.SpaceCode));
            }
            // 模拟入库
            //Task.Run(() =>
            //{
            //    Thread.Sleep(2000);
            //    InStore("B24010181060282920011");
            //});
            //实时监测入库任务下发和入库任务完成
            StartPassDownAndRealInstoreFinish();
        }

        /// <summary>
        /// 定时器实时监测入库出库完成信号
        /// </summary>
        /// <returns></returns>
        public void RealInstoreFinish()
        {
            var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("泡前库Plc"));
            if (obj != null && obj.plc.IsConnected)
            {
                foreach (SpaceAddress spaceAddress in spaceAddresses)
                {
                    // 入库完成信号
                    if (obj.plc.ReadInt16(spaceAddress.inStoreFinish) == 1)
                    {
                        obj.plc.WriteInt16(spaceAddress.inStoreFinish, "0");
                        InStoreFinish(spaceAddress.spaceCode);
                    }
                    // 出库完成信号,
                    if (obj.plc.ReadInt16(spaceAddress.outStoreFinish) == 1)
                    {
                        obj.plc.WriteInt16(spaceAddress.outStoreFinish, "0");
                        // 系统不控制出库,暂时未使用出库完成信号
                    }
                }
            }
        }

        /// <summary>
        ///实时监测入库任务下发和入库任务完成
        /// </summary>
        public async void StartPassDownAndRealInstoreFinish()
        {
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                while (true)
                {
                    PassDown();
                    Thread.Sleep(1000);
                }
            });
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                while (true)
                {
                    RealInstoreFinish();
                    Thread.Sleep(1000);
                }
            });


        }


        /// <summary>
        /// 获取入库任务下发plc
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public void PassDown()
        {
            try
            {
                RealTaskInfo taskInfo = GetAwaitSendTask(storeCode);

                if (taskInfo != null)
                {
                   
                    logHelper.Info($"下发泡前入库任务:{taskInfo.TaskCode};仓库{taskInfo.StoreCode};货道:{taskInfo.SpaceCode}");
                    LogDelegateEvent?.Invoke($"下发泡前入库任务:{taskInfo.TaskCode};仓库{taskInfo.StoreCode};货道:{taskInfo.SpaceCode},等待plc反馈");
                    if (SendFoamTask_InStore(taskInfo))
                    {
                        logHelper.Info($"泡前入库任务:{taskInfo.TaskCode};下发成功,等待PLC执行反馈");
                        semaphore.Wait(); //一直堵塞直到信号量释放
                        logHelper.Info($"箱壳入库任务:{taskInfo.TaskCode};开始执行");
                        LogDelegateEvent?.Invoke($"箱壳入库任务:{taskInfo.TaskCode};开始执行");
                        taskInfo.TaskStatus = 2;
                        _realTaskInfoService.UpdateAsync(taskInfo);

                        #region 更新在途数
                        BaseSpaceInfo spaceInfo = _baseSpaceInfoServices.Query(x => x.StoreCode == taskInfo.StoreCode && x.SpaceCode == taskInfo.SpaceCode).FirstOrDefault();
                        spaceInfo.OnRouteAmount += 1;
                        _baseSpaceInfoServices.UpdateSpaceInfo(spaceInfo);
                        #endregion

                        RefreshDataGridDelegateEvent?.Invoke();//刷新datagrid 列表

                        //    logHelper.Info($"泡后入库任务:{taskInfo.TaskCode};执行完成");
                        // 刷新入库任务列表
                    }
                    else
                    {
                        logHelper.Info($"泡后入库任务:{taskInfo.TaskCode};下发失败,请排除PLC连接");
                    }

                }
                else
                {
                    logHelper.Info("未获取到需要下发的泡后入库任务");
                }
            }
            catch (Exception ex)
            {
                logHelper.Info("下发任务异常");
            }

        }
        /// <summary>
        /// 获取待执行的入库任务
        /// </summary>
        /// <param name="storeCode"></param>
        /// <returns></returns>
        private RealTaskInfo GetAwaitSendTask(string storeCode)
        {
            RealTaskInfo taskInfo = null;

            try
            {
                taskInfo = _realTaskInfoService.Query(x => x.StoreCode == storeCode && x.TaskType == 1 && x.TaskStatus == 1).OrderBy(x => x.CreateTime).FirstOrDefault();

            }
            catch (Exception ex)
            {
                logHelper.Info("获取待执行的入库任务异常", ex);
            }
            return taskInfo;
        }

        #region 入库
        /// <summary>
        /// 入库,扫码器委托触发
        /// </summary>
        /// <param name="storeCode">仓库编号</param>
        /// <param name="materialCode">物料条码</param>
        public async Task InStore(string materialBarCode)
        {
            try
            {
                logHelper.Info($"扫码成功,物料条码:{materialBarCode}");
                LogDelegateEvent?.Invoke($"扫码成功,物料条码:{materialBarCode}");
                var taskList = await _realTaskInfoService.QueryAsync(d => d.MaterialCode.Equals(materialBarCode) && d.StoreCode == storeCode);
                if (taskList.Count() > 0)
                {
                    LogDelegateEvent?.Invoke($"物料条码[{materialBarCode}],任务创建失败,该物料入库任务已存在!");
                    return;
                }
                string materialType = SubString(materialBarCode);//截取中间物料条码

                BaseSpaceInfo spaceInfo = await GetSpaceInfoByMaterialType(storeCode, materialType);
                if (spaceInfo != null)
                {
                    logHelper.Info($"匹配货道:{spaceInfo.ToJson()}");
                    LogDelegateEvent?.Invoke($"匹配货道:{spaceInfo.ToJson()}");

                    string message = $"箱体码[{materialBarCode}], 入{spaceInfo.SpaceName},入库中....";
                    PrintBarCode print = await _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == materialBarCode);
                    RefreshScanMateriaCodeEvent?.Invoke(materialBarCode, materialType, print.MaterialName, spaceInfo.SpaceName, message); //刷新界面扫码信息
                    var result = await CreateInStoreTask(spaceInfo, materialBarCode); //创建入库任务
                    if (result)
                    {
                        #region 更新过点数据    
                        //MaterialCompletion completion = new MaterialCompletion();
                        //completion.OrderCode = print.OrderCode;
                        //completion.MaterialBarcode = materialBarCode;
                        //completion.MaterialCode = print.MaterialCode;
                        //completion.MaterialName = print.MaterialName;
                        //completion.StationName = "1003";
                        //completion.CompleteDate = DateTime.Now;
                        //await _iMaterialCompletionServices.AddAsync(completion);
                        #endregion
                        RefreshDataGridDelegateEvent?.Invoke();
                        await _baseSpaceInfoServices.UpdateSpaceInfo(spaceInfo);
                    }
                }
                else
                {
                    //报警停线
                }
            }
            catch (Exception ex)
            {
                logHelper.Error($"入库业务异常:{ex}");
            }
        }

        #region 创建入库任务
        /// <summary>
        /// 创建入库任务
        /// </summary>
        /// <param name="spaceInfo"></param>
        private async Task<bool> CreateInStoreTask(BaseSpaceInfo spaceInfo, string materialCode)
        {
            bool result = false;
            try
            {
                //生成入库任务依次下发至PLC
                RealTaskInfo realTaskInfo = new RealTaskInfo();
                realTaskInfo.TaskType = 1;
                realTaskInfo.TaskCode = System.Guid.NewGuid().ToString("N").Substring(0, 6);
                realTaskInfo.SpaceName = spaceInfo.SpaceName;
                realTaskInfo.StoreCode = spaceInfo.StoreCode;
                realTaskInfo.SpaceCode = spaceInfo.SpaceCode;
                realTaskInfo.MaterialType = spaceInfo.MaterialType;
                realTaskInfo.MaterialCode = materialCode;
                realTaskInfo.PlanAmount = 1;
                realTaskInfo.TaskStatus = 1; //任务状态:1 - 待执行;2 - 执行中;3 - 完成
                realTaskInfo.CreateTime = DateTime.Now;
                int flag = await _realTaskInfoService.AddAsync(realTaskInfo);
                if (flag > 0)
                {
                    logHelper.Info("入库任务创建成功");
                    LogDelegateEvent?.Invoke($"[{materialCode}]入库任务创建成功");
                    RefreshInStoreTaskEvent?.Invoke(realTaskInfo);//刷新datagrid 列表
                    result = true;
                }
                else
                {
                    logHelper.Info("入库任务创建失败");
                    LogDelegateEvent?.Invoke($"[{materialCode}]入库任务创建失败");
                    result = false;
                }
            }
            catch (Exception ex)
            {
                logHelper.Info($"入库任务创建异常:{ex.Message}");
                result = false;
            }
            return result;
        }

        #endregion


        /// 筛选货道
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="materialType"></param>
        /// <returns></returns>
        private async Task<BaseSpaceInfo> GetSpaceInfoByMaterialType(string storeCode, string materialType)
        {
            BaseSpaceInfo result = null;
            try
            {
                //   List<BaseSpaceInfo> info = _spaceInfoService.GetBaseSpaceInfosByMaterialType(storeCode, materialType);
                List<BaseSpaceInfo> info = await _baseSpaceInfoServices.InStoreGetSpaceInfoByMaterialType(storeCode, materialType);
                if (info != null)
                {
                    if (info.Count > 0)
                    {
                        foreach (BaseSpaceInfo item in info)
                        {
                            var spaceInfo = ReadSpaceInfoByPlc(item);
                            item.SpaceStock = spaceInfo.SpaceStock;
                            // item.OnRouteAmount = spaceInfo.OnRouteAmount;
                            //  item.SpaceStatus = spaceInfo.SpaceStatus;
                        }
                       
                        info = info.Where(x => x.SpaceStatus == 1 &&  x.SpaceCapacity > (x.SpaceStock + x.OnRouteAmount)).ToList();
                        if(info.Count > 0)
                        {
                            result = info.OrderByDescending(x => x.SpaceStock).OrderBy(x => x.SpaceCode).First();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logHelper.Info("货道信息读取异常", ex);
            }

            return result;
        }

        /// <summary>
        /// 通过PLC获取货道信息
        /// </summary>
        /// <param name="spaceInfo"></param>
        /// <returns></returns>
        public BaseSpaceInfo ReadSpaceInfoByPlc(BaseSpaceInfo spaceInfo)
        {

            var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("泡前库Plc"));
            if (obj != null && obj.plc.IsConnected)
            {
                SpaceAddress spaceAddress = spaceConfig.GetSpaceAddress(spaceInfo.StoreCode, spaceInfo.SpaceCode);
                spaceInfo.SpaceStock = obj.plc.ReadInt16(spaceAddress.onStore);
                //  spaceInfo.OnRouteAmount = obj.plc.ReadInt32(spaceAddress.onRoute);
                //   spaceInfo.SpaceStatus = obj.plc.ReadInt32(spaceAddress.spaceStatus);
            }
            return spaceInfo;
        }


        #endregion

        #region 截取物料编码
        public string SubString(string barCode)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(barCode))
            {
                result = barCode.Substring(7, 10);
            }

            return result;
        }
        #endregion


        #region 泡前入库任务下发处理
        public bool SendFoamTask_InStore(RealTaskInfo taskInfo)
        {
            bool result = false;
            try
            {
                SpaceAddress spaceAddress = spaceConfig.GetSpaceAddress(storeCode, taskInfo.SpaceCode);
                var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("泡前库Plc"));
                if (obj != null && obj.plc.IsConnected)
                {
                  
                    //写入应答字
                    obj.plc.WriteInt16("DB200.2", "1");
                    //写入货道物料类型
                    obj.plc.WriteString(spaceAddress.materialType, taskInfo.MaterialType);
                    //写入货道号
                    obj.plc.WriteInt16("DB200.0", taskInfo.SpaceCode.Substring(7,1));
                    //写入完成后读取反馈号进行复位
                    ReadShellAnswer_InStore(taskInfo);
                    result = true;
                }
                else
                {
                    logHelper.Info($"仓库{taskInfo.StoreCode};PLC未连接");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error("泡后入库任务下发异常", ex);
            }
            return result;
        }

        /// <summary>
        /// 读取泡前入库应答
        /// </summary>
        private void ReadShellAnswer_InStore(RealTaskInfo taskInfo)
        {
            lock (string.Empty)
            {
                bool isFlag = true;
                var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("泡前库Plc"));
                try
                {
                    Task.Run(() =>
                    {
                        if (obj != null && obj.plc.IsConnected)
                        {
                            do
                            {
                                //读取PLC反馈号,上位机清空写入的入库内容
                                if (obj.plc.ReadInt16("DB200.86") == 2)
                                {
                                    obj.plc.WriteInt16("DB200.86", "0");
                                    //-------------plc清
                                    //写入货道号
                                    obj.plc.WriteInt16("DB200.0", "0");
                                 //   写入应答字
                                     obj.plc.WriteInt16("DB200.2", "0");
                                    //写入货道物料类型
                                    //  obj.plc.WriteInt16(spaceAddress.materialType, taskInfo.MaterialType);
                                    //----------------------
                                    
                                    isFlag = false;
                                    InStoreAnswer(taskInfo.TaskCode);
                                    //  TaskInfos.Add(taskInfo);
                                    // ReadShellFinish_InStore(taskCode);
                                }
                                Thread.Sleep(500);
                            } while (isFlag);
                        }
                        else
                        {
                            logHelper.Info("PLC未连接");
                        }
                    });
                }
                catch (Exception ex)
                {
                    logHelper.Error("读取泡后入库应答字异常", ex);
                }
            }
        }

      
        /// <summary>
        /// 泡前库执行反馈
        /// </summary>
        private void InStoreAnswer(string taskCode)
        {
            LogDelegateEvent?.Invoke($"泡前库应答成功,自动释放信号量,进行下发新任务");
            logHelper.Info("泡前库应答成功,自动释放信号量,进行下发新任务");
            // InStoreFinish(taskCode);
            semaphore.Release();
        }
        #endregion

        /// <summary>
        /// 入库完成
        /// </summary>
        /// <param name="storeCode"></param>
        /// <param name="spaceCode"></param>
        /// <param name="materialType"></param>
        private async void InStoreFinish(string spaceCode)
        {
            try
            {

                List<RealTaskInfo> tasks = await _realTaskInfoService.QueryAsync(x => x.StoreCode == storeCode && x.SpaceCode == spaceCode && x.TaskStatus == 2);
                RealTaskInfo taskInfo = tasks.OrderBy(x => x.CreateTime).FirstOrDefault();
                if (taskInfo != null)
                {
                    BaseSpaceInfo spaceInfo = await _baseSpaceInfoServices.GetSpaceInfoBySpaceCode(taskInfo.StoreCode, taskInfo.SpaceCode);
                    if (spaceInfo != null)
                    {
                        spaceInfo.MaterialType = taskInfo.MaterialType;
                       
                        //读取PLC获取货道信息:存放数量、在途数量,
                        #region Add By wenjy 2023-10-30 13:44:00 通过PLC获取货道信息
                        var item = ReadSpaceInfoByPlc(spaceInfo);
                        spaceInfo.SpaceStock = item.SpaceStock;
                        // 入库完成,在途减1
                        spaceInfo.OnRouteAmount -= 1;
                        
                        #endregion

                        await _baseSpaceInfoServices.UpdateSpaceInfo(spaceInfo);

                        #region 添加货道明细  不控制出库,暂时未添加明细
                        BaseSpaceDetail spaceDetail = new BaseSpaceDetail();
                        spaceDetail.MaterialType = taskInfo.MaterialType;
                        spaceDetail.MaterialCode = taskInfo.MaterialCode;
                        spaceDetail.MaterialName = await GetMaterialName(taskInfo.MaterialType);
                        spaceDetail.StoreCode = spaceInfo.StoreCode;
                        spaceDetail.SpaceCode = spaceInfo.SpaceCode;
                        spaceDetail.MaterialAmount = 1;
                        //await  _baseSpaceDetailServices.InsertSpaceDetail(spaceDetail);
                        #endregion

                        #region 添加入库记录
                        RecordInStore recordInstore = new RecordInStore();
                        recordInstore.StoreCode = taskInfo.StoreCode;
                        recordInstore.SpaceCode = taskInfo.SpaceCode;
                        recordInstore.MaterialCode = taskInfo.MaterialCode;
                        recordInstore.MaterialType = taskInfo.MaterialType;
                        recordInstore.MaterialName = await GetMaterialName(taskInfo.MaterialType);
                        recordInstore.InStoreAmount = 1;
                        recordInstore.InStoreTime = DateTime.Now;
                        recordInstore.BarCodeCode = taskInfo.MaterialCode;
                        #endregion
                        bool result = await _recordInstoreServices.SaveRecordToDb(recordInstore, taskInfo, spaceInfo, spaceDetail);
                        if (result)
                        {
                            LogDelegateEvent?.Invoke($"入库完成,更新数据库成功");
                        }
                        else
                        {
                            LogDelegateEvent?.Invoke($"更新数据库异常");
                        }
                           
                    }
                    ////清除任务信息
                    //await _realTaskInfoService.DeleteTaskInfo(taskCode, storeCode);
                }

            }
            catch (Exception ex)
            {
                logHelper.Info("入库完成逻辑处理异常", ex);
            }
        }

        /// <summary>
        ///获取物料名称
        /// </summary>
        /// <param name="materialType"></param>
        /// <returns></returns>
        public async Task<string> GetMaterialName(string materialType)
        {
            string materialName = string.Empty;
            BaseMaterialInfo info = await _baseMaterialInfoServices.FirstAsync(x => x.MaterialType == materialType);
            if (info != null)
            {
                materialName = info.MaterialName;
            }
            return materialName;
        }

        #region PLC 任务处理表
        /// <summary>
        ///  PLC 任务处理表
        /// </summary>
        /// <param name="storeCode">仓库编码</param>
        /// <param name="materialBarCode">物料编码</param>
        /// <returns></returns>
        public async Task MaterialEnterStore(string storeCode, string materialBarCode = "B20231082080029650001")
        {
            //扫描入库信号,入库完成
            try
            {
                var taskList = await _realTaskInfoService.QueryAsync(d => d.MaterialType.Equals(materialBarCode) && d.StoreCode == storeCode);
                if (taskList.Count() == 0) return;
                var obj = taskList.FirstOrDefault();
                var mCode = materialBarCode.Substring(7, 10);//物料条码
                //删除任务表、更新货道、添加入库明细、添加入库记录
                var planInfoList = await _productPlanInfoServices.QueryAsync(d => d.MaterialCode.Equals(mCode));//计划
                if (planInfoList.Count() == 0)
                {
                    logHelper.Error($"物料计划信息为空!");
                    return;
                }
                var baseStoreInfolist = await _baseStoreInfoServices.QueryAsync(d => d.StoreCode.Equals(obj.StoreCode));//仓库
                if (baseStoreInfolist.Count() == 0)
                {
                    logHelper.Error($"仓库信息为空!");
                    return;
                }
                var baseSpacelist = await _baseSpaceInfoServices.QueryAsync(d => d.SpaceCode.Equals(obj.SpaceCode));
                if (taskList.Count() == 0)
                {
                    LogDelegateEvent?.Invoke($"物料[{materialBarCode}],入库记录条码重复异常!");
                    logHelper.Error($"货道信息为空!");
                    return;
                }
                var baseSpaceDetailList = await _baseSpaceDetailServices.QueryAsync(d => d.MaterialCode.Equals(obj.MaterialCode));//货到详情
                if (baseSpaceDetailList.Count() != 0)
                {
                    logHelper.Error($"货到信息存在重复物料!");
                    return;
                }
                var baseSpace = baseSpacelist.FirstOrDefault();
                var planInfo = planInfoList.FirstOrDefault();
                var baseStoreInfo = baseStoreInfolist.FirstOrDefault();

                baseSpace.SpaceStock = baseSpace.SpaceStock + 1;
                baseSpace.OnRouteAmount = 0;
                //入库记录表
                RecordInStore recordInstore = new RecordInStore();
                recordInstore.StoreCode = storeCode;
                recordInstore.StoreArea = baseStoreInfo.StoreArea;
                recordInstore.SpaceCode = baseSpace.SpaceCode;
                recordInstore.MaterialType = baseSpace.MaterialType;
                recordInstore.MaterialCode = mCode;
                recordInstore.InStoreTime = DateTime.Now;
                recordInstore.BarCodeCode = materialBarCode;
                recordInstore.MaterialName = planInfo.MaterialName;
                recordInstore.EntryPattern = 0;
                recordInstore.IsFlag = 0;
                recordInstore.CreatedTime = DateTime.Now;
                //入库详情表
                BaseSpaceDetail baseDetail = new BaseSpaceDetail();
                baseDetail.StoreCode = storeCode;
                baseDetail.SpaceCode = baseSpace.SpaceCode;
                baseDetail.MaterialCode = materialBarCode;
                baseDetail.MaterialName = planInfo.MaterialName;
                baseDetail.MaterialAmount = 1;
                baseDetail.CreatedTime = DateTime.Now;

                bool result = await _recordInstoreServices.SaveRecordToDb(recordInstore, obj, baseSpace, baseDetail);
                if (result)
                {
                    string message = $"物料[{planInfo.MaterialName}], 入{baseSpace.SpaceName},入库成功!";
                    RefreshScanMateriaCodeEvent?.Invoke(obj.MaterialCode, materialBarCode, planInfo.MaterialName, baseSpace.SpaceName, message); //刷新界面扫码信息
                    LogDelegateEvent?.Invoke($"物料[{planInfo.MaterialName}], 入库[{baseSpace.SpaceName}]成功!");
                    RefreshDataGridDelegateEvent?.Invoke();
                }
                else
                {
                    LogDelegateEvent?.Invoke($"物料[{planInfo.MaterialName}], 入库[{baseSpace.SpaceName}]失败,任务回滚!");
                    logHelper.Error($"物料[{planInfo.MaterialName}], 入库[{baseSpace.SpaceName}]失败,任务回滚!");
                }
            }
            catch (Exception ex)
            {
                logHelper.Error($"入库数据处理异常:{ex.Message}");
            }
        }

        #endregion
 
}
}