如何修改AnyLogic供应链模型实现基于数据库时间生成订单?
AnyLogic供应链模型改造:按数据库指定时间生成订单
一、循环事件的逻辑代码实现
- 先确认数据库表结构:假设你的表包含
id(订单唯一ID)、order_time(与模型时间单位一致的触发时间,比如秒)、quantity(订单数量)、is_processed(是否已处理,默认0)字段。 - 在每秒触发的循环事件中添加以下代码:
// 查询所有未处理且触发时间<=当前模型时间的订单 List<Record> pendingOrders = selectFrom(ordersTable) .where(ordersTable.is_processed.eq(0).and(ordersTable.order_time.le(time()))) .list(); // 遍历处理每个订单 for(Record order : pendingOrders){ // 1. 生成订单实体(假设你的订单实体类为Order) Order newOrder = new Order(this, order.get(ordersTable.quantity)); // 2. 发送消息给对应零售商代理触发订单动作 retailerAgent.send("triggerOrder", newOrder); // 3. 标记订单为已处理,避免重复生成 update(ordersTable) .set(ordersTable.is_processed, 1) .where(ordersTable.id.eq(order.get(ordersTable.id))) .execute(); } - 注意事项:
- 模型时间
time()的单位必须和数据库order_time单位一致;如果数据库存的是日期时间,需用dateToTime(orderDate)转换为模型运行秒数。 - 多零售商场景下,数据库需新增
retailer_id字段,查询时过滤对应零售商的订单。
- 模型时间
二、状态图的调整与集成
方案1:消息触发订单生成
- 在零售商状态图的目标状态(如
Idle或ReadyToOrder)添加消息触发的迁移:- 右键迁移→
Add Trigger→Message,设置消息类型为triggerOrder。 - 在迁移的
Action中调用订单生成逻辑,传入消息携带的订单实体(比如复用原有createOrder()函数)。 - 原周订单率迁移可保留或禁用,按需选择。
- 右键迁移→
方案2:原迁移叠加条件判断
- 若需保留原周订单率逻辑,同时支持指定时间订单,修改原迁移的
Guard Condition:// 原周订单率触发条件 || 存在待处理的指定时间订单 originalRateCondition || !this.pendingOrders.isEmpty() - 在迁移
Action中优先处理指定时间订单,再执行原率生成逻辑:if(!pendingOrders.isEmpty()){ Order targetOrder = pendingOrders.remove(0); // 执行指定时间订单的生成逻辑 } else { // 原周订单率生成订单的逻辑 } - 这里的
pendingOrders是零售商代理的List变量,需在循环事件中将待处理订单添加到该列表。
方案3:状态内部条件触发
- 在状态图的活跃状态(如
Operating)添加Internal Transition:- 右键状态→
Add Internal Transition。 - 设置触发条件为
!pendingOrders.isEmpty()或time() >= nextScheduledOrderTime。 - 在
Action中执行订单生成逻辑,并更新待处理订单状态。
- 右键状态→
内容的提问来源于stack exchange,提问作者Abby Zimmerman
相关产品推荐
相关产品推荐

