package com.jspxcms.ext.service.impl; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.jspxcms.common.orm.Limitable; import com.jspxcms.common.orm.SearchFilter; import com.jspxcms.common.util.RowSide; import com.jspxcms.core.domain.Site; import com.jspxcms.core.listener.SiteDeleteListener; import com.jspxcms.core.service.SiteService; import com.jspxcms.core.service.VoteMarkService; import com.jspxcms.core.support.DeleteException; import com.jspxcms.ext.domain.Vote; import com.jspxcms.ext.domain.VoteOption; import com.jspxcms.ext.repository.VoteDao; import com.jspxcms.ext.service.VoteOptionService; import com.jspxcms.ext.service.VoteService; @Service @Transactional(readOnly = true) public class VoteServiceImpl implements VoteService, SiteDeleteListener { public Page<Vote> findAll(Map<String, String[]> params, Pageable pageable) { return dao.findAll(spec(params), pageable); } public RowSide<Vote> findSide(Map<String, String[]> params, Vote bean, Integer position, Sort sort) { if (position == null) { return new RowSide<Vote>(); } Limitable limit = RowSide.limitable(position, sort); List<Vote> list = dao.findAll(spec(params), limit); return RowSide.create(list, bean); } private Specification<Vote> spec(Map<String, String[]> params) { Collection<SearchFilter> filters = SearchFilter.parse(params).values(); Specification<Vote> sp = SearchFilter.spec(filters, Vote.class); return sp; } public boolean numberExist(String number, Integer siteId) { return dao.countByNumber(number, siteId) > 0; } public Vote findByNumber(String number, Integer[] status, Integer siteId) { return dao.findByNumber(number, status, siteId); } public Vote findLatest(Integer[] status, Integer siteId) { return dao.findLatest(status, siteId); } public Vote get(Integer id) { return dao.findOne(id); } @Transactional public Vote save(Vote bean, String[] title, Integer[] count, Integer siteId) { Site site = siteService.get(siteId); bean.setSite(site); bean.applyDefaultValue(); bean = dao.save(bean); voteOptionService.save(title, count, bean); return bean; } @Transactional public Vote update(Vote bean, Integer[] id, String[] title, Integer[] count) { bean.applyDefaultValue(); bean = dao.save(bean); voteOptionService.update(id, title, count, bean); return bean; } @Transactional public Vote delete(Integer id) { Vote entity = dao.findOne(id); if (entity != null) { voteMarkService.unmark(Vote.MARK_CODE, id); dao.delete(entity); } return entity; } @Transactional public Vote[] delete(Integer[] ids) { Vote[] beans = new Vote[ids.length]; for (int i = 0; i < ids.length; i++) { beans[i] = delete(ids[i]); } return beans; } @Transactional public Vote vote(Integer id, Integer[] optionIds, Integer userId, String ip, String cookie) { Vote vote = get(id); int total = 0; for (VoteOption option : vote.getOptions()) { if (ArrayUtils.contains(optionIds, option.getId())) { option.setCount(option.getCount() + 1); } total += option.getCount(); } vote.setTotal(total); voteMarkService.mark(Vote.MARK_CODE, id, userId, ip, cookie); return vote; } public void preSiteDelete(Integer[] ids) { if (ArrayUtils.isNotEmpty(ids)) { if (dao.countBySiteId(Arrays.asList(ids)) > 0) { throw new DeleteException("vote.management"); } } } private VoteMarkService voteMarkService; private VoteOptionService voteOptionService; private SiteService siteService; @Autowired public void setVoteMarkService(VoteMarkService voteMarkService) { this.voteMarkService = voteMarkService; } @Autowired public void setVoteOptionService(VoteOptionService voteOptionService) { this.voteOptionService = voteOptionService; } @Autowired public void setSiteService(SiteService siteService) { this.siteService = siteService; } private VoteDao dao; @Autowired public void setDao(VoteDao dao) { this.dao = dao; } }