package com.jspxcms.core.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.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.ScoreGroup;
import com.jspxcms.core.domain.ScoreItem;
import com.jspxcms.core.domain.Site;
import com.jspxcms.core.listener.SiteDeleteListener;
import com.jspxcms.core.repository.ScoreGroupDao;
import com.jspxcms.core.service.ScoreGroupService;
import com.jspxcms.core.service.ScoreItemService;
import com.jspxcms.core.service.SiteService;
import com.jspxcms.core.support.DeleteException;
@Service
@Transactional(readOnly = true)
public class ScoreGroupServiceImpl implements ScoreGroupService,
SiteDeleteListener {
public List<ScoreGroup> findList(Map<String, String[]> params, Sort sort) {
return dao.findAll(spec(params), sort);
}
public RowSide<ScoreGroup> findSide(Map<String, String[]> params,
ScoreGroup bean, Integer position, Sort sort) {
if (position == null) {
return new RowSide<ScoreGroup>();
}
Limitable limit = RowSide.limitable(position, sort);
List<ScoreGroup> list = dao.findAll(spec(params), limit);
return RowSide.create(list, bean);
}
private Specification<ScoreGroup> spec(Map<String, String[]> params) {
Collection<SearchFilter> filters = SearchFilter.parse(params).values();
Specification<ScoreGroup> sp = SearchFilter.spec(filters,
ScoreGroup.class);
return sp;
}
public ScoreGroup findByNumber(Integer siteId, String number) {
List<ScoreGroup> list = dao.findBySiteIdAndNumber(siteId, number);
return !list.isEmpty() ? list.get(0) : null;
}
public ScoreGroup findTopOne(Integer siteId) {
return dao.findTopOne(siteId);
}
public ScoreGroup get(Integer id) {
return dao.findOne(id);
}
public boolean numberExist(String number, Integer siteId) {
return dao.countByNumber(number, siteId) > 0;
}
@Transactional
public ScoreGroup save(ScoreGroup bean, String[] name, Integer[] score,
String[] icon, Integer siteId) {
Site site = siteService.get(siteId);
bean.setSite(site);
bean.applyDefaultValue();
bean = dao.save(bean);
scoreItemService.save(name, score, icon, bean);
return bean;
}
@Transactional
public ScoreGroup update(ScoreGroup bean, Integer[] itemId,
String[] itemName, Integer[] itemScore, String[] itemIcon) {
bean.applyDefaultValue();
bean = dao.save(bean);
scoreItemService.update(itemId, itemName, itemScore, itemIcon, bean);
return bean;
}
@Transactional
public ScoreGroup[] batchUpdate(Integer[] id, String[] name,
String[] number, String[] description) {
ScoreGroup[] beans = new ScoreGroup[id.length];
for (int i = 0, len = id.length; i < len; i++) {
beans[i] = get(id[i]);
beans[i].setSeq(i);
beans[i].setName(name[i]);
beans[i].setNumber(number[i]);
beans[i].setDescription(description[i]);
beans[i].applyDefaultValue();
dao.save(beans[i]);
}
return beans;
}
@Transactional
public ScoreGroup delete(Integer id) {
ScoreGroup entity = dao.findOne(id);
for (ScoreItem item : entity.getItems()) {
scoreItemService.delete(item);
}
dao.delete(entity);
return entity;
}
@Transactional
public ScoreGroup[] delete(Integer[] ids) {
ScoreGroup[] beans = new ScoreGroup[ids.length];
for (int i = 0; i < ids.length; i++) {
beans[i] = delete(ids[i]);
}
return beans;
}
public void preSiteDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countBySiteId(Arrays.asList(ids)) > 0) {
throw new DeleteException("scoreGroup.management");
}
}
}
private ScoreItemService scoreItemService;
private SiteService siteService;
@Autowired
public void setScoreItemService(ScoreItemService scoreItemService) {
this.scoreItemService = scoreItemService;
}
@Autowired
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
private ScoreGroupDao dao;
@Autowired
public void setDao(ScoreGroupDao dao) {
this.dao = dao;
}
}