package org.hsweb.web.service.impl.form;
import com.alibaba.fastjson.JSON;
import org.hsweb.commons.StringUtils;
import org.hsweb.ezorm.rdb.meta.RDBTableMetaData;
import org.hsweb.web.bean.common.InsertParam;
import org.hsweb.web.bean.common.QueryParam;
import org.hsweb.web.bean.po.form.Form;
import org.hsweb.web.bean.po.form.Form.Property;
import org.hsweb.web.bean.po.history.History;
import org.hsweb.web.core.utils.RandomUtil;
import org.hsweb.web.dao.form.FormMapper;
import org.hsweb.web.service.form.DynamicFormService;
import org.hsweb.web.service.form.FormParser;
import org.hsweb.web.service.form.FormService;
import org.hsweb.web.service.history.HistoryService;
import org.hsweb.web.service.impl.AbstractServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.util.Assert;
import javax.annotation.Resource;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
/**
* 自定义表单服务类
* Created by generator
*/
@Service("formService")
public class FormServiceImpl extends AbstractServiceImpl<Form, String> implements FormService {
private static final String CACHE_KEY = "form";
@Autowired(required = false)
protected FormParser formParser = new DefaultFormParser();
@Resource
protected FormMapper formMapper;
@Resource
protected HistoryService historyService;
@Override
protected FormMapper getMapper() {
return formMapper;
}
@Resource
protected DynamicFormService dynamicFormService;
@Override
// @Cacheable(value = CACHE_KEY, key = "#id")
public Form selectByPk(String id) {
return super.selectByPk(id);
}
@Override
public String createNewVersion(String oldVersionId) {
Form old = this.selectByPk(oldVersionId);
assertNotNull(old, "表单不存在!");
old.setId(RandomUtil.randomChar());
old.setVersion(old.getVersion() + 1);
old.setCreateDate(new Date());
old.setUpdateDate(null);
old.setRevision(1);
old.setRelease(0);
old.setUsing(false);
getMapper().insert(InsertParam.build(old));
return old.getId();
}
@Override
public String insert(Form data) {
List<Form> old = this.select(QueryParam.build().where("name", data.getName()));
Assert.isTrue(old.isEmpty(), "表单 [" + data.getName() + "] 已存在!");
data.setCreateDate(new Date());
data.setVersion(1);
if (StringUtils.isNullOrEmpty(data.getId()))
data.setId(RandomUtil.randomChar());
super.insert(data);
return data.getId();
}
@Override
@Caching(
evict = {
@CacheEvict(value = {CACHE_KEY}, key = "#data.id"),
@CacheEvict(value = {CACHE_KEY}, key = "#data.name+':'+#data.version")
}
)
public int update(Form data) {
Form old = this.selectByPk(data.getId());
assertNotNull(old, "表单不存在!");
data.setUpdateDate(new Date());
data.setVersion(old.getVersion());
data.setRevision(old.getRevision() + 1);
return createUpdate(data).excludes(Property.using, Property.createDate, Property.release, Property.version)
.fromBean().where(Property.id).exec();
}
@Override
@CacheEvict(value = CACHE_KEY, key = "#id")
public int delete(String id) {
Form old = this.selectByPk(id);
assertNotNull(old, "表单不存在!");
Assert.isTrue(!old.isUsing(), "表单正在使用,无法删除!");
return super.delete(id);
}
@Override
@Transactional(readOnly = true)
public List<Form> selectLatestList(QueryParam param) {
return formMapper.selectLatestList(param);
}
@Override
@Transactional(readOnly = true)
public int countLatestList(QueryParam param) {
return formMapper.countLatestList(param);
}
@Override
@Cacheable(value = CACHE_KEY, key = "#name+':'+#version")
public Form selectByVersion(String name, int version) {
List<Form> formList = this.createQuery()
.where(Property.name, name).and(Property.version, version)
.list(formMapper::selectLatestList);
return formList.size() > 0 ? formList.get(0) : null;
}
@Override
public Form selectLatest(String name) {
List<Form> formList = this.createQuery()
.where(Property.name, name)
.orderByAsc(Property.version)
.list(formMapper::selectLatestList);
return formList.size() > 0 ? formList.get(0) : null;
}
@Override
@Caching(evict = {
@CacheEvict(value = {CACHE_KEY + ".deploy"}, allEntries = true),
@CacheEvict(value = {CACHE_KEY}, allEntries = true)
})
public void tryDeployAll() {
createQuery().where(Form.Property.using, 1).listNoPaging().forEach(form -> {
try {
Form deployed = selectDeployed(form.getName());
if (null != deployed) {
RDBTableMetaData metaData = dynamicFormService.parseMeta(deployed);
dynamicFormService.getDefaultDatabase().reloadTable(metaData);
} else {
dynamicFormService.deploy(form);
}
} catch (Exception e) {
logger.error("部署{}:({})失败", form.getName(), form.getRemark(), e);
}
});
}
@Override
@Transactional(rollbackFor = Throwable.class)
@Caching(evict = {
@CacheEvict(value = {CACHE_KEY + ".deploy"}, key = "'deploy.'+target.selectByPk(#formId).getName()+'.html'"),
@CacheEvict(value = {CACHE_KEY + ".deploy"}, key = "'deploy.'+target.selectByPk(#formId).getName()"),
@CacheEvict(value = {CACHE_KEY}, key = "'using.'+target.selectByPk(#formId).getName()"),
@CacheEvict(value = {CACHE_KEY}, key = "'deploy.'+target.selectByPk(#formId).getName()+'.version'")
})
public void deploy(String formId) throws SQLException {
Form old = this.selectByPk(formId);
assertNotNull(old, "表单不存在");
//先卸载正在使用的表单
Form using = selectUsing(old.getName());
if (using != null) {
this.unDeploy(using.getId());
}
//开始发布
old.setUsing(true);
dynamicFormService.deploy(old);
old.setRelease(old.getRevision());//发布修订版本
createUpdate(old).includes(Property.using, Property.release).where(Property.id, old.getId()).exec();
//加入发布历史记录
History history = History.newInstance("form.deploy." + old.getName());
history.setPrimaryKeyName("id");
history.setPrimaryKeyValue(old.getId());
history.setChangeBefore("{}");
history.setChangeAfter(JSON.toJSONString(old));
historyService.insert(history);
}
@Override
@Transactional(rollbackFor = Throwable.class)
@Caching(evict = {
@CacheEvict(value = {CACHE_KEY + ".deploy"}, key = "'deploy.'+target.selectByPk(#formId).getName()+'.html'"),
@CacheEvict(value = {CACHE_KEY + ".deploy"}, key = "'deploy.'+target.selectByPk(#formId).getName()"),
@CacheEvict(value = {CACHE_KEY}, key = "'using.'+target.selectByPk(#formId).getName()"),
@CacheEvict(value = {CACHE_KEY}, key = "'deploy.'+target.selectByPk(#formId).getName()+'.version'")
})
public void unDeploy(String formId) {
Form old = this.selectByPk(formId);
assertNotNull(old, "表单不存在");
dynamicFormService.unDeploy(old);
old.setUsing(false);
createUpdate(old).includes(Property.using).where(Property.id, old.getId()).exec();
}
@Override
@Cacheable(value = CACHE_KEY + ".deploy", key = "'deploy.'+#name+'.html'")
public String createDeployHtml(String name) {
History history = historyService.selectLastHistoryByType("form.deploy." + name);
assertNotNull(history, "表单不存在");
return formParser.parseHtml(JSON.parseObject(history.getChangeAfter(), Form.class));
}
@Override
@Cacheable(value = CACHE_KEY + ".deploy", key = "'deploy.'+#name")
public Form selectDeployed(String name) {
Form using = selectUsing(name);
assertNotNull(using, "表单不存在或未部署");
History history = historyService.selectLastHistoryByType("form.deploy." + name);
assertNotNull(history, "表单不存在或未部署");
return JSON.parseObject(history.getChangeAfter(), Form.class);
}
@Override
public String createViewHtml(String formId) {
Form form = this.selectByPk(formId);
assertNotNull(form, "表单不存在");
return formParser.parseHtml(form);
}
@Override
@Cacheable(value = CACHE_KEY, key = "'using.'+#name")
public Form selectUsing(String name) {
return createQuery().where(Property.using,1).and().is(Property.name,name).single();
}
@Override
@Cacheable(value = CACHE_KEY, key = "'deploy.'+#name+'.version'")
public int selectDeployedVersion(String name) {
return selectDeployed(name).getRelease();
}
}