package com.sckw.transport.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sckw.mongo.model.TableTops;
import com.sckw.transport.api.model.param.TimePara;
import com.sckw.transport.api.model.vo.CountPara2;
import com.sckw.transport.api.model.vo.LogisticsVo;
import com.sckw.transport.api.model.vo.WaybillRankVo;
import com.sckw.transport.api.model.vo.WaybillVo;
import com.sckw.transport.model.KwtWaybillOrder;
import com.sckw.transport.model.dto.OrderCarDTO;
import com.sckw.transport.model.dto.WayBillDetailDTO;
import com.sckw.transport.model.dto.WaybillAmountDTO;
import com.sckw.transport.model.vo.WaybillCountVo;
import com.sckw.transport.model.vo.WaybillOrderDriverVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author zk
 * @desc 车辆运单
 * @date 2023/10/16
 */
@Mapper
public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
    /**
     * 新增
     *
     * @param record 新增参数
     * @return 新增数量
     * @desc 新增
     * @author zk
     * @date 2023/7/31
     **/
    @Override
    int insert(KwtWaybillOrder record);

    /**
     * 查询车辆信息
     *
     * @param id       运单ID
     * @param page     分页参数
     * @param pageSize 分页参数
     * @return 销售订单-采购订单-车辆信息
     * @desc 查询车辆信息
     * @author zk
     * @date 2023/7/31
     **/
    List<OrderCarDTO> selectWaybillOrderCarList(@Param("id") String id, @Param("page") int page, @Param("pageSize") int pageSize);

    /**
     * 托运订单-承运订单-通过单据号根据车牌号分组获取车辆信息统计信息
     *
     * @param ids
     * @param statusList
     * @param page
     * @param pageSize
     * @return 销售订单-采购订单-车辆信息
     */
    List<OrderCarDTO> selectWaybillOrderCarListGroupByTruckNo(@Param("ids") List<String> ids, @Param("statusList") List<Integer> statusList, @Param("page") int page, @Param("pageSize") int pageSize);

    /**
     * 贸易订单对应车辆运单数
     *
     * @param id 贸易订单ID
     * @return 关联数量
     */
    Long selectWaybillOrderCarCount(@Param("id") String id);

    /**
     * 根据司机id+定义状态统计
     *
     * @param id
     * @param status
     * @return 统计数
     */
    TableTops statistics(@Param("id") Long id, @Param("status") List<Long> status);

    /**
     * 根据司机id+运单状态获取物流订单id
     *
     * @param id
     * @param status
     * @return 物流订单id
     */
    List<Long> selectDriverOrder(@Param("id") Long id, @Param("status") List<Long> status);

    /**
     * 根基运单ID查询关联数据
     *
     * @param id
     * @return 订单详情
     */
    WayBillDetailDTO selectWaybillRelate(@Param("id") Long id);

    /**
     * 通过物流订单id+车辆运单状态查询是否存在处理中的数据
     *
     * @param id
     * @param statusList
     * @return 处理中的数据
     */
    int selectDataByLorderId(@Param("id") String id, @Param("statusList") List<Integer> statusList);

    /**
     * 统计车辆运单
     *
     * @param params {
     *               lOrderId 物流订单id,
     *               upperlOrderId 下级分包物流订单,
     *               belowlOrderId 所属上级分包,
     *               loadCountStatus 有效装货状态,
     *               unloadCountStatus 有效卸货状态}
     * @return 统计数据
     * @desc 统计车辆运单
     * @author zk
     * @date 2023/7/31
     **/
    WaybillCountVo findWaybillOrderCount(Map<String, Object> params);

    /**
     * 统计车辆运单
     *
     * @param params {
     *               lOrderId 物流订单id,
     *               upperlOrderId 下级分包物流订单,
     *               belowlOrderId 所属上级分包,
     *               loadCountStatus 有效装货状态,
     *               unloadCountStatus 有效卸货状态}
     * @return 统计数据
     * @desc 统计车辆运单
     * @author zk
     * @date 2023/7/31
     **/
    Double findWaybillOrderTicketCount(Map<String, Object> params);

    /**
     * 统计司机任务数(待接单/出车/执行/完结)
     *
     * @param params {driverId 司机ID}
     * @return 统计数据
     * @desc 统计司机任务数(待接单 / 出车 / 执行 / 完结)
     * @author zk
     * @date 2023/8/1
     **/
    Map<String, Object> findStatisticsCountByDriver(Map<String, Object> params);

    /**
     * 统计司机任务数（任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款）
     *
     * @param params {driverId 司机ID, month月份}
     * @return 统计数据
     * @desc 统计司机任务数（任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款）
     * @author zk
     * @date 2023/8/1
     **/
    Map<String, BigDecimal> findStatisticsSumByDriver(Map<String, Object> params);

    /**
     * 统计司机任务数（任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款）
     *
     * @param params {driverId 司机ID, month月份}
     * @return 口亏量
     * @desc 统计司机任务数（任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款）
     * @author zk
     * @date 2023/8/1
     **/
    BigDecimal deficitLossAmountByDriver(Map<String, Object> params);

    /**
     * 查询司机任务列表-待接单
     *
     * @param params {driverId 司机ID}
     * @return 待接单运单
     * @desc 查询司机任务列表-待接单
     * @author zk
     * @date 2023/8/1
     **/
    List<WaybillOrderDriverVo> findWaitWaybillOrderByDriver(Map<String, Object> params);

    /**
     * 查询司机任务列表-出车/执行/完结
     *
     * @param params {driverId 司机ID, busStatus 状态 2出车/3执行/4完结, month月份}
     * @return 运单数据
     * @desc 查询司机任务列表-出车/执行/完结
     * @author zk
     * @date 2023/8/1
     **/
    List<WaybillOrderDriverVo> findOtherWaybillOrderByDriver(Map<String, Object> params);

    /**
     * 易订单id查找相关联车辆信息
     *
     * @param id
     * @return 车辆信息
     */
    List<OrderCarDTO> selectWaybillOrderCarListNotPage(@Param("id") String id);

    /**
     * 贸易订单ids查找相关联车辆信息
     *
     * @param ids 贸易订单ids
     * @return 车辆信息
     */
    List<OrderCarDTO> selectWaybillOrderCarListByTradeOrderId(@Param("ids") List<Long> ids);

    /**
     * 按状态统计运单
     *
     * @param entId     企业ID
     * @param createBys 创建人
     * @param statuses  查询状态
     * @param keyword   关键字
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 统计数据
     */
    Long selectWaybillOrderCountByStatus(
            @Param("entId") Long entId,
            @Param("createBys") List<Long> createBys,
            @Param("statuses") List<Long> statuses,
            @Param("keyword") String keyword,
            @Param("startDate") String startDate,
            @Param("endDate") String endDate);

    /**
     * 查询订单
     *
     * @param orderId    订单id
     * @param type       类型
     * @param statusList 状态集
     * @return 订单信息
     */
    Map<String, Object> selectOrderByOrderId(@Param("orderId") Long orderId,
                                             @Param("type") Integer type,
                                             @Param("statusList") List<Long> statusList);

    /**
     * 按装卸量统计运单
     *
     * @param entId     企业ID
     * @param createBys 创建人
     * @param statuses  查询状态
     * @param keyword   关键字
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 统计数据
     */
    List<WaybillAmountDTO> selectWaybillOrdersByStatus(
            @Param("entId") Long entId,
            @Param("createBys") List<Long> createBys,
            @Param("statuses") List<Long> statuses,
            @Param("keyword") String keyword,
            @Param("startDate") String startDate,
            @Param("endDate") String endDate
    );

    /**
     * 查询最大运单编号
     *
     * @param lOrderNo 运单编号
     * @return 运单编号
     */
    String getMaxOrderNo(@Param("lOrderNo") String lOrderNo);

    /**
     * 查询车辆运单
     *
     * @param params {driverId 司机ID, truckNo车牌号, busStatus 状态 2出车/3执行/4完结}
     * @return 运单信息
     * @desc 查询车辆运单
     * @author zk
     * @date 2023/9/6
     **/
    List<KwtWaybillOrder> findWaybillOrder(Map<String, Object> params);

    /**
     * 托运订单-承运订单-通过单据号根据车牌号分组获取车辆信息统计信息
     *
     * @param ids
     * @param statusList
     * @param page
     * @param pageSize
     * @return 运单关联司机信息
     */
    List<OrderCarDTO> selectInvalidWaybillOrderCarListGroupByTruckNo(@Param("ids") List<String> ids,
                                                                     @Param("statusList") List<Integer> statusList,
                                                                     @Param("page") int page,
                                                                     @Param("pageSize") int pageSize);

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

    List<WaybillVo> countLogistics(@Param("para") CountPara2 countPara, @Param("ids") List<Long> ids);

    List<WaybillRankVo> logisticsRank(@Param("ids")List<Long> ids, @Param("para") TimePara timePara);
}
