using Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using WebRepository;

namespace WebApp
{
    /// <summary>
    /// 入库单主表
    /// </summary>

    public partial class ReceiptHeaderApp
    {
        private IUnitWork _unitWork;
        public IRepository<ReceiptHeader> _app;
        public IRepository<Inventory> _appi;
        public IRepository<Location> _appl;
        public IRepository<TaskDetail> _apptd;
        public IRepository<Task> _appt;
        public IRepository<ReceiptDetail> _apprd;
        private BaseDBContext _context;
        private static IHostingEnvironment _hostingEnvironment;
        ExcelHelper imp = new ExcelHelper(_hostingEnvironment);

        public ReceiptHeaderApp(IUnitWork unitWork, BaseDBContext context, IRepository<Task> task, IRepository<Inventory> inventory, IRepository<Location> location, IRepository<TaskDetail> taskDetail, IRepository<ReceiptDetail> receiptDetail, IRepository<ReceiptHeader> repository, IHostingEnvironment hostingEnvironment)
        {
            _unitWork = unitWork;
            _app = repository;
            _appi = inventory;
            _appl = location;
            _apptd = taskDetail;
            _apprd = receiptDetail;
            _appt = task;
            _context = context;
            _hostingEnvironment = hostingEnvironment;
        }

        public ReceiptHeaderApp SetLoginInfo(LoginInfo loginInfo)
        {
            _app._loginInfo = loginInfo;
            _appi._loginInfo = loginInfo;
            _appl._loginInfo = loginInfo;
            _apptd._loginInfo = loginInfo;
            _apprd._loginInfo = loginInfo;
            _appt._loginInfo = loginInfo;
            return this;
        }

        public TableData Load(PageReq pageRequest, ReceiptHeader entity)
        {
            return _app.Load(pageRequest, entity);
        }

        public void Ins(ReceiptHeader entity)
        {
            entity.TotalQty = 0;
            entity.TotalLines = 0;
            entity.UploadStatus = 0;
            entity.FirstStatus = ReceiptHeaderStatus.新建;
            entity.LastStatus = ReceiptHeaderStatus.新建;
            entity.Station = entity.Station ?? "";

            entity.Code = _app.GetTaskNo(entity.Type);
            entity.SupplierName = _unitWork.FindSingle<Supplier>(u => u.Code.Equals(entity.SupplierCode)).Name;

            _app.Add(entity);
        }

        public void Upd(ReceiptHeader entity)
        {
            if (entity.FirstStatus != ReceiptHeaderStatus.新建 || entity.LastStatus != ReceiptHeaderStatus.新建)
            {
                throw new Exception("当前状态不可编辑!Id: " + entity.Id);
            }
            entity.Station = entity.Station ?? "";
            _app.Update(entity);
        }

        public void DelByIds(int[] ids)
        {
            foreach (var item in ids)
            {
                ReceiptHeader entity = _app.FindSingle(u => u.Id == item);
                if (entity.FirstStatus != ReceiptHeaderStatus.新建 || entity.LastStatus != ReceiptHeaderStatus.新建)
                {
                    throw new Exception("订单号:" + entity.Code + "进入订单池后,不允许删除");
                }
                _unitWork.Delete<ReceiptDetail>(u => u.ReceiptId.Equals(entity.Id));
                _app.Delete(entity);
            }
        }

        public ReceiptHeader FindSingle(Expression<Func<ReceiptHeader, bool>> exp)
        {
            return _app.FindSingle(exp);
        }

        public IQueryable<ReceiptHeader> Find(Expression<Func<ReceiptHeader, bool>> exp)
        {
            return _app.Find(exp);
        }

        public Response ImportIn(IFormFile excelfile)
        {
            Response result = new Infrastructure.Response();
            List<ReceiptHeader> exp = imp.ConvertToModel<ReceiptHeader>(excelfile);
            string sErrorMsg = "";

            for (int i = 0; i < exp.Count; i++)
            {
                try
                {
                    ReceiptHeader e = exp[i];
                    e.Id = null;
                    _app.Add(e);
                }
                catch (Exception ex)
                {
                    sErrorMsg += "第" + (i + 2) + "行:" + ex.Message + "<br>";
                    result.Message = sErrorMsg;
                    break;
                }
            }
            if (sErrorMsg.Equals(string.Empty))
            {
                if (exp.Count == 0)
                {
                    sErrorMsg += "没有发现有效数据, 请确定模板是否正确, 或是否有填充数据!";
                    result.Message = sErrorMsg;
                }
                else
                {
                    result.Message = "导入完成";
                }
            }
            else
            {
                result.Status = false;
                result.Message = result.Message;
            }
            return result;
        }

