package com.dayou.service;
import com.dayou.dto.*;
import com.dayou.entity.AssetsProduction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dayou.vo.AssetsProductionFundVo;

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

/**
 * <p>
 * 资产产品表 服务类
 * </p>
 *
 * @author GouGengquan
 * @since 2024-03-28
 */
public interface IAssetsProductionService extends IService<AssetsProduction> {

        /**
         * 根据资产业务id查询资产业务产品
         * @param id 资产业务id
         * @return List<AssetsProduction>
         */
        List<AssetsProduction> getAroductionByAssetsId(Long id);

        Page<AssetsProduction> selectPage(Page page,AssetsProduction assetsProduction);

        AssetsProduction detail(Long id);

        Boolean add(AssetsProduction assetsProduction);

        /**
         * 产品信息更新
         * @param assetsProduction prod
         * @return Boolean
         */
        Boolean update(AssetsProduction assetsProduction);

        /**
         * 更新产品选择类型
         * @param assetsProduction prod
         * @return Boolean
         */
        Boolean updateChoice(AssetsProduction assetsProduction);

        Boolean delete(Long id);

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

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

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

        /**
         * 根据业务id与产品号获取资产产品详细信息
         * @param dto 查询dto
         * @return AssetsProduction
         */
        AssetsProduction getAssetsProductionDetail(AssetsProductionDetailDTO dto);

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

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

        /**
         * 根据业务id与产品号集合获取每个产品是否有提交过的流程实例信息
         * @return List<Integer>
         */
        List<Integer> getInatanceCountList(AProListSelectDTO aProListSelectDTO);

        /**
         * 产品出入库
         * @param wareHouseDTO 出入库dto
         * @return Boolean
         */
        Boolean assetsProRepertory(AssetsProWareHouseDTO wareHouseDTO);

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

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

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

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

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

        /**
         * 资产认领实收款到 产品
         * @param claimOrders 认领信息
         * @return Boolean
         */
        Boolean doAllotRealAmountToProd(List<OrderReportDTO> claimOrders);

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

        /**
         * 资产分配订单实收款到产品
         * @param orderReportDTO 分配信息
         * @return Boolean
         */
        Boolean allotOrderRealAmountToProduction(OrderReportDTO orderReportDTO);

        /**
         * 产品归档
         *
         * @param saveFileDate 归档时间
         */
        void prodSaveFile(Date saveFileDate, String productionNo);

        List<Long> getReportByAssetsId(Long id);

        void updateSigner(String jsonString, Long reportId);
}
