CyclecountDetailApp.cs 13.6 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 CyclecountDetailApp
    {
        private IUnitWork _unitWork;
        public IRepository<CyclecountDetail> _app;
        private static IHostingEnvironment _hostingEnvironment;
        ExcelHelper imp = new ExcelHelper(_hostingEnvironment);
        private BaseDBContext _context;
        public IRepository<TaskDetail> _apptd;
        public IRepository<Task> _appt;

        public CyclecountDetailApp(IUnitWork unitWork, IRepository<CyclecountDetail> repository, IHostingEnvironment hostingEnvironment, IRepository<Task> task, IRepository<TaskDetail> taskDetail, BaseDBContext context)
        {
            _unitWork = unitWork;
            _app = repository;
            _hostingEnvironment = hostingEnvironment;
            _apptd = taskDetail;
            _appt = task;
            _context = context;
        }
        
        public CyclecountDetailApp SetLoginInfo(LoginInfo loginInfo)
        {
            _app._loginInfo = loginInfo;
            return this;
        }
        
        public TableData Load(PageReq pageRequest, CyclecountDetail entity)
        {
            return _app.Load(pageRequest, entity);
        }

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

        public void BatchIns(List<CyclecountDetail> entitys)
        {
            _app.BatchAdd(entitys.ToArray());
        }

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

        public void DelByIds(int[] ids)
        {
            //删除盘点明细,更新库存的盘点状态
            foreach(var item in ids)
            {
                var detail = _app.FindSingle(u => u.Id == item);

                Inventory inventory = _unitWork.Find<Inventory>(u => u.Id == detail.InventoryId).FirstOrDefault();
                inventory.TaskStatus = "-1";
                _unitWork.Update(inventory);
            }

            _app.Delete(u => ids.Contains(u.Id.Value));
        }
        
        public CyclecountDetail FindSingle(Expression<Func<CyclecountDetail, bool>> exp)
        {
            return _app.FindSingle(exp);
        }

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

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

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

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

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

            return result;
        }

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

        public string Insert(CyclecountDetail entity)
        {
            string str = "";
            try
            {
                string containerCode = entity.ContainerCode;
                string materialCode = entity.MaterialCode;

                Inventory inventory = _unitWork.Find<Inventory>(n => n.MaterialCode == materialCode && n.ContainerCode == containerCode).FirstOrDefault();
                int count = _unitWork.Find<TaskDetail>(n => n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && n.ContainerCode == containerCode && !n.TaskType.Contains("C")).Count();
                Container container = _unitWork.Find<Container>(n => n.Code == containerCode).FirstOrDefault();

                if (inventory == null || container == null)
                {
                    str = "该托盘或物料不存在!";
                    return str;
                }

                if (container.IsLock == 0 && count == 0)
                {
                    if (inventory.TaskStatus == "idle")
                    {
                        inventory.TaskStatus = "cyclecountLock";
                        _unitWork.Update(inventory);
                    }

                    entity.SystemQty = inventory.Qty;
                    _app.Add(entity);

                    str += AddTaskInfo(entity, inventory);
                }
            }
            catch (Exception ex)
            {
                str += "物料:" + entity.MaterialCode + ":" + ex.Message + "<br>";
            }
            return str;
        }

        public string BatchInsert(List<CyclecountDetail> entitys)
        {
            string str = "";
            foreach (var entity in entitys)
            {
                try
                {
                    string containerCode = entity.ContainerCode;
                    string materialCode = entity.MaterialCode;

                    Inventory inventory = _unitWork.Find<Inventory>(n => n.MaterialCode == materialCode && n.ContainerCode == containerCode).FirstOrDefault();
                    int count = _unitWork.Find<TaskDetail>(n => n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && n.ContainerCode == containerCode && !n.TaskType.Contains("C")).Count();
                    Container container = _unitWork.Find<Container>(n => n.Code == containerCode).FirstOrDefault();

                    if (inventory == null || container == null)
                    {
                        str = "该托盘或物料不存在!";
                        return str;
                    }

                    if (container.IsLock == 0 && count == 0)
                    {
                        if (inventory.TaskStatus == "idle")
                        {
                            inventory.TaskStatus = "cyclecountLock";
                            _unitWork.Update(inventory);
                        }

                        entity.SystemQty = inventory.Qty;
                        _app.Add(entity);

                        str += AddTaskInfo(entity, inventory);
                    }
                }
                catch (Exception ex)
                {
                    str += "物料:" + entity.MaterialCode + ":" + ex.Message + "<br>";
                }
            }
            return str;
        }

        public string AddTaskInfo(CyclecountDetail entity,Inventory inventory)
        {
            string str = "";
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    Task task = new Task();
                    TaskDetail taskDetail = new TaskDetail();
                    CyclecountHeader cyclecountHeader = _unitWork.Find<CyclecountHeader>(n => n.Code == entity.Code).FirstOrDefault(); 
                    var tno = "";
                    int tcount = _unitWork.Find<Task>(n => n.OrderCode == entity.Code).Count();
                    if (tcount > 0)
                    {
                        var tasknum = _unitWork.Find<Task>(n => n.OrderCode == entity.Code).Select(a => a.TaskNo).First();
                        tno = tasknum;
                    }
                    else
                    {
                        tno = _app.GetTaskNo(TaskNo.盘点);
                        task.TaskNo = tno;
                        task.OrderCode = cyclecountHeader.Code;
                        task.BusinessType = cyclecountHeader.Type;
                        task.FirstStatus = TaskStatus.待下发任务;
                        task.LastStatus = TaskStatus.待下发任务;
                        _appt.Add(task);
                    }

                    if (inventory != null)
                    {
                        //任务明细状态更新
                        taskDetail.TaskType = TaskType.盘点;
                        taskDetail.ContainerQty = inventory.Qty;
                        taskDetail.TaskNo = tno;
                        taskDetail.OrderCode = entity.Code;
                        taskDetail.ContainerCode = entity.ContainerCode;

                        taskDetail.MaterialCode = entity.MaterialCode;
                        taskDetail.MaterialName = _unitWork.Find<Material>(n => n.Code == entity.MaterialCode).Select(a => a.Name).FirstOrDefault();
                        taskDetail.Batch = entity.Batch;
                        taskDetail.Lot = entity.Lot;
                        taskDetail.OderQty = inventory.Qty;
                        taskDetail.HadQty = 0;
                        Location loc = _unitWork.Find<Location>(n => n.Code == inventory.LocationCode && n.IsStop == false).FirstOrDefault();
                        taskDetail.SourceLocation = loc.Code;
                        taskDetail.DestinationLocation = loc.Code;
                        taskDetail.Roadway = _unitWork.Find<Location>(n => n.Code == inventory.LocationCode && n.IsStop == false).Select(a => a.Roadway).First(); ;
                        taskDetail.Priority = 0;
                        taskDetail.Status = TaskStatus.待下发任务;
                        _apptd.Add(taskDetail);
                        //盘点明细状态更新
                        entity.Status = ReceiptHeaderStatus.分配完成;
                        entity.IsCreateTask = "true";
                        _app.Update(entity);

                        //建立容器出库任务
                        if (_unitWork.IsExist<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.MaterialCode == entity.MaterialCode && n.OrderCode == entity.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 = 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();
                    str +="物料:"+ entity.MaterialCode + ":" + ex.Message +"<br>";
                }
            }
            return str;
        }
    }
}