yyk
2024-08-22 1310b47a24f0cc70f0128c820bd490dca6a1a921
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -430,6 +430,7 @@
                                IsWave = "0",
                                WaveNo = "",
                                IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
                                IsMixBox = d.IsMixBox,
                                OrderDetailCode = d.OrderDetailCode,
@@ -540,7 +541,7 @@
                                var item = new BllExportNoticeDetail()
                                {
                                    SONo = billNo,
                                    OrderDetailCode=d.OrderDetailCode,
                                    OrderDetailCode = d.OrderDetailCode,
                                    SkuNo = sku.SkuNo,
                                    SkuName = sku.SkuName,
                                    Standard = sku.Standard,
@@ -559,6 +560,7 @@
                                    IsWave = "0",
                                    WaveNo = "",
                                    IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
                                    IsMixBox = d.IsMixBox,
                                    CreateUser = 0,
                                };
@@ -812,70 +814,62 @@
        #region 基础功能
        public List<ExportNoticeDto> GetExportNoticeList(string no, string type, string status, string lotNo, int? logisticsId, string isWave, string isDespatch, string waveNo, int page, int limit, out int count)
        public async Task<List<ExportNoticeDto>> GetExportNoticeList(GetExportNoticeVm model, RefAsync<int> count)
        {
            try
            {
                var strList = new List<string>();
            var strList = new List<string>();
                if (!string.IsNullOrWhiteSpace(lotNo))
            if (!string.IsNullOrWhiteSpace(model.LotNo))
            {
                var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.LotNo.Contains(model.LotNo.Trim())).Select(m => m.SONo).Distinct().ToList();
                strList = detailList;
            }
            Expression<Func<BllExportNotice, bool>> item = Expressionable.Create<BllExportNotice>()
                .AndIF(!string.IsNullOrWhiteSpace(model.No), it => it.SONo.Contains(model.No.Trim()))
                .AndIF(!string.IsNullOrWhiteSpace(model.Type), it => it.Type == model.Type)
                .AndIF(!string.IsNullOrWhiteSpace(model.Status), it => it.Status == model.Status)
                .AndIF(model.LogisticsId != null, it => it.LogisticsId == model.LogisticsId)
                .AndIF(!string.IsNullOrWhiteSpace(model.IsWave), it => it.IsWave == model.IsWave)
                .AndIF(!string.IsNullOrWhiteSpace(model.IsDespatch), it => it.IsDespatch == model.IsDespatch)
                .AndIF(!string.IsNullOrWhiteSpace(model.WaveNo), it => it.WaveNo.Contains(model.WaveNo.Trim()))
                .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => strList.Contains(it.SONo))
                .ToExpression();//注意 这一句 不能少
            var data = await GetAllWhereAsync(item)
                .LeftJoin<SysLogisticsInfo>((a, b) => a.LogisticsId == b.Id)
                .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                .Select((a, b, c, d, e) => new ExportNoticeDto()
                {
                    var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.LotNo.Contains(lotNo.Trim())).Select(m => m.SONo).Distinct().ToList();
                    strList = detailList;
                }
                Expression<Func<BllExportNotice, bool>> item = Expressionable.Create<BllExportNotice>()
                    .AndIF(!string.IsNullOrWhiteSpace(no), it => it.SONo.Contains(no.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(type), it => it.Type == type)
                    .AndIF(!string.IsNullOrWhiteSpace(status), it => it.Status == status)
                    .AndIF(logisticsId != null, it => it.LogisticsId == logisticsId)
                    .AndIF(!string.IsNullOrWhiteSpace(isWave), it => it.IsWave == isWave)
                    .AndIF(!string.IsNullOrWhiteSpace(isDespatch), it => it.IsDespatch == isDespatch)
                    .AndIF(!string.IsNullOrWhiteSpace(waveNo), it => it.WaveNo.Contains(waveNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(lotNo), it => strList.Contains(it.SONo))
                    .ToExpression();//注意 这一句 不能少
                var total = 0;
                var data = GetAllWhereAsync(item)
                    .LeftJoin<SysLogisticsInfo>((a, b) => a.LogisticsId == b.Id)
                    .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
                    .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id)
                    .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                    .Select((a, b, c, d, e) => new ExportNoticeDto()
                    {
                        Id = a.Id,
                        SONo = a.SONo,
                        Type = a.Type,
                        Status = a.Status,
                        Origin = a.Origin,
                        CustomerNo = a.CustomerNo,
                        CustomerName = a.CustomerName,
                        LotNo = a.LotNo,
                        LotText = a.LotText,
                        SupplierLot = a.SupplierLot,
                        LogisticsId = a.LogisticsId,
                        LogisticsName = b.CarrierName,
                        IsWave = a.IsWave,
                        WaveNo = a.WaveNo,
                        IsDespatch = a.IsDespatch,
                        Demo = a.Demo,
                    Id = a.Id,
                    SONo = a.SONo,
                    Type = a.Type,
                    Status = a.Status,
                    Origin = a.Origin,
                    CustomerNo = a.CustomerNo,
                    CustomerName = a.CustomerName,
                    LotNo = a.LotNo,
                    LotText = a.LotText,
                    SupplierLot = a.SupplierLot,
                    LogisticsId = a.LogisticsId,
                    LogisticsName = b.CarrierName,
                    IsWave = a.IsWave,
                    WaveNo = a.WaveNo,
                    IsDespatch = a.IsDespatch,
                    Demo = a.Demo,
                        CreateUserName = c.RealName,
                        UpdateUserName = c.RealName,
                        CreateTime = a.CreateTime,
                        UpdateTime = a.UpdateTime,
                    CreateUserName = c.RealName,
                    UpdateUserName = c.RealName,
                    CreateTime = a.CreateTime,
                    UpdateTime = a.UpdateTime,
                        CheckUserName = e.RealName,
                        CheckTime = a.CheckTime
                    })
                    .OrderByDescending(a => a.CreateTime)
                    .ToOffsetPage(page, limit, ref total);
                count = total;
                    CheckUserName = e.RealName,
                    CheckTime = a.CheckTime
                })
                .OrderByDescending(a => a.CreateTime)
                .ToPageListAsync(model.Page, model.Limit, count);
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return data;
        }
        //获取添加/编辑出库单时选择物料明细信息
