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.*;
import cn.iocoder.yudao.module.order.vo.orderCargoControlPick.OrderCargoControlPickApplyVO;

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> cargoControlOrderPage(OrderQueryVO query, PageVO page);


    /**
     * 预警控货订单信息
     * 满足条件：1、控货订单
     *         2、非海外仓订单
     *         3、控货订单放货三次未提货完
     *         4、控货订单已过免仓时效，未完成放货
     * 以上为查询出的预警控货订单，以便于将订单转海外仓货、收取仓储费用、提醒客户放货等业务操作
     *
     * @param query
     * @param page
     * @return
     */
    PageResult<OrderBackPageVO> warningCargoControlOrderPage(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);


    /**
     * @param approveId 表单业务ID
     * @param result    1 处理中  2 通过 3 不通过 4 已取消
     */
    void approvalOrderCargoControl(String approveId, Integer result);


    /**
     * 订单放货限制修改申请
     *
     * @param orderId 订单ID
     * @return 订单放货限制修改申请业务表单详情
     */
    OrderCargoControlApplyVO approvalOrderCargoControlPickLimitUpdateByOrderId(Long orderId);

    /**
     * 订单海外仓修改申请
     *
     * @param orderId 订单ID
     * @return 订单海外仓修改申请业务表单详情
     */
    OrderCargoControlApplyVO approvalOrderCargoControlOverseasWarehouseUpdateByOrderId(Long orderId);

    /**
     * 订单控货相关申请管理
     *
     * @param orderCargoControlApplyVO 控货订单审批业务申请信息
     */
    void orderCargoControlApply(OrderCargoControlApplyVO orderCargoControlApplyVO);
}
