package cn.iocoder.yudao.module.order.service.orderCargoControl;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderCargoControl.OrderCargoControlDO;
import cn.iocoder.yudao.module.order.dto.OrderCargoControlReleaseInfoDto;
import cn.iocoder.yudao.module.order.dto.OrderQueryDTO;
import cn.iocoder.yudao.module.order.vo.order.OrderBackPageVO;
import cn.iocoder.yudao.module.order.vo.order.OrderQueryVO;
import cn.iocoder.yudao.module.order.vo.order.OrderSendSmsReqVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControl.OrderCargoControlBackVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControl.OrderCargoControlCreateReqVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControl.OrderCargoControlQueryVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControl.OrderCargoControlUpdateReqVO;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.List;

/**
 * 订单控货人信息 Service 接口
 *
 * @author 郑屹
 */
public interface OrderCargoControlService extends IService<OrderCargoControlDO> {

    /**
     * 创建订单控货人信息
     *
     * @param createReqVO  创建信息
     * @param memberUserDO app-web当前登录会员信息
     * @return 编号
     */
    Long createOrderCargoControl(@Valid OrderCargoControlCreateReqVO createReqVO, MemberUserDO memberUserDO);

    /**
     * 更新订单控货人信息
     *
     * @param updateReqVO 更新信息
     */
    void updateOrderCargoControl(@Valid OrderCargoControlUpdateReqVO updateReqVO);

    /**
     * 删除订单控货人信息
     *
     * @param id 编号
     */
    void deleteOrderCargoControl(Long id);

    /**
     * 获得订单控货人信息
     *
     * @param id 编号
     * @return 订单控货人信息
     */
    OrderCargoControlDO getOrderCargoControl(Long id);

    /**
     * 获得订单控货人信息列表
     *
     * @param ids 编号
     * @return 订单控货人信息列表
     */
    List<OrderCargoControlDO> getOrderCargoControlList(Collection<Long> ids);

    /**
     * 获得订单控货人信息分页
     *
     * @param page  分页查询
     * @param query 查询
     * @return 订单控货人信息分页
     */
    PageResult<OrderCargoControlDO> getOrderCargoControlPage(OrderCargoControlQueryVO query, PageVO page);

    /**
     * 获得订单控货人信息列表, 用于 Excel 导出
     *
     * @param query 查询
     * @return 订单控货人信息列表
     */
    List<OrderCargoControlDO> getOrderCargoControlList(OrderCargoControlQueryVO query);

    PageResult<OrderBackPageVO> orderPage(OrderQueryVO query, PageVO page);

    OrderCargoControlBackVO getOrderCargoControlInfo(Long orderId);

    OrderCargoControlReleaseInfoDto getOrderCargoControlReleaseInfo(Long orderId);

    void sendSmsCode(Long loginUserId, OrderSendSmsReqVO reqVO, MemberUserDO memberUserDO);


    List<OrderBackPageVO> seasoningCondimentsCargoControlOrderPage(Long orderId, Integer userType);


    /**
     * 通过订单id获取实际控货人
     *
     * @param orderId 订单id
     * @return
     */
    OrderCargoControlDO getActualOrderCargoControlByOrderId(Long orderId);

    void exportCargoControlOrderExcel(HttpServletResponse response, OrderQueryVO query) throws IOException;

   // FileDO makeCargoControlOrderExcelFile(Long userId, Integer userType, OrderQueryVO query) throws Exception;

    FileDO makeCargoControlOrderExcelFile(Long userId, Integer userType, OrderQueryDTO query) throws Exception;
    /**
     * 判断是否控货人是否设置了控货密码
     *
     * @param orderId 订单id
     * @return 返回是或否
     */
    Boolean checkControlPassword(Long orderId);
}
