package com.sckw.transport.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sckw.mongo.model.TableTops;
import com.sckw.transport.api.model.LogisticsBaseOrderVo;
import com.sckw.transport.api.model.dto.AcceptCarriageLogisticsOrderDto;
import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
import com.sckw.transport.api.model.vo.LogisticsOrderVO;
import com.sckw.transport.model.KwtLogisticsOrder;
import com.sckw.transport.model.LogisticsOrderPara;
import com.sckw.transport.model.dto.LogisticsOrderDto;
import com.sckw.transport.model.param.*;
import com.sckw.transport.model.vo.*;
import com.sckw.transport.model.vo.execlVo.AcceptCarriageOrderExcelVo;
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;
import java.util.Map;

@Mapper
public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {


    /**
     * 查询物流订单数据
     *
     * @param logisticsOrderParam 查询参数
     * @param dictValue           字典id
     * @param entId               托运角色
     * @param ids                 承运角色
     * @param orderStatusList     单据状态
     * @return
     */
    List<LogisticsOrderVO> selectLogisticOrderData(@Param("logisticsOrderParam") LogisticsOrderParam logisticsOrderParam,
                                                   @Param("dictValue") String dictValue, @Param("entId") Long entId,
                                                   @Param("ids") List<Long> ids,
                                                   @Param("orderStatusList") List<Integer> orderStatusList
    );


    /**
     * 销售订单-采购订单-托运详情
     *
     * @param id
     * @param page
     * @param pageSize
     * @param type
     * @return
     */
    List<LogisticsOrderDto> selectOrderList(@Param("id") String id, @Param("page") int page,
                                            @Param("pageSize") int pageSize, @Param("type") String type);

    /**
     * 销售订单-采购订单-托运详情
     *
     * @param id
     * @param type
     * @return
     */
    List<LogisticsOrderDto> selectOrderListNotPage(@Param("id") String id, @Param("type") String type);

    /**
     * 销售订单-采购订单-托运详情
     *
     * @param ids  贸易订单id
     * @param type
     * @return
     */
    List<LogisticsOrderDto> selectOrderListNotPageByIds(@Param("ids") List<Long> ids, @Param("type") String type);

    List<SckwLogisticsOrderVO> selectOrderListByContractId(@Param("type") String type, @Param("entId") Long entId, @Param("contractIds") List<Long> contractIds);

    /**
     * 销售订单-采购订单-托运详情(导出)
     *
     * @param ids
     * @param type
     * @return
     */
    List<LogisticsOrderDto> selectOrderListByIdsAndUnitType(@Param("ids") List<String> ids, @Param("type") String type);

    /**
     * 销售订单-采购订单-托运列表-数据统计
     *
     * @param id
     * @return
     */
    List<LogisticsOrderDto> selectOrderCountByOrderId(@Param("id") String id, @Param("type") String type);

    /**
     * @param id   贸易订单id
     * @param type 采购单1/销售单2
     * @return
     */
    Long selectOrderCount(@Param("id") String id, @Param("type") String type);

    /**
     * @param logisticsOrderParam
     * @param dictValue
     * @return
     */
    Long selectLogisticOrderCount(@Param("logisticsOrderParam") LogisticsOrderParam logisticsOrderParam,
                                  @Param("dictValue") String dictValue, @Param("entId") Long entId,
                                  @Param("ids") List<Long> ids,
                                  @Param("orderStatusList") List<Integer> orderStatusList
    );

    Map<String, String> getRejectReason(@Param("id") String id, @Param("status") Integer status);

    /**
     * 根据承运订单id查看分包数据列表
     *
     * @param lOrderId
     * @param page
     * @param pageSize
     * @return
     */
    List<SubcontractConsignmentVO> getSubcontractConsignment(@Param("lOrderId") String lOrderId, @Param("page") Integer page, @Param("pageSize") Integer pageSize);

    /**
     * @param lOrderId
     * @return
     */
    List<SubcontractConsignmentVO> getSubcontractConsignmentNotPage(@Param("lOrderId") String lOrderId);

    List<SubcontractConsignmentVO> getSubcontractConsignmentList(@Param("lOrderIds") List<Long> lOrderIds);

    /**
     * @param lOrderId
     * @return
     */
    List<Map> countSubcontractConsignmentById(@Param("lOrderId") String lOrderId);

    /**
     * 通过物流订单查看单据下运力司机数据【趟次】
     *
     * @param driverParam
     * @return
     */
    List<DriverListVo> selectDriverListById(@Param("driverParam") DriverParam driverParam, @Param("orderStatus") List<Integer> orderStatus);

    /**
     * 通过物流订单查看单据下运力司机数据【趟次】
     *
     * @param driverParam
     * @return
     */
    List<DriverListVo> selectDriverCountById(@Param("driverParam") DriverParam driverParam, @Param("type") Integer type, @Param("orderStatus") List<Integer> orderStatus);

    /**
     * @param ids
     * @return
     */
    List<AcceptCarriageLogisticsOrderDto> selectLogisticOrderList(@Param("ids") List<String> ids, @Param("status") Integer status);

    /**
     * 通过物流订单id获取统计数据
     *
     * @param orderId
     * @return
     */
    OrderFinishVO selectOrderFinishData(@Param("orderId") String orderId);

    /**
     * @param params {ownOrderId 物流订单id, upperlOrderId 下级分包物流订单,belowlOrderId 所属上级分包}
     * @return
     * @desc 查询分包物流订单
     * @author zk
     * @date 2023/7/20
     */
    List<KwtLogisticsOrder> findLogisticsOrder(Map params);

    /**
     * @param entId
     * @return
     */
    List<Integer> getAddressList(@Param("entId") Long entId);

    /**
     * @param id
     * @return
     */
    int selectMaxLevel(@Param("id") String id);

    /**
     * 根据贸易订单id统计委派量-实际装货量-实际卸货量
     *
     * @param tOrderId
     * @return
     */
    Map<String, BigDecimal> countAmountByTradeOrderId(@Param("tOrderId") Long tOrderId);

    /**
     * 根据物流订单id查询能被停止的循环数据
     *
     * @param driverParam 页面请求参数
     * @return
     */
    List<DriverListVo> selectLoopOrderAndDriverListByOrderId(@Param("driverParam") DriverParam driverParam);

    /**
     * 根据物流订单id查询能被停止的循环数据
     *
     * @param idsList 物流订单id
     * @return
     */
    List<DriverListVo> selectLoopOrderAndDriverListByOrderIds(@Param("idsList") List<Long> idsList);

    /**
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @return
     */
    List<AcceptCarriageOrderVO> selectLogisticsOrderList(@Param("query") AcceptCarriageOrderQuery query,
                                                         @Param("orderList") List<Integer> orderList,
                                                         @Param("type") String type,
                                                         @Param("entId") Long entId,
                                                         @Param("contactsIds") List<Long> contactsIds,
                                                         @Param("userIds") List<Long> userIds,
                                                         @Param("idsList") List<Long> idsList

    );


    /**
     * @param query
     * @param orderList
     * @param entId
     * @param authEntIdList 客户经理关联的企业id
     * @return
     */
    List<ManagementLogisticsOrderVO> selectManagementLogisticsOrderList(@Param("query") ManagementLogisticsOrderQuery query,
                                                                        @Param("orderList") List<Integer> orderList,
                                                                        @Param("entId") Long entId,
                                                                        @Param("contactsIds") List<Long> contactsIds,
                                                                        @Param("userIds") List<Long> userIds,
                                                                        @Param("idsList") List<Long> idsList,
                                                                        @Param("authEntIdList") List<Long> authEntIdList

    );

    /**
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @return
     */
    List<ConsignOrderVO> selectConsignLogisticsOrderList(@Param("query") ConsignOrderQuery query,
                                                         @Param("orderList") List<Integer> orderList,
                                                         @Param("type") String type,
                                                         @Param("entId") Long entId,
                                                         @Param("contactsIds") List<Long> contactsIds,
                                                         @Param("userIds") List<Long> userIds,
                                                         @Param("idsList") List<Long> idsList
    );

    /**
     * 托运数据查询
     *
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @return
     */
    List<ConsignOrderVO> selectConsignLogisticsOrderListByConsign(@Param("query") ConsignOrderQuery query,
                                                                  @Param("orderList") List<Integer> orderList,
                                                                  @Param("type") String type,
                                                                  @Param("entId") Long entId,
                                                                  @Param("contactsIds") List<Long> contactsIds,
                                                                  @Param("userIds") List<Long> userIds,
                                                                  @Param("idsList") List<Long> idsList
    );

    /**
     * 首页查询导出
     *
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @return
     */
    List<AcceptCarriageOrderExcelVo> selectLogisticsOrderListExport(@Param("query") AcceptCarriageOrderQuery query,
                                                                    @Param("orderList") List<Integer> orderList,
                                                                    @Param("type") String type,
                                                                    @Param("entId") Long entId
    );


    /**
     * @param query
     * @param orderList   单据状态
     * @param type        代表承运或者托运
     * @param entId       企业id
     * @param contactsIds 联系人id
     * @return
     */
    List<TableTops> countLogisticsOrderListByStatus(@Param("query") AcceptCarriageOrderQuery query,
                                                    @Param("orderList") List<Integer> orderList,
                                                    @Param("type") String type,
                                                    @Param("entId") Long entId,
                                                    @Param("contactsIds") List<Long> contactsIds,
                                                    @Param("userIds") List<Long> userIds,
                                                    @Param("idsList") List<Long> idsList
    );

    /**
     * 承运订单
     *
     * @param query
     * @param orderList   单据状态
     * @param type        代表承运或者托运
     * @param entId       企业id
     * @param contactsIds 联系人id
     * @return
     */
    List<TableTops> countLogisticsOrderListByAcceptCarriageStatus(@Param("query") AcceptCarriageOrderQuery query,
                                                                  @Param("orderList") List<Integer> orderList,
                                                                  @Param("type") String type,
                                                                  @Param("entId") Long entId,
                                                                  @Param("contactsIds") List<Long> contactsIds,
                                                                  @Param("userIds") List<Long> userIds,
                                                                  @Param("idsList") List<Long> idsList
    );


    /**
     * @param query
     * @param orderList   单据状态
     * @param entId       企业id
     * @param contactsIds 联系人id
     * @return
     */
    List<TableTops> countManagementLogisticsOrderListByStatus(@Param("query") ManagementLogisticsOrderQuery query,
                                                              @Param("orderList") List<Integer> orderList,
                                                              @Param("entId") Long entId,
                                                              @Param("contactsIds") List<Long> contactsIds,
                                                              @Param("userIds") List<Long> userIds,
                                                              @Param("authEntIdList") List<Long> authEntIdList
    );

    /**
     * 物流订单号+状态统计数量
     *
     * @param orderId
     * @param orderStatusList
     * @return
     */
    Integer selectCountByLorderId(@Param("orderId") String orderId, @Param("orderStatusList") List<Integer> orderStatusList);

    String getMaxOrderNoByDate(@Param("date") Date date);

    List<String> checkLogisticsOrderIsFinishByEntId(@Param("consignEntId") Long consignEntId, @Param("acceptCarriageEntId") Long acceptCarriageEntId, @Param("orderStatus") List<Integer> orderStatus);

    Integer statisticsWaybillSendCar(@Param("ids") List<Long> ids, @Param("orderList") List<Integer> orderList);

    List<Long> statisticsLogistics(@Param("topEntId") Long topEntId);

    Integer statisticsLogisticsByTopEntIdAndOrderStatus(@Param("topEntId") Long topEntId, @Param("orderList") List<Integer> orderList,
                                                        @Param("unitType") String unitType, @Param("enterpriseIds") List<Long> enterpriseIds);

    /**
     * @param statusList 单据状态集合
     * @param dateStart  开始时间
     * @param dateEnd    结束时间
     * @param topId      顶级企业id
     * @param unitType   企业类型【1托运2承运】
     * @return
     */
    StatisticsByOrderVO selectAcceptCarriageFinishOrder(@Param("statusList") List<Integer> statusList, @Param("dateStart") String dateStart, @Param("dateEnd") String dateEnd, @Param("topId") Long topId, @Param("unitType") Integer unitType);

    /**
     * @param statusList 单据状态集合
     * @param dateStart  开始时间
     * @param dateEnd    结束时间
     * @param topId      顶级企业id
     * @param unitType   企业类型【1托运2承运】
     * @return
     */
    StatisticsByOrderVO selectAcceptCarriageAwaitFinishOrder(@Param("statusList") List<Integer> statusList, @Param("dateStart") String dateStart, @Param("dateEnd") String dateEnd, @Param("topId") Long topId, @Param("unitType") Integer unitType);


    StatisticsByOrderVO selectStatisticsByOrder(@Param("statusList") List<Integer> statusList, @Param("dateStart") String dateStart, @Param("dateEnd") String dateEnd, @Param("topId") Long topId, @Param("unitType") Integer unitType);

    List<LogisticsOrderStatisticsVO> workbenchLogisticsOrderStatisticsByMonth(@Param("id") Long id, @Param("statusList") List<Integer> statusList,
                                                                              @Param("type") Integer type, @Param("dateStart") String dateStart,
                                                                              @Param("dateEnd") String dateEnd,
                                                                              @Param("typeOne") String typeOne,
                                                                              @Param("typeTwo") String typeTwo
    );


    List<LogisticsOrderStatisticsVO> workbenchLogisticsOrderStatisticsByDays(@Param("id") Long id, @Param("statusList") List<Integer> statusList,
                                                                             @Param("type") Integer type, @Param("dateStart") String dateStart,
                                                                             @Param("dateEnd") String dateEnd,
                                                                             @Param("typeOne") String typeOne,
                                                                             @Param("typeTwo") String typeTwo
    );

    List<LogisticsOrderDto> selectOrderListByTradeOrderIds(@Param("tradeOrderIds") List<Long> tradeOrderIds, @Param("unitType") String unitType);

    /**
     * 承运订单数据查询
     *
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @param contactsIds
     * @param userIds
     * @param idsList
     * @return
     */
    List<AcceptCarriageOrderVO> selectLogisticsOrderListByAcceptCarriage(@Param("query") AcceptCarriageOrderQuery query,
                                                                         @Param("orderList") List<Integer> orderList,
                                                                         @Param("type") String type,
                                                                         @Param("entId") Long entId,
                                                                         @Param("contactsIds") List<Long> contactsIds,
                                                                         @Param("userIds") List<Long> userIds,
                                                                         @Param("idsList") List<Long> idsList

    );

    /**
     * 托运订单数据查询
     *
     * @param query
     * @param orderList
     * @param type
     * @param entId
     * @param contactsIds
     * @param userIds
     * @param idsList
     * @return
     */
    List<AcceptCarriageOrderVO> selectLogisticsOrderListByConsign(
            @Param("query") AcceptCarriageOrderQuery query,
            @Param("orderList") List<Integer> orderList,
            @Param("type") String type,
            @Param("entId") Long entId,
            @Param("contactsIds") List<Long> contactsIds,
            @Param("userIds") List<Long> userIds,
            @Param("idsList") List<Long> idsList
    );

    /**
     * 托运订单数据统计
     *
     * @param query
     * @param orderList   单据状态
     * @param type        代表承运或者托运
     * @param entId       企业id
     * @param contactsIds 联系人id
     * @return
     */
    List<TableTops> countLogisticsOrderListByConsignStatus(@Param("query") AcceptCarriageOrderQuery query,
                                                           @Param("orderList") List<Integer> orderList,
                                                           @Param("type") String type,
                                                           @Param("entId") Long entId,
                                                           @Param("contactsIds") List<Long> contactsIds,
                                                           @Param("userIds") List<Long> userIds,
                                                           @Param("idsList") List<Long> idsList
    );

    /**
     * @param params {lOrderId 物流订单id, tOrderId 贸易订单id, upperlOrderId 下级分包物流订单, belowlOrderId 所属上级分包, status 状态}
     * @desc 统计物流订单
     * @author zk
     * @date 2023/9/18
     **/
    LogisticsCountVo findLogisticsOrderCount(Map<String, Object> params);

    List<McpLogisticsOrderVo> selectData(@Param("para") LogisticsOrderPara orderPara);

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

    List<LogisticsBaseOrderVo> selectBase(@Param("para")LogisticsOrderPara orderPara);

    /**
     * 统计贸易订单已派车次，排除已取消运单。
     *
     * @param tOrderId 贸易订单ID
     * @return 已派车次数
     */
    Long countDispatchedWaybillsByTradeOrderId(@Param("tOrderId") Long tOrderId);

    /**
     * 按时间范围汇总贸易订单已完成运单的完成量。
     *
     * @param tOrderId 贸易订单ID
     * @param chargeType 计费方式：1-装货量，2-卸货量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 完成量
     */
    BigDecimal sumCompletedWaybillVolumeByTimeRange(@Param("tOrderId") Long tOrderId,
                                                    @Param("chargeType") Integer chargeType,
                                                    @Param("startTime") LocalDateTime startTime,
                                                    @Param("endTime") LocalDateTime endTime);
}
