package cn.iocoder.yudao.module.system.service.customersettlement;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.api.customersettlement.dto.SettlementItemDTO;
import cn.iocoder.yudao.module.system.controller.admin.customersettlement.vo.CustomerSettlementPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.customersettlement.vo.CustomerSettlementSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.customersettlement.vo.StatisticsVO;
import cn.iocoder.yudao.module.system.dal.dataobject.customersettlement.CustomerSettlementDO;
import cn.iocoder.yudao.module.system.dal.dataobject.customersettlement.SettlementItemDO;

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

/**
 * 客户结算信息 Service 接口
 *
 * @author 陈宾顺
 */
public interface CustomerSettlementService {

    /**
     * 创建客户结算信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCustomerSettlement(@Valid CustomerSettlementSaveReqVO createReqVO);

    /**
     * 更新客户结算信息
     *
     * @param updateReqVO 更新信息
     */
    void updateCustomerSettlement(@Valid CustomerSettlementSaveReqVO updateReqVO);

    /**
     * 删除客户结算信息
     *
     * @param id 编号
     */
    void deleteCustomerSettlement(Long id);

    /**
     * 获得客户结算信息
     *
     * @param id 编号
     * @return 客户结算信息
     */
    CustomerSettlementDO getCustomerSettlement(Long id);

    /**
     * 获得客户结算信息分页
     *
     * @param pageReqVO 分页查询
     * @return 客户结算信息分页
     */
    PageResult<CustomerSettlementDO> getCustomerSettlementPage(CustomerSettlementPageReqVO pageReqVO);

    /**
     * 根据结算id查询结算明细
     *
     * @param ids       结算id集合
     * @param businessType 查询条件
     * @return 结算明细集合
     */
    List<SettlementItemDO> getSettlementItemListBySettlementId(List<Long> ids, Integer businessType);

    /**
     * 更新结算信息确认状态
     *
     * @param id     编号
     * @param status 状态
     */
    void updateConfirm(Long id, Integer status);

    /**
     * 获得结算统计信息
     * @param pageReqVO 查询信息
     * @return 统计信息
     */
    StatisticsVO getCustomerSettlementTotal(CustomerSettlementPageReqVO pageReqVO);

    /**
     * 获得结算扣款明细
     * @param factoryId 工厂id
     * @param month  月份
     * @return  结算扣款明细
     */
    List<SettlementItemDTO> getDeductionItems(Long factoryId, String month);
}