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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.api.oa.vo.receipt.BpmOAReceiptVO;
import cn.iocoder.yudao.module.bpm.api.oa.vo.receipt.ReceiptSettlementDTO;
import cn.iocoder.yudao.module.bpm.api.oa.vo.receipt.ReceiptSettlementVO;
import cn.iocoder.yudao.module.bpm.api.oa.vo.receipt.ReceiptStatisticsDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.receipt.BpmOAReceiptCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.receipt.BpmOAReceiptPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.receipt.BpmOAReceiptRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.receipt.ReceiptStatisticsVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAReceiptDO;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;

public interface BpmOAReceiptService {

    /**
     * 创建回款申请
     *
     * @param userId      用户编号
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createReceipt(Long userId, @Valid BpmOAReceiptCreateReqVO createReqVO);

    /**
     * 更新回款申请的状态
     *
     * @param id     编号
     * @param result 结果
     */
    void updateReceiptResult(String processInstanceId, Long id, Integer result);

    /**
     * 获得回款申请
     *
     * @param id 编号
     * @return 退款申请
     */
    BpmOAReceiptDO getReceipt(Long id);

    /**
     * 获得指定的回款申请
     *
     * @param processInstanceId 流程实例编号
     * @return 退款申请
     */
    BpmOAReceiptDO getByProcessInstanceId(String processInstanceId);

    /**
     * 获得回款申请分页列表
     *
     * @param pageReqVO 分页信息
     * @return 分页列表
     */
    PageResult<BpmOAReceiptRespVO> getReceiptPage(BpmOAReceiptPageReqVO pageReqVO);

    /**
     * 获得回款统计信息
     *
     * @param userId   用户编号
     * @param relation 查询类型
     * @return 回款统计信息
     */
    ReceiptStatisticsVO getStatistics(Long userId, String relation);

    /**
     * 获得回款列表
     *
     * @param respVO 参数信息
     * @return 回款信息列表
     */
    List<BpmOAReceiptDO> getReceiptList(BpmOAReceiptVO respVO);

    /**
     * 获得指定用户回款统计信息
     *
     * @param userIds    用户编号
     * @param createTime 创建时间
     * @return 回款统计信息
     */
    List<ReceiptStatisticsDTO> getReceiptStatisticsListByUserIds(List<Long> userIds, LocalDateTime[] createTime);

    /**
     * 获取用户结算回款信息
     *
     * @param vo
     * @return
     */
    List<ReceiptSettlementDTO> getReceiptSettlement(ReceiptSettlementVO vo);
}
