package com.xcong.farmer.cms.modules.system.service.Impl;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.io.FileUtil;
|
import com.xcong.farmer.cms.common.utils.FileUtils;
|
import com.xcong.farmer.cms.configurations.properties.CmsProperties;
|
import com.xcong.farmer.cms.modules.core.service.ICmsCoreService;
|
import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
|
import com.xcong.farmer.cms.modules.system.entity.ColumnEntity;
|
import com.xcong.farmer.cms.modules.system.entity.CompanyEntity;
|
import com.xcong.farmer.cms.modules.system.entity.WebSettingEntity;
|
import com.xcong.farmer.cms.modules.system.mapper.ArticleMapper;
|
import com.xcong.farmer.cms.modules.system.mapper.ColumnMapper;
|
import com.xcong.farmer.cms.modules.system.mapper.CompanyMapper;
|
import com.xcong.farmer.cms.modules.system.mapper.WebSetMapper;
|
import com.xcong.farmer.cms.modules.system.service.IReleaseService;
|
import com.xcong.farmer.cms.modules.system.util.LoginUserUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.HashMap;
|
import java.util.Hashtable;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.Executor;
|
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author wzy
|
* @TODO 发布时,index存在重复发布的情况,可优化。用线程notify唤醒。
|
* @date 2022-07-05
|
**/
|
@Slf4j
|
@Service
|
public class ReleaseServiceImpl implements IReleaseService {
|
|
@Autowired
|
private ArticleMapper articleMapper;
|
|
@Autowired
|
private ColumnMapper columnMapper;
|
|
@Autowired
|
private ICmsCoreService cmsCoreService;
|
|
@Autowired
|
private CmsProperties cmsProperties;
|
|
@Autowired
|
private CompanyMapper companyMapper;
|
|
@Autowired
|
private WebSetMapper webSetMapper;
|
|
private final Executor executor = new ThreadPoolExecutor(5, 20, 600, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
|
|
@Override
|
public void releaseArticle(Long id, Long companyId) {
|
ArticleEntity article = articleMapper.selectById(id);
|
ColumnEntity column = columnMapper.selectById(article.getColumnId());
|
|
Long beforeColumnId = article.getBeforeColumnId();
|
article.setBeforeColumnId(-1L);
|
articleMapper.updateById(article);
|
|
Map<String, Object> data = new Hashtable<>();
|
data.put("id", article.getId());
|
data.put("companyId", companyId);
|
|
executor.execute(() -> {
|
log.info("执行文章发布");
|
cmsCoreService.articleProcess(data, column.getArticleTemplate(), column.getPath());
|
this.releaseColumn(column.getId(), 1, companyId);
|
if (column.getParentId() != 0L) {
|
releaseColumn(column.getParentId(), 1, companyId);
|
}
|
|
if (beforeColumnId != null && !article.getColumnId().equals(beforeColumnId)) {
|
ColumnEntity beforeColumn = columnMapper.selectById(beforeColumnId);
|
this.releaseColumn(beforeColumnId, 1, companyId);
|
if (beforeColumn.getParentId() != 0L) {
|
this.releaseColumn(beforeColumn.getParentId(), 1, companyId);
|
}
|
}
|
|
this.releaseIndex(companyId, false);
|
});
|
}
|
|
@Override
|
public void releaseColumn(Long id, int type, Long companyId) {
|
ColumnEntity columnEntity = columnMapper.selectById(id);
|
Map<String, Object> map = buildColumnData(columnEntity);
|
|
if (columnEntity.getBeforeParentId() != -1 || !"-1".equals(columnEntity.getBeforeColumnCode())) {
|
CompanyEntity company = companyMapper.selectById(companyId);
|
if (!"-1".equals(columnEntity.getBeforeColumnCode())) {
|
String outputPath = FileUtils.path(cmsProperties.getOutputPath(), company.getCode()) + "/" + columnEntity.getBeforeColumnCode();
|
log.info("删除路径为:{}", outputPath);
|
FileUtil.del(outputPath);
|
}
|
|
if (columnEntity.getBeforeParentId() != -1) {
|
ColumnEntity parent = columnMapper.selectById(columnEntity.getBeforeParentId());
|
String path = FileUtils.path(cmsProperties.getOutputPath(), company.getCode()) + parent.getPath() + "/" + columnEntity.getColumnCode();
|
log.info("删除路径为:{}", path);
|
FileUtil.del(path);
|
}
|
|
columnEntity.setBeforeColumnCode("-1");
|
columnEntity.setBeforeParentId(-1L);
|
columnMapper.updateById(columnEntity);
|
releaseAll(companyId);
|
return;
|
}
|
|
executor.execute(() -> {
|
List<ArticleEntity> articles = articleMapper.selectArticleByColumnId(columnEntity.getId(), companyId, type);
|
if (CollUtil.isNotEmpty(articles)) {
|
for (ArticleEntity article : articles) {
|
if (article.getReleaseStatus() == 0) {
|
article.setReleaseStatus(1);
|
articleMapper.updateById(article);
|
}
|
|
if (article.getType() == 1) {
|
map.put("id", article.getId());
|
cmsCoreService.articleProcess(map, columnEntity.getArticleTemplate(), columnEntity.getPath());
|
}
|
}
|
}
|
|
map.put("id", columnEntity.getId());
|
|
cmsCoreService.columnProcess(map, columnEntity.getListTemplate());
|
if (columnEntity.getParentId() != 0L) {
|
ColumnEntity parentColumn = columnMapper.selectById(columnEntity.getParentId());
|
Map<String, Object> parentMap = buildColumnData(parentColumn);
|
parentMap.put("id", parentColumn.getId());
|
cmsCoreService.columnProcess(parentMap, parentColumn.getListTemplate());
|
}
|
|
releaseIndex(companyId, false);
|
});
|
|
if (type != 1) {
|
executor.execute(() -> {
|
if (columnEntity.getParentId() == 0L) {
|
List<ColumnEntity> columns = columnMapper.selectColumnByParentId(columnEntity.getId(), companyId, 2);
|
if (CollUtil.isNotEmpty(columns)) {
|
for (ColumnEntity column : columns) {
|
List<ArticleEntity> articles = articleMapper.selectArticleByColumnId(column.getId(), companyId, type);
|
if (CollUtil.isNotEmpty(articles)) {
|
for (ArticleEntity article : articles) {
|
if (article.getReleaseStatus() == 0) {
|
article.setReleaseStatus(1);
|
articleMapper.updateById(article);
|
}
|
|
if (article.getType() == 1) {
|
map.put("id", article.getId());
|
cmsCoreService.articleProcess(map, column.getArticleTemplate(), column.getPath());
|
}
|
}
|
}
|
|
Map<String, Object> data = buildColumnData(column);
|
cmsCoreService.columnProcess(data, column.getListTemplate());
|
}
|
}
|
}
|
|
releaseIndex(companyId, false);
|
});
|
|
}
|
}
|
|
@Override
|
public void releaseColumns(int type, Long companyId) {
|
List<ColumnEntity> columns = columnMapper.selectColumnByParentId(0L, companyId, 2);
|
|
if (CollUtil.isEmpty(columns)) {
|
return;
|
}
|
|
for (ColumnEntity column : columns) {
|
releaseColumn(column.getId(), type, companyId);
|
}
|
}
|
|
private Map<String, Object> buildColumnData(ColumnEntity columnEntity) {
|
Map<String, Object> map = new Hashtable<>();
|
map.put("id", columnEntity.getId());
|
map.put("code", columnEntity.getColumnCode());
|
if (columnEntity.getParentId() == 0L) {
|
map.put("parentCode", columnEntity.getColumnCode());
|
} else {
|
ColumnEntity parent = columnMapper.selectById(columnEntity.getParentId());
|
map.put("parentCode", parent.getColumnCode());
|
}
|
map.put("columnTitle", columnEntity.getColumnName());
|
map.put("templatePath", columnEntity.getPath());
|
map.put("companyId", columnEntity.getCompanyId());
|
return map;
|
}
|
|
@Override
|
public void releaseIndex(Long companyId, boolean hasSearch) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("companyId", companyId);
|
|
WebSettingEntity webSetting = webSetMapper.selectByCompanyId(companyId);
|
|
cmsCoreService.indexProcess(map, webSetting.getIndexTemplate());
|
if (hasSearch) {
|
executor.execute(() -> {
|
cmsCoreService.process(map, "search", webSetting.getSearchTemplate());
|
cmsCoreService.process(map, "message", webSetting.getMsgTemplate());
|
});
|
}
|
}
|
|
@Override
|
public void releaseAll(Long companyId) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("companyId", companyId);
|
|
releaseColumns(4, companyId);
|
releaseIndex(companyId, true);
|
}
|
}
|