using Model; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Media.Animation; namespace BLL { public class TwArrivalStatisticsService { public static List GetStatistics(string projectid,string materialCode,string WarehouseCode) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { ///所需材料数量列表 var NeedOutMateriaList = from x in db.HJGL_PipeLineMat join y in db.HJGL_MaterialCodeLib on x.MaterialCode equals y.MaterialCode join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId where z.ProjectId == projectid && (string.IsNullOrEmpty(materialCode) || x.MaterialCode .Contains( materialCode)) group x by x.MaterialCode into g select new { g.Key, NeedNum = g.Sum(x => x.Number) ?? 0, }; ///实际材料入库数量列表 var RealInMateriaList = from x in db.Tw_InputDetail join y in db.HJGL_MaterialCodeLib on x.MaterialCode equals y.MaterialCode group x by x.MaterialCode into g where (string.IsNullOrEmpty(materialCode) || g.Key.Contains( materialCode)) select new { g.Key, RealNum = g.Sum(x => x.ActNum) ?? 0, }; var tw_MaterialStock=from x in db.Tw_MaterialStock where x.WarehouseCode==WarehouseCode select x; var StatisticsList =(from x in NeedOutMateriaList join y in RealInMateriaList on x.Key equals y.Key into gg from y in gg.DefaultIfEmpty() join z in db.HJGL_MaterialCodeLib on x.Key equals z.MaterialCode into zz from z in zz.DefaultIfEmpty() join m in tw_MaterialStock on x.Key equals m.PipeLineMatCode into mm from m in mm.DefaultIfEmpty() select new Tw_ArrivalStatisticsOutPut { MaterialCode = x.Key, StockNum = m==null?0: (decimal)m.StockNum, NeedNum = x.NeedNum, RealNum = y==null?0:y.RealNum, MaterialName = z.MaterialName, MaterialSpec=z.MaterialSpec, MaterialUnit=z.MaterialUnit, MaterialDef = z.MaterialDef, MatchRate = (x.NeedNum == 0 ?0:Math.Round((y == null ? 0 : y.RealNum) / x.NeedNum, 4,MidpointRounding.ToEven)), }).ToList(); foreach (var item in StatisticsList) { item.MatchRateString = Math.Round(item.MatchRate*100, 2).ToString()+"%" ; } return StatisticsList ; } } public static List GetPipeMatMatch(string projectid, List pipelineIds,string WarehouseCode) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var results = new List(); // 获取所需材料列表 var requiredMaterials = (from x in db.HJGL_PipeLineMat join y in db.HJGL_MaterialCodeLib on x.MaterialCode equals y.MaterialCode join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId where z.ProjectId == projectid && pipelineIds.Contains(z.PipelineId) && x.PrefabricatedComponents!= "" //x.PrefabricatedComponents!="" 用于筛选非散件材料 select new Tw_PipeMatMatchOutput { Id= Guid.NewGuid().ToString(), PipelineId =x.PipelineId, PipelineCode=z.PipelineCode, UnitWorkId=z.UnitWorkId, UnitWorkName=m.UnitWorkName, PrefabricatedComponents=x.PrefabricatedComponents, MaterialCode = x.MaterialCode, MaterialName= y.MaterialName, MaterialSpec= y.MaterialSpec, MaterialUnit= y.MaterialUnit, MaterialDef= y.MaterialDef, NeedNum=x.Number, } ).ToList(); Tw_MaterialStockOutput tw_MaterialStockOutput=new Tw_MaterialStockOutput(); tw_MaterialStockOutput .WarehouseCode=WarehouseCode; var stockList= TwMaterialstockService.GetTw_MaterialStockByModle(tw_MaterialStockOutput).ToList();//获取库存列表 // 模拟库存管理 foreach (var material in requiredMaterials) { var thisMaterialStockNum = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode)?.StockNum??0; if (thisMaterialStockNum >= material.NeedNum) { material.MatchNum=material.NeedNum; material.MatchRate=1; material.MatchRateString="100%"; } else { material.MatchNum = thisMaterialStockNum<0?0:thisMaterialStockNum; material.MatchRate = (material.NeedNum == 0 ? 0 : material.MatchNum??0 / material.NeedNum); material.MatchRateString = Math.Round((decimal)material.MatchRate * 100, 2).ToString() + "%"; } //修改stockList对应的库存数量 var stock = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode); if (stock != null) { stock.StockNum -= material.MatchNum; } } results = requiredMaterials; return results; } } public static decimal? GetPipeMatch(string pipelineId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var twPipeMatMatchOutputs = new List(); var pipelineModel = PipelineService.GetPipelineByPipelineId(pipelineId); string warehouseCode = PipelineService .GetPipeArea().FirstOrDefault(x => x.Value == pipelineModel.PipeArea.ToString()) ?.Text; // 获取所需材料列表 var requiredMaterials = (from x in db.HJGL_PipeLineMat join y in db.HJGL_MaterialCodeLib on x.MaterialCode equals y.MaterialCode join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId where z.PipelineId== pipelineId && x.PrefabricatedComponents != "" //x.PrefabricatedComponents!="" 用于筛选非散件材料 select new Tw_PipeMatMatchOutput { Id = Guid.NewGuid().ToString(), PipelineId = x.PipelineId, PipelineCode = z.PipelineCode, UnitWorkId = z.UnitWorkId, UnitWorkName = m.UnitWorkName, PrefabricatedComponents = x.PrefabricatedComponents, MaterialCode = x.MaterialCode, MaterialName = y.MaterialName, MaterialSpec = y.MaterialSpec, MaterialUnit = y.MaterialUnit, MaterialDef = y.MaterialDef, NeedNum = x.Number, } ).ToList(); Tw_MaterialStockOutput tw_MaterialStockOutput = new Tw_MaterialStockOutput(); tw_MaterialStockOutput.WarehouseCode = warehouseCode; var stockList = TwMaterialstockService.GetTw_MaterialStockByModle(tw_MaterialStockOutput).ToList();//获取库存列表 // 模拟库存管理 foreach (var material in requiredMaterials) { var thisMaterialStockNum = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode)?.StockNum ?? 0; if (thisMaterialStockNum >= material.NeedNum) { material.MatchNum = material.NeedNum; material.MatchRate = 1; material.MatchRateString = "100%"; } else { material.MatchNum = thisMaterialStockNum < 0 ? 0 : thisMaterialStockNum; material.MatchRate = (material.NeedNum == 0 ? 0 : material.MatchNum ?? 0 / material.NeedNum); material.MatchRateString = Math.Round((decimal)material.MatchRate * 100, 2).ToString() + "%"; } //修改stockList对应的库存数量 var stock = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode); if (stock != null) { stock.StockNum -= material.MatchNum; } } twPipeMatMatchOutputs = requiredMaterials; var result = twPipeMatMatchOutputs.Count==0?0: twPipeMatMatchOutputs.Sum(x=>x.MatchRate)/ twPipeMatMatchOutputs.Count; return result; } } public static List GetMatMatchByOutPlanMasterId(string outPlanMasterId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var results = new List(); // 获取所需材料列表 var requiredMaterials = (from x in db.Tw_InOutPlanDetail_Relation join master in db.Tw_InOutPlanMaster on x.InOutPlanMasterId equals master.Id join y in db.HJGL_MaterialCodeLib on x.MaterialCode equals y.MaterialCode join z in db.HJGL_Pipeline on x.PipelineId equals z.PipelineId where x.InOutPlanMasterId == outPlanMasterId select new Tw_PipeMatMatchOutput { Id = Guid.NewGuid().ToString(), PipelineId = x.PipelineId, PipelineCode = z.PipelineCode, PrefabricatedComponents = x.PrefabricatedComponents, MaterialCode = x.MaterialCode, MaterialName = y.MaterialName, MaterialSpec = y.MaterialSpec, MaterialUnit = y.MaterialUnit, MaterialDef = y.MaterialDef, NeedNum = x.Number, } ).ToList(); var masterModle = db.Tw_InOutPlanMaster.FirstOrDefault(x => x.Id == outPlanMasterId); Tw_MaterialStockOutput tw_MaterialStockOutput = new Tw_MaterialStockOutput(); tw_MaterialStockOutput.WarehouseCode = masterModle.WarehouseCode; var stockList = TwMaterialstockService.GetTw_MaterialStockByModle(tw_MaterialStockOutput).ToList();//获取库存列表 // 模拟库存管理 foreach (var material in requiredMaterials) { var thisMaterialStockNum = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode)?.StockNum ?? 0; if (thisMaterialStockNum >= material.NeedNum) { material.MatchNum = material.NeedNum; material.MatchRate = 1; material.MatchRateString = "100%"; } else { material.MatchNum = thisMaterialStockNum < 0 ? 0 : thisMaterialStockNum; material.MatchRate = (material.NeedNum == 0 ? 0 : material.MatchNum ?? 0 / material.NeedNum); material.MatchRateString = Math.Round((decimal)material.MatchRate * 100, 2).ToString() + "%"; } //修改stockList对应的库存数量 var stock = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode); if (stock != null) { stock.StockNum -= material.MatchNum; } } results = requiredMaterials; return results; } } } }