@@ -1908,33 +1902,23 @@
        /// <param name="limit">零托标记</param> 
        /// <param name="count">零托标记</param> 
        /// <returns></returns>
        public List<DataStockDetail> GetPalletNoOutList(string skuNo, string skuName, string palletNo, string lotNo, string inspectMark, string bitPalletMark, int page, int limit, out int count)
        public async Task<List<DataStockDetail>> GetPalletNoOutList(GetPalletNoOutVm model, RefAsync<int> count)
        {
            Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                   .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), m => m.SkuNo.Contains(model.SkuNo.Trim()))
                   .AndIF(!string.IsNullOrWhiteSpace(model.SkuName), m => m.SkuName.Contains(model.SkuName.Trim()))
                   .AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), m => m.PalletNo.Contains(model.PalletNo.Trim()))
                   .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), m => m.LotNo.Contains(model.LotNo.Trim()))
                   .AndIF(!string.IsNullOrWhiteSpace(model.InspectMark), m => m.InspectMark == model.InspectMark)
                   .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 == "W01")
                   .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");
            try
            {
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    .AndIF(!string.IsNullOrWhiteSpace(skuNo), m => m.SkuNo.Contains(skuNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(skuName), m => m.SkuName.Contains(skuName.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(palletNo), m => m.PalletNo.Contains(palletNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(lotNo), m => m.LotNo.Contains(lotNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(inspectMark), m => m.InspectMark == inspectMark)
                    .AndIF(!string.IsNullOrWhiteSpace(bitPalletMark), m => m.BitPalletMark == bitPalletMark)
                    .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo))
                    .And(a => a.Status == "0")
                    .And(a => a.WareHouseNo == "W01")
                    .ToExpression();
                var total = 0;
                var data = Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToOffsetPage(page, limit, ref total);
                //data.Select(m => m.Status == "0" && m.IsDel == "0");
                count = total;
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return data;
        }
        //托盘出库
@@ -4325,6 +4309,8 @@
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == soNo).ToList();
                //库存总表信息
                var data = Db.Queryable<DataStock>().Where(m => m.IsDel == "0").ToList();
                //库存明细中检验合格批次集合
                var dataDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.InspectStatus == "1").GroupBy(g => g.LotNo).Select(s => s.LotNo).ToList();
                //库存明细表信息
                var dataBoxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0").ToList();
