wxw
4 天以前 21dfb86aa0d5c1477ae7e3919172bcf82788eb44
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -30,6 +30,7 @@
using System.Drawing.Drawing2D;
using Model.ModelDto.LogDto;
using AutoMapper.Internal;
using System.Diagnostics.Contracts;
namespace WMS.BLL.BllSoServer
{
@@ -2079,7 +2080,7 @@
                   .AndIF(!string.IsNullOrWhiteSpace(model.BitPalletMark), m => m.BitPalletMark == model.BitPalletMark)
                   .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo))
                   .And(a => a.Status == "0")
                   .And(a => a.WareHouseNo == "W02")
                   .And(a => a.WareHouseNo == "W01" || a.WareHouseNo == "W02")
                   .ToExpression();
            var data = await Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToPageListAsync(model.Page, model.Limit, count);
            //data.Select(m => m.Status == "0" && m.IsDel == "0");
@@ -2313,6 +2314,264 @@
                    }
                    return outDtoList;
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 托盘出库(密集库)
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="outMode"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str)
        {
            try
            {
                //判断托盘号是否为空
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception($"托盘号不能为空,请核实");
                }
                str = "";
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList();
                if (stockDetailList.Count == 0)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var stocka = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetailList[0].SkuNo);
                //验证库存托盘状态
                if (stockDetailList[0].Status != "0")
                {
                    throw new Exception($"当前托盘未处于待分配状态,请核实!");
                }
                //判断托盘库存信息分组后是否大于1条
                var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList();
                if (detailGroup.Count > 1)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetailList[0].LocatNo && w.Status == "1");
                if (locatStart == null)
                {
                    throw new Exception($"起始储位不存在或非空闲,请检查");
                }
                #region 集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                #endregion
                var com = new Common();
                var allot = new AllotLocation();
                #region 集合
                Db.BeginTran();
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    var taskNoStr = "";
                    // 储位号
                    var locateNo = locatStart.LocatNo;
                    List<string> locateListStrs = new List<string>();
                    locateListStrs.Add(locateNo);
                    var row1 = int.Parse(locatStart.LocatNo.Substring(2, 2));
                    var row2 = int.Parse(locatStart.AisleOne.Substring(2, 2));
                    //需要移库的信息
                    var NeedMoveInfo = IsNeedMoveLocate(locatStart, locateListStrs, out int isOut);
                    if (isOut == 1)
                    {
                        //巷道组中有入库或移入的储位,或者是当前储位前有储位未下发成功的任务
                        throw new Exception($"巷道组中有入库或移入的储位,请稍后再试");
                    }
                    if (NeedMoveInfo.Count > 0)//需要移库
                    {
                        //判断库内空储位是否够
                        var okRoad = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == locatStart.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        var nullSlotNum = Db.Queryable<SysStorageLocat>().Count(m => m.RoadwayNo != locatStart.RoadwayNo && okRoad.Contains(m.RoadwayNo) && m.Status == "0");
                        //判断空储位的数量是否大于需要移库的数量
                        if (nullSlotNum >= NeedMoveInfo.Count)
                        {
                            foreach (var s in NeedMoveInfo)
                            {
                                //储位列
                                var rows = int.Parse(s.Substring(2, 2));
                                //获取移库储位
                                var moveAddress = GetMiJiMoveAddress(s, locatStart.AisleOne);
                                var tary = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == s);
                                if (string.IsNullOrWhiteSpace(moveAddress)) // 判断是否获取到移库的库位
                                {
                                    throw new Exception($"出库前有货物,需移库但未查询到空储位");
                                }
                                else
                                {
                                    var ykTaskNo = new Common().GetMaxNo("TK");
                                    var ykTask = new LogTask    //出库任务
                                    {
                                        TaskNo = ykTaskNo,
                                        Sender = "WMS",
                                        Receiver = "WCS",
                                        IsSuccess = 0, //是否下发成功 0失败 1成功
                                        StartLocat = s,//起始位置
                                        EndLocat = moveAddress,//outMode,//目标位置
                                        PalletNo = tary.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        Msg = "从" + s + "到" + moveAddress + "的移库任务", //关键信息
                                    };
                                    Db.Insertable(ykTask).ExecuteCommand();
                                    logTaskList.Add(ykTask);
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = ykTask.PalletNo,//托盘号
                                        StartLocate = ykTask.StartLocat, // 起始位置
                                        StartRoadway = locatStart.RoadwayNo,//其实巷道
                                        EndLocate = moveAddress,//outMode, // 目标位置
                                        TaskNo = ykTaskNo, // 任务号
                                        TaskType = "2",// 任务类型 (出库)0入 1出 2移
                                        Order = Math.Abs(row2 - rows),
                                        Type = PLCTypeEnum.ShuttleCar
                                    });
                                    var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s);
                                    var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress);
                                    slotChange.Status = "5"; //改变状态(正在出库)
                                    slotChange2.Status = "4"; // 改变状态(正在移入)
                                    Db.Updateable(slotChange).ExecuteCommand();
                                    Db.Updateable(slotChange2).ExecuteCommand();
                                }
                            }
                        }
                        else
                        {
                            throw new Exception($"出库前有货物,需移库但空储位不够移库");
                        }
                    }
                    #region 添加出库任务
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask    //出库任务
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        StartLocat = locatStart.LocatNo,//起始位置
                        EndLocat = outMode,//outMode,//目标位置
                        PalletNo = palletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = "从" + locatStart.LocatNo + "到" + outMode + "的出库任务", //关键信息
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    logTaskList.Add(exTask);
                    var endroad = allot.RoadwayToStationNum(locatStart.RoadwayNo, outMode);
                    outDto1.Add(new OutCommandDto()
                    {
                        PalletNo = palletNo,//托盘号
                        StartLocate = locatStart.LocatNo, // 起始位置
                        StartRoadway = locatStart.RoadwayNo,//起始巷道
                        EndLocate = outMode,//, // 目标位置
                        EndRoadway = endroad,
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)0入 1出 2移
                        OutMode = outMode,  //出库口
                        Order = Math.Abs(row2 - row1),
                        Type = PLCTypeEnum.ShuttleCar
                    });
                    taskNoStr = exTask.TaskNo;
                    #endregion
                    #region 改变数据
                    locatStart.Status = "3"; //要出库的储位改变状态 正在出库
                    Db.Updateable(locatStart).ExecuteCommand();
                    #endregion
                    outDto1.AddRange(moveDto);
                    outDto1.AddRange(outDto2);
                    //添加操作日志记录
                    new OperationSOServer().AddLogOperationSo("出库作业", "托盘出库", palletNo, "出库", $"点击出库按钮出库托盘为:{palletNo}", userId);
                    Db.CommitTran();
                    if (outDto1.Count > 0)
                    {
                        // 正式运行程序放开
                        var list2 = outDto1.Select(m => m.TaskNo).ToList();
                        var jsonData = JsonConvert.SerializeObject(outDto1);
                        string response = "";
                        try
                        {
                            var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            ////解析返回数据
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                            if (wcsModel.code == 200)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            }
                            else
                            {
                                new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
                                throw new Exception(wcsModel.message);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    return outDto1;
                }
                catch (Exception e)
                {
@@ -3528,7 +3787,7 @@
                        }
                        //判断储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0" && m.WareHouseNo == "W01");//当前出库的储位信息
                        if (locate == null)
                        {
                            flagList.Add(2);
@@ -3616,8 +3875,8 @@
                                            outDto1.Add(new OutCommandDto()
                                            {
                                                PalletNo = item.PalletNo,//托盘号
                                                StartLocate = locate.LocatNo, // 起始位置
                                                PalletNo = ykTask.PalletNo,//托盘号
                                                StartLocate = ykTask.StartLocat, // 起始位置
                                                StartRoadway = locate.RoadwayNo,//其实巷道
                                                EndLocate = moveAddress,//outMode, // 目标位置 
                                                TaskNo = ykTaskNo, // 任务号
@@ -3865,9 +4124,9 @@
            // 010101 派列层
            //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            
            var sArray = lcoate.LocatNo.Substring(4,2);
            var sArray = lcoate.LocatNo.Substring(2, 2);
            var row = int.Parse(sArray);//储位列
            var sArray2 = lcoate.AisleOne.Substring(4, 2);
            var sArray2 = lcoate.AisleOne.Substring(2, 2);
            var row2 = int.Parse(sArray2); //通道口列
            isOut = 0;
@@ -4015,7 +4274,21 @@
                    {
                        foreach (var item2 in item)
                        {
                            var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList();
                        var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == item2.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        //当前托盘所在楼层
                        if (oldSlot.Layer == 1)
                        {
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) <= 56).ToList();
                        }
                        else if (oldSlot.Layer == 2)
                        {
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) > 56).ToList();
                        }
                        else
                        {
                            throw new Exception("当前托盘所在楼层异常");
                        }
                            var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo
                            && m.LotNo == item2.LotNo && !slotList.Contains(m.LocatNo) && m.PalletTags == item2.PalletTags && okLan.Contains(m.RoadwayNo)).ToList();
                            foreach (var s in tray2)
@@ -4202,7 +4475,7 @@
            location = "";
            
            // 判断储位组是否有空储位   关联库存明细表可防止储位状态不准确避免造成满入异常//not in ('1','2','4','6','7','8')
            sqlString = $"select LocatNo,Column,AisleOne from SysStorageLocat where RoadwayNo = {laneWayId} and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = { laneWayId}) order by Row;";
            sqlString = $"select LocatNo,[Column],AisleOne from SysStorageLocat where IsDel=0 and WareHouseNo='W01' and RoadwayNo = '{laneWayId}' and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = '{laneWayId}') order by Row;";
            var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList();
            if (slotModel.Count == 0)
            {