package cn.iocoder.yudao.module.expense.service.expenseinfo;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.expense.api.expenseinfo.dto.ExpenseInfoCreateReqDTO;
import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoPageReqVO;
import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoRespVO;
import cn.iocoder.yudao.module.expense.controller.admin.expenseinfo.vo.ExpenseInfoSaveReqVO;
import cn.iocoder.yudao.module.expense.dal.dataobject.expenseinfo.ExpenseInfoDO;
import cn.iocoder.yudao.module.expense.dal.dataobject.expenseinfo.ExpenseInfoObjDO;

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

/**
 * 报销信息 Service 接口
 *
 * @author dp
 */
public interface ExpenseInfoService {

    /**
     * 创建报销信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createInfo(@Valid ExpenseInfoSaveReqVO createReqVO);

    /**
     * 更新报销信息
     *
     * @param updateReqVO 更新信息
     */
    void updateInfo(@Valid ExpenseInfoSaveReqVO updateReqVO);

    /**
     * 删除报销信息
     *
     * @param id 编号
     */
    void deleteInfo(Long id);

    /**
     * 获得报销信息
     *
     * @param id 编号
     * @return 报销信息
     */
    ExpenseInfoDO getInfo(Long id);

    /**
     * 获得报销信息分页
     *
     * @param pageReqVO 分页查询
     * @return 报销信息分页
     */
    PageResult<ExpenseInfoRespVO> getInfoPage(ExpenseInfoPageReqVO pageReqVO);

    /**
     * 创建费用信息
     *
     * @param createReqDTO 费用信息创建请求对象，包含创建费用信息所需的各项数据
     * @return 返回新创建的费用信息的唯一标识
     */
    Long createExpenseInfo(ExpenseInfoCreateReqDTO createReqDTO);

    // ==================== 子表（报销信息子） ====================

    /**
     * 获得报销信息子列表
     *
     * @param expenseId 报销主表主键id
     * @return 报销信息子列表
     */
    List<ExpenseInfoObjDO> getExpenseInfoObjListByExpenseId(Long expenseId);

}