package com.uas.search.b2b.service;

import com.uas.search.b2b.exception.SearchException;
import com.uas.search.b2b.model.PageParams;
import com.uas.search.b2b.model.SPage;

/**
 * B2B商务平台搜索服务的接口
 * 
 * @author sunyj
 * @since 2016年11月9日 上午9:52:25
 */
public interface SearchService {

	/**
	 * 单据类型
	 * 
	 * @author sunyj
	 * @since 2016年11月9日 上午10:22:01
	 */
	public enum Table_name {
		/**
		 * 买家采购订单
		 */
		PURC$ORDERS("PURC$ORDERS"),
		/**
		 * 买家委外加工单
		 */
		MAKE$ORDERS("MAKE$ORDERS"),

		/**
		 * 客户验收单
		 */
		PURC$ACCEPT("PURC$ACCEPT"),

		/**
		 * 应付发票单
		 */
		PURC$APBILL("PURC$APBILL"),

		/**
		 * 不良品入库单
		 */
		PURC$BADIN("PURC$BADIN"),

		/**
		 * 不良品出库
		 */
		PURC$BADOUT("PURC$BADOUT"),

		/**
		 * 采购预测单
		 */
		PURC$FORECAST("PURC$FORECAST"),

		/**
		 * 采购询价单
		 */
		// PURC$INQUIRY("PURC$INQUIRY"),

		/**
		 * 采购询价单详情
		 */
		PURC$INQUIRYITEMS("PURC$INQUIRYITEMS"),

		/**
		 * 客户MRB
		 */
		PURC$MRB("PURC$MRB"),

		/**
		 * 采购变更单
		 */
		PURC$CHANGES("PURC$CHANGES"),

		/**
		 * 打样申请单
		 */
		// PURC$PROOFING("PURC$PROOFING"),

		/**
		 * 打样申请单
		 */
		PURC$PROOFINGITEMS("PURC$PROOFINGITEMS"),

		/**
		 * 主动报价单
		 * 
		 */
		SALE$QUOTATION("SALE$QUOTATION"),

		/**
		 * 采购验退单
		 */
		PURC$RETURN("PURC$RETURN"),

		/**
		 * 委外验收单
		 */
		MAKE$ACCEPT("MAKE$ACCEPT"),

		/**
		 * 委外变更单详情
		 */
		MAKE$CHANGEITEMS("MAKE$CHANGEITEMS"),

		/**
		 * 委外验退单
		 */
		MAKE$RETURN("MAKE$RETURN"),

		/**
		 * 平台发货单
		 */
		SALE$SEND("SALE$SEND"),

		/**
		 * 发货提醒单
		 */
		PURC$NOTICE("PURC$NOTICE"),

		/**
		 * 客户收到供应商的送样后的认定单
		 */
		PURC$PROOFINGAPPROVAL("PURC$PROOFINGAPPROVAL"),

		/**
		 * 针对客户的打样申请单
		 */
		PURC$PROOFINGSEND("PURC$PROOFINGSEND"),

		/**
		 * 应付对账单（买家）
		 */
		SALE$ARCHECK("SALE$ARCHECK"),

		/**
		 * 应收对账单（卖家）
		 */
		PURC$APCHECK("PURC$APCHECK"),

		/**
		 * 模具询价单
		 */
		PURC$INQUIRYMOULD("PURC$INQUIRYMOULD"),

		/**
		 * 物料信息表
		 */
		PRODUCTS("PRODUCTS"),

		/**
		 * 物料信息表（标准）
		 */
		PRODUCTS_STANDARD("PRODUCTS_STANDARD"),

		/**
		 * 物料信息表（非标准）
		 */
		PRODUCTS_NONSTANDARD("PRODUCTS_NONSTANDARD"),

		/**
		 * 企业信息表
		 */
		SEC$ENTERPRISES("SEC$ENTERPRISES"),

		/**
		 * 器件信息表
		 */
		PRODUCT$COMPONENT("PRODUCT$COMPONENT"),

		/**
		 * 类目信息表
		 */
		PRODUCT$KIND("PRODUCT$KIND"),

		/**
		 * 招标表
		 */
		PURC$TENDER("PURC$TENDER"),

		/**
		 * 代采订单表
		 */
		PURC$DEPUTYORDERS("PURC$DEPUTYORDERS"),

		/**
		 * 消息表
		 */
		PURC$PAGINGRELEASEDETAIL("PURC$PAGINGRELEASEDETAIL"),

