package com.dayou.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dayou.dto.APFundSelectDTO;
import com.dayou.dto.AProListSelectDTO;
import com.dayou.dto.ReportDTO;
import com.dayou.entity.AssetsProduction;
import com.dayou.dao.CustomBaseMapper;
import com.dayou.vo.AssetsProductionFundVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 资产产品表 Mapper 接口
 * </p>
 *
 * @author GouGengquan
 * @since 2024-03-28
 */
public interface AssetsProductionMapper extends CustomBaseMapper<AssetsProduction> {

    /**
     * 根据业务id获取产品信息类型集合
     * @param businessId 资产业务id
     * @return List<String>
     */
    List<String> getProductionTypes(@Param("businessId") Long businessId);

    /**
     * 根据业务id获取已选择产品
     * @param businessId 资产业务id
     * @return AssetsProduction
     */
    AssetsProduction getProductionByBusinessId(@Param("businessId") Long businessId);

    /**
     * 获取产品号集合(用于判断下一个子号)
     * @param targetId 评估对象id
     * @return List<String>
     */
    List<String> getProductionNo(@Param("id") Long targetId);

    /**
     * 更新产品的产品号信息
     * @param businessId 业务id
     * @param productionType 产品类型
     * @param productionNo 产品号
     * @return Boolean
     */
    Boolean updateProductionNo(@Param("productionId") Long productionId, @Param("businessId") Long businessId, @Param("productionType") String productionType, @Param("productionNo") String productionNo);

    /**
     * 取子号情况下,再复制一份产品信息并添加
     * @param assetsProduction 产品基础信息
     * @return Boolean
     */
    Boolean copyProductionInfo(AssetsProduction assetsProduction);

    /**
     * 撰写产品信息
     * @param assetsProduction 产品信息字段
     * @return Boolean
     */
    Boolean writeAssetsProduction(AssetsProduction assetsProduction);

    /**
     * 根据业务id与产品号查询产品信息
     * @param aProListSelectDTO 查询dto
     * @return List<AssetsProduction>
     */
    List<AssetsProduction> getProductionList(AProListSelectDTO aProListSelectDTO);

    /**
     * 根据业务id与产品号查询该产品是否已有提交的流程实例信息
     * @param aProListSelectDTO 查询dto
     * @return Integer
     */
    Integer getInatanceCount(AProListSelectDTO aProListSelectDTO);

    /**
     * 根据业务id与产品号集合获取每个产品是否有提交过的流程实例信息
     * @return Integer
     */
    Integer getInatanceCountByIdAndProNo(@Param("businessId") Long businessId, @Param("productionNo") String productionNo);

    /**
     * 根据资产产品id更新文件路由信息
     * @param assetsProduction 产品信息dto
     * @return Boolean
     */
    Boolean updateProductionFileInfo(AssetsProduction assetsProduction);

    /**
     * 获取产品实收款
     * @param productionNo 产品号
     * @return BigDecimal
     */
    BigDecimal getProductionRealAmount(@Param("productionNo") String productionNo);

    /**
     * 产品标记送达
     * @param productionNo 产品号
     * @return Boolean
     */
    Boolean markDelivery(@Param("productionNo") String productionNo);

    /**
     * 查找实收款认领产品列表
     * @param apFundSelectDTO 查询dto
     * @return List<AssetsProductionFundVo>
     */
    Page<AssetsProductionFundVo> getAssetsProductionFundVoList(@Param("page") Page page , @Param("apFundSelectDTO") APFundSelectDTO apFundSelectDTO, @Param("managerId") Long managerId);

    /**
     * 查找实收款认领订单列表
     * @param apFundSelectDTO 查询dto
     * @return List<AssetsProductionFundVo>
     */
    Page<AssetsProductionFundVo> getAssetsOrderFundVoList(@Param("page") Page page , @Param("apFundSelectDTO") APFundSelectDTO apFundSelectDTO, @Param("managerId") Long managerId);

    /**
     * 根据订单收款id获取产品收款信息
     * @param orderFundId 资产订单收款id
     * @return List<ReportDTO>
     */
    List<ReportDTO> getProductionFundByOrderFundId(@Param("orderFundId") Long orderFundId);

    /**
     * 产品归档
     * @param saveFileDate 归档时间
     * @return Boolean
     */
    Boolean prodSaveFile(@Param("saveFileDate") Date saveFileDate, @Param("productionNo") String productionNo);

    List<Long> getReportByAssetsId(@Param("businessId") Long businessId);
}
