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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.bpm.enums.WorkFlowEmus;
import cn.iocoder.yudao.module.order.dal.dataobject.approval.OrderApprovalDO;
import cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum;
import cn.iocoder.yudao.module.order.vo.approval.OrderApprovalCreateReqVO;
import cn.iocoder.yudao.module.order.vo.approval.OrderApprovalQueryVO;
import cn.iocoder.yudao.module.order.vo.approval.OrderApprovalUpdateReqVO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 订单审核 Service 接口
 *
 * @author 系统管理员
 */
public interface OrderApprovalService extends IService<OrderApprovalDO> {




    /**
     * 创建审核并发起审批流程
     *
     * @param orderApprovalDO 审批请求对象
     * @param workFlowEmus             审批类型
     * @param copyUserId
     * @return
     */
    Long applyAndCreate(OrderApprovalDO orderApprovalDO, WorkFlowEmus workFlowEmus, String[] copyUserId);

    /**
     * 审核单回调更新
     *
     * @param orderApprovalDO
     * @param formId
     * @param result                   结果
     */
    void callbackUpdate(OrderApprovalDO orderApprovalDO, String formId, Integer result);


    /**
     * 取消审核 并更新 状态
     * @param orderApprovalDO 审核单
     * @param reason 取消原因
     */
    void cancelApplyAndUpdate(OrderApprovalDO orderApprovalDO, String reason);

    /**
     * 创建订单审核
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createApproval(@Valid OrderApprovalCreateReqVO createReqVO);

    /**
     * 更新订单审核
     * @param updateReqVO 更新信息
     */
    void updateApproval(@Valid OrderApprovalUpdateReqVO updateReqVO);

    /**
     * 删除订单审核
     * @param id 编号
     */
    void deleteApproval(Long id);

    /**
     * 获得订单审核
     * @param id 编号
     * @return 订单审核
     */
    OrderApprovalDO getApproval(Long id);

    /**
     * 获得订单审核列表
     * @param ids 编号
     * @return 订单审核列表
     */
    List<OrderApprovalDO> getApprovalList(Collection<Long> ids);

    /**
     * 获得订单审核分页
     * @param page 分页查询
     * @param query 查询
     * @return 订单审核分页
     */
    PageResult<OrderApprovalDO> getApprovalPage(OrderApprovalQueryVO query, PageVO page);

    /**
     * 获得订单审核列表, 用于 Excel 导出
     * @param query 查询
     * @return 订单审核列表
     */
    List<OrderApprovalDO> getApprovalList(OrderApprovalQueryVO query);


    OrderApprovalDO selectOne(LambdaQueryWrapperX<OrderApprovalDO> lambdaQueryWrapperX);

    /**
     * 获取订单此类型的最近的一个审批单
     *
     * @param orderId 订单id
     * @param orderApprovalTypeEnum 审批类型
     * @return
     */
    OrderApprovalDO getLast(Long orderId, OrderApprovalTypeEnum orderApprovalTypeEnum);


    /**
     * 获取正在处理中的批量审批（批量优惠/批量特价）
     * @param orderId
     * @param orderItemId
     * @return
     */
    OrderApprovalDO getProcessingItemBatchApproval(Long orderId, Long orderItemId);

}
