package com.uas.search.service;

import com.uas.search.constant.model.BaseOrder;
import com.uas.search.constant.model.PageParams;
import com.uas.search.constant.model.SPage;
import com.uas.search.exception.SearchException;
import com.uas.search.model.OrderInvoice;
import com.uas.search.model.Order;
import com.uas.search.model.PurchaseInvoice;
import com.uas.search.model.Purchase;

/**
 * 商城订单搜索服务
 * 
 * @author suntg
 * @since 2016年10月11日上午11:36:27
 */
public interface OrderSearchService {

	/**
	 * 订单的类型名称
	 * 
	 * @author suntg
	 * @since 2016年10月11日上午11:36:44
	 */
	public enum Table_name {
		/**
		 * 商城销售订单
		 */
		ORDER("order"),
		/**
		 * 商城采购订单
		 */
		PURCHASE("purchase"),
		/**
		 * 商城销售订单的发货单
		 */
		ORDER_INVOICE("order_invoice"),
		/**
		 * 商城采购订单的发货单
		 */
		PURCHASE_INVOICE("purchase_invocie");

		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
	 *            模糊搜索关键词，可以是：订单主表单号、订单买方个人姓名、订单买方企业名称、订单卖方企业名称、订单明细中的单号、器件型号、
	 *            器件品牌名称、 器件类目名称
	 * @param tableName
	 *            订单类型名称
	 * @param params
	 *            翻页、过滤等信息
	 *            <p>
	 *            关于过滤，通过键值对指定过滤条件，键为
	 *            {@link com.uas.search.constant.model.PageParams.FilterField}
	 *            ，值的类型由键决定：
	 *            </p>
	 * 
	 *            <table border=1 cellpadding=5 cellspacing=0 summary=
	 *            "Fields and types">
	 *            <tr>
	 *            <th>Field</th>
	 *            <th>Type</th>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_STATUS</td>
	 *            <td>List(Integer)，多个状态之间取"或"的关系</td>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_BUYER_UU</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_BUYER_EN_UU</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_SELLER_EN_UU</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_MIN_TIME</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            <tr>
	 *            <td>ORDER_MAX_TIME</td>
	 *            <td>Long</td>
	 *            </tr>
	 *            </table>
	 * 
	 * @return 符合条件的单据。<br>
	 *         如果关键词命中主表中的信息，结果有主表信息不带从表；<br>
	 *         如果关键词没命中主表信息，命中了从表中的信息，结果有主表带被命中的从表信息；<br>
	 *         如果都没有命中，则不命中。
	 */
	public SPage<BaseOrder> getOrderIdsWithDetail(String keyword, Table_name tableName, PageParams params)
			throws SearchException;

	/**
	 * 根据关键词和其他信息搜索销售单id信息
	 * 
	 * @param keyword
	 *            关键词，可以是：销售单号、买方个人姓名、买方企业名称、卖方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
	 * @param params
	 *            其他信息，可能带有翻页信息，filter中可以有：订单状态码（List
	 *            <Integer>，多个状态之间取"或"的关系）、买方个人UU号、买方企业UU号、卖方企业UU号、订单日期范围最大值、
	 *            订单日期最小值
	 * @return 符合条件的单据。<br>
	 *         如果关键词命中主表中的信息，结果有主表信息不带从表；<br>
	 *         如果关键词没命中主表信息，命中了从表中的信息，结果有主表带被命中的从表信息；<br>
	 *         如果都没有命中，则不命中。
	 */
	public SPage<BaseOrder> searchOrderIds(String keyword, PageParams params);

	/**
	 * 根据关键词和其他信息搜索销售发货单id信息
	 * 
	 * @param keyword
	 *            关键词，可以是：发货单号、买方个人姓名、买方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
	 * @param params
	 *            其他信息，可能带有翻页信息，filter中可以有：订单状态码（List
	 *            <Integer>，多个状态之间取"或"的关系）、买方个人UU号、买方企业UU号、订单日期范围最大值、订单日期最小值
	 * @return 符合条件的单据。<br>
	 *         如果关键词命中主表中的信息，结果有主表信息不带从表；<br>
	 *         如果关键词没命中主表信息，命中了从表中的信息，结果有主表带被命中的从表信息；<br>
	 *         如果都没有命中，则不命中。
	 */
	public SPage<BaseOrder> searchOrderInvoiceIds(String keyword, PageParams params);

	/**
	 * 根据关键词和其他信息搜索采购单id信息
	 * 
	 * @param keyword
	 *            模糊搜索关键词，可以是：采购单号、卖方企业名称、明细中的单号、器件型号、器件品牌名称、 器件类目名称
	 * @param params
	 *            关键词，可能带有翻页信息，filter中可以有：订单状态码（List
	 *            <Integer>，多个状态之间取"或"的关系）、卖方企业UU号、订单日期范围最大值、订单日期最小值
	 * @return 符合条件的单据。<br>
	 *         如果关键词命中主表中的信息，结果有主表信息不带从表；<br>
	 *         如果关键词没命中主表信息，命中了从表中的信息，结果有主表带被命中的从表信息；<br>
	 *         如果都没有命中，则不命中。
	 */
	public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params);

	/**
	 * 根据关键词和其他信息搜索采购发货单id信息
	 * 
	 * @param keyword
	 *            关键词，可以是：发货单号、卖方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
	 * @param params
	 *            其他信息，可能带有翻页信息，filter中可以有：订单状态码（List
	 *            <Integer>，多个状态之间取"或"的关系）、卖方企业UU号、订单日期范围最大值、订单日期最小值
	 * @return 符合条件的单据。<br>
	 *         如果关键词命中主表中的信息，结果有主表信息不带从表；<br>
	 *         如果关键词没命中主表信息，命中了从表中的信息，结果有主表带被命中的从表信息；<br>
	 *         如果都没有命中，则不命中。
	 */
	public SPage<BaseOrder> searchPurchaseInvoiceIds(String keyword, PageParams params);

	/**
	 * 根据id获取索引中的销售单数据
	 * 
	 * @param id
	 * @return
	 */
	public Order getOrder(Long id);

	/**
	 * 根据id获取索引中的销售发货单数据
	 * 
	 * @param id
	 * @return
	 */
	public OrderInvoice getOrderInvoice(Long id);

	/**
	 * 根据id获取索引中的采购单数据
	 * 
	 * @param id
	 * @return
	 */
	public Purchase getPurchase(Long id);

	/**
	 * 根据id获取索引中的采购发货单数据
	 * 
	 * @param id
	 * @return
	 */
	public PurchaseInvoice getPurchaseInvoice(Long id);
}
