package com.ym.mec.collectfee.common.service.impl;

/**
 * GenericServiceImpl.java 
 * Copyright © 2015-2015
 * 
 * @author pengdc
 * @create 2015年7月13日
 */
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ym.mec.collectfee.common.dao.BaseDAO;
import com.ym.mec.collectfee.common.page.PageInfo;
import com.ym.mec.collectfee.common.page.QueryInfo;
import com.ym.mec.collectfee.common.service.BaseService;
import com.ym.mec.collectfee.utils.MapUtil;

/**
 * SERVICE操作基类
 * @param <PK>
 * @param <T>
 */
public abstract class BaseServiceImpl<PK extends Serializable, T> implements BaseService<PK, T> {

	public abstract BaseDAO<PK, T> getDAO();

	/**
	 * 通过主键id加载对象
	 * @param id
	 * @return
	 */
	public T get(final PK id) {
		return this.getDAO().get(id);
	}

	/**
	 * 更新实体对象
	 * @param bean
	 * @return int
	 */
	public int update(T bean) {
		return this.getDAO().update(bean);
	}

	/**
	 * 通过主键id删除对象
	 * @param id
	 * @return int
	 */
	public int delete(final PK id) {
		return this.getDAO().delete(id);
	}

	/**
	 * 写入实体对象
	 * @param bean
	 * @return int
	 */
	public long insert(T bean) {
		return this.getDAO().insert(bean);
	}

	/**
	 * 通过参数查找所有结果集
	 * @param params
	 * @return
	 */
	public List<T> findAll(Map<String, Object> params) {
		return this.getDAO().findAll(params);
	}

	/**
	 * 通过参数查找结果集，适合分页场景
	 * @param queryInfo
	 * @return
	 */
	public PageInfo<T> queryPage(QueryInfo queryInfo) {
		PageInfo<T> pageInfo = new PageInfo<T>(queryInfo.getPage(), queryInfo.getRows());
		Map<String, Object> params = new HashMap<String, Object>();
		MapUtil.populateMap(params, queryInfo);
		
		List<T> dataList = null;
		int count = this.findCount(params);
		if (count > 0) {
			pageInfo.setTotal(count);
			params.put("offset", pageInfo.getOffset());
			dataList = this.getDAO().queryPage(params);
		}
		if (count == 0) {
			dataList = new ArrayList<T>();
		}
		pageInfo.setRows(dataList);
		return pageInfo;
	}

	/**
	 * 通过参数查找结果集数目
	 * @author pengdc
	 * @param params
	 * @return
	 */
	public int findCount(Map<String, Object> params) {
		return this.getDAO().findCount(params);
	}
}
