| | |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1", |
| | | IsMixBox = d.IsMixBox, |
| | | |
| | | OrderDetailCode = d.OrderDetailCode, |
| | | |
| | |
| | | var item = new BllExportNoticeDetail() |
| | | { |
| | | SONo = billNo, |
| | | OrderDetailCode=d.OrderDetailCode, |
| | | OrderDetailCode = d.OrderDetailCode, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1", |
| | | IsMixBox = d.IsMixBox, |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | |
| | | |
| | | #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; |
| | | } |
| | | |
| | | //获取添加/编辑出库单时选择物料明细信息 |
| | |
| | | /// <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; |
| | | } |
| | | |
| | | //托盘出库 |
| | |
| | | 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(); |
| | | |
| | |
| | | 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); //集合添加单据的批次 |
| | | //获取排序后的第一个批次 |
| | |
| | | |
| | | //验证效期优先原则 |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | var exAllotList = new List<BllExportAllot>(); |
| | | var assign = new AllotSku(); |
| | | var specialSku = new List<string>();//特殊物料集合,无需托盘上全部分配的 |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | |
| | | { |
| | | 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("库存明细数量不足"); |
| | |
| | | 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); |
| | |
| | | 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(); |
| | | |
| | |
| | | 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) |
| | | { |