wxw
9 小时以前 4c49b591b3833a2752634355cb37b0a74923e916
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -948,6 +948,7 @@
                    WaveNo = a.WaveNo,
                    IsDespatch = a.IsDespatch,
                    Demo = a.Demo,
                    OrderCode = a.OrderCode,
                    CreateUserName = c.RealName,
                    UpdateUserName = c.RealName,
@@ -996,10 +997,10 @@
                        inspectStatus = "1";
                        break;
                    case "1"://领料出库
                        if (house != "W02")
                        {
                            throw new Exception("领料出库只能选择原料库");
                        }
                        //if (house != "W02")
                        //{
                        //    throw new Exception("领料出库只能选择原料库");
                        //}
                        skuType = "(0,1,3)";
                        inspectStatus = "1";
                        break;
@@ -1096,7 +1097,7 @@
                    skuList = skuList.Where(m => m.SkuNo == "100088").ToList();
                }
                skuStrList = skuList.Select(m => m.SkuNo).ToList();
                var areaStr = new List<string>() { "B06", "B07", "B09" };
                var areaStr = new List<string>() { "B06", "B07", "B09", "B24" };
                var stockRst = new StockServer();
                var stockDetailRst = new StockDetailServer();
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
@@ -1193,6 +1194,12 @@
                        //}
                        break;
                    case "W02"://原料库
                        if (skuList.Any(m => m.Type == "2"))
                        {
                            throw new Exception("仓库与出库物料不符");
                        }
                        break;
                    case "W04"://平库
                        if (skuList.Any(m => m.Type == "2"))
                        {
                            throw new Exception("仓库与出库物料不符");
@@ -1830,9 +1837,9 @@
                {
                    throw new Exception("未查询到出库单据信息");
                }
                if (notice.Origin != "WMS" || notice.Status != "0")
                if (notice.Status != "0")//notice.Origin != "WMS" ||
                {
                    throw new Exception("参数异常,请检查状态是否未等待执行或来源是否是WMS");
                    throw new Exception("参数异常,请检查状态是否未等待执行");
                }
                //总库存信息
@@ -2006,6 +2013,13 @@
            }
        }
        /// <summary>
        /// 导出xml文件
        /// </summary>
        /// <param name="id"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public XmlNode AddExXmlStr(int id, int userId)
        {
            try
@@ -2015,27 +2029,80 @@
                {
                    throw new Exception("未查询到出库单据信息");
                }
                var noticeDetial = Db.Queryable<BllExportNoticeDetail>().Where(w => w.IsDel == "0" && w.SONo == notice.SONo).First();
                if (noticeDetial == null)
                {
                    throw new Exception("未查询到出库单据明细信息");
                }
                var statusLis = new List<string>() { "4", "5", "6" };
                if (!statusLis.Contains(notice.Status))
                {
                    throw new Exception("参数异常,请检查状态是否为执行完成或订单关闭/已上传");
                }
                string xmlName = string.Empty;
                switch (notice.Type)
                {
                    case "0"://成品出库/销售出库
                        xmlName = "SalesWareHouseOut";
                        break;
                    case "2"://抽检出库
                        xmlName = "CheckWareHouseOut";
                        break;
                    default:
                        throw new Exception("单据类型异常");
                }
                var materiDetial = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == noticeDetial.SkuNo);
                var packType = Db.Queryable<SysPackag>().First(w => w.IsDel == "0" && w.PackagNo == materiDetial.PackagNo);
                int level = 0;
                if (!string.IsNullOrEmpty(packType.L2Name))
                {
                    level = 1;
                }
                if (!string.IsNullOrEmpty(packType.L3Name))
                {
                    level = 2;
                }
                if (!string.IsNullOrEmpty(packType.L4Name))
                {
                    level = 3;
                }
                //出库单明细
                var comDetail = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.SONo == notice.SONo).Select(m => m.BoxNo3).ToList();
                var comDetail = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.SONo == notice.SONo).ToList();
                var userinfo = Db.Queryable<SysUserInfor>().Where(m => m.Id == comDetail.First().CreateUser).First().RealName;
                Db.BeginTran();//开启事务
                try
                {
                    //Hashtable pars = new Hashtable();       //用来存放参数
                    var pars = new List<string>();
                    //for (int i = 0; i < 10; i++)
                    //{
                    //    pars.Add("202203240009000479940290");
                    //}
                    string[] strr = new string[comDetail.Count];
                    var dom = HttpHelper.EncodeParsToFuMa(comDetail, "ceshi", "ExInfoXml");
                    for (int i = 0; i < comDetail.Count(); i++)
                    {
                        switch (level)
                        {
                            case 1:
                                strr[i] = comDetail[i].BoxNo + "," + comDetail[i].SONo + "," + userinfo + "," + Convert.ToString(comDetail[i].CreateTime);
                                break;
                            case 2:
                                strr[i] = comDetail[i].BoxNo3 + "," + comDetail[i].SONo + "," + userinfo + "," + Convert.ToString(comDetail[i].CreateTime);
                                break;
                            case 3:
                                strr[i] = comDetail[i].BoxNo2 + "," + comDetail[i].SONo + "," + userinfo + "," + Convert.ToString(comDetail[i].CreateTime);
                                break;
                            default:
                                break;
                        }
                        pars.Add(strr[i]);
                    }
                    //string fileName = $"{xmlName}_{notice.OrderCode}_linklink";
                    var dom = HttpHelper.EncodeParsToFuMa(pars, "", xmlName, "ExInfoXml");
                    ////添加操作日志记录
                    //var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "关单", $"关闭了单据号为{notice.SONo}的单据信息", userId);
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "上传", $"上传了单据号为{notice.SONo}的单据信息", userId);
                    Db.CommitTran();
                    return dom;
