var instock = _context.siger_project_preset_separeparttooling_inwarehouse.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid);
var outstock = _context.siger_project_preset_separeparttooling_outwarehouse.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid);
var purchasestock = _context.siger_project_preset_separeparttooling_purchasemanage.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid && a.state == (int)RowState.Invalid);
var stockBaseInfo = _context.siger_project_preset_separeparttooling.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid);
var groupPurchase = (from puc in purchasestock
group puc by puc.sptoolingid into temp
select new
{
sptoolingid = temp.Key,
purnum = temp.Sum(a => a.purchasenum)
}).ToList();
var groupInstock = (from ins in instock
group ins by new { ins.sptoolingid, ins.storageid } into temp
select new
{
sptoolingid = temp.Key.sptoolingid,
storageid = temp.Key.storageid,
instock = temp.Sum(a => a.num)
}).ToList();
var groupOutstock = (from ous in outstock
group ous by new { ous.sptoolingid, ous.storageid } into temp
select new
{
sptoolingid = temp.Key.sptoolingid,
storageid = temp.Key.storageid,
outstock = temp.Sum(a => a.num)
}).ToList();
var groupResult = (from gins in groupInstock
join gous in groupOutstock on new { gins.sptoolingid, gins.storageid } equals new { gous.sptoolingid, gous.storageid }
into temp
from s in temp.DefaultIfEmpty()
select new
{
sptoolingid = gins.sptoolingid,
storageid = gins.storageid,
stock = gins.instock - (s == null ? 0 : s.outstock)
}).ToList();
var queryList = (from main in stockBaseInfo
join pur in groupPurchase.AsQueryable() on main.id equals pur.sptoolingid into purtemp
from pur in purtemp.DefaultIfEmpty()
join sto in groupResult.AsQueryable() on main.id equals sto.sptoolingid into stotemp
from sto in stotemp.DefaultIfEmpty()
select new ResponsePresetStockForDashboard
{
name = main.sptoolingname,
code = main.sptoolingcode,
num = sto == null ? 0 : sto.stock,
purnum = main.maxstorage - (sto == null ? 0 : sto.stock) - (pur == null ? 0 : pur.purnum),
onwaynum = pur == null ? 0 : pur.purnum,
minstorage = main.minstorage
});
var count = queryList.Count();
Expression<Func<ResponsePresetStockForDashboard, bool>> WarningDataExpression = q => true;
if (count != 0 )
{
WarningDataExpression = q => q.num + q.onwaynum < q.minstorage;
}
var result = queryList.Where(WarningDataExpression).ToList();
return result;