package cn.iocoder.yudao.module.bpm.service.oa;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.workorder.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkOrderDO;

import javax.validation.Valid;

/**
 * BPM OA 工单 Service 接口
 *
 * @author 系统
 */
public interface BpmOAWorkOrderService {

    /**
     * 创建工单
     *
     * @param userId      发起人ID
     * @param createReqVO 创建请求
     * @return 工单ID
     */
    Long createWorkOrder(Long userId, @Valid BpmOAWorkOrderCreateReqVO createReqVO);

    /**
     * 更新工单状态结果
     *
     * @param id     工单ID
     * @param result BPM流程结果
     */
    void updateWorkOrderResult(Long id, Integer result);

    /**
     * 分配工单
     *
     * @param id             工单ID
     * @param assigneeUserId 责任人ID
     * @param assigneeDeptId 责任部门ID
     */
    void assignWorkOrder(Long id, Long assigneeUserId, Long assigneeDeptId);

    /**
     * 添加工单跟踪信息
     *
     * @param userId     操作人ID
     * @param trackReqVO 跟踪信息
     */
    void addTrackInfo(Long userId, @Valid BpmOAWorkOrderTrackReqVO trackReqVO);

    /**
     * 更新工单
     *
     * @param updateReqVO 更新请求
     */
    void updateWorkOrder(@Valid BpmOAWorkOrderUpdateReqVO updateReqVO);

    /**
     * 获取工单详情
     *
     * @param id 工单ID
     * @return 工单DO
     */
    BpmOAWorkOrderDO getWorkOrder(Long id);

    /**
     * 获取工单详情（带扩展信息）
     *
     * @param id 工单ID
     * @return 工单详情VO
     */
    BpmOAWorkOrderRespVO getWorkOrderDetail(Long id);

    /**
     * 根据流程实例ID获取工单
     *
     * @param processInstanceId 流程实例ID
     * @return 工单DO
     */
    BpmOAWorkOrderDO getWorkOrderByProcessInstanceId(String processInstanceId);

    /**
     * 获取工单分页
     *
     * @param loginUserId 登录用户ID
     * @param pageVO      分页请求
     * @return 分页结果
     */
    PageResult<BpmOAWorkOrderRespVO> getWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);

    /**
     * 获取我发起的工单分页
     *
     * @param loginUserId 登录用户ID
     * @param pageVO      分页请求
     * @return 分页结果
     */
    PageResult<BpmOAWorkOrderRespVO> getMyWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);

    /**
     * 获取分配给我的工单分页
     *
     * @param loginUserId 登录用户ID
     * @param pageVO      分页请求
     * @return 分页结果
     */
    PageResult<BpmOAWorkOrderRespVO> getAssignedWorkOrderPage(Long loginUserId, BpmOAWorkOrderPageReqVO pageVO);

    /**
     * 获取我负责工单的数量
     *
     * @param userId 用户ID
     * @return 工单数量
     */
    Long getMyAssignedWorkOrderCount(Long userId);

    /**
     * 工单操作记录跟踪分页列表
     *
     * @param dto
     * @return
     */
    PageResult<BpmOAWorkOrderTrackInfo> getTrackPage(@Valid BpmOAWorkOrderTrackReqDTO dto);
}
