我们正在运行一个石英作业,以触发一条命令,该命令最终会在某些条件下每天更新n个订单的状态(到期和逾期)。 作业运行正常并每天触发命令,但是在执行操作(即更新订单状态)时,存在不一致 就像有一天会更新状态,而有一天会错过状态。
代码如下
CommandHandler处理来自作业的命令:
public void Handle(SetOrderProgressStatusUpdateCommand command)
{
var updater = new StatusUpdater(dbContext);
updater.OrderPackageProgress.SetNewOverdue();
updater.OrderPackageProgress.SetUpdatedOverdue();
updater.OrderPackageProgress.SetSentOverdue();
updater.MainComponentArrivalProgress.SetNotArrivedOverdue();
updater.TagCompositionProgress.SetNotSecuredOverdue();
updater.CounterSampleProgress.SetOrderedOverdue();
updater.CounterSampleProgress.SetReceivedOverdue();
updater.ProductionStartProgress.SetNotStartedOverdue();
updater.ProductionSampleProgress.SetOrderedOverdue();
updater.ProductionSampleProgress.SetReceivedOverdue();
updater.ProductionStartProgress.SetNotStartedDue();
updater.MainComponentArrivalProgress.SetNotArrivedDue();
updater.OrderPackageProgress.SetCancelledNotSentOverdue();
updater.OrderPackageProgress.SetCancelledSentOverdue();
if (featureAccessManager.IsAvailable(FeatureKey.Deadlines))
{
updater.ProductionStartDateSetProgresss.SetDateNotSetOverdue();
updater.ProductionStartDateSetProgresss.SetDateNotSetDue();
updater.MainComponentArrivalDateSetProgress.SetArrivalDateNotSetDue();
updater.MainComponentArrivalDateSetProgress.SetArrivalDateNotsetOverdue();
updater.ProductionUnitProgress.SetAssignementInvalidDue();
updater.ProductionUnitProgress.SetAssignementInvalidOverdue();
updater.ProductionUnitProgress.SetNotAssignedDue();
updater.ProductionUnitProgress.SetNotAssignedOverdue();
updater.ProductionUnitProgress.SetQuantityDiffDue();
updater.ProductionUnitProgress.SetQuantityDiffOverdue();
updater.CounterSampleDateSetProgress.SetApprovedDateNotSetDue();
updater.CounterSampleDateSetProgress.SetApprovedDateNotSetOverdue();
updater.CounterSampleDateSetProgress.SetNotOrderedDue();
updater.CounterSampleDateSetProgress.SetNotOrderedOverdue();
updater.CounterSampleDateSetProgress.SetOrderedDue();
updater.CounterSampleDateSetProgress.SetReceivedDue();
}
}
内部每种方法都有针对特定状态的过滤器和操作,例如:
public void SetNewOverdue()
{
Expression<Func<OrderProgressStatusUpdate, bool>> filter =
x =>
x.Deadline.OrderPackageSentDueDate < StatusUpdater.Today &&
x.Status.OrderPackageProgressName == "New";
Action<OrderProgressStatus> action = status => status.SetOrderPackageProgressNewOverdue();
StatusUpdater.SetProgressOverdue(filter, action);
}
That eventually calls the SetProgressOverdue method and that performs the actual action based on the filter.
Code inside that method looks like this :
public static void SetProgressOverdue(Expression<Func<OrderProgressStatusUpdate, bool>> where, `enter code here`Action<OrderProgressStatus> action)
{
var orderProgressStatuses = dbContext.OrderProgressStatuses
.Join(dbContext.OrderDeadlines, status => status.OrderId, deadline => deadline.OrderId,
(status, deadline) => new OrderProgressStatusUpdate { Status = status, Deadline = deadline })
.Where(where)
.Select(x => x.Status).ToList();
orderProgressStatuses.ForEach(action);
}
示例:
调用SetNewOverdue()方法时,它将过滤器和操作发送到方法SetProgressOverdue(filter,action), 在基于过滤器的方法中,我们获取当天的合格订单并使用ForEach方法更新状态。 如果有10个SetNewOverdue订单,则ForEach方法将调用该动作(即SetOrderPackageProgressNewOverdue())10次。
我们有两个桌子 1.OrderProgressStatus:保持订单状态,如OrderProgressname和OrderProgressText 2.OrderDeadLine:保留“截止期限”详细信息,表示应该到期和逾期的DateTime。
让我们考虑: 我有一些OrderId,今天是截止日期,那么对于所有这些Orderid,状态应更改为Due(到期),明天(明天)更改为过期。
2C8B329A-73AB-4584-AD92-CC08E55D4CDF 3C8B329A-73AB-4584-AD92-CC08E55D4CDF 4C8B329A-73AB-4584-AD92-CC08E55D4CDF 5C8B329A-73AB-4584-AD92-CC08E55D4CDF 6C8B329A-73AB-4584-AD92-CC08E55D4CDF 7C8B329A-73AB-4584-AD92-CC08E55D4CDF 8C8B329A-73AB-4584-AD92-CC08E55D4CDF 6B8B329A-73AB-4584-AD92-CC08E55D4CDF AC8B329A-73AB-4584-AD92-CC08E55D4CDF GC8B329A-73AB-4584-AD92-CC08E55D4CDF 9C8B329A-73AB-4584-AD92-CC08E55D4CDF
获取数据后,我们将更新OrderProgressStatus表中每个orderId的状态
我们尝试处理异常(如果有的话),但一切似乎都很好 我们怀疑在高负载时它只是忽略了动作。
将提供一点帮助,在此先感谢。