package com.jsowell.pile.mapper;

import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.OrderDetail;
import com.jsowell.pile.dto.IndexQueryDTO;
import com.jsowell.pile.dto.QueryOrderDTO;
import com.jsowell.pile.dto.QueryPersonPileDTO;
import com.jsowell.pile.dto.QueryStationInfoDTO;
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
import com.jsowell.pile.vo.uniapp.OrderVO;
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
import com.jsowell.pile.vo.uniapp.SendMessageVO;
import com.jsowell.pile.vo.web.IndexOrderInfoVO;
import com.jsowell.pile.vo.web.OrderListVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单Mapper接口
 *
 * @author jsowell
 * @date 2022-09-30
 */
@Repository
public interface OrderBasicInfoMapper {
	/**
	 * 查询订单
	 *
	 * @param id 订单主键
	 * @return 订单
	 */
	OrderBasicInfo selectOrderBasicInfoById(Long id);

	/**
	 * 条件查询订单基础信息
	 * @param info
	 * @return
	 */
	OrderBasicInfo getOrderBasicInfo(OrderBasicInfo info);

	/**
	 * 查询订单列表
	 *
	 * @param orderBasicInfo 订单
	 * @return 订单集合
	 */
	List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO orderBasicInfo);

	/**
	 * 新增订单
	 *
	 * @param orderBasicInfo 订单
	 * @return 结果
	 */
	int insertOrderBasicInfo(OrderBasicInfo orderBasicInfo);

	/**
	 * 修改订单
	 *
	 * @param orderBasicInfo 订单
	 * @return 结果
	 */
	int updateOrderBasicInfo(OrderBasicInfo orderBasicInfo);

	/**
	 * 批量删除订单
	 *
	 * @param ids 需要删除的数据主键集合
	 * @return 结果
	 */
	int deleteOrderBasicInfoByIds(Long[] ids);

	/**
	 * 批量删除订单详情
	 *
	 * @param ids 需要删除的数据主键集合
	 * @return 结果
	 */
	int deleteOrderDetailByOrderCodes(Long[] ids);

	/**
	 * 批量新增订单详情
	 *
	 * @param orderDetailList 订单详情列表
	 * @return 结果
	 */
	int batchOrderDetail(List<OrderDetail> orderDetailList);


	/**
	 * 通过订单主键删除订单详情信息
	 *
	 * @param id 订单ID
	 * @return 结果
	 */
	int deleteOrderDetailByOrderCode(Long id);

	/**
	 * 修改订单详情
	 * @param orderDetail 订单详情
	 */
	int updateOrderDetail(OrderDetail orderDetail);

	/**
	 * 通过订单号查询订单基本信息
	 *
	 * @param orderCode 订单号
	 * @return
	 */
	OrderBasicInfo getOrderInfoByOrderCode(String orderCode);

	OrderBasicInfo getOrderInfoByTransactionCode(String transactionCode);

	/**
	 * 根据桩编号和枪口号查询某状态订单
	 *
	 * @param pileSn 桩编号
	 * @param connectorCode 枪口号
	 * @param orderStatus 订单状态
	 * @return 订单
	 */
	OrderBasicInfo queryOrderBasicInfo(@Param("pileSn") String pileSn, @Param("connectorCode") String connectorCode, @Param("orderStatus") String orderStatus);

	/**
	 * 通过订单号查询订单详情
	 *
	 * @param orderCode 订单号
	 * @return 订单详情
	 */
	OrderDetail getOrderDetailByOrderCode(@Param("orderCode") String orderCode);

	/**
	 * 通过会员Id和订单状态查询订单信息
	 *
	 * @param memberId 会员id
	 * @param orderStatusList 订单状态集合
	 * @param dateTime
	 * @return
	 */
	List<OrderVO> getListByMemberIdAndOrderStatus(@Param("memberId") String memberId,
												  @Param("orderStatusList") List<String> orderStatusList,
												  @Param("dateTime") LocalDateTime dateTime,
												  @Param("stationId") String stationId);

	/**
	 * 将某订单修改为某状态
	 * @param orderCode 订单号
	 * @param orderStatus 修改为某状态
	 */
    void updateOrderStatusByOrderCode(@Param("orderCode") String orderCode, @Param("orderStatus") String orderStatus);


	/**
	 * 首页订单数据展示
	 * @param dto 首页信息查询dto
	 * @return
	 */
	List<IndexOrderInfoVO> getIndexOrderInfo(@Param("dto") IndexQueryDTO dto);

	/**
	 * 获取超过15分钟的待支付状态订单
	 * @return
	 */
	List<OrderBasicInfo> getUnpaidOrderListOver15Min(@Param("createTime") String createTime);

	/**
	 * 根据orderId批量修改订单状态
	 * @param orderIds
	 * @param orderStatus
	 */
	void updateOrderStatusById(@Param("orderIds") List<String> orderIds, @Param("orderStatus") String orderStatus);

	/**
	 * 通过订单号查询订单信息（小程序发送消息用）
	 * @param orderCode
	 * @return
	 */
	SendMessageVO selectOrderInfoByOrderCode(@Param("orderCode") String orderCode);

	List<OrderBasicInfo> selectOrderListByTimeRangeAndStatus(@Param("startTime") String startTime,
															 @Param("endTime") String endTime,
															 @Param("orderStatus") String orderStatus,
															 @Param("payStatus") String payStatus);

	/**
	 * 个人桩查询充电数据
	 * @param dto
	 * @return
	 */
	List<PersonPileConnectorSumInfoVO> getAccumulativeInfo(QueryPersonPileDTO dto);

	List<OrderBasicInfo> getAppointmentOrder(LocalDateTime dateTime);

	List<OrderVO> getListByOrderCodes(@Param("orderCodes") List<String> orderCodes);

	/**
	 * 联联平台 获取累计数据用
	 * @param dto
	 * @return
	 */
	List<AccumulativeInfoVO> getAccumulativeInfoForLianLian(QueryStationInfoDTO dto);

	List<OrderDetail> queryElecAmountNullList();

	int batchUpdateOrderDetail(@Param("list") List<OrderDetail> orderDetailList);

	List<OrderDetail> getOrderDetailList(List<String> orderCodes);

    List<OrderBasicInfo> tempQueryWeChatRefundOrders(@Param("startTime") String startTime, @Param("endTime") String endTime);
}
