Compare commits
2 Commits
ee7d29015f
...
1e3ba03c5c
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e3ba03c5c | |||
| eeb837f32e |
+38
-1
@@ -79,10 +79,47 @@ public class ExpirePendingOrdersService : BackgroundService
|
|||||||
// آزادسازی رزرو موجودی
|
// آزادسازی رزرو موجودی
|
||||||
foreach (var detail in order.OrderDetails)
|
foreach (var detail in order.OrderDetails)
|
||||||
{
|
{
|
||||||
|
var inventoryItem = await inventoryService.GetInventoryAsync(
|
||||||
|
detail.ProductId,
|
||||||
|
ProductType.DiscountProduct,
|
||||||
|
null,
|
||||||
|
cancellationToken);
|
||||||
|
|
||||||
|
if (inventoryItem == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning(
|
||||||
|
"Skipping inventory release for expired order #{OrderId}, ProductId={ProductId} because InventoryItem was not found",
|
||||||
|
order.Id,
|
||||||
|
detail.ProductId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inventoryItem.ReservedQuantity <= 0)
|
||||||
|
{
|
||||||
|
_logger.LogInformation(
|
||||||
|
"Skipping inventory release for expired order #{OrderId}, ProductId={ProductId} because no reserved quantity remains",
|
||||||
|
order.Id,
|
||||||
|
detail.ProductId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseQuantity = Math.Min(detail.Count, inventoryItem.ReservedQuantity);
|
||||||
|
|
||||||
|
if (releaseQuantity < detail.Count)
|
||||||
|
{
|
||||||
|
_logger.LogWarning(
|
||||||
|
"Partial reservation release for expired order #{OrderId}, ProductId={ProductId}: requested={Requested}, reserved={Reserved}, releasing={Released}",
|
||||||
|
order.Id,
|
||||||
|
detail.ProductId,
|
||||||
|
detail.Count,
|
||||||
|
inventoryItem.ReservedQuantity,
|
||||||
|
releaseQuantity);
|
||||||
|
}
|
||||||
|
|
||||||
await inventoryService.ReleaseReservationAsync(
|
await inventoryService.ReleaseReservationAsync(
|
||||||
detail.ProductId,
|
detail.ProductId,
|
||||||
ProductType.DiscountProduct,
|
ProductType.DiscountProduct,
|
||||||
detail.Count,
|
releaseQuantity,
|
||||||
order.Id,
|
order.Id,
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -249,14 +249,23 @@ public class InventoryService : IInventoryService
|
|||||||
|
|
||||||
var quantityBefore = item.ReservedQuantity;
|
var quantityBefore = item.ReservedQuantity;
|
||||||
item.ReservedQuantity = Math.Max(0, item.ReservedQuantity - quantity);
|
item.ReservedQuantity = Math.Max(0, item.ReservedQuantity - quantity);
|
||||||
|
var releasedQuantity = quantityBefore - item.ReservedQuantity;
|
||||||
|
|
||||||
await _context.SaveChangesAsync(ct);
|
await _context.SaveChangesAsync(ct);
|
||||||
|
|
||||||
|
if (releasedQuantity == 0)
|
||||||
|
{
|
||||||
|
_logger.LogInformation(
|
||||||
|
"No reserved units to release for {ProductType} Id={ProductId}, OrderId={OrderId}",
|
||||||
|
productType, productId, orderId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// ثبت StockMovement
|
// ثبت StockMovement
|
||||||
await LogMovementAsync(
|
await LogMovementAsync(
|
||||||
item.Id,
|
item.Id,
|
||||||
StockMovementType.Released,
|
StockMovementType.Released,
|
||||||
quantity,
|
-releasedQuantity,
|
||||||
quantityBefore,
|
quantityBefore,
|
||||||
item.ReservedQuantity,
|
item.ReservedQuantity,
|
||||||
orderId,
|
orderId,
|
||||||
@@ -268,7 +277,7 @@ public class InventoryService : IInventoryService
|
|||||||
|
|
||||||
_logger.LogInformation(
|
_logger.LogInformation(
|
||||||
"Released {Quantity} reserved units for {ProductType} Id={ProductId}, OrderId={OrderId}",
|
"Released {Quantity} reserved units for {ProductType} Id={ProductId}, OrderId={OrderId}",
|
||||||
quantity, productType, productId, orderId);
|
releasedQuantity, productType, productId, orderId);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user