package com.yonyou.hrcloud.pm.ps.service;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.alibaba.fastjson.JSONObject;
import com.yonyou.cloud.middleware.rpc.RemoteCall;
import com.yonyou.hrcloud.adder.exception.AdderBusinessException;
import com.yonyou.hrcloud.adder.model.param.Sorter;
import com.yonyou.hrcloud.adder.model.query.Condition;
import com.yonyou.hrcloud.pm.ps.model.EvaAppraiser;
import com.yonyou.hrcloud.pm.ps.model.EvaSetting;
import com.yonyou.hrcloud.pm.ps.model.Scheme;
import com.yonyou.hrcloud.pm.ps.model.SchemePlan;

/**
 * 绩效方案服务接口
 * 
 * @author Flysea
 *
 */
@RemoteCall("performance-core@c87e2267-1001-4c70-bb2a-ab41f3b81aa3")
public interface ISchemeService {

	/**
	 * 查询绩效方案
	 * 
	 * @param cond
	 *            条件
	 * @param sort
	 *            排序
	 * @param pageable
	 *            分页，可选
	 * @return
	 */
	public List<Scheme> querySchemeByConditon(Condition cond, Sorter sort, Pageable pageable);

	/**
	 * 查询方案列表数据，带组织权限
	 *
	 * @param cond
	 * @param sort
	 * @param pageable
	 * @return
	 */
	public List<Scheme> querySchemeList(Condition cond, Sorter sort, Pageable pageable);

	/**
	 * 根据配置条件查询方案列表
	 * 
	 * @param jsonObject
	 * @return
	 */
	public Page<Scheme> querySchemeListByConfig(JSONObject jsonObject);

	/**
	 * 查询绩效方案的流程
	 *
	 * @param cond
	 *            条件
	 * @param sort
	 *            排序
	 * @param pageable
	 *            分页，可选
	 * @return
	 */
	public List<EvaAppraiser> queryEvaAppraiserByConditon(Condition cond, Sorter sort);

	/**
	 * 获取方案详情，不带组织权限控制
	 *
	 * @param id
	 * @param isAll
	 *            是否所有子集，不含考核对象
	 * @return
	 */
	public Scheme querySchemeByID(String id, boolean isAll) throws AdderBusinessException;

	/**
	 * 分部分获取方案详情，不带组织权限控制
	 *
	 * @param id
	 * @param hasGroup
	 *            是否包含考核对象组
	 * @param hasAppraiser
	 *            是否包含考核流程
	 * @return
	 */
	public Scheme querySchemeByID(String id, boolean hasGroup, boolean hasAppraiser) throws AdderBusinessException;

	/**
	 * 增加绩效方案
	 * 
	 * @param Scheme
	 */
	public void insert(Scheme scheme);

	/**
	 * 更新绩效方案
	 * 
	 * @param Scheme
	 */
	public void update(Scheme scheme);

	/**
	 * 删除方案
	 * 
	 * @param id
	 */
	public void delete(String id);

	/**
	 * 获取方案详情，带组织权限控制
	 *
	 * @param id
	 * @param isAll
	 *            是否所有子集，不含考核对象
	 * @return
	 */
	public Scheme queryAuthorizedSchemeByID(String id, boolean isAll) throws AdderBusinessException;

	/**
	 * 分部分获取方案详情，带组织权限控制
	 *
	 * @param id
	 * @param hasGroup
	 *            是否包含考核对象组
	 * @param hasAppraiser
	 *            是否包含考核流程
	 * @return
	 */
	public Scheme queryAuthorizedSchemeByID(String id, boolean hasGroup, boolean hasAppraiser)
			throws AdderBusinessException;

	/**
	 * 保存考核对象的 指标审核人和考核人
	 * 
	 * @param data
	 */
	public Scheme saveObjectAppraiser(JSONObject data);

	/**
	 * 获取考核对象上的 指标考核人。
	 * 
	 * @param evaobject_id
	 * @return
	 */
	public List<EvaSetting> getObjectAppraiser(List<String> evaobject_ids);

	/**
	 * 获取考核对象上的 指标审核人。
	 * 
	 * @param evaobject_id
	 * @return
	 */
	public List<EvaSetting> getObjectApprover(List<String> evaobject_ids);

	/**
	 * 保存方案计划
	 * 
	 * @param plan
	 */
	public void saveSchemePlan(SchemePlan plan);

	/**
	 * 查询方案计划
	 * 
	 * @param schemeid
	 * @param step
	 */
	public SchemePlan querySchemePlan(String schemeid, Integer step);

	/**
	 * 根据人查询方案
	 * 
	 * @param staffids
	 */
	public List<String> querySchemesByStaffs(List<String> staffids);

	/**
	 * 修改一个方案的名称或说明
	 * 
	 * @param schemeid
	 * @param schemename
	 * @param remark
	 */
	public void saveSchemeInfo(String schemeid, String schemename, String remark);
	
	/**
	 * add by zengcl  导出模板
	 * @param request
	 * @param response
	 * @param scheme
	 */
	public void exportTemplateBySchemeId(HttpServletRequest request, HttpServletResponse response, Scheme scheme) ;
}
