package com.sckw.order.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sckw.core.model.vo.TableTop;
import com.sckw.order.api.model.*;
import com.sckw.order.model.KwoTradeOrder;
import com.sckw.order.model.SalesReportRawData;
import com.sckw.order.model.dto.*;
import com.sckw.order.model.vo.SaleTopVo;
import com.sckw.order.model.vo.res.TradeOrderAppStatisticVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * @desc: 交易订单（采购订单/销售订单）mapper
 * @author: yzc
 * @date: 2023-06-25 14:18
 */
@Mapper
public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {

    /**
     * @desc: 获取指定日期最大订单号
     * @author: yzc
     * @date: 2023-09-11 11:44
     * @Param date:
     * @return: java.lang.String
     */
    String getMaxOrderNoByDate(@Param("date") Date date);

    /**
     * @desc: 根据一级企业id查询，企业类型分组，统计非草稿的订单数量
     * @author: yzc
     * @date: 2023-09-11 11:44
     * @Param topEntId:
     * @return: java.util.List<com.sckw.order.api.model.TradeOrderCountStatisticsDTO>
     */
    List<TradeOrderCountStatisticsDTO> getOrderNumByTopEntId(@Param("topEntId") Long topEntId, @Param("enterpriseIds") List<Long> enterpriseIds);

    /**
     * @desc: 工作台贸易订单表格统计
     * @author: yzc
     * @date: 2023-09-13 15:46
     * @Param item:
     * @return: java.util.List<com.sckw.order.model.dto.WbTOrderExcelStsResDTO>
     */
    List<WbTOrderExcelStsResDTO> workbenchExcel(@Param("item") WbTOrderExcelStsReqDTO item);

    /**
     * @param query
     * @param goodIds
     * @param authUserIds
     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
     * @desc 贸易订单列表查询
     * @author yzc
     * @date 2024/3/6 15:50
     */
    List<OrderListResDTO> tradeOrderSelect(@Param("query") TradeOrderListSelectDTO query,
                                           @Param("goodIds") List<Long> goodIds,
                                           @Param("authUserIds") List<Long> authUserIds,
                                           @Param("entIds") List<Long> entIds);


    /***
     * @desc 贸易订单列表统计查询
     * @param query
     * @param goodIds
     * @param authUserIds
     * @return java.util.List<com.sckw.core.model.vo.TableTop>
     * @author yzc
     * @date 2024/3/14 14:34
     */
    List<TableTop> tradeOrderStatistic(@Param("query") TradeOrderListSelectDTO query,
                                       @Param("goodIds") List<Long> goodIds,
                                       @Param("authUserIds") List<Long> authUserIds);

    /**
     * @param query
     * @param statuses
     * @param authUserIds
     * @return java.util.List<com.sckw.order.model.vo.res.TradeOrderAppStatisticVO>
     * @desc app主界面贸易订单统计
     * @author yzc
     * @date 2024/3/15 14:24
     */
    List<TradeOrderAppStatisticVO> appStatistic(@Param("query") TradeOrderAppStatisticParamDTO query,
                                                @Param("statuses") List<Integer> statuses,
                                                @Param("authUserIds") List<Long> authUserIds);

    /**
     * @param query
     * @param goodIds
     * @param authUserIds
     * @param ids
     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
     * @desc 贸易订单列表导出
     * @author yzc
     * @date 2024/3/15 14:24
     */
    List<OrderListResDTO> tradeOrderExport(@Param("query") TradeOrderListSelectDTO query,
                                           @Param("goodIds") List<Long> goodIds,
                                           @Param("authUserIds") List<Long> authUserIds,
                                           @Param("ids") List<Long> ids);

    /**
     * @param query
     * @param goodsIds
     * @param excludeIds
     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
     * @desc 贸易订单对账单分页列表查询
     * @author yzc
     * @date 2024/3/15 14:24
     */
    List<OrderListResDTO> tradeOrderStatementList(@Param("query") TradeOrderStatementListParamDTO query,
                                                  @Param("goodsIds") List<Long> goodsIds,
                                                  @Param("excludeIds") List<Long> excludeIds);

    /**
     * @param query
     * @param contractIds
     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
     * @desc 合同关联订单列表
     * @author yzc
     * @date 2024/3/15 14:24
     */
    List<OrderListResDTO> tradeOrderContractList(@Param("query") TradeOrderContractParamDTO query,
                                                 @Param("contractIds") List<Long> contractIds);

    /**
     * @param procureTopEntId
     * @param excludeStatuses
     * @return java.util.List<com.sckw.order.model.dto.WorkbenchPurchaseDTO>
     * @desc TODO
     * @author yzc
     * @date 2024/3/18 17:04
     */
    List<WorkbenchPurchaseDTO> workbenchPurchaseList(@Param("procureTopEntId") Long procureTopEntId,
                                                     @Param("excludeStatuses") List<Integer> excludeStatuses);

    WorkbenchOrderStsDTO getOrderStsInfo(@Param("query") OrderStsInfoDTO query,
                                         @Param("excludeStatuses") List<Integer> excludeStatuses);


    List<OrderSaleVo> querySaleOrder(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end);

    List<TradeOrderVo> selectData(@Param("para") TradeOrderPara para);

    Long queryCount(@Param("ids") List<Long> ids);

    List<TradeVo> queryList(@Param("ids") List<Long> ids, @Param("all") Boolean all);

    List<TradeSaleVo> countList(@Param("ids") List<Long> ids, @Param("para") CountPara countPara);

    List<SaleVo> countSale(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);

    List<BuyVo> countBuy(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);

    List<GoodsVo> countGoods(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);

    List<TradeBuyVo> buyRank(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);

    /**
     * 查询销售报表原始数据
     * @param curEntId 当前企业ID
     * @param customerId 客户ID
     * @param goodsId 商品ID
     * @return 销售报表原始数据列表
     */
    List<SalesReportRawData> querySalesReportRawData(@Param("curEntId") Long curEntId,
                                                     @Param("customerId") Long customerId,
                                                     @Param("goodsId") Long goodsId);

    List<SaleTopVo> saleTop();

    BigDecimal saleSum();

    List<TradeOrderDto> joinSelect();

    /**
     * 按日期和一级分类统计近7日已完成订单的净重
     * @param entId 企业ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 每日出货量统计列表
     */
    List<DailyShipmentStatisticsDTO> selectDailyShipmentByCategory(@Param("entId") Long entId,
                                                                   @Param("startTime") Date startTime,
                                                                   @Param("endTime") Date endTime);

    /**
     * 按日期和一级分类统计近7日销售额
     * @param entId 企业ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 每日销售额统计列表
     */
    List<DailySalesStatisticsDTO> selectDailySalesByCategory(@Param("entId") Long entId,
                                                             @Param("startTime") Date startTime,
                                                             @Param("endTime") Date endTime);

    /**
     * 按最低级分类统计历史完成订单的净重总和（取前5名）
     * @param entId 企业ID
     * @return 商品销量统计列表
     */
    List<GoodsVolumeStatisticsDTO> selectGoodsVolumeTop5(@Param("entId") Long entId);

    /**
     * 按最低级分类统计历史完成订单的销售金额总和（取前5名）
     * @param entId 企业ID
     * @return 商品销售金额统计列表
     */
    List<GoodsAmountStatisticsDTO> selectGoodsAmountTop5(@Param("entId") Long entId);

}
