package com.fang.bbks.modules.sys.service; import java.util.Date; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.criterion.CriteriaQuery; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.engine.spi.TypedValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Reference; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.fang.bbks.common.persistence.Page; import com.fang.bbks.common.utils.StringUtils; import com.fang.bbks.modules.sys.dao.BookDao; import com.fang.bbks.modules.sys.dao.CategoryDao; import com.fang.bbks.modules.sys.entity.Book; import com.fang.bbks.modules.sys.entity.BookContent; import com.fang.bbks.modules.sys.entity.Category; /** * @Intro Book service Component * @author Lee * @Date 2013-8-1 */ @Service("bookService") @Transactional(readOnly = true) public class BookService { @SuppressWarnings("unused") private static Logger logger = LoggerFactory.getLogger(BookService.class); @Autowired private BookDao bookDao; @Autowired private CategoryDao categoryDao; /** * 获取书籍信息 * @param id * @return */ public Book findOne(Long id){ return bookDao.findOne(id); } public Book findByBookNameOrIsbn(String bookName,String isbn){ return bookDao.findByBookNameOrIsbn(bookName, isbn); } public Book findByIsbn(String isbn){ return bookDao.findByIsbn(isbn); } @Transactional(readOnly = false) public Book save(Book book){ book.setUpdateAt(new Date()); bookDao.clear(); return bookDao.save(book); } @Transactional(readOnly = false) public void delete(Long id) { bookDao.deleteById(id); //TODO 从列表中也出这本书及的信息 } @Transactional(readOnly = false) public void updateEbook(String epubStr,String txtStr,Long id){ if(StringUtils.isEmpty(epubStr) && StringUtils.isEmpty(txtStr)){ System.out.println("---"); return; } if(StringUtils.isEmpty(epubStr) && StringUtils.isNotEmpty(txtStr)){ bookDao.update("update Book set txtSrc = ?1,e_flag='1' where id=?2", txtStr,id); } if(StringUtils.isEmpty(txtStr) && StringUtils.isNotEmpty(epubStr)){ bookDao.update("update Book set bookSrc = ?1,e_flag='1' where id=?2", epubStr,id); } if(StringUtils.isNotEmpty(txtStr) && StringUtils.isNotEmpty(epubStr)){ bookDao.update("update Book set bookSrc = ?1, txtSrc=?2,e_flag='1' where id=?3",epubStr, txtStr,id); } } /** * 全文检索 * @param page * @param keywords * @return */ public Page<Book> findByKeyWords(Page<Book> page,String keywords,String sortBy,Integer orders){ // 设置查询条件 BooleanQuery query = bookDao.getFullTextQuery(keywords, "bookName","outline","author"); // 设置过滤条件 BooleanQuery queryFilter = bookDao.getFullTextQuery( new BooleanClause(new TermQuery(new Term("delFlag", Book.DEL_FLAG_NORMAL+"")), Occur.MUST)); //设置排序 Sort sort = new Sort(new SortField("updateTime", SortField.DOC, true)); if(StringUtils.isNotEmpty(sortBy)){ if( "comment".equals(sortBy)){ if(orders == 0){ sort.setSort(new SortField("commentCount", SortField.DOC,true)); }else{ sort.setSort(new SortField("commentCount", SortField.DOC,false)); } }else if("price".equals(sortBy)){ if(orders == 0){ sort.setSort(new SortField("pubPrice", SortField.DOC,true)); }else{ sort.setSort(new SortField("pubPrice", SortField.DOC,false)); } } } // 全文检索 //bookDao.search(page, query, queryFilter, sort); bookDao.search(page, query, null, sort); // 关键字高亮 //bookDao.keywordsHighlight(query, page.getList(), "outline"); return page; } /** * 全文检索 * @param page * @param keywords * @return */ public Page<Book> findByKeyWords(Page<Book> page,String keywords){ // 设置查询条件 BooleanQuery query = bookDao.getFullTextQuery(keywords, "bookName","outline","author"); // 设置过滤条件 BooleanQuery queryFilter = bookDao.getFullTextQuery(new BooleanClause( new TermQuery(new Term("delFlag", Book.DEL_FLAG_NORMAL+"")), Occur.MUST)); // 设置排序 Sort sort = new Sort(new SortField("updateTime", SortField.DOC, true)); // 全文检索 //bookDao.search(page, query, queryFilter, sort); bookDao.search(page, query, null, null); // 关键字高亮 //bookDao.keywordsHighlight(query, page.getList(), "outline"); return page; } /** * 分页分类查询图书 * @param page * @param catlogId * @return */ public Page<Book> findBook(Page<Book> page,Long catlogId){ Book b = new Book(); if(catlogId != null && catlogId > 0){ Category catlog = categoryDao.findOne(catlogId); if(catlog == null){ return null; } b.setCategory(catlog); } return findBook(page, b); } public Page<Book> findEbook(Page<Book> page,Integer catlogId){ DetachedCriteria dc = bookDao.createDetachedCriteria(); dc.createAlias("category", "category"); dc.add(Restrictions.eq("eFlag", Book.EBOOK_YEW)); if(catlogId != null && catlogId > 0){ dc.add(Restrictions.eq("category.id", catlogId)); } return bookDao.find(page, dc); } public Page<Book> findBook(Page<Book> page,Book book,String sortBy,int orders){ DetachedCriteria dc = bookDao.createDetachedCriteria(); //设置查询条件 addCondition(dc,book); System.out.println(sortBy+"--"+orders); if(StringUtils.isNotEmpty(sortBy)){ if( "comment".equals(sortBy)){ if(orders == 0){ dc.addOrder(Order.desc("commentCount")); }else{ dc.addOrder(Order.asc("commentCount")); } }else if("price".equals(sortBy)){ if(orders == 0){ dc.addOrder(Order.desc("pubPrice")); }else{ dc.addOrder(Order.asc("pubPrice")); } } } return bookDao.find(page, dc); } /** * 找书 */ public Page<Book> findBook(Page<Book> page,Book book){ DetachedCriteria dc = bookDao.createDetachedCriteria(); //设置查询条件 addCondition(dc,book); return bookDao.find(page, dc); } ////////////////////////// ////////////////////////// ////////////////////////// /** * 添加查询条件 * @param dc * @param book */ private void addCondition(DetachedCriteria dc,Book book){ if(book == null) return; dc.createAlias("category", "category"); if(book.isFree()){ //查询免费书籍 dc.add(Restrictions.eq("isFreee", book.isFree())); } //分类 if(book.getCategory() != null && book.getCategory().getId() != null){ if (book.getCategory()!=null){ dc.add(Restrictions.eq("category.id", book.getCategory().getId())); } } if(StringUtils.isNotEmpty(book.getBookName())){ //根据书名查询 dc.add(Restrictions.like("bookName", book.getBookName()+"%")); } if(StringUtils.isNotEmpty(book.getAuthor())){ //根据作者查询 dc.add(Restrictions.like("author", book.getAuthor()+"%")); } if(StringUtils.isNotEmpty(book.getTranslator())){ dc.add(Restrictions.like("thranslator", book.getTranslator()+"%")); } } /** * 跟新索引 */ public void createdAndUpdateIndex(){ long startTime=System.currentTimeMillis(); //获取开始时间 System.out.println("执行索引开始。。。"+startTime); bookDao.createIndex(); long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("执行索引结束。。。"+endTime+"---"+(endTime-startTime)); } }