using AutoMapper; using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Excel; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Core.Utilities; using WIDESEA_DTO.Stock; using WIDESEA_IBasicRepository; using WIDESEA_IRecordRepository; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_StockRepository; namespace WIDESEA_StockService { public partial class StockInfoService : ServiceBase, IStockInfoService { /// /// 根据托盘号查询库存 /// /// /// public Dt_StockInfo? GetStockByPalletCode(string palletCode) { Dt_StockInfo stockInfo = BaseDal.QueryFirst(x => x.PalletCode == palletCode); if (stockInfo != null) { stockInfo.Details = _stockRepository.StockInfoDetailRepository.QueryData(x => x.StockId == stockInfo.Id); } return stockInfo; } public void AddMaterielGroup(Dt_StockInfo stockInfo) { decimal beforeQuantity = 0; List details = new List(); if (stockInfo.Id == 0) { BaseDal.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); details = stockInfo.Details; } else { beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); for (int i = 0; i < stockInfo.Details.Count; i++) { if (stockInfo.Details[i].Id == 0) { details.Add(_stockRepository.StockInfoDetailRepository.Db.Insertable(stockInfo.Details[i]).ExecuteReturnEntity()); } } } stockInfo.Details = details; _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup); } public List GetUseableStocks(string materielCode) { List roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos; List warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds; List areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds); List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds); return BaseDal.GetStockInfos(materielCode, locationCodes); } public List GetStockSelectViews(string materielCode) { List roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos; List warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds; List areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds); List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds); return BaseDal.QueryTabs((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO { LocationCode = a.LocationCode, MaterielCode = b.MaterielCode, MaterielName = b.MaterielName, PalletCode = a.PalletCode, UseableQuantity = b.StockQuantity - b.OutboundQuantity }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO { LocationCode = x.FirstOrDefault()?.LocationCode ?? "", MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", MaterielName = x.FirstOrDefault()?.MaterielName ?? "", PalletCode = x.Key, UseableQuantity = x.Sum(x => x.UseableQuantity) }).ToList(); } public List GetOutboundStocks(List stockInfos, string materielCode, decimal needQuantity, out decimal residueQuantity) { List outStocks = new List(); decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x); stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); if (stockTotalQuantity >= needQuantity)//库存够 { int index = 0; while (needQuantity > 0) { Dt_StockInfo stockInfo = stockInfos[index]; decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); if (useableStockQuantity < needQuantity) { stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); needQuantity -= useableStockQuantity; } else { stockInfo.Details.ForEach(x => { if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) { if (x.StockQuantity - x.OutboundQuantity >= needQuantity) { x.OutboundQuantity += needQuantity; needQuantity = 0; } else { needQuantity -= (x.StockQuantity - x.OutboundQuantity); x.OutboundQuantity = x.StockQuantity; } } }); } outStocks.Add(stockInfo); index++; } } else { for (int i = 0; i < stockInfos.Count; i++) { Dt_StockInfo stockInfo = stockInfos[i]; decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); if (useableStockQuantity < needQuantity) { stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); needQuantity -= useableStockQuantity; } else { stockInfo.Details.ForEach(x => { if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) { if (x.StockQuantity - x.OutboundQuantity >= needQuantity) { x.OutboundQuantity += needQuantity; needQuantity = 0; } else { needQuantity -= (x.StockQuantity - x.OutboundQuantity); x.OutboundQuantity = x.StockQuantity; } } }); } outStocks.Add(stockInfo); } } residueQuantity = needQuantity; return outStocks; } /// /// 删除数据 /// /// 主键数组 /// public virtual WebResponseContent DeleteData(object[] keys) { try { List stockList = BaseDal.QureyDataByIds(keys); var stokd= stockList.Where(x=>x.StockStatus != (int)StockStatusEmun.组盘暂存).ToList(); if(stokd.Count > 0 ) { return WebResponseContent.Instance.Error("删除失败!只能删除“组盘暂存”的信息"); } foreach (var item in stockList) { var stodet=_stockRepository.StockInfoDetailRepository.QueryFirst(x => x.StockId == item.Id); _stockRepository.StockInfoDetailRepository.DeleteData(stodet); } if (typeof(Dt_StockInfodt).GetNavigatePro() == null) return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error(); else { if (keys != null) { Type detailType = typeof(Dt_StockInfodt).GetDetailType(); string name = typeof(Dt_StockInfodt).GetMainIdByDetail(); List dynamicDelKeys = new List(); for (int i = 0; i < keys.Length; i++) { dynamicDelKeys.Add(keys[i]); } ((SqlSugarClient)BaseDal.Db).BeginTran(); if (dynamicDelKeys.Count > 0) BaseDal.Db.Deleteable().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange(); BaseDal.DeleteDataByIds(keys); ((SqlSugarClient)BaseDal.Db).CommitTran(); return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error("参数错误"); } } } catch (Exception ex) { ((SqlSugarClient)BaseDal.Db).RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } //导出 public override WebResponseContent Export(PageDataOptions options) { WebResponseContent content = new WebResponseContent(); try { string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport"; IExporter exporter = new ExcelExporter(); //添加条件 string wheres = options.ValidatePageOptions(TProperties); //获取排序字段 Dictionary orderbyDic = options.GetPageDataSort(TProperties); List entities = BaseDal.QueryData(wheres, orderbyDic); List detdata = _stockInfoDetail.QueryData(); List stolist= new List(); for (int i = 0; i < entities.Count; i++) { Dt_StockInfoDetail dt_StockIndet = detdata.Where(x => x.StockId == entities[i].Id).FirstOrDefault(); string MaterialTypet = "原材料"; if (entities[i].MaterialType == (int)InventoryMaterialType.成品) { MaterialTypet = "成品"; } else if(entities[i].MaterialType == (int)InventoryMaterialType.空托) { MaterialTypet = "空托"; } string Wlstatust = "待检"; if (entities[i].Wlstatus== (int)InventoryMaterialStatus.合格) { Wlstatust = "合格"; } else if (entities[i].Wlstatus == (int)InventoryMaterialStatus.不合格) { Wlstatust = "不合格"; } else if (entities[i].Wlstatus == (int)InventoryMaterialStatus.空托) { Wlstatust = "空托"; } else if (entities[i].Wlstatus == (int)InventoryMaterialStatus.退货) { Wlstatust = "退货"; } else if (entities[i].Wlstatus == (int)InventoryMaterialStatus.返工) { Wlstatust = "返工"; } else if (entities[i].Wlstatus == (int)InventoryMaterialStatus.特采) { Wlstatust = "特采"; } Dt_StockInfodt dt_ = new Dt_StockInfodt() { PalletCode = entities[i].PalletCode, MaterialType = MaterialTypet, LocationCode = entities[i].LocationCode, Wlstatus = Wlstatust, MaterielCode = dt_StockIndet?.MaterielCode ?? "", // 如果 dt_StockIndet 为 null,使用空字符串作为默认值 MaterielName = dt_StockIndet?.MaterielName ?? "", OrderNo = dt_StockIndet?.OrderNo ?? "", BatchNo = dt_StockIndet?.BatchNo ?? "", SerialNumber = dt_StockIndet?.SerialNumber ?? "", StockQuantity = dt_StockIndet?.StockQuantity ?? 0, // 假设 StockQuantity 是数值类型,使用 0 作为默认值 BatchNoName = dt_StockIndet?.BatchNoName ?? "", CreateDate = dt_StockIndet?.CreateDate ?? DateTime.MinValue, // 假设 CreateDate 是日期类型,使用默认时间 Remark = entities[i].Remark, }; stolist.Add(dt_); } byte[] data = exporter.ExportAsByteArray(stolist).Result; string fileName = "1.xlsx"; FileHelper.WriteFile(savePath, fileName, data); content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } public class Dt_StockInfodt: Dt_StockInfoDetail { [ExporterHeader(DisplayName = "托盘编号")] public string PalletCode { get; set; } [ExporterHeader(DisplayName = "类型")] public string MaterialType { get; set; } [ExporterHeader(DisplayName = "货位编号")] public string LocationCode { get; set; } [ExporterHeader(DisplayName = "物料状态")] public string Wlstatus { get; set; } } } }