@@ -2724,7 +2791,9 @@
                        //还需要分配的数量
                        decimal needQty = detail.Qty - (detail.AllotQty == null ? 0 : decimal.Parse(detail.AllotQty.ToString()));
                        //库存明细 Status 0:待分配 1:部分分配  2:已分配 
                        var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == detail.SkuNo && (m.Qty - m.FrozenQty - m.LockQty + m.InspectQty) > 0 && (m.Status == "0" || m.Status == "1") && m.IsDel == "0").ToList();
                        var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == detail.SkuNo && (m.Qty - m.FrozenQty - m.LockQty + m.InspectQty) > 0 && (m.Status == "0" || m.Status == "1") && m.IsDel == "0"
                        && m.AreaNo != "B06" && m.AreaNo != "B07" && m.AreaNo != "B09" && m.AreaNo != "B24")//排除车间库存
                            .ToList();
                        //判断单号是否指定批次
@@ -2764,8 +2833,8 @@
                        }
                        #region 包装信息
                        var pNum = 0;//托盘物品数量
                        var bNum = 0;//箱物品数量
                        var pNum = 0m;//托盘物品数量
                        var bNum = 0m;//箱物品数量
                        //公共方法获取包装数量
                        new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
@@ -2773,7 +2842,8 @@
                        //取合适库存商品
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
                        var qty = 0m;
                        var qty = 0m;//分配数量
                        var xQty = 0m;//下架数量
                        var house = "";
                        //分配货物
@@ -2809,6 +2879,11 @@
                                CreateUser = userId,
                                CreateTime = DateTime.Now
                            };
                            if (s.WareHouseNo == "W04")
                            {
                                allot.Status = "2";//待拣货
                                xQty += allot.Qty;
                            }
                            exAllotList.Add(allot);
                            s.LockQty += stockQtyDic[s.Id];
@@ -2821,11 +2896,12 @@
                            {
                                s.Status = "1";
                            }
                            var sd = Db.Updateable(s).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand();
                        }
                        detail.AllotQty += qty;
                        detail.AllotQty += qty;//分配数量
                        detail.FactQty += xQty;//下架数量
                        detail.UpdateUser = userId;
                        detail.UpdateTime = DateTime.Now;
                        if (detail.Status == "0")
@@ -2891,8 +2967,13 @@
                                //证明所有分配数量全部小于等于出库数量 不做修改
                                break;
                        }
                        var outPalletCount = exAllotList.Where(w => w.Status == "0").Count();//查找有无需要出库的托盘
                        if (outPalletCount <= 0)
                        {
                            notice.Status = "3";//正在执行
                        }
                    }
                    notice.UpdateUser = userId;
                    notice.UpdateTime = DateTime.Now;
                    var zd = Db.Updateable(notice).ExecuteCommand();
@@ -3004,6 +3085,7 @@
                            soDetailList.Add(soDetail);
                        }
                        d.AllotQty = 0;
                        d.FactQty = 0;
                        d.Status = "0";
                        d.UpdateUser = userId;
                        d.UpdateTime = DateTime.Now;
@@ -3136,7 +3218,8 @@
                        m => m.SkuNo.Contains(msg.Trim())
                             || m.SkuName.Contains(msg.Trim())
                             || m.LocatNo.Contains(msg.Trim()))
                    .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && (m.Status == "0" || m.Status == "1"))
                    .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && (m.Status == "0" || m.Status == "1")
                        && m.AreaNo != "B06" && m.AreaNo != "B07" && m.AreaNo != "B09" && m.AreaNo != "B24")//排除车间库存
                    .ToExpression();//注意 这一句 不能少
                var list = Db.Queryable<DataStockDetail>().Where(item).Select(a => new StockDetailDto
@@ -3209,7 +3292,8 @@
                //var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo);
                var allotList = new List<BllExportAllot>();
                decimal outQtys = 0;
                decimal outQtys = 0;//分配数量
                decimal xQty = 0;//下架数量
                foreach (var st in model.StockList)
                {
                    var stock = stockList.First(a => a.Id == st.StockId);
@@ -3251,6 +3335,11 @@
                            CreateUser = userId,
                            CreateTime = DateTime.Now
                        };
                        if (stock.WareHouseNo == "W04")
                        {
                            allot.Status = "2";//待拣货
                            xQty += allot.Qty;
                        }
                        allotList.Add(allot);
                    }
                    else
@@ -3273,7 +3362,8 @@
                }
                Db.Insertable(allotList).ExecuteCommand();
                //修改单据明细
                detail.AllotQty += outQtys;
                detail.AllotQty += outQtys;//分配数量
                detail.FactQty += xQty;//下架数量
                detail.UpdateUser = userId;
                detail.UpdateTime = DateTime.Now;
                if (detail.Status == "0")
@@ -3302,6 +3392,12 @@
                    else if (totalAllotQty < totalQty && totalAllotQty > 0)
                    {
                        notice.Status = "1";//证明分配数量小于等于出库数量  修改为部分分配
                    }
                    var outPalletCount = allotList.Where(w => w.Status == "0").Count();//查找有无需要出库的托盘
                    if (outPalletCount <= 0)
                    {
                        notice.Status = "3";//正在执行
                    }
                    Db.Updateable(notice).ExecuteCommand();
                }
@@ -4307,31 +4403,65 @@
                        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)
                        if (tray2.Count > 0)
                        {
                            if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                            foreach (var s in tray2)
                            {
                                continue;
                            }
                            var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                            //判断是否有入库中、出库中、移入中、移出中
                            if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                            {
                                continue;
                            }
                            if (lan.Count(m => m.Status == "0") > 0)
                            {
                                var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                if (bol && !string.IsNullOrWhiteSpace(location))
                                if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                                {
                                    newAddress = location;
                                    return newAddress;
                                    continue;
                                }
                                var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                                //判断是否有入库中、出库中、移入中、移出中
                                if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                                {
                                    continue;
                                }
                                if (lan.Count(m => m.Status == "0") > 0)
                                {
                                    var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                    if (bol && !string.IsNullOrWhiteSpace(location))
                                    {
                                        newAddress = location;
                                        return newAddress;
                                    }
                                }
                            }
                        }
                        if(string.IsNullOrEmpty(newAddress))
                        {
                            //已有物品的巷道
                            var roadwayHave = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.WareHouseNo == "W01").GroupBy(g => g.RoadwayNo).Select(s => s.RoadwayNo).ToList();
                            //查找没有物品的巷道
                            var roadwayNull = Db.Queryable<SysStorageRoadway>().Where(w => w.IsDel == "0" && w.WareHouseNo == "W01" && w.Status == "0" && okLan.Contains(w.RoadwayNo) && !roadwayHave.Contains(w.RoadwayNo)).Select(s => s.RoadwayNo).ToList();
                            if (roadwayNull.Count > 0)
                            {
                                foreach (var itemRoad in roadwayNull)
                                {
                                    var bol = GetBecomingLocation(itemRoad, ref location);
                                    if (bol && !string.IsNullOrWhiteSpace(location))
                                    {
                                        newAddress = location;
                                        return newAddress;
                                    }
                                }
                            }
                            else
                            {
                                foreach (var itemRoad in roadwayHave)
                                {
                                    var bol = GetBecomingLocation(itemRoad, ref location);
                                    if (bol && !string.IsNullOrWhiteSpace(location))
                                    {
                                        newAddress = location;
                                        return newAddress;
                                    }
                                }
                            }
                        }
                    }
                }
@@ -4505,16 +4635,15 @@
                if (slotModel[0].Column > aisleRow)
                {
                    // 取最上面一排
                    location = slotModel[0].LocatNo;
                }
                else
                {
                    // 取最下面一排
                    location = slotModel[slotModel.Count - 1].LocatNo;
                }
                else
                {
                    // 取最上面一排
                    location = slotModel[0].LocatNo;
                }
                bl = true;
            }