2024-09-27 18:17:21 +08:00
|
|
|
|
using Microsoft.SqlServer.Dts.Runtime;
|
|
|
|
|
|
using Model;
|
|
|
|
|
|
using System;
|
2024-09-18 10:48:34 +08:00
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
2024-09-27 18:17:21 +08:00
|
|
|
|
using System.Text.RegularExpressions;
|
2024-09-18 10:48:34 +08:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace BLL
|
|
|
|
|
|
{
|
|
|
|
|
|
public class TwArrivalStatisticsService
|
|
|
|
|
|
{
|
2024-09-27 18:17:21 +08:00
|
|
|
|
public static List<Tw_ArrivalStatisticsOutPut> GetStatistics(string projectid,string materialCode)
|
2024-09-18 10:48:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
|
|
|
|
|
{
|
2024-10-09 17:20:12 +08:00
|
|
|
|
///所需材料数量列表
|
2024-09-18 10:48:34 +08:00
|
|
|
|
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,
|
|
|
|
|
|
};
|
2024-10-09 17:20:12 +08:00
|
|
|
|
///实际材料入库数量列表
|
2024-09-18 10:48:34 +08:00
|
|
|
|
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,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-09-27 18:17:21 +08:00
|
|
|
|
var StatisticsList =(from x in NeedOutMateriaList
|
2024-09-18 10:48:34 +08:00
|
|
|
|
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()
|
2024-10-09 17:20:12 +08:00
|
|
|
|
join m in db.Tw_MaterialStock on x.Key equals m.PipeLineMatCode into mm
|
|
|
|
|
|
from m in mm.DefaultIfEmpty()
|
2024-09-27 18:17:21 +08:00
|
|
|
|
select new Tw_ArrivalStatisticsOutPut
|
2024-09-18 10:48:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
MaterialCode = x.Key,
|
2024-10-09 17:20:12 +08:00
|
|
|
|
StockNum = m==null?0: (decimal)m.StockNum,
|
2024-09-18 10:48:34 +08:00
|
|
|
|
NeedNum = x.NeedNum,
|
|
|
|
|
|
RealNum = y==null?0:y.RealNum,
|
|
|
|
|
|
MaterialName = z.MaterialName,
|
|
|
|
|
|
MaterialSpec=z.MaterialSpec,
|
|
|
|
|
|
MaterialUnit=z.MaterialUnit,
|
2024-09-27 18:17:21 +08:00
|
|
|
|
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 ;
|
2024-09-18 10:48:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-09-27 18:17:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static List<Tw_PipeMatMatchOutput> GetPipeMatMatch(string projectid, List<string> pipelineIds,string WarehouseCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
|
|
|
|
|
{
|
|
|
|
|
|
var results = new List<Tw_PipeMatMatchOutput>();
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所需材料列表
|
|
|
|
|
|
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
|
2024-10-09 17:20:12 +08:00
|
|
|
|
join m in db.WBS_UnitWork on z.UnitWorkId equals m.UnitWorkId
|
2024-09-27 18:17:21 +08:00
|
|
|
|
where z.ProjectId == projectid && pipelineIds.Contains(z.PipelineId)
|
|
|
|
|
|
select new Tw_PipeMatMatchOutput
|
|
|
|
|
|
{
|
|
|
|
|
|
Id= Guid.NewGuid().ToString(),
|
|
|
|
|
|
PipelineId =x.PipelineId,
|
|
|
|
|
|
PipelineCode=z.PipelineCode,
|
2024-10-09 17:20:12 +08:00
|
|
|
|
UnitWorkId=z.UnitWorkId,
|
|
|
|
|
|
UnitWorkName=m.UnitWorkName,
|
2024-09-27 18:17:21 +08:00
|
|
|
|
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 List<Tw_PipeMatMatchOutput> GetMatMatchByOutPlanMasterId(string outPlanMasterId)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
|
|
|
|
|
{
|
|
|
|
|
|
var results = new List<Tw_PipeMatMatchOutput>();
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所需材料列表
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-18 10:48:34 +08:00
|
|
|
|
}
|