SuspensionService.java 1.87 KB
package com.infoloop.tianting.service;

import com.infoloop.tianting.mealorderservice.SingleDinerMealSuspensionRecordRpcResponse;
import com.infoloop.tianting.mealorderservice.SingleDinerRpcResponse;

import java.util.List;
import java.util.Map;

/**
 * 公共停餐服务:为单个就餐人提供学校/班级/学生三个维度的最新停餐记录集合
 */
public interface SuspensionService {

    /**
     * 简单时间窗对象
     */
    class SuspensionWindow {
        public final long startAt;
        public final long endAt;

        public SuspensionWindow(long startAt, long endAt) {
            this.startAt = startAt;
            this.endAt = endAt;
        }
    }

    /**
     * 获取就餐人的停餐记录(学校/班级/学生三个维度各取最新一条),用于做并集判断
     *
     * @param enterpriseId 企业ID
     * @param clientId     学校ID
     * @param classId      班级ID
     * @param dinerId      就餐人ID
     * @return 最多包含3条记录(学校级一条、班级级一条、学生级一条),按存在性返回非空集合
     */
    List<SingleDinerMealSuspensionRecordRpcResponse> getLatestSuspensionsForDiner(int enterpriseId, int clientId, int classId, int dinerId);

    /**
     * 获取就餐人的停餐并集时间窗(取上述三维度最新记录的并集:min(startAt), max(endAt))。
     * 若不存在任何停餐记录则返回 null。
     */
    SuspensionWindow getSuspensionUnionWindowForDiner(int enterpriseId, int clientId, int classId, int dinerId);

    /**
     * 为多个订餐人批量计算停餐并集时间窗。避免逐个调用,内部一次性查询并用 Map 聚合。
     * 返回的 Map key 为 dinerId,仅为存在停餐窗口的订餐人返回条目。
     */
    Map<Integer, SuspensionWindow> getSuspensionUnionWindowsForDiners(int enterpriseId, List<SingleDinerRpcResponse> diners);
}