@@ -244,5 +244,61 @@ from sa in sai.DefaultIfEmpty()
244
244
245
245
return Ok ( result ) ;
246
246
}
247
+
248
+ [ HttpGet ( "Material/OverTime/{materialId}" ) ]
249
+ [ HttpGet ( "Material/OverTime/{materialId}/{dealerId}" ) ]
250
+ public async Task < IActionResult > GetMaterialAmountOverTime ( [ FromRoute ] int materialId , [ FromRoute ] int ? dealerId = null , [ FromQuery ] DateTime ? start = null , [ FromQuery ] DateTime ? end = null ) {
251
+ var startDate = start ?? DateTime . Now . Date ;
252
+ var endDate = end ?? DateTime . Now . Date ;
253
+ dealerId = dealerId ?? 1 ;
254
+ var beforeAmount = (
255
+ from DealItem in _context . DealItem
256
+ join Deal in _context . Deal on DealItem . DealId equals Deal . Id
257
+ where DealItem . MaterialId == materialId
258
+ where Deal . DealTime . Date < startDate . Date
259
+ where Deal . SellerId == dealerId || Deal . BuyerId == dealerId
260
+ let coef = Deal . SellerId == dealerId ? - 1 : 1
261
+ select DealItem . Quantity * coef
262
+ ) . DefaultIfEmpty ( 0 ) . Sum ( ) ;
263
+
264
+ var amounts = (
265
+ from DealItem in _context . DealItem
266
+ join Deal in _context . Deal on DealItem . DealId equals Deal . Id
267
+ where DealItem . MaterialId == materialId
268
+ where Deal . DealTime . Date >= startDate . Date && Deal . DealTime . Date <= endDate
269
+ where Deal . SellerId == dealerId || Deal . BuyerId == dealerId
270
+ let coef = Deal . SellerId == dealerId ? - 1 : 1
271
+ group new { Deal = Deal , DealItem = DealItem , coef = coef } by Deal . DealTime . Date into gg
272
+ select new AmountOverDate {
273
+ Date = gg . Key . Date ,
274
+ Amount = gg . Select ( u => new { u . DealItem , u . coef } ) . Select ( u => u . DealItem . Quantity * u . coef ) . DefaultIfEmpty ( 0 ) . Sum ( )
275
+ }
276
+ ) . ToList ( ) ;
277
+
278
+ var dates = Enumerable . Range ( 0 , ( int ) ( endDate - startDate ) . TotalDays + 1 )
279
+ . Select ( x => startDate . AddDays ( x ) )
280
+ . ToList ( ) ;
281
+
282
+ amounts = ( from date in dates
283
+ join a in amounts on date . Date equals a . Date into iAmount
284
+ from Amount in iAmount . DefaultIfEmpty ( )
285
+ select new AmountOverDate {
286
+ Date = date . Date ,
287
+ Amount = Amount ? . Amount ?? 0
288
+ } ) . OrderBy ( u => u . Date ) . ToList ( ) ;
289
+
290
+ amounts . ForEach ( u => {
291
+ u . Amount += beforeAmount ;
292
+ beforeAmount = u . Amount ;
293
+ } ) ;
294
+
295
+ return Ok ( amounts ) ;
296
+ }
297
+
298
+ private class AmountOverDate
299
+ {
300
+ public DateTime Date { get ; set ; }
301
+ public decimal Amount { get ; set ; }
302
+ }
247
303
}
248
304
}
0 commit comments