        public TableData ExportData(ReceiptHeader entity)
        {
            return _app.ExportData(entity);
        }

        public TableData Query(ReceiptHeader entity)
        {
            var result = new TableData();
            var data = _app.Find(EntityToExpression<ReceiptHeader>.GetExpressions(entity));

            GetData(data, result);
            result.count = data.Count();

            return result;
        }

        public void GetData(IQueryable<ReceiptHeader> data, TableData result, PageReq pageRequest = null)
        {
            _app.GetData(data, result, pageRequest);
        }

        public TableData FinishMaterialApp(TaskDetail taskDel)
        {
            TableData tab = new TableData();
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    TaskDetail task = _unitWork.Find<TaskDetail>(n => n.ContainerCode == taskDel.ContainerCode && n.TaskNo == n.TaskNo && (n.Status == TaskStatus.已经到站台 || n.Status == TaskStatus.放货中) && n.Id == taskDel.Id).FirstOrDefault();
                    if (task != null)
                    {
                        task.HadQty += taskDel.HadQty;
                        task.UpdateBy = _app._loginInfo.Name;
                        if (task.HadQty < task.OderQty)
                        {
                            task.Status = TaskStatus.放货中;
                            _apptd.Update(task);
                            tab.code = 200;
                        }
                        else if (task.HadQty == task.OderQty)
                        {
                            task.Status = TaskStatus.放取货完成;
                            _apptd.Update(task);
                            tab.code = 200;
                        }
                        else
                        {
                            tab.code = 300;
                            tab.msg = "物料数量大于托盘分配数量";
                        }
                        Task Task = _unitWork.Find<Task>(n => n.TaskNo == taskDel.TaskNo).FirstOrDefault();
                        List<TaskDetail> tasks = _unitWork.Find<TaskDetail>(n => n.TaskNo == task.TaskNo).OrderByDescending(x => x.Status).ToList();
                        Task.FirstStatus = tasks.First().Status;
                        Task.LastStatus = tasks.Last().Status;
                        _appt.Update(Task);
                    }
                    else
                    {
                        tab.code = 300;
                        tab.msg = "未找到该任务明细";
                    }
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    tab.code = 300;
                    tab.msg = ex.Message;
                }
            }
            return tab;

        }

        public TableData GetPrintDetailData(string rpno)
        {
            var result = new TableData();
            var data = from rd in _unitWork.Find<ReceiptDetail>(u => u.ReceiptCode == rpno)
                       join mt in _unitWork.Find<Material>(null)
                       on rd.MaterialCode equals mt.Code
                       select new
                       {
                           rd.MaterialCode,
                           mt.Name,
                           rd.Batch,
                           rd.Lot,
                           rd.Qty,
                           PBarCode = rd.MaterialCode,
                       };
            result.data = data.ToList();
            result.count = data.Count();

            if (result.count == 0)
            {
                result.msg = "还未建立明细数据!";
            }
            return result;
        }

        public TableData AutoReceiptApp(List<ReceiptHeader> receiptHeaders)
        {
            TableData tab = new TableData();
            tab.code = 200;
            int dcount = 0;
            int hcount = 0;
            try
            {
                List<ReceiptDetail> receiptDetails = new List<ReceiptDetail>();
                foreach (ReceiptHeader receiptHeader in receiptHeaders)
                {
                    receiptDetails = _unitWork.Find<ReceiptDetail>(n => n.ReceiptCode == receiptHeader.Code && n.Status == ReceiptHeaderStatus.新建).ToList();
                    if (receiptDetails.Count != 0)
                    {
                        string str = "";
                        foreach (ReceiptDetail r in receiptDetails)
                        {
                            str = AddTaskInfo(r);
                            //添加任务和明细
                            if (str == "")
                            {
                                r.Status = ReceiptHeaderStatus.分配完成;
                                r.QtyDivided = r.Qty;
                                _apprd.Update(r);
                                dcount = dcount + 1;
                            }
                            else
                            {
                                tab.code = 300;
                                tab.msg += "单号:"+ r.ReceiptCode + "物料号:" + r.MaterialCode + ": " + str + "<br>";
                            }
                        }
                        hcount += receiptDetails.Count;
                        List<ReceiptDetail> listreceiptDetail = _unitWork.Find<ReceiptDetail>(n => n.ReceiptCode == receiptHeader.Code).OrderByDescending(x => x.Status).ToList();
                        receiptHeader.FirstStatus = (short)listreceiptDetail.First().Status;
                        receiptHeader.LastStatus = (short)listreceiptDetail.Last().Status;
                        _app.Update(receiptHeader);
                    }
                }

                if (hcount == dcount)
                {
                    tab.code = 200;
                    tab.msg = dcount + "条订单分配完成!";
                }
                else
                {
                    tab.code = 300;
                    tab.msg += (receiptDetails.Count - dcount) + "条订单分配失败!";
                }
            }
            catch (Exception ex)
            {
                tab.code = 300;
                tab.msg += ex.Message;
            }
            return tab;
        }

        //添加任务
        public string AddTaskInfo(ReceiptDetail receiptDetail)
        {
            string str = "";
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    ReceiptHeader receiptHeader = _unitWork.Find<ReceiptHeader>(n => n.Code == receiptDetail.ReceiptCode).FirstOrDefault();
                    Task task = new Task();
                    TaskDetail taskDetail = new TaskDetail();
                    var tno = "";
                    int tcount = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Count();
                    if (tcount > 0)
                    {
                        var tasknum = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Select(a => a.TaskNo).First();
                        tno = tasknum;
                    }
                    else
                    {
                        tno = _app.GetTaskNo(TaskNo.入库自动分配);
                        task.TaskNo = tno;
                        task.SourceCode = receiptDetail.SourceCode;
                        task.OrderCode = receiptDetail.ReceiptCode;
                        task.BusinessType = receiptHeader.Type;
                        task.TotalQty = receiptHeader.TotalQty;
                        task.TotalLines = receiptHeader.TotalLines;
                        task.FirstStatus = TaskStatus.待下发任务;
                        task.LastStatus = TaskStatus.待下发任务;
                        task.Project = receiptDetail.Project;
                        _appt.Add(task);
                    }

                    Inventory inv = (from inventory in _unitWork.Find<Inventory>(n => n.MaterialCode == receiptDetail.MaterialCode && n.ContainerStatus != ContainerStatus.满 && n.WarehouseType == receiptHeader.WarehouseType && n.TaskStatus == "idle")
                                     join container in _unitWork.Find<Container>(x => x.IsLock == 0)
                                     on inventory.ContainerCode equals container.Code
                                     select inventory).FirstOrDefault();
                    var sqty = receiptDetail.Qty;
                    if (inv != null)
                    {
                        taskDetail.TaskType = TaskType.补充入库;
                        taskDetail.ContainerQty = sqty;
                        taskDetail.TaskNo = tno;
                        taskDetail.SourceCode = receiptDetail.SourceCode;
                        taskDetail.OrderCode = receiptDetail.ReceiptCode;
                        taskDetail.ContainerCode = inv.ContainerCode;

                        taskDetail.MaterialCode = receiptDetail.MaterialCode;
                        taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).First();
                        taskDetail.Batch = receiptDetail.Batch;
                        taskDetail.Lot = receiptDetail.Lot;
                        taskDetail.OderQty = receiptDetail.Qty;
                        if (receiptDetail.Station != null && receiptDetail.Station != "")
                        {
                            taskDetail.Station = receiptDetail.Station;
                        }else if (receiptHeader.Station != null && receiptHeader.Station != "")
                        {
                            taskDetail.Station = receiptHeader.Station;
                        }

                        taskDetail.HadQty = 0;
                        Location loc = _unitWork.Find<Location>(n => n.Code == inv.LocationCode && n.IsStop == false).First();
                        if (loc != null)
                        {
                            taskDetail.SourceLocation = loc.Code;
                            taskDetail.DestinationLocation = receiptDetail.Station;
                            taskDetail.Roadway = _unitWork.Find<Location>(n => n.Code == inv.LocationCode && n.IsStop == false).Select(a => a.Roadway).First();
                        }
                        else
                        {
                            taskDetail.Roadway = 0;
                        }
                        taskDetail.Priority = 0;
                        taskDetail.Status = TaskStatus.待下发任务;
                        _apptd.Add(taskDetail);
                    }
                    else
                    {
                        Location location = _unitWork.Find<Location>(n => n.Type == receiptHeader.WarehouseType && n.Status == LocationStatus.空容器 && n.IsStop == false).FirstOrDefault();
                        if (location != null)
                        {
                            taskDetail.TaskType = TaskType.整盘入库;
                            taskDetail.ContainerQty = sqty;
                            taskDetail.TaskNo = tno;
                            taskDetail.SourceCode = receiptDetail.SourceCode;
                            taskDetail.OrderCode = receiptDetail.ReceiptCode;
                            taskDetail.ContainerCode = location.ContainerCode;
                            taskDetail.MaterialCode = receiptDetail.MaterialCode;
                            taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).First();
                            taskDetail.Batch = receiptDetail.Batch;
                            taskDetail.Lot = receiptDetail.Lot;
                            taskDetail.OderQty = receiptDetail.Qty;
                            taskDetail.HadQty = 0;
                            taskDetail.SourceLocation = location.Code;
                            taskDetail.DestinationLocation = receiptDetail.Station;
                            taskDetail.Roadway = location.Roadway;
                            taskDetail.Priority = 0;
                            if (receiptDetail.Station != null && receiptDetail.Station != "")
                            {
                                taskDetail.Station = receiptDetail.Station;
                            }
                            else if (receiptHeader.Station != null && receiptHeader.Station != "")
                            {
                                taskDetail.Station = receiptHeader.Station;
                            }
                            taskDetail.Status = TaskStatus.待下发任务;
                            _apptd.Add(taskDetail);
                            location.Status = LocationStatus.入库占用;
                            _appl.Update(location);

                            location.Status = LocationStatus.任务锁定中;
                            _appl.Update(location);
                        }
                        else
                        {
                            Inventory invOther = (from inventory in _unitWork.Find<Inventory>(n => n.ContainerStatus != ContainerStatus.满 && n.WarehouseType == receiptHeader.WarehouseType && n.TaskStatus == "idle")
                                                  join container in _unitWork.Find<Container>(x => x.IsLock == 0)
                                                  on inventory.ContainerCode equals container.Code
                                                  select inventory).FirstOrDefault();
                            if (invOther != null)
                            {
                                taskDetail.TaskType = TaskType.补充入库;
                                taskDetail.ContainerQty = sqty;
                                taskDetail.TaskNo = tno;
                                taskDetail.SourceCode = receiptDetail.SourceCode;
                                taskDetail.OrderCode = receiptDetail.ReceiptCode;
                                taskDetail.ContainerCode = invOther.ContainerCode;

                                taskDetail.MaterialCode = receiptDetail.MaterialCode;
                                taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).First();
                                taskDetail.Batch = receiptDetail.Batch;
                                taskDetail.Lot = receiptDetail.Lot;
                                taskDetail.OderQty = receiptDetail.Qty;
                                if (receiptDetail.Station != null && receiptDetail.Station != "")
                                {
                                    taskDetail.Station = receiptDetail.Station;
                                }
                                else if (receiptHeader.Station != null && receiptHeader.Station != "")
                                {
                                    taskDetail.Station = receiptHeader.Station;
                                }
                                taskDetail.HadQty = 0;
                                Location loc = _unitWork.Find<Location>(n => n.Code == invOther.LocationCode && n.IsStop == false).First();
                                if (loc != null)
                                {
                                    taskDetail.SourceLocation = loc.Code;
                                    taskDetail.DestinationLocation = receiptDetail.Station;
                                    taskDetail.Roadway = _unitWork.Find<Location>(n => n.Code == invOther.LocationCode && n.IsStop == false).Select(a => a.Roadway).First();
                                }
                                else
                                {
                                    taskDetail.Roadway = 0;
                                }
                                taskDetail.Priority = 0;
                                taskDetail.Status = TaskStatus.待下发任务;
                                _apptd.Add(taskDetail);
                            }
                            else
                            {
                                str = "未能找到仓位!";
                                return str;
                            }
                        }
                    }

                    //建立容器出库任务
                    if (_unitWork.IsExist<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.MaterialCode == receiptDetail.MaterialCode && n.OrderCode == receiptDetail.ReceiptCode))
                    {
                        int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == taskDetail.ContainerCode && n.TaskType == TaskType.容器出库).Count();
                        if (ptdcount < 1)
                        {
                            Task ptask = new Task();
                            TaskDetail ptaskDetail = new TaskDetail();
                            var taskNo = _app.GetTaskNo(TaskNo.容器出库);
                            ptask.TaskNo = taskNo;
                            ptask.OrderCode = taskNo;
                            ptask.BusinessType = BusinessType.出库_其他出库单;
                            ptask.FirstStatus = TaskStatus.待下发任务;
                            ptask.LastStatus = TaskStatus.待下发任务;
                            _appt.Add(ptask);

                            ptaskDetail.TaskNo = taskNo;
                            ptaskDetail.OrderCode = taskNo;
                            ptaskDetail.TaskType = TaskType.容器出库;
                            ptaskDetail.ContainerCode = taskDetail.ContainerCode;
                            ptaskDetail.SourceLocation = taskDetail.SourceLocation;
                            ptaskDetail.DestinationLocation = receiptDetail.Station;
                            ptaskDetail.OderQty = 0;
                            ptaskDetail.ContainerQty = 0;
                            ptaskDetail.HadQty = 0;
                            ptaskDetail.Roadway = taskDetail.Roadway;
                            ptaskDetail.Station = taskDetail.Station;
                            ptaskDetail.Status = TaskStatus.待下发任务;
                            if (taskDetail.Priority != null)
                            {
                                ptaskDetail.Priority = taskDetail.Priority;
                            }
                            else
                            {
                                ptaskDetail.Priority = 0;
                            }
                            _apptd.Add(ptaskDetail);
                        }
                    }

                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    str = ex.Message;
                    return str;
                }
            }

            return str;
        }

        //手动添加入库栈板(组板)
        public TableData HandDivide_InventoryApp(ReceiptDetail r, Inventory inventory,int num)
        {
            TableData tab = new TableData();
            tab.code = 200;
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    ReceiptDetail receiptDetail = _unitWork.Find<ReceiptDetail>(n => n.Id == r.Id).FirstOrDefault();
                    ReceiptHeader receiptHeader = _unitWork.Find<ReceiptHeader>(n => n.Code == receiptDetail.ReceiptCode).FirstOrDefault();
                    Inventory inv = _unitWork.Find<Inventory>(n => n.Id == inventory.Id && n.TaskStatus == "idle").FirstOrDefault();
                    Task task = new Task();
                    TaskDetail taskDetail = new TaskDetail();
                    var tno = "";
                    int tcount = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Count();
                    if (tcount > 0)
                    {
                        var tasknum = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Select(a => a.TaskNo).First();
                        tno = tasknum;
                    }
                    else
                    {
                        tno = _app.GetTaskNo(TaskNo.入库手动分配);
                        task.TaskNo = tno;
                        task.SourceCode = receiptDetail.SourceCode;
                        task.OrderCode = receiptDetail.ReceiptCode;
                        task.BusinessType = receiptHeader.Type;
                        task.TotalQty = receiptHeader.TotalQty;
                        task.TotalLines = receiptHeader.TotalLines;
                        task.FirstStatus = TaskStatus.待下发任务;
                        task.LastStatus = TaskStatus.待下发任务;
                        task.Project = receiptDetail.Project;
                        _appt.Add(task);
                    }

                    if (inv != null)
                    {
                        //任务明细状态更新
                        taskDetail.TaskType = TaskType.补充入库;
                        taskDetail.ContainerQty = num;
                        taskDetail.TaskNo = tno;
                        taskDetail.SourceCode = receiptDetail.SourceCode;
                        taskDetail.OrderCode = receiptDetail.ReceiptCode;
                        taskDetail.ContainerCode = inv.ContainerCode;

                        taskDetail.MaterialCode = receiptDetail.MaterialCode;
                        taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).FirstOrDefault();
                        taskDetail.Batch = receiptDetail.Batch;
                        taskDetail.Lot = receiptDetail.Lot;
                        taskDetail.OderQty = num;
                        if (receiptDetail.Station != null && receiptDetail.Station != "")
                        {
                            taskDetail.Station = receiptDetail.Station;
                        }
                        else if (receiptHeader.Station != null && receiptHeader.Station != "")
                        {
                            taskDetail.Station = receiptHeader.Station;
                        }
                        taskDetail.HadQty = 0;
                        Location loc = _unitWork.Find<Location>(n => n.Code == inv.LocationCode && n.IsStop == false).FirstOrDefault();
                        taskDetail.SourceLocation = loc.Code;
                        taskDetail.DestinationLocation = receiptDetail.Station;
                        taskDetail.Roadway = _unitWork.Find<Location>(n => n.Code == inv.LocationCode && n.IsStop == false).Select(a => a.Roadway).First();;
                        taskDetail.Priority = 0;
                        taskDetail.Status = TaskStatus.待下发任务;
                        _apptd.Add(taskDetail);
                        //入库明细状态更新
                        receiptDetail.Status = ReceiptHeaderStatus.分配完成;
                        receiptDetail.QtyDivided += num;
                        _apprd.Update(receiptDetail);
                        List<ReceiptDetail> receiptDetails = _unitWork.Find<ReceiptDetail>(n => n.ReceiptCode == receiptHeader.Code).OrderByDescending(x => x.Status).ToList();
                        receiptHeader.FirstStatus = (short)receiptDetails.First().Status;
                        receiptHeader.LastStatus = (short)receiptDetails.Last().Status;
                        tab.msg = "分配成功";
                        _app.Update(receiptHeader);

                        //建立容器出库任务
                        if (_unitWork.IsExist<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.MaterialCode == receiptDetail.MaterialCode && n.OrderCode == receiptDetail.ReceiptCode))
                        {
                            int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == taskDetail.ContainerCode && n.TaskType == TaskType.容器出库).Count();
                            if (ptdcount < 1)
                            {
                                Task ptask = new Task();
                                TaskDetail ptaskDetail = new TaskDetail();
                                var taskNo = _app.GetTaskNo(TaskNo.容器出库);
                                ptask.TaskNo = taskNo;
                                ptask.OrderCode = taskNo;
                                ptask.BusinessType = BusinessType.出库_其他出库单;
                                ptask.FirstStatus = TaskStatus.待下发任务;
                                ptask.LastStatus = TaskStatus.待下发任务;
                                _appt.Add(ptask);

                                ptaskDetail.TaskNo = taskNo;
                                ptaskDetail.OrderCode = taskNo;
                                ptaskDetail.TaskType = TaskType.容器出库;
                                ptaskDetail.ContainerCode = taskDetail.ContainerCode;
                                ptaskDetail.SourceLocation = taskDetail.SourceLocation;
                                ptaskDetail.DestinationLocation = receiptDetail.Station;
                                ptaskDetail.OderQty = 0;
                                ptaskDetail.ContainerQty = 0;
                                ptaskDetail.HadQty = 0;
                                ptaskDetail.Roadway = taskDetail.Roadway;
                                ptaskDetail.Station = taskDetail.Station;
                                ptaskDetail.Status = TaskStatus.待下发任务;
                                if (taskDetail.Priority != null)
                                {
                                    ptaskDetail.Priority = taskDetail.Priority;
                                }
                                else
                                {
                                    ptaskDetail.Priority = 0;
                                }
                                _apptd.Add(ptaskDetail);
                            }
                        }
                    }

                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    tab.code = 300;
                    tab.msg += ex.Message;
                }
            }
            return tab;
        }

        //手动添加入库栈板(空板)
        public TableData HandDivide_LocationApp(ReceiptDetail r, Location loc, int num)
        {
            TableData tab = new TableData();
            tab.code = 200;
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    //任务明细状态更新
                    ReceiptDetail receiptDetail = _unitWork.Find<ReceiptDetail>(n => n.Id == r.Id).FirstOrDefault();
                    ReceiptHeader receiptHeader = _unitWork.Find<ReceiptHeader>(n => n.Code == receiptDetail.ReceiptCode).FirstOrDefault();
                    Location location = _unitWork.Find<Location>(n => n.Id == loc.Id && n.IsStop == false).FirstOrDefault();
                    Task task = new Task();
                    TaskDetail taskDetail = new TaskDetail();
                    var tno = "";
                    int tcount = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Count();
                    var  ma = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Count();
                    if (ma < 1) {
                        tab.code = 300;
                        tab.msg = "没有"+ receiptDetail.MaterialCode + "此物料,请先添加物料";
                        return tab;
                    }
                    if (tcount > 0)
                    {
                        var tasknum = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Select(a => a.TaskNo).First();
                        tno = tasknum;
                    }
                    else
                    {
                        tno = _app.GetTaskNo(TaskNo.入库手动分配);
                        task.TaskNo = tno;
                        task.SourceCode = receiptDetail.SourceCode;
                        task.OrderCode = receiptDetail.ReceiptCode;
                        task.BusinessType = receiptHeader.Type;
                        task.TotalQty = receiptHeader.TotalQty;
                        task.TotalLines = receiptHeader.TotalLines;
                        task.FirstStatus = TaskStatus.待下发任务;
                        task.LastStatus = TaskStatus.待下发任务;
                        task.Project = receiptDetail.Project;
                        _appt.Add(task);
                    }

                    if (location != null)
                    {
                        taskDetail.TaskType = TaskType.整盘入库;
                        taskDetail.ContainerQty = num;
                        taskDetail.TaskNo = tno;
                        taskDetail.SourceCode = receiptDetail.SourceCode;
                        taskDetail.OrderCode = receiptDetail.ReceiptCode;
                        taskDetail.ContainerCode = location.ContainerCode;
                        taskDetail.MaterialCode = receiptDetail.MaterialCode;
                        taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).First();
                        taskDetail.Batch = receiptDetail.Batch;
                        taskDetail.Lot = receiptDetail.Lot;
                        taskDetail.OderQty = num;
                        taskDetail.HadQty = 0;
                        taskDetail.SourceLocation = location.Code;
                        taskDetail.DestinationLocation = receiptDetail.Station;
                        taskDetail.Roadway = location.Roadway;
                        taskDetail.Priority = 0;
                        if (receiptDetail.Station != null && receiptDetail.Station != "")
                        {
                            taskDetail.Station = receiptDetail.Station;
                        }
                        else if (receiptHeader.Station != null && receiptHeader.Station != "")
                        {
                            taskDetail.Station = receiptHeader.Station;
                        }
                        taskDetail.Status = TaskStatus.待下发任务;
                        _apptd.Add(taskDetail);
                        receiptDetail.Status = ReceiptHeaderStatus.分配完成;
                        receiptDetail.QtyDivided += num;
                        _apprd.Update(receiptDetail);
                        List<ReceiptDetail> receiptDetails = _unitWork.Find<ReceiptDetail>(n => n.ReceiptCode == receiptHeader.Code).OrderByDescending(x => x.Status).ToList();
                        receiptHeader.FirstStatus = (short)receiptDetails.First().Status;
                        receiptHeader.LastStatus = (short)receiptDetails.Last().Status;
                        _app.Update(receiptHeader);
                        location.Status = LocationStatus.入库占用;
                        _appl.Update(location);
                        tab.msg = "分配成功";

                        //建立容器出库任务
                        if (_unitWork.IsExist<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.MaterialCode == receiptDetail.MaterialCode && n.OrderCode == receiptDetail.ReceiptCode))
                        {
                            int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == taskDetail.ContainerCode && n.TaskType == TaskType.容器出库).Count();
                            if (ptdcount < 1)
                            {
                                Task ptask = new Task();
                                TaskDetail ptaskDetail = new TaskDetail();
                                var taskNo = _app.GetTaskNo(TaskNo.容器出库);
                                ptask.TaskNo = taskNo;
                                ptask.OrderCode = taskNo;
                                ptask.BusinessType = BusinessType.出库_其他出库单;
                                ptask.FirstStatus = TaskStatus.待下发任务;
                                ptask.LastStatus = TaskStatus.待下发任务;
                                _appt.Add(ptask);

                                ptaskDetail.TaskNo = taskNo;
                                ptaskDetail.OrderCode = taskNo;
                                ptaskDetail.TaskType = TaskType.容器出库;
                                ptaskDetail.ContainerCode = taskDetail.ContainerCode;
                                ptaskDetail.SourceLocation = receiptDetail.Station; ;
                                ptaskDetail.DestinationLocation = taskDetail.DestinationLocation;
                                ptaskDetail.OderQty = 0;
                                ptaskDetail.ContainerQty = 0;
                                ptaskDetail.HadQty = 0;
                                ptaskDetail.Roadway = taskDetail.Roadway;
                                ptaskDetail.Station = taskDetail.Station;
                                ptaskDetail.Status = TaskStatus.待下发任务;
                                if (taskDetail.Priority != null)
                                {
                                    ptaskDetail.Priority = taskDetail.Priority;
                                }
                                else
                                {
                                    ptaskDetail.Priority = 0;
                                }
                                _apptd.Add(ptaskDetail);
                            }
                        }
                    }
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    tab.code = 300;
                    tab.msg += ex.Message;
                }
            }
            return tab;
        }

        //查询类型为1和6,只允许出的站台
        public TableData LoadStation(List<Inventory> list)
        {
            TableData result = new TableData();
            result.code = 200;
            var s = list.GroupBy(n => n.LocationCode.Substring(0,2)).FirstOrDefault();
            int count = list.GroupBy(n => n.LocationCode.Substring(0, 2)).Count();
            if (count > 1)
            {
                result.code = 300;
                return result;
            }
            int? roadway = _unitWork.Find<Location>(n => n.Code == list.First().LocationCode).Select(a => a.Roadway).FirstOrDefault();
            List<Station> StationLoad = null;
            if (roadway == null)
            {
                StationLoad = (from stat in _unitWork.Find<Station>(n => (n.Type == 1 || n.Type == 6) && n.IsStop != 1 && n.IsOut == 1)
                                             join statto in _unitWork.Find<StationToStation>(a => a.StartStation == list.First().LocationCode)
                                             on stat.Code equals statto.EndStation
                                             select stat).ToList();
                result.count = StationLoad.Count();
            }
            else
            {
                StationLoad = (from stat in _unitWork.Find<Station>(n => (n.Type == 1 || n.Type == 6) && n.IsStop != 1 && n.IsOut == 1)
                                             join statrow in _unitWork.Find<StationRoadway>(a => a.RoadWay == roadway)
                                             on stat.Code equals statrow.StationCode
                                             select stat).ToList();
                result.count = StationLoad.Count();
            }

            result.data = StationLoad;
            return result;
        }

        //查询类型为1,只允许出的站台
        public TableData LoadStationOne()
        {
            TableData tab = new TableData();
            tab.code = 200;
            List<Station> StationLoad = _unitWork.Find<Station>(n => n.Type == 1 && n.IsStop != 1 && n.IsOut == 1 ).ToList();
            tab.data = StationLoad;
            tab.count = StationLoad.Count();
            return tab;
        }

        //通过起始站台请求终点站台
        public TableData StartStationEnd(string StartStation)
        {
            TableData tab = new TableData();
            tab.code = 200;
            try
            {
                List<Station> EndStation = (from station in _unitWork.Find<Station>(null)
                                                     join sts in _unitWork.Find<StationToStation>(n => n.StartStation == StartStation)
                                                     on station.Code equals sts.EndStation
                                                     select station).ToList();
                tab.data = EndStation;
            }
            catch (Exception ex)
            {
                tab.code = 500;
                tab.msg = ex.Message;
            }
            return tab;
        }

        //添加手动入库任务并选站台
        public TableData AddReceiptTaskApp(string station, List<ReceiptDetail> receiptDels)
        {
            TableData tab = new TableData();
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    string str = "";
                    foreach (ReceiptDetail r in receiptDels)
                    {
                       str = CreateTask(r, station);
                        if (!string.IsNullOrEmpty(str))
                        {
                            throw new Exception(str);
                        }
                    }
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    tab.code = 500;
                    tab.msg = ex.Message;
                }
                return tab;
            }
        }

        //手动入库
        public string CreateTask(ReceiptDetail r, string station)
        {
            string str = "";
                try
                {
                    ReceiptDetail receiptDetail = _unitWork.Find<ReceiptDetail>(n => n.Id == r.Id).FirstOrDefault();
                    ReceiptHeader receiptHeader = _unitWork.Find<ReceiptHeader>(n => n.Code == receiptDetail.ReceiptCode).FirstOrDefault();
                    Task task = new Task();
                    TaskDetail taskDetail = new TaskDetail();
                    var tno = "";
                    int tcount = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Count();
                    if (tcount > 0)
                    {
                        var tasknum = _unitWork.Find<Task>(n => n.OrderCode == receiptDetail.ReceiptCode).Select(a => a.TaskNo).First();
                        tno = tasknum;
                    }
                    else
                    {
                        tno = _app.GetTaskNo(TaskNo.入库手动分配);
                        task.TaskNo = tno;
                        task.SourceCode = receiptDetail.SourceCode;
                        task.OrderCode = receiptDetail.ReceiptCode;
                        task.BusinessType = receiptHeader.Type;
                        task.TotalQty = receiptHeader.TotalQty;
                        task.TotalLines = receiptHeader.TotalLines;
                        task.FirstStatus = TaskStatus.待下发任务;
                        task.LastStatus = TaskStatus.待下发任务;
                        task.Project = receiptDetail.Project;
                        _appt.Add(task);
                    }

                    Station sta = _unitWork.Find<Station>(n => n.Code == station && n.Containercode != "").FirstOrDefault();
                    if (sta != null)
                    {
                        //任务明细状态更新
                        taskDetail.TaskType = TaskType.补充入库;
                        taskDetail.ContainerQty = receiptDetail.Qty;
                        taskDetail.TaskNo = tno;
                        taskDetail.SourceCode = receiptDetail.SourceCode;
                        taskDetail.OrderCode = receiptDetail.ReceiptCode;
                        taskDetail.ContainerCode = sta.Containercode;

                        taskDetail.MaterialCode = receiptDetail.MaterialCode;
                        taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == receiptDetail.MaterialCode).Select(a => a.Name).FirstOrDefault();
                        taskDetail.Batch = receiptDetail.Batch;
                        taskDetail.Lot = receiptDetail.Lot;
                        taskDetail.OderQty = receiptDetail.Qty;
                        taskDetail.Station = sta.Code;
                        taskDetail.HadQty = 0;
                        taskDetail.SourceLocation = sta.Code;
                        taskDetail.Roadway = _unitWork.Find<StationRoadway>(n => n.StationCode == sta.Code).Select(a => a.RoadWay).FirstOrDefault(); ;
                        taskDetail.Priority = 0;
                        taskDetail.Status = TaskStatus.已经到站台;
                        _apptd.Add(taskDetail);
                        //入库明细状态更新
                        receiptDetail.Status = ReceiptHeaderStatus.分配完成;
                        receiptDetail.QtyDivided += receiptDetail.Qty;
                        _apprd.Update(receiptDetail);
                        List<ReceiptDetail> receiptDetails = _unitWork.Find<ReceiptDetail>(n => n.ReceiptCode == receiptHeader.Code).OrderByDescending(x => x.Status).ToList();
                        receiptHeader.FirstStatus = (short)receiptDetails.First().Status;
                        receiptHeader.LastStatus = (short)receiptDetails.Last().Status;
                        _app.UpdateByTracking(receiptHeader);
                    }
                    else
                    {
                        str = station + "未找到该站台或者该站台无栈板占用!";
                    }
                }
                catch (Exception ex)
                {
                    str += ex.Message;
                }
            return str;
        }
    }
}