ContainerApp.cs 13.7 KB
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 ContainerApp
    {
        private IUnitWork _unitWork;
        public IRepository<Container> _app;
        private IAuth _auth;
        private BaseDBContext _context;
        private static IHostingEnvironment _hostingEnvironment;
        public IRepository<ReceiptHeader> _apprh;
        ExcelHelper imp = new ExcelHelper(_hostingEnvironment);

        public ContainerApp(IUnitWork unitWork, IRepository<Container> repository, IHostingEnvironment hostingEnvironment, IRepository<ReceiptHeader> receiptHeader, IAuth auth, BaseDBContext context)
        {
            _unitWork = unitWork;
            _app = repository;
            _auth = auth;
            _context = context;
            _apprh = receiptHeader;
            _hostingEnvironment = hostingEnvironment;
        }
        
        public ContainerApp SetLoginInfo(LoginInfo loginInfo)
        {
            _app._loginInfo = loginInfo;
            return this;
        }
        
        public TableData Load(PageReq pageRequest, Container entity)
        {
            return _app.Load(pageRequest, entity);
            //TableData tab = _app.Load(pageRequest, entity);
            //List<Container> list = tab.data;
            //if (list != null)
            //{
            //    tab.data = list.Where(n => n.Code.Substring(0, 2) != "BB");
            //}
            //return tab;
        }

        public void Ins(Container entity)
        {
            _app.Add(entity);
        }

        public void Upd(Container entity)
        {
            _app.Update(entity);
        }

        public void DelByIds(int[] ids)
        {
            _app.Delete(u => ids.Contains(u.Id.Value));
        }
        
        public Container FindSingle(Expression<Func<Container, bool>> exp)
        {
            return _app.FindSingle(exp);
        }

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

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

            for (int i = 0; i < exp.Count; i++)
            {
                try
                {
                    Container 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(Container entity)
        {
            return _app.ExportData(entity);
        }

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

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

            return result;
        }

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

        public string UpDatas(List<Container> ids)
        {
            string strError = "";
            foreach (Container UpDate in ids)
            {
                string sql = string.Format("UPDATE dbo.container SET printCount = '{0}' WHERE id = '{1}';", UpDate.PrintCount, UpDate.Id);
                try
                {
                    _unitWork.ExecuteSql(sql);
                }
                catch (Exception ex)
                {
                    strError += "失败原因:" + ex.Message + "||";
                }
            }
            return strError;
        }
        //批量创建
        public Response BtchAdd(string Type, int Num)
        {
            Response res = new Response();
            try
            {
                _unitWork.ExecuteSql(string.Format("EXECUTE dbo.P_Create_Container '{0}','{1}'", Type, Num));
                return res;
            }
            catch (Exception ex)
            {
                res.Code = 300;
                res.Message = ex.Message;
                return res;
            }
        }

        //直接出库
        public Response ContainerOutNoBackApp(List<Container> entitys, string station)
        {
            Response response = new Response();
            foreach (Container item in entitys)
            {
                int? Roadway = 0;
                Container Con = _unitWork.Find<Container>(n => (n.Code == item.Code)).FirstOrDefault();
                if (item.Status == ContainerStatus.) {
                    Inventory inv = _unitWork.Find<Inventory>(n => (n.ContainerCode == item.Code)).FirstOrDefault();
                    if (inv != null) {
                        response.Code = 300;
                        response.Message += "当前托盘为空托盘,但库存表中存在该托盘的库存!";
                        return response;
                    }
                }
                Container ConType = _unitWork.Find<Container>(n => n.Code == item.Code).FirstOrDefault();
                //目标站台
                Station Sta = _unitWork.Find<Station>(n => n.Code == station).FirstOrDefault();
                if (Sta.IsPass == 1)
                {
                    response.Code = 300;
                    response.Message = "当前站台禁止无单据出库!!";
                    return response;
                }
                //判断当前位置是站台还是库位
                Station IsStation = _unitWork.Find<Station>(n => n.Code == item.LocationCode).FirstOrDefault();
                //容器当前位置为站台,查询巷道
                if (IsStation != null)
                {
                    Roadway = _unitWork.Find<StationRoadway>(n => n.StationCode == item.LocationCode).Select(a => a.RoadWay).FirstOrDefault();
                }
                else
                {
                    Roadway = _unitWork.Find<Location>(n => n.Code == item.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                }
                if (ConType.Type == "s_1" && (station == "EntranceStationE02" || station == "EntranceStationE03"))
                {
                    response.Code = 300;
                    response.Message = "选择托盘:" + item.Code + "为小托盘,选择出库站台:" + Sta.Name + "为大托盘站台,选择错误不允许出库!!!";
                    return response;
                }
                else if (ConType.Type == "s_2" && (station == "EntranceStationE01" || station == "EntranceStationE04"))
                {
                    response.Code = 300;
                    response.Message = "选择托盘:" + item.Code + "为大托盘,选择出库站台:" + Sta.Name + "为小托盘站台,选择错误不允许出库!!!";
                    return response;
                }
                //对原材料特殊判断,站台到站台,机台到站台,
                if (Roadway == 1)
                {
                    //建立容器出库任务
                    int TaskCount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == item.Code).Count();
                    if (TaskCount < 1 && item.IsLock == ContainerLock.未锁)
                    {
                        Task ptask = new Task();
                        var ctaskNo = _app.GetTaskNo(TaskNo.容器出库);
                        ptask.TaskNo = ctaskNo;
                        ptask.OrderCode = ctaskNo;
                        ptask.BusinessType = BusinessType.出库_其他出库单;
                        ptask.FirstStatus = TaskStatus.待下发任务;
                        ptask.LastStatus = TaskStatus.待下发任务;
                        ptask.CreateTime = DateTime.Now;


                        TaskDetail ptaskDetail = new TaskDetail();
                        ptaskDetail.TaskType = TaskType.容器出库;
                        ptaskDetail.Roadway = Roadway;
                        ptaskDetail.TaskNo = ctaskNo;
                        ptaskDetail.OrderCode = ctaskNo;
                        ptaskDetail.ContainerCode = item.Code;
                        ptaskDetail.SourceLocation = item.LocationCode;
                        ptaskDetail.DestinationLocation = station;
                        ptaskDetail.Station = station;
                        _unitWork.Add(ptask);

                        ptaskDetail.OderQty = 0;
                        ptaskDetail.ContainerQty = 0;
                        ptaskDetail.HadQty = 0;
                        ptaskDetail.Status = TaskStatus.待下发任务;
                        ptaskDetail.Priority = 99;
                        ptaskDetail.CreateTime = DateTime.Now;
                        _unitWork.Add(ptaskDetail);

                        List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == item.Code).ToList();
                        if (inventories.Count > 0)
                        {
                            foreach (Inventory inv in inventories)
                            {
                                inv.TaskStatus = InventoryTaskType.任务锁定中;
                                _unitWork.Update(inv);
                            }
                        }
                    }
                    else
                    {
                        response.Code = 300;
                        response.Message += item.Code + "已有任务</br>";
                    }
                }
                else
                {
                    //建立容器出库任务
                    int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == item.Code).Count();
                    if (ptdcount < 1 && item.IsLock == ContainerLock.未锁)
                    {
                        Task ptask = new Task();
                        var ctaskNo = _app.GetTaskNo(TaskNo.容器出库);
                        ptask.TaskNo = ctaskNo;
                        ptask.OrderCode = ctaskNo;
                        ptask.BusinessType = BusinessType.出库_其他出库单;
                        ptask.FirstStatus = TaskStatus.待下发任务;
                        ptask.LastStatus = TaskStatus.待下发任务;
                        ptask.CreateTime = DateTime.Now;


                        TaskDetail ptaskDetail = new TaskDetail();
                        Station stat = _unitWork.Find<Station>(n => n.Code == item.LocationCode && n.Type == StationType.暂存区站台).FirstOrDefault();
                        if (stat != null)
                        {
                            ptaskDetail.TaskType = TaskType.站台到站台;
                            ptaskDetail.Roadway = _unitWork.Find<StationRoadway>(n => n.StationCode == item.LocationCode).Select(a => a.RoadWay).FirstOrDefault();
                        }
                        else
                        {
                            ptaskDetail.TaskType = TaskType.直接出库;
                            ptaskDetail.Roadway = _unitWork.Find<Location>(n => n.Code == item.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                        }
                        ptaskDetail.TaskNo = ctaskNo;
                        ptaskDetail.OrderCode = ctaskNo;
                        ptaskDetail.ContainerCode = item.Code;
                        ptaskDetail.SourceLocation = item.LocationCode;
                        ptaskDetail.DestinationLocation = station;
                        ptaskDetail.Station = station;
                        _unitWork.Add(ptask);

                        ptaskDetail.OderQty = 0;
                        ptaskDetail.ContainerQty = 0;
                        ptaskDetail.HadQty = 0;
                        ptaskDetail.Status = TaskStatus.待下发任务;
                        ptaskDetail.Priority = 99;
                        ptaskDetail.CreateTime = DateTime.Now;
                        _unitWork.Add(ptaskDetail);

                        //item.IsLock = 1;
                        //_unitWork.Update(item);

                        List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == item.Code).ToList();
                        foreach (Inventory inv in inventories)
                        {
                            inv.TaskStatus = InventoryTaskType.任务锁定中;
                            _unitWork.Update(inv);
                        }
                    }
                    else
                    {
                        response.Code = 300;
                        response.Message += item.Code + "已有任务</br>";
                    }
                }
               
            }
            return response;
        }
    }
}