@@ -4333,8 +4319,10 @@
                foreach (var item in noticeDetail)
                {
                    //验证先进先出原则
                    var forData = data.Where(m => m.SkuNo == item.SkuNo && m.LotNo != item.LotNo && (m.Qty - m.FrozenQty - m.LockQty) > 0 ).Select(m=>m.LotNo).ToList(); //获取当前物料的所有批次信息(排除单据的批次,防止单据所在批次锁定数量后验证小于等于0)
                    //获取当前物料的所有批次信息(排除单据的批次,防止单据所在批次锁定数量后验证小于等于0)
                    var forData = data.Where(m => m.SkuNo == item.SkuNo
                    && m.LotNo != item.LotNo && (m.Qty - m.FrozenQty - m.LockQty) > 0
                    && dataDetail.Contains(m.LotNo)).Select(m=>m.LotNo).ToList();
                    forData.Add(item.LotNo);  //集合添加单据的批次
                    //获取排序后的第一个批次
@@ -4347,15 +4335,37 @@
                    //验证效期优先原则
                    var forDataBox = dataBoxInfo.Where(m => m.SkuNo == item.SkuNo && m.LotNo != item.LotNo && m.Qty > 0).ToList();
                    var expirationTime = dataBoxInfo.Where(m => m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.Qty > 0).OrderBy(m=>m.ExpirationTime).Select(m=>m.ExpirationTime).First();  //获取当前单据批次的最近效期
                    var num = forDataBox.Count(m => m.ExpirationTime > expirationTime); //获取库存中其它批次效期大于当前单据批次的效期数量
                    //判断是否大于0
                    if (num>0)
                    //获取当前单据批次的最近效期
                    var expirationTimedt = dataBoxInfo.Where(m => m.SkuNo == item.SkuNo
                    && m.LotNo == item.LotNo && m.Qty > 0).ToList();
                    if (expirationTimedt.Count > 0)
                    {
                        bl = false;
                        break;
                        var expirationTime = expirationTimedt.OrderBy(m => m.ExpirationTime).Select(m => m.ExpirationTime).First();
                        //获取库存中其它批次效期大于当前单据批次的效期数量
                        var num = forDataBox.Count(m => m.ExpirationTime > expirationTime);
                        //判断是否大于0
                        if (num > 0)
                        {
                            bl = false;
                            break;
                        }
                    }
                    else
                    {
                        var dataDetailtime = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.InspectStatus == "1").
                            Where(m => m.SkuNo == item.SkuNo
                            && m.LotNo == item.LotNo && m.Qty > 0)
                            .OrderBy(m => m.ExpirationTime)
                            .Select(m => m.ExpirationTime).First();
                        var num = forDataBox.Count(m => m.ExpirationTime > dataDetailtime);
                        //判断是否大于0
                        if (num > 0)
                        {
                            bl = false;
                            break;
                        }
                    }
                }
@@ -4394,7 +4404,6 @@
                var exAllotList = new List<BllExportAllot>();
                var assign = new AllotSku();
                var specialSku = new List<string>();//特殊物料集合,无需托盘上全部分配的
                Db.BeginTran();
                try
                {
@@ -4442,12 +4451,6 @@
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList();
                        }
                        if (notice.Type == "1" && !specialSku.Contains(detail.SkuNo))
                        {
                            //分配整个托盘上的物料 只查询未分配的托盘
                            stockDetail = stockDetail.Where(m => m.Status == "0").ToList();
                        }
                        if (stockDetail.Sum(m=>m.Qty-m.LockQty) < needQty)
                        {
                            throw new Exception("库存明细数量不足");
@@ -4465,16 +4468,7 @@
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
                        var qty = 0m;
                        //分配货物
                        if (notice.Type == "1" && !specialSku.Contains(detail.SkuNo))//判断是否未领料出库
                        {
                            //分配四楼备料投料的物料
                            qty += assign.LingLiaoAllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic);
                        }
                        else
                        {
                            qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic);
                        }
                        qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic, detail.LotNo, detail.IsMixBox);
                        foreach (var sc in stockQtyDic)
                        {
                            var s = stockDetail.FirstOrDefault(m => m.Id == sc.Key);
@@ -4532,7 +4526,9 @@
                        if (qty > detail.Qty)
                        {
                            //库存总表
                            var stock = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo);
                            var stock = Db.Queryable<DataStock>().First(d => d.IsDel == "0"
                            && d.SkuNo == detail.SkuNo
                            && d.LotNo == detail.LotNo);
                            stock.LockQty += qty-detail.Qty;
                            Db.Updateable(stock).ExecuteCommand();
@@ -4593,7 +4589,8 @@
                    var zd = Db.Updateable(notice).ExecuteCommand();
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "分配", $"自动分配了单据号为{notice.SONo}的单据信息", userId);
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据",
                        notice.SONo, "分配", $"自动分配了单据号为{notice.SONo}的单据信息", userId);
                    if (zd > 0 && mx > 0 && fp > 0 && k)
                    {