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.contract.BpmOAContractVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.ContractStatisticsRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAContractDO;

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

public interface BpmOAContractService {

    /**
     * 创建合同申请
     *
     * @param userId      用户编号
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createContract(Long userId, @Valid BpmOAContractCreateReqVO createReqVO);

    /**
     * 更新合同
     *
     * @param updateReqVO 更新信息
     */
    void updateContract(BpmOAContractDO updateReqVO);

    /**
     * 修改开票金额
     *
     * @param contractId 合同编号
     * @param amount     开票金额
     */
    void updateInvoiceMoney(Long contractId, BigDecimal amount);

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

    /**
     * 获得合同申请
     *
     * @param id 编号
     * @return 出差申请
     */
    BpmOAContractDO getContract(Long id);

    /**
     * 获得指定合同申请
     *
     * @param processInstanceId 流程实例编号
     * @return 出差申请
     */
    BpmOAContractDO getByProcessInstanceId(String processInstanceId);

    /**
     * 获取当前用户所在部门的合同列表
     *
     * @param userIds 用户编号集合
     * @return 合同列表
     */
    List<BpmOAContractDO> getListByDeptId(List<Long> userIds);

    /**
     * 获得合同分页
     *
     * @param pageReqVO 分页参数
     * @return 分页列表
     */
    PageResult<BpmOAContractRespVO> getContractPage(BpmOAContractPageReqVO pageReqVO);

    /**
     * 获得指定流程实例的合同申请列表
     *
     * @param processInstanceIds 流程实例编号集合
     * @return 合同列表
     */
    List<BpmOAContractRespVO> getListByProcessInstanceIds(List<String> processInstanceIds);

    /**
     * 获得合同统计信息
     *
     * @param userId   用户编号
     * @param relation 查询类型
     * @return 统计信息
     */
    ContractStatisticsRespVO getContractStatistics(Long userId, String relation);

    /**
     * 获得指定用户的合同统计信息列表
     *
     * @param userIds    用户编号集合
     * @param createTime 创建时间
     * @return 合同统计信息列表
     */
    List<ContractStatisticsRespVO> getContractStatisticsListByUserIds(List<Long> userIds, LocalDateTime[] createTime);

    /**
     * 获得合同列表
     *
     * @param respVO 参数列表
     * @return 合同列表
     */
    List<BpmOAContractDO> getContractList(BpmOAContractVO respVO);

    /**
     * 获得指定客户合同列表
     *
     * @param customerId 客户编号
     * @return 合同列表
     */
    List<BpmOAContractDO> getListByCustomerId(Long customerId);

    /**
     * 批量更新合同结算状态
     *
     * @param contractIds
     */
    void updateSettlementFlagByIds(List<Long> contractIds);

    /**
     * 获取下属和自己的合同列表
     *
     * @return
     */
    List<BpmOAContractDO> getList(String relation, Integer contractType, String contractName);
}
