package com.sckw.transport.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sckw.mongo.model.TableTops;
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;

@Mapper
public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
    int deleteByPrimaryKey(Long id);

    @Override
    int insert(KwtWaybillOrder record);

    int insertSelective(KwtWaybillOrder record);

    KwtWaybillOrder selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(KwtWaybillOrder record);

    int updateByPrimaryKey(KwtWaybillOrder record);

    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);

    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
     */
    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 有效卸货状态}
     * @desc 统计车辆运单
     * @author zk
     * @date 2023/7/31
     **/
    WaybillCountVo findWaybillOrderCount(Map<String, Object> params);

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

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

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

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

    /**
     * @param params {driverId 司机ID, busStatus 状态 2出车/3执行/4完结, month月份}
     * @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 statuses 查询状态
     * @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);

    Map<String,Object> selectOrderByOrderId(@Param("orderId") Long orderId, @Param("type") Integer type, @Param("statusList") List<Long> statusList);

    /**
     * 按装卸量统计运单
     * @param entId 企业ID
     * @param statuses 查询状态
     * @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
    );


    String getMaxOrderNo(@Param("lOrderNo") String lOrderNo);

    /**
     * @param params {driverId 司机ID, truckNo车牌号, busStatus 状态 2出车/3执行/4完结}
     * @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);

}