package com.dayou.service;
import com.dayou.dto.*;
import com.dayou.entity.Assets;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dayou.entity.Department;
import com.dayou.vo.AssetsBusinessMember;
import com.dayou.vo.AssetsOrderFundInvoiceVO;
import com.dayou.vo.AssetsRepertoryVo;
import com.dayou.vo.AssetsVO;
import com.fasterxml.jackson.core.JsonProcessingException;

import java.util.List;

/**
 * <p>
 * 资产业务订单表 服务类
 * </p>
 *
 * @author GouGengquan
 * @since 2024-03-28
 */
public interface IAssetsService extends IService<Assets> {

        /**
         * 条件查询资产任务列表
         * @param page 分页条件
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        Page<AssetsVO> selectPage(Page page, AssetsSelectDTO assetsSelectDTO);

        /**
         * 条件查询我的任务订单列表
         * @param page 分页条件
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        Page<AssetsVO> selectMyOrderPage(Page page, AssetsSelectDTO assetsSelectDTO);

        /**
         * 导出我的任务订单列表
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        List<AssetsVO> exportMyOrder(AssetsSelectDTO assetsSelectDTO);

        /**
         * 条件查询资产已归档列表
         * @param page 分页条件
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        Page<AssetsVO> selectArchivedPage(Page page, AssetsSelectDTO assetsSelectDTO);

        /**
         * 条件查询资产已终止列表
         * @param page 分页条件
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        Page<AssetsVO> selectTerminatedPage(Page page, AssetsSelectDTO assetsSelectDTO);


        /**
         * 条件查询资产入库统计列表
         * @param page 分页条件
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        Page<AssetsRepertoryVo> selectRepertoryPage(Page page, AssetsSelectDTO assetsSelectDTO);

        /**
         * 条件查询资产入库统计集合(用于导出)
         * @param assetsSelectDTO 查询条件
         * @return Page<AssetsVO>
         */
        List<AssetsRepertoryVo> selectRepertoryList(AssetsSelectDTO assetsSelectDTO);

        /**
         * 根据业务id获取资产业务详情
         * @param id 业务id
         * @return AssetsVO
         */
        AssetsVO getAssetsDetailById(Long id);

        /**
         * 新增资产业务订单
         * @param assets 资产订单信息
         * @return Boolean
         */
        WorkNodeCommit add(Assets assets);

        /**
         * 修改资产业务订单项目负责人与项目成员
         * @param taskRecordDTO 修改dto
         * @return Boolean
         */
        Boolean updatePrincipalAndMembers(TaskRecordDTO<AssetsPrincipalMembersDTO> taskRecordDTO);

        /**
         * 根据业务id获取资产业务款项信息
         * @param id 业务id
         * @return AssetsOrderFundInvoiceVO
         */
        AssetsOrderFundInvoiceVO getOrderFundInvoiceById(Long id);

        Boolean update(Assets assets);

        Boolean delete(Long id);

        /**
         * 资产业务产品取号
         * @param takeAssetsProductionNoDTO 取号dto
         * @return String
         */
        Boolean takeAssetsProductionNo(TakeAssetsProductionNoDTO takeAssetsProductionNoDTO);


        /**
         * 获取资产项目所有参与人
         * @param assetsBusinessMembersDTO 查询dto
         * @return List<AssetsBusinessMembers>
         */
        List<AssetsBusinessMember> getAssetsBusinessMembers(AssetsBusinessMembersDTO assetsBusinessMembersDTO) throws JsonProcessingException;


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

        /**
         * 获取订单详情
         * @param id 订单id
         * @return Assets
         */
        Assets detail(Long id);

        /**
         * 更新资产订单基本信息
         * @param assets 更新信息
         * @return Boolean
         */
        Boolean updateOrderBaseInfo(Assets assets);

        /**
         * 获取资产市场下单部门
         * @return List<Department>
         */
        List<Department> getAssetsMarketDepartment();

        List<Assets> getMembersIsNull();

        void updateMembers(Assets assets);
}
