package com.yeshi.fanli.service.impl.user; import java.io.Serializable; import java.util.List; import java.util.Random; import java.util.Set; import javax.annotation.Resource; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.yeshi.fanli.dao.goods.DynamicRecommendDao; import com.yeshi.fanli.entity.bus.recommend.DynamicRecommend; import com.yeshi.fanli.entity.bus.recommend.RecommendDetails; import com.yeshi.fanli.entity.bus.recommend.RecommendLike; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.service.inter.goods.RecommendDetailsService; import com.yeshi.fanli.service.inter.goods.RecommendLikeService; import com.yeshi.fanli.service.inter.user.DynamicRecommendService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.EhcacheUtil; import com.yeshi.fanli.util.StringUtil; import org.yeshi.utils.NumberUtil; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; @Service public class DynamicRecommendServiceImpl implements DynamicRecommendService { @Resource private DynamicRecommendDao dao; @Resource private RecommendDetailsService recommendDetailsService; @Resource private UserInfoService userInfoService; @Resource private RecommendLikeService recommendLikeService; @Transactional(rollbackFor=Exception.class) public long makePublic(DynamicRecommend dynamicRecommend) { long id = (Long) dao.save(dynamicRecommend); RecommendDetails rd = new RecommendDetails(); rd.setBadCount(0); rd.setGoodCount(0); rd.setDynamicRecommend(dynamicRecommend); long rdid = recommendDetailsService.save(rd); if(id > 0 && rdid > 0){ String md5 = StringUtil.Md5(Constant.MYDYNAMIC+dynamicRecommend.getUserInfo().getId()); EhcacheUtil.removeCache(md5); } return id; } public List getDynamicRecommendList(long uid,int page) { int start = (page -1) * Constant.PAGE_SIZE; List list = dao.list("from DynamicRecommend dr order by dr.id desc ", start, Constant.PAGE_SIZE, new Serializable[]{}); if(list.size() >0 && uid >0){ for (DynamicRecommend dynamicRecommend : list) { Set likers = dynamicRecommend.getLikers(); if(likers.contains(new RecommendLike(new UserInfo(uid), dynamicRecommend))){ dynamicRecommend.setIslike(true); } } } return list; } public int getCount() { int count = (int) dao.getCount("select count(*) from DynamicRecommend "); return count; } public List getMyDynamicRecommendList(long uid, int page) { String md5 = StringUtil.Md5(Constant.MYDYNAMIC+uid); Cache cache = null; cache = EhcacheUtil.getCache(md5); String key = StringUtil.Md5(uid+"&"+page); if(cache!=null){ Element element = cache.getQuiet(key); return (List) element.getValue(); } int start = (page -1) * Constant.PAGE_SIZE; List list = dao.list("from DynamicRecommend dr where dr.userInfo.id = ? order by dr.id desc", start, Constant.PAGE_SIZE, new Serializable[]{uid}); if(list.size() >0 && uid >0){ for (DynamicRecommend dynamicRecommend : list) { Set likers = dynamicRecommend.getLikers(); if(likers.contains(new RecommendLike(new UserInfo(uid), dynamicRecommend))){ dynamicRecommend.setIslike(true); } } } cache = EhcacheUtil.addCahae(EhcacheUtil.getMyPubCacheConfig(md5)); cache.putQuiet(new Element(key, list)); return list; } public int getCount(long uid) { int count = (int) dao.getCount("select count(*) from DynamicRecommend dr where dr.userInfo.id = ? ",new Serializable[]{uid}); return count; } public DynamicRecommend getDynamicRecommend(long drid,long uid) { List list = dao.list("from DynamicRecommend dr where dr.id = ?", new Serializable[]{drid}); if(list.size()>0){ DynamicRecommend dynamicRecommend = list.get(0); Set likers = dynamicRecommend.getLikers(); if(likers.contains(new RecommendLike(new UserInfo(uid), dynamicRecommend))){ dynamicRecommend.setIslike(true); } return dynamicRecommend; } return null; } @Transactional(rollbackFor=Exception.class) public void replyUp(final long drid) { dao.excute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { SQLQuery query = session.createSQLQuery("update yeshi_ec_dynamic_recommend set replyCount=replyCount+1 where id=?"); query.setParameter(0, drid); query.executeUpdate(); return null; } }); } @Transactional(rollbackFor=Exception.class) public void delete(final long id) { DynamicRecommend find = dao.find(DynamicRecommend.class, id); if(find != null){ recommendDetailsService.deleteByDr(id); long uid = find.getUserInfo().getId(); String md5 = StringUtil.Md5(Constant.MYDYNAMIC+uid); EhcacheUtil.removeCache(md5); } } @Transactional(rollbackFor=Exception.class) public void addlike(final long drid, long uid) { DynamicRecommend find = dao.find(DynamicRecommend.class, drid); if(find == null){ return; } Set likers = find.getLikers(); if(likers.contains(new RecommendLike(new UserInfo(uid), find))){ return; } RecommendLike newlike=new RecommendLike(); newlike.setCreatetime(System.currentTimeMillis()); newlike.setDynamicRecommend(find); newlike.setUserInfo(new UserInfo(uid)); recommendLikeService.save(newlike); likers.add(newlike); dao.update(find); dao.excute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { session.createSQLQuery("update yeshi_ec_dynamic_recommend set likeCount=likeCount+1 where id=?") .setParameter(0, drid).executeUpdate(); return null; } }); } @Transactional(rollbackFor=Exception.class) public void removelike(final long drid, final long uid) { dao.excute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery("delete RecommendLike rl where rl.dynamicRecommend.id = ? and rl.userInfo.id = ?"); query.setParameter(0, drid); query.setParameter(1, uid); int i = query.executeUpdate(); if(i<=0){ return null; } session.createSQLQuery("update yeshi_ec_dynamic_recommend set likeCount=likeCount-1 where id=?") .setParameter(0, drid).executeUpdate(); session.flush(); return null; } }); } public List getMyLikeRecommends(final long uid, int page) { int start =(page-1)*Constant.PAGE_SIZE; List list = dao.list("select dr from DynamicRecommend dr join dr.likers ls where ls.userInfo.id = ? order by ls.id desc ", start, Constant.PAGE_SIZE,new Serializable[]{uid}); for (DynamicRecommend dynamicRecommend : list) { dynamicRecommend.setIslike(true); } return list; } public List getDynamicRecommendList(String key,int type, int page) { int start = (page -1 ) * Constant.PAGE_SIZE; String wheretype = ""; if(type==0){ //全部 wheretype=" order by dr.id desc"; }else if(type ==1){ //用户发布 wheretype="and dr.type=0 order by dr.id desc"; }else{ //后台发布 wheretype="and dr.type=1 order by dr.id desc"; } if(NumberUtil.isNumeric(key)){ long lk = Long.parseLong(key); String hql = "from DynamicRecommend dr where (dr.userInfo.id = ? or dr.userInfo.nickName like ? or dr.reason like ? ) "; return dao.list(hql+wheretype, start, Constant.PAGE_SIZE, new Serializable[]{lk,"%"+key+"%","%"+key+"%"}); } String hql="from DynamicRecommend dr where (dr.userInfo.nickName like ? or dr.reason like ? ) "; return dao.list(hql+wheretype, start, Constant.PAGE_SIZE, new Serializable[]{"%"+key+"%","%"+key+"%"}); } public int getCount(String key,int type) { String wheretype = ""; if(type==0){ //全部 wheretype=""; }else if(type ==1){ //用户发布 wheretype="and dr.type=0 "; }else{ //后台发布 wheretype="and dr.type=1 "; } if(NumberUtil.isNumeric(key)){ long lk = Long.parseLong(key); String hql = "select count(*) from DynamicRecommend dr where (dr.userInfo.id = ? or dr.userInfo.nickName like ? or dr.reason like ?) "; return (int) dao.getCount(hql+wheretype, new Serializable[]{lk,"%"+key+"%","%"+key+"%"}); } String hql="select count(*) from DynamicRecommend dr where (dr.userInfo.nickName like ? or dr.reason like ?) "; return (int) dao.getCount(hql+wheretype, new Serializable[]{"%"+key+"%","%"+key+"%"}); } @Transactional public void updateLikeCount() { final long time = System.currentTimeMillis()-144000; dao.excute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { int count =new Random().nextInt(15)+5; SQLQuery sqlQuery = session.createSQLQuery("update yeshi_ec_dynamic_recommend dr set dr.likeCount=dr.likeCount+"+count+" where dr.likeCount < 5 and dr.createtime < ? "); sqlQuery.setParameter(0,time); sqlQuery.executeUpdate(); return null; } }); } }