package com.ruoyi.ss.transactionBill.mapper;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.domain.vo.CommonCountVO;
import com.ruoyi.dashboard.domain.vo.BillCountVo;
import com.ruoyi.ss.transactionBill.domain.TransactionBill;
import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionAmountVO;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionDailyAmountVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 充值记录Mapper接口
 *
 * @author 邱贞招
 * @date 2024-02-21
 */
public interface TransactionBillMapper
{
    /**
     * 查询充值记录
     *
     * @param billId 充值记录主键
     * @return 充值记录
     */
    public TransactionBillVO selectSmTransactionBillByBillId(Long billId);

    /**
     * 查询充值记录列表
     *
     * @param smTransactionBill 充值记录
     * @return 充值记录集合
     */
    public List<TransactionBillVO> selectSmTransactionBillList(@Param("query") TransactionBillQuery smTransactionBill);

    /**
     * 新增充值记录
     *
     * @param transactionBill 充值记录
     * @return 结果
     */
    public int insertSmTransactionBill(TransactionBill transactionBill);

    /**
     * 修改充值记录
     *
     * @param transactionBill 充值记录
     * @return 结果
     */
    public int updateSmTransactionBill(@Param("data")TransactionBill transactionBill);

    /**
     * 删除充值记录
     *
     * @param billId 充值记录主键
     * @return 结果
     */
    public int deleteSmTransactionBillByBillId(Long billId);

    /**
     * 批量删除充值记录
     *
     * @param billIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteSmTransactionBillByBillIds(Long[] billIds);

    /**
     * 获取账单统计数据
     * @param dto 查询条件
     */
    List<BillCountVo> selectCount(@Param("query")TransactionBillQuery dto);

    /**
     * 充值成功
     * @param billId 订单id
     */
    int rechargeSuccess(@Param("billId") Long billId, @Param("payTime") Date payTime);

    /**
     * 通过订单编号查询订单
     * @param billNo 订单编号
     * @return
     */
    TransactionBillVO selectSmTransactionBillByBillNo(String billNo);

    /**
     * 订单取消
     * @param billNo 订单编号
     * @param status 订单取消后的状态
     * @return 影响的行数
     */
    int cancelRecharge(@Param("billNo") String billNo, @Param("status") String status);

    /**
     * 审核通过
     * @param billId id
     * @param remark 审核意见
     */
    int doPassWithdraw(@Param("billId") Long billId, @Param("remark") String remark);

    /**
     * 拒绝提现
     * @param billId id
     * @param remark 审核意见
     */
    int doRejectWithdraw(@Param("billId") Long billId, @Param("remark") String remark);

    /**
     * 发起提现打款（打款中...）
     * @param billId 提现订单id
     */
    int doPayWithdraw(Long billId);

    /**
     * 提现成功
     * @param billId id
     */
    int withdrawSuccess(@Param("billId") Long billId, @Param("payTime")LocalDateTime payTime);

    /**
     * 提现失败
     * @param billId id
     */
    int withdrawFailed(Long billId);

    /**
     * 更新状态为支付中
     * @param billId
     * @return
     */
    int paying(Long billId);

    int updateDeviceRechargeStatus(@Param("billId") Long billId, @Param("status") String status, @Param("openMsg") String openMsg);

    /**
     * 修改设备充值状态
     * @param billIds 需要修改的ID
     * @param status 修改后的设备充值状态
     */
    int updateDeviceRechargeStatusByIds(@Param("billIds") List<Long> billIds, @Param("status") String status);

    /**
     * 蓝牙充值成功
     */
    int bluetoothRechargeSuccess(String billNo);

    /**
     * 根据条件修改
     */
    int updateByQuery(@Param("data") TransactionBill data, @Param("query") TransactionBillQuery query);

    /**
     * 添加退款金额
     * @param billId 订单ID
     * @param refundAmount 退款金额
     * @param refundMchAmount 商户退款金额
     * @param refundServiceAmount 服务费退款金额
     */
    int addRefundAmount(@Param("billId") Long billId,
                        @Param("refundAmount") BigDecimal refundAmount,
                        @Param("refundMchAmount") BigDecimal refundMchAmount,
                        @Param("refundServiceAmount") BigDecimal refundServiceAmount
    );

    /**
     * 批量更新套餐结束时间
     */
    int batchUpdateSuitEndTime(@Param("billIds") List<Long> billIds,@Param("time") LocalDateTime time);

    /**
     * 查询提现列表
     */
    List<TransactionBillVO> selectWithdrawList(@Param("query") TransactionBillQuery query);

    /**
     * 查询提现详情
     */
    TransactionBillVO selectWithdrawById(Long billId);

    /**
     * 简单查询数量
     */
    int selectSimpleCount(@Param("query") TransactionBillQuery query);

    /**
     * 查询订单总金额
     * @param query
     * @return
     */
    BigDecimal selectSumOfMoney(@Param("query") TransactionBillQuery query);

    /**
     * 查询金额统计
     */
    <T> List<TransactionAmountVO<T>> selectCommonSumOfMoney(@Param("query") TransactionBillQuery query, @Param("groupBy") String groupBy);

    /**
     * 查询统计数量
     */
    List<JSONObject> selectCountGroupBy(@Param("query") TransactionBillQuery query, @Param("groupBy") String groupBy);

    /**
     * 查询订单总金额（不包含退款）
     */
    BigDecimal selectSumOfMoneyWithoutRefund(@Param("query") TransactionBillQuery query);

    /**
     * 按日查询金额
     */
    List<TransactionDailyAmountVO> selectDailyAmount(@Param("query") TransactionBillQuery query);

}