		/**
		 * 供应商表（搜索供应商资料）
		 */
		PURC$VENDORS("PURC$VENDORS"),

		/**
		 * 供应商表（搜索客户资料）
		 */
		PURC$VENDORS_CUST("PURC$VENDORS_CUST"),

		/**
		 * 品牌表
		 */
		PRODUCT$BRAND("PRODUCT$BRAND"),

		/**
		 * 企业圈表
		 */
		AC$US$DETAIL("AC$US$DETAIL"),

		/**
		 * 平台询价
		 */
		PURC$PUINQUIRY("PURC$PUINQUIRY"),

		/**
		 * 平台询价详情
		 */
		PURC$PUINQUIRYITEMS("PURC$PUINQUIRYITEMS"),

		/**
		 * 邀请记录
		 */
		INVITATIONRECORDS("INVITATIONRECORDS"),
		/**
		 * 投标表 (ERP搜索)
		 */
		SALE$TENDER("SALE$TENDER"),

		/**
		 * 投标表(B2B待投标和已投标)
		 */
		SALE$TENDER_B2B("SALE$TENDER_B2B"),

		/**
		 * 购物车
		 */
		PURC$CART("PURC$CART"),

		/**
		 * 航天开票
		 */
		PURC$APBILLOUT("PURC$APBILLOUT"),

		/**
		 * 招标提问单
		 */
		SALE$TENDERQUESTION("SALE$TENDERQUESTION"),

		/**
		 * 供应商绩效考核
		 */
		VENDORPERFORMANCEASSESS("VENDORPERFORMANCEASSESS"),

        /**
         * 个人产品库
         */
        PRODUCT$USERS("PRODUCT$USERS");
		// TODO

		private Table_name(String phrase) {
			this.phrase = phrase;
		}

		private String phrase;

		public String value() {
			return phrase;
		}

		@Override
		public String toString() {
			return phrase;
		}
	}

	/**
	 * 根据关键词、单据类型、状态码搜索单据id
	 * 
	 * @param keyword
	 *            可为空，模糊搜索关键词，可以是：单据编号、供应商uu（采购）、供应商名称（采购）、客户uu（销售）、客户名称（销售）、
	 *            物料编号、 物料名称、物料规格
	 * @param tableName
	 *            不为空，单据类型
	 * @param pageParams
	 *            可为空，翻页、过滤、排序、排除过滤等信息
	 *            <p>
	 *            关于过滤，通过键值对指定过滤条件，值的类型由键决定：
	 *            </p>
	 * 
	 *            <table border=1 cellpadding=5 cellspacing=0 summary=
	 *            "Fields and types">
	 *            <tr>
	 *            <th>Description</th>
	 *            <th>Field</th>
	 *            <th>Type</th>
	 *            </tr>
	 *            <tr>
	 *            <td>状态、所属企业uu、其他状态（如已采纳、未采纳等）</td>
	 *            <td>键为数据库表中相应的字段名称</td>
	 *            <td>值为字段对应的值，若值有多个，则使用
	 *            {@link com.uas.search.b2b.model.MultiValue}</td>
	 *            </tr>
	 *            <tr>
	 *            <td>开始时间、截止时间， 这两个参数用于对时间范围进行筛选</td>
	 *            <td>{@link com.uas.search.b2b.util.SearchConstants}</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            <tr>
	 *            <td>排序方式</td>
	 *            <td>{@link com.uas.search.b2b.util.SearchConstants}</td>
	 *            <td>List({@link com.uas.search.b2b.model.Sort})</td>
	 *            </tr>
	 *            </table>
	 * 
	 *            <p>
	 *            关于排除过滤，键为数据库表中相应的字段名称，值为需排除的值，若值有多个，则使用
	 *            {@link com.uas.search.b2b.model.MultiValue}
	 *            </p>
	 * @return 单据id
	 * @throws SearchException
	 */
	public SPage<Long> searchIds(String keyword, Table_name tableName, PageParams pageParams) throws SearchException;

	/**
	 * 根据关键词、单据类型、指定域获取联想词
	 * 
	 * @param keyword
	 *            可为空，关键词
	 * @param tableName
	 *            不为空，单据类型
	 * @param size
	 *            可为空，联想词的数目
	 * @param fields
	 *            指定的域（数据库表中相应的字段名称）
	 * @return 联想词
	 * @throws SearchException
	 */
	public SPage<String> similar(String keyword, Table_name tableName, Integer size, String... fields)
			throws SearchException;
}
