package com.zg.project.wisdom.mapper;

import com.zg.project.wisdom.domain.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

@Mapper
public interface RkStatisticsMapper {

    /** 库龄统计（未出库）：按项目数计数（去重 xm_no） */
    RkAgeStatVO selectAgeStats();


    /**
     * 入库类型汇总（仅未出库）
     * @return 汇总结果列表
     */
    List<RkTypeSummaryVO> selectRkTypeSummary();


    /**
     * 按入库类型 + 项目 统计【每项目的条目数】
     * （用于回填到类型汇总的 projectGoodsCounts 中）
     */
    List<RkTypeProjectGoodsCountVO> selectProjectGoodsCountByType();


    /** 入库类型汇总（未出库，rk_type 非空） */
    List<RkSummaryVO> selectTypeSummary();

    /**
     * 县局汇总（未出库，县局非空）
     */
    List<RkSummaryVO> selectCountySummary();

    /** 入库（每天+县局）：按 rk_time */
    List<DayCountyStatVO> selectWeekDailyIn(@Param("startDate") String startDate,
                                            @Param("endDate") String endDate);

    /** 出库（每天+县局）：按 ly_time */
    List<DayCountyStatVO> selectWeekDailyOut(@Param("startDate") String startDate,
                                             @Param("endDate") String endDate);

    /** 汇总（>30 & >60）：项目数、条目数、总金额 */
    AgeSummaryVO selectAge3060Summary();

    /** 明细列表：返回超过 minDays 天的明细（minDays 取 30 或 60） */
    List<RkAgeDetailVO> selectAgeDetails(@Param("minDays") int minDays);

    /**
     * 按入库类型统计饼状图数据
     * @return 每个入库类型的项目数、条目数、总数量、总金额
     */
    List<RkTypePieVO> selectTypePie();

    /**
     * 按入库类型统计（联查 stock_in_type，时间范围过滤）
     * 仅统计未删除、未出库
     */
    List<RkTypePieVO> selectTypeSummaryByRange(@Param("start") String start,
                                               @Param("end") String end);

    /**
     * 按出库类型统计（时间范围；仅 is_chuku=1）
     * 维度：项目数、条目数、总数量、总金额
     */
    List<RkTypePieVO> selectOutTypeSummaryByRange(@Param("start") String start,
                                                  @Param("end") String end);


    /** 本月入库汇总（按 rk_time 过滤） */
    RkMonthSummaryVO selectMonthlyInSummary(@Param("start") String start,
                                            @Param("end") String end);

    /** 本月出库汇总（is_chuku=1 且按 ly_time 过滤） */
    RkMonthSummaryVO selectMonthlyOutSummary(@Param("start") String start,
                                             @Param("end") String end);


    /** 应到未到（status='0'） */
    GysJhUndeliveredSummaryVO selectUndelivered();

    /** 部分未到（status='2'） */
    GysJhUndeliveredSummaryVO selectPartialUndelivered();

    /** 当前库存：按物资类型统计（过滤 wl_type 空/无） */
    List<WlTypeStockStatVO> selectCurrentStockByWlType();

    /** 当前库存：入库时间 >30 天的四项汇总（SQL 聚合计算） */
    RkTypePieVO selectAgeGt30Summary();

    /** 入库：在 [startTs, endTs) 时间范围内的原始行（仅最小过滤） */
    List<RkInVO> selectInRange(@Param("startTs") String startTs,
                               @Param("endTs") String endTs);

    /** 出库：在 [startTs, endTs) 时间范围内、is_chuku=1 的原始行（仅最小过滤） */
    List<RkOutVO> selectOutRange(@Param("startTs") String startTs,
                                 @Param("endTs") String endTs);

    /**
     * 外层：按场景汇总可用数量，并级联查询可用库位明细（返回 SceneAvailableVO 列表）
     */
    List<SceneAvailableVO> selectAvailableByWarehouse(@Param("warehouseCode") String warehouseCode);

    /**
     * 内层：指定仓库 + 场景，查询该场景下的可用库位明细
     */
    List<PcdeDetailSimpleVO> selectAvailablePositionsByWarehouseAndScene(
            @Param("warehouseCode") String warehouseCode,
            @Param("sceneCode") String sceneCode);
}
