package org.hsweb.web.service.impl.template;
import com.alibaba.fastjson.JSON;
import org.hsweb.web.bean.common.QueryParam;
import org.hsweb.web.bean.common.UpdateParam;
import org.hsweb.web.bean.po.history.History;
import org.hsweb.web.bean.po.template.Template;
import org.hsweb.web.bean.po.template.Template.Property;
import org.hsweb.web.dao.template.TemplateMapper;
import org.hsweb.web.service.history.HistoryService;
import org.hsweb.web.service.impl.AbstractServiceImpl;
import org.hsweb.web.service.template.TemplateService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import static org.hsweb.web.bean.po.GenericPo.Property.id;
import static org.hsweb.web.bean.po.template.Template.Property.release;
import static org.hsweb.web.bean.po.template.Template.Property.using;
import static org.hsweb.web.bean.po.template.Template.Property.version;
/**
* Created by zhouhao on 16-5-20.
*/
@Service("templateService")
public class TemplateServiceImpl extends AbstractServiceImpl<Template, String> implements TemplateService {
private static final String CACHE_NAME = "template";
@Resource
private TemplateMapper templateMapper;
@Resource
private HistoryService historyService;
@Override
protected TemplateMapper getMapper() {
return templateMapper;
}
@Override
public String insert(Template data) {
data.setVersion(1);
data.setUsing(false);
data.setRelease(0);
data.setRevision(0);
return super.insert(data);
}
@Override
public String createNewVersion(String oldVersionId) {
Template old = templateMapper.selectByPk(oldVersionId);
assertNotNull(old, "模板不存在");
old.setId(null);
old.setVersion(old.getVersion() + 1);
old.setRevision(0);
old.setRelease(0);
old.setUsing(false);
insert(old);
return old.getId();
}
@Override
@Transactional(readOnly = true)
public List<Template> selectLatestList(QueryParam param) {
return templateMapper.selectLatestList(param);
}
@Override
@Transactional(readOnly = true)
public int countLatestList(QueryParam param) {
return templateMapper.countLatestList(param);
}
@Override
@CacheEvict(value = CACHE_NAME,
key = "'template.name.using'+target.selectByPk(#id).getName()",
condition = "target.selectByPk(#id).isUsing()")
public int update(Template data) {
Template old = selectByPk(data.getId());
assertNotNull(old, "模板不存在");
data.setRevision(old.getRevision() + 1);
return createUpdate()
.excludes(version, release, release, using)
.where(id, data.getId())
.exec();
}
@Override
@Caching(
evict = {
@CacheEvict(value = CACHE_NAME, key = "'template.using.name.'+target.selectByPk(#id).getName()"),
@CacheEvict(value = CACHE_NAME, key = "'template.deploy.name.'+target.selectByPk(#id).getName()")
}
)
public void deploy(String id) {
Template old = templateMapper.selectByPk(id);
assertNotNull(old, "模板不存在");
Template usingTemplate = selectUsing(old.getName());
if (usingTemplate != null) {
usingTemplate.setUsing(true);
createUpdate(usingTemplate).includes(using).fromBean().where(Property.id).exec();
}
old.setUsing(true);
createUpdate(old).includes(using).fromBean().where(Property.id).exec();
History history = new History();
history.setPrimaryKeyName("id");
history.setPrimaryKeyValue(id);
history.setChangeAfter(JSON.toJSONString(old));
history.setDescribe("模板发布历史");
history.setType("template.deploy." + old.getName());
history.setCreateDate(new Date());
historyService.insert(history);
}
@Override
@Caching(
evict = {
@CacheEvict(value = CACHE_NAME, key = "'template.using.name.'+target.selectByPk(#id).getName()")
, @CacheEvict(value = CACHE_NAME, key = "'template.deploy.name'+target.selectByPk(#id).getName()")
}
)
public void unDeploy(String id) {
Template old = templateMapper.selectByPk(id);
assertNotNull(old, "模板不存在");
old.setUsing(false);
createUpdate(old).includes(using).fromBean().where(Property.id);
}
@Override
@Transactional(readOnly = true)
public Template selectLatest(String name) {
return createQuery()
.where(Property.name, name)
.orderByDesc(version)
.list(templateMapper::selectLatestList)
.stream().findFirst().orElse(null);
}
@Override
@Cacheable(value = CACHE_NAME, key = "'template.name.'+#name+':'+#version")
public Template selectByVersion(String name, int version) {
return this.createQuery().where(Property.name, name).and(Property.version, version).single();
}
@Override
@Cacheable(value = CACHE_NAME, key = "'template.deploy.name.'+#name")
public Template selectDeploy(String name) {
Template deployed = selectUsing(name);
assertNotNull(deployed, "模板不存在或未部署");
History history = historyService.selectLastHistoryByType("template.deploy." + name);
assertNotNull(history, "模板不存在或未部署");
return JSON.parseObject(history.getChangeAfter(), Template.class);
}
@Override
@Cacheable(value = CACHE_NAME, key = "'template.using.name.'+#name")
public Template selectUsing(String name) {
return this.createQuery().where(Property.name, name).and(Property.using, true).single();
}
}