package cn.ey.biz.module.external.api.fd.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestBody;

import cn.ey.biz.common.exception.ServiceException;
import cn.ey.biz.common.pojo.PageResult;
import cn.ey.biz.module.external.api.fd.feign.reqdto.LeaveCodeRequest;
import cn.ey.biz.module.external.api.fd.feign.resdto.LeaveCodeResponseDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.ARAgingReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.EngAgementGlobalSearchReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.EngagementActiveInfoReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.EngagementListForCodeGropReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.EngagementListReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.EngagementStatusReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.FeeSharingFactorReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.FinancialIndexReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetBusinessUnitReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetCodeBlockReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetCompentencyReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetCurrencyIdReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetDictInfoReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetGcrateReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetGdsRateReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetMercuryCompetencyReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetSubMgmtGdsReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetSubMgmtUnitReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.GetSubServiceLineReq;
import cn.ey.biz.module.external.api.fd.service.requestdto.RateInfoReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.SaveEngagementReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.SaveEngagementRoleReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.TeExpenseDetailReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.TimesheetDetailReqDTO;
import cn.ey.biz.module.external.api.fd.service.requestdto.WIPAgingReqDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.ARAgingResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.BusinessUnitResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.CodeBlockResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.CompentencyResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.DictInfoResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.EngTeamDetailDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.EngagementActiveInfoResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.EngagementListResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.EngagementStatusResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.EngagementinfoResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.FeeSharingFactorResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.FinancialIndexResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.GetCurrencyIdResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.GetGcrateResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.GetGdsRateResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.GlobalSearchEngAgementInfoResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.MercuryCompetencyResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.RateInfoResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.StatisticsTeExpenseDetailResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.StatisticsTimesheetDetailResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.SubMgmtGdsResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.SubMgmtUnitResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.SubServiceLineResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.TeExpenseDetailResDTO;
import cn.ey.biz.module.external.api.fd.service.responsedto.TimesheetDetailResDTO;

/**
 * 财务中台对接interface
 * @author 86182
 *
 */

public interface IFdService {

	/**
	 * 查询项目列表-分页查
	 * @param request
	 * @return
	 */
	public PageResult<EngagementListResDTO> getEngagementList(EngagementListReqDTO request);
	
	/**
	 * 查询项目列表-分页查(code组合场景)
	 * @param request
	 * @return
	 */
	public PageResult<EngagementListResDTO> getEngagementListForCodeGroup(EngagementListForCodeGropReqDTO request);
	
	/**
	 * 查询项目列表-按条件全部查
	 * @param request
	 * @return
	 */
	public List<EngagementListResDTO> getEngagementListAll(EngagementListReqDTO request);
	
	/**
	 * 全局检索项目列表
	 * @param request
	 * @return
	 */
	public PageResult<GlobalSearchEngAgementInfoResDTO> getEngagementListGlobalSearch(EngAgementGlobalSearchReqDTO request);
	
	/**
	 * 項目列表查詢 根据codes查询
	 * @param reqParam
	 * @return
	 */
	public List<EngagementListResDTO> getEngagementsForCompletion(List<String> engCodes);
	
	/**
	 * 判断是否存在满足条件engCodes,statuss的任意项目o
	 * @param engCodes
	 * @param statuss
	 * @return
	 */
	public Boolean existAnyEng(List<String> engCodes,List<String> statuss);
	
	/**
	 * 根据项目10位code查询项目详情
	 * @param engagementCode
	 * @return
	 */
	public EngagementinfoResDTO getEngagementInfoByEngagementCode(String engagementCode);
	
	/**
	 * 根据项目8位code查询项目详情
	 * @param engagementCode
	 * @return
	 */
	public EngagementinfoResDTO getEngagementInfoByEngagementCode1(String engagementCode1);
	
	/**
	 * 根据流程编号查询项目详情
	 * @param processNo
	 * @return
	 */
	public EngagementinfoResDTO getEngagementInfoByProcessNo(String processNo);
	
	/**
	 * 查询项目权限
	 * @param processNo
	 * @return
	 */
	public boolean hasEngagementPermission(String engagementCode);
	
	/**
	 * 判断 budgetPlanId 下是否有项目存在
	 * @param processNo
	 * @return
	 */
	public boolean hasEngagementsByBudgetPlanId(String budgetPlanId);
	
	/**
	 * 查询项目状态
	 * @param request
	 * @return
	 */
	public ArrayList<EngagementStatusResDTO> getEngagementStatus(EngagementStatusReqDTO request);
	
	/**
	 * 项目财年汇总
	 * @param request
	 * @return
	 */
	public List<String> getEngagementFinancialCalendar();
	
	/**
	 * 新增项目
	 * @param request
	 * @return
	 * @throws Exception 
	 */
	public EngagementinfoResDTO saveEngagement(SaveEngagementReqDTO request) throws ServiceException;
	
	/**
	 * 更新项目
	 * @param request
	 * @return
	 * @throws Exception 
	 */
	public EngagementinfoResDTO updateEngagement(SaveEngagementReqDTO request) throws ServiceException;
	
	/**
	 * 更新项目角色
	 * @param request
	 * @return
	 * @throws Exception 
	 */
	public List<EngTeamDetailDTO> updateEngagementRole(SaveEngagementRoleReqDTO request) throws ServiceException;
	
	/**
	 * 获取项目角色
	 * @param engagementCode 10位code
	 * @return
	 * @throws Exception 
	 */
	public List<EngTeamDetailDTO> getEngagementRoleByEngagementCode(String engagementCode) throws ServiceException;
	
	/**
	 * 获取项目角色
	 * @param engagementCode1 8位code
	 * @return
	 * @throws Exception 
	 */
	public List<EngTeamDetailDTO> getEngagementRoleByEngagementCode1(String engagementCode1) throws ServiceException;
	
	/**
	 * 删除项目
	 * @param engagementCode
	 * @return
	 */
	public boolean delEngagementInfo(String engagementCode);
	
	/**
	 * 根据项目编号查询财务指标数据
	 * @param request
	 * @return
	 */
	public FinancialIndexResDTO getFinancialIndex(FinancialIndexReqDTO request);
	
	/**
	 * 查询 AR Aging
	 * @param request
	 * @return
	 */
	public ARAgingResDTO getArAging(ARAgingReqDTO request);
	
	/**
	 * 查询 WIP Aging
	 * @param request
	 * @return
	 */
	public ARAgingResDTO WipAging(WIPAgingReqDTO request);
	
	
	/**
	 * 查询休假code
	 * @param request
	 * @return
	 */
	public LeaveCodeResponseDTO getLeaveCodes(LeaveCodeRequest request);
	
	/**
	 * 获取汇率基础数据
	 * @param request
	 * @return
	 */
	public List<RateInfoResDTO> getRateInfo(RateInfoReqDTO request);
	
	/**
	 * 获取币种ID
	 * @param request
	 * @return
	 */
	public GetCurrencyIdResDTO getCurrencyId(GetCurrencyIdReqDTO request);
	
	/**
	 * 获取gcRate信息
	 * @param request
	 * @return
	 */
	public List<GetGcrateResDTO> getGcrate(GetGcrateReqDTO request);
	
	/**
	 * 获取GDS Rate信息
	 * @param request
	 * @return
	 */
	public List<GetGdsRateResDTO> getGdsRate(GetGdsRateReqDTO request);
	
	/**
	 * 获取Fee Sharing Factor数据
	 * @param request
	 * @return
	 */
	public List<FeeSharingFactorResDTO> getFeeSharingFactor(FeeSharingFactorReqDTO request);
	
	
	/**
	 * 人员工时_分页
	 * @param reqParam
	 * @return
	 */
	public PageResult<TimesheetDetailResDTO> getTimesheetDetailPageList(@RequestBody TimesheetDetailReqDTO reqParam);
		
	/**
	 * 人员工时_全部
	 * @param reqParam
	 * @return
	 */
	public List<TimesheetDetailResDTO> getTimesheetDetailAllList(@RequestBody TimesheetDetailReqDTO reqParam);
		
	
	/**
	 * 人员工时_时间段数量统计
	 * @param reqParam
	 * @return
	 */
	public StatisticsTimesheetDetailResDTO statisticsTimesheetDetail(@RequestBody TimesheetDetailReqDTO reqParam);
		
	
	/**
	 * 费用明细_分页
	 * @param reqParam
	 * @return
	 */
	public PageResult<TeExpenseDetailResDTO> getTeExpenseDetailPageList(@RequestBody TeExpenseDetailReqDTO reqParam);

	/**
	 * 费用明细_全部
	 * @param reqParam
	 * @return
	 */
	public List<TeExpenseDetailResDTO> getTeExpenseDetailAllList(@RequestBody TeExpenseDetailReqDTO reqParam);
		
	/**
	 * 费用明细_时间段数量统计
	 * @param reqParam
	 * @return
	 */
	public StatisticsTeExpenseDetailResDTO statisticsTeExpenseDetail(@RequestBody TeExpenseDetailReqDTO reqParam);
		
	/**
	 * 清理无效数据<p>
	 * 1. 仅清理由项目系统创建的数据
	 * 2. 按必填项字段清理：processno, epgpn, emgpn, fmagpn
	 * 
	 * @return 被清理数据的项目编号列表
	 */
	public List<String> clearDirtyEngagement(EngagementListReqDTO request);
	
	/**
	 * 获取项目活动信息
	 * @param reqParam
	 * @return
	 */
	PageResult<EngagementActiveInfoResDTO> getEngagementActiveInfo(EngagementActiveInfoReqDTO reqParam);
	
	/**
	 * 获取项目活动信息_根据ids全量查
	 * @param reqParam
	 * @return
	 */
	List<EngagementActiveInfoResDTO> getEngagementActiveInfosByActivityCodes(List<String> activityCodes);
	
	/**
	 * 获取GDS项目
	 * @param reqParam
	 * @return
	 */
	PageResult<EngagementListResDTO> getGdsEngagementInfos(EngagementListReqDTO reqParam);
	
	/**
	 * 获取GDS项目详情
	 * @param reqParam
	 * @return
	 */
	EngagementinfoResDTO getGdsEngagementInfo(String engagementCode1);
	
	/**
	 * 获取通用字典
	 * @param reqParam
	 * @return
	 */
	List<DictInfoResDTO> getDictInfoByCategoryCode(@RequestBody GetDictInfoReqDTO reqParam);
	
	/**
	 * 获取 business unit
	 * @param reqParam
	 * @return
	 */
	List<BusinessUnitResDTO> getBusinessUnit(@RequestBody GetBusinessUnitReq reqParam);
	
	/**
	 * 获取compentency
	 * @param reqParam
	 * @return
	 */
	List<CompentencyResDTO> getCompentency(@RequestBody GetCompentencyReq reqParam);
	
	/**
	 * 获取CodeBlock
	 * @param reqParam
	 * @return
	 */
	List<CodeBlockResDTO> getCodeBlock(@RequestBody GetCodeBlockReq reqParam);
	
	/**
	 * 获取SMU_firm
	 * @param reqParam
	 * @return
	 */
	List<SubMgmtUnitResDTO> getSubMgmtUnit(@RequestBody GetSubMgmtUnitReq reqParam);
	
	
	/**
	 * 获取SubServiceLine
	 * @param reqParam
	 * @return
	 */
	List<SubServiceLineResDTO> getSubServiceLine(@RequestBody GetSubServiceLineReq reqParam);
	
	/**
	 * 获取SubMgmtGds
	 * @param reqParam
	 * @return
	 */
	List<SubMgmtGdsResDTO> getSubMgmtGds(@RequestBody GetSubMgmtGdsReq reqParam);
	
	/**
	 * 获取mercury Competency
	 * @param request
	 * @return
	 */
	List<MercuryCompetencyResDTO> getMercuryCompetency(@RequestBody GetMercuryCompetencyReq reqParam);
	
	
}
