package com.ghy.order.service;

import com.ghy.order.domain.OrderDetail;
import com.huifu.adapay.core.exception.BaseAdaPayException;

import java.util.List;
import java.util.Map;

/**
 * 详细订单接口
 *
 * @author HH 2022/4/25
 */
public interface OrderDetailService {

    /**
     * @param orderDetail 详细订单属性
     * @return 成功条数
     */
    int insertOrderDetail(OrderDetail orderDetail);

    /**
     * @param orderDetail 详细订单属性
     * @return 成功条数
     */
    int updateOrderDetail(OrderDetail orderDetail);

    /**
     * @param orderDetail 详细订单入参
     * @return 详细订单集合
     */
    List<OrderDetail> selectOrderDetailList(OrderDetail orderDetail);


    /**
     * @param orderDetailId 详细订单id
     * @return 详细订单
     */
    OrderDetail selectById(Long orderDetailId);

    /**
     * @param orderMasterId 主订单id
     * @return 详细订单
     */
    List<OrderDetail> selectByOrderMasterId(Long orderMasterId);

    /**
     * @param ids 详细订单ids
     * @return 删除结果
     */
    int deleteOrderDetailByIds(String ids);

    /**
     * 校验详细订单编码是否重复
     *
     * @param orderDetail 详细订单属性
     * @return 校验结果 1存在 0不存在
     */
    String checkOrderDetailCodeUnique(OrderDetail orderDetail);

    /**
     * 创建code
     */
    String createCode();

    /**
     * 根据订单id集合信息进行查询封装成为map数据，
     *
     * @param orderIdList 订单Id集合信息数据
     * @return 键值队列数据， key-> 订单Id value-> 订单实体集合信息
     */
    Map<Long, List<OrderDetail>> byOrderIdInMap(List<Long> orderIdList);

    /**
     * 消费者申请取消子订单
     *
     * @param orderDetailId 子订单ID
     */
    void cancel(Long orderDetailId);

    /**
     * 师傅审核取消子订单申请
     *
     * @param orderDetailId 子订单ID
     * @param agree         0=不同意 1=同意
     */
    void cancelAgree(Long orderDetailId, Integer agree);

    /**
     * 通过主订单ID批量更新子订单
     * 可更新字段: orderStatus
     *
     * @param orderDetail 子订单
     */
    void updateByOrderMasterId(OrderDetail orderDetail);

    /**
     * 查询指定状态的订单
     */
    List<OrderDetail> selectByStatus(List<Integer> status);

    /**
     * 子订单确认完成
     * 1.修改子订单状态为 OrderStatus.FINISH.code
     * 2.将子订单对应的子财务单确认分账
     * 3.异步提现至银行卡
     *
     * @param orderDetailId 子订单ID
     */
    void finish(Long orderDetailId) throws BaseAdaPayException;
}
