package com.xcong.farmer.cms.modules.system.service.Impl;
|
|
import cn.hutool.core.collection.CollUtil;
|
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.mapper.ArticleMapper;
|
import com.xcong.farmer.cms.modules.system.mapper.ColumnMapper;
|
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;
|
|
/**
|
* @TODO 发布时,index存在重复发布的情况,可优化。用线程notify唤醒。
|
* @author wzy
|
* @date 2022-07-05
|
**/
|
@Slf4j
|
@Service
|
public class ReleaseServiceImpl implements IReleaseService {
|
|
@Autowired
|
private ArticleMapper articleMapper;
|
|
@Autowired
|
private ColumnMapper columnMapper;
|
|
@Autowired
|
private ICmsCoreService cmsCoreService;
|
|
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);
|
});
|
}
|
|
@Override
|
public void releaseColumn(Long id, int type, Long companyId) {
|
ColumnEntity columnEntity = columnMapper.selectById(id);
|
Map<String, Object> map = buildColumnData(columnEntity);
|
|
map.put("releaseType", type);
|
executor.execute(() -> {
|
cmsCoreService.columnProcess(map, columnEntity.getListTemplate());
|
if (columnEntity.getParentId() != 0L) {
|
map.put("id", columnEntity.getParentId());
|
}
|
|
releaseIndex(companyId);
|
});
|
|
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) {
|
Map<String, Object> data = buildColumnData(column);
|
cmsCoreService.columnProcess(data, column.getListTemplate());
|
|
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());
|
}
|
}
|
}
|
}
|
}
|
}
|
|
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());
|
}
|
}
|
}
|
|
releaseIndex(companyId);
|
});
|
|
}
|
}
|
|
@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) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("companyId", companyId);
|
|
cmsCoreService.indexProcess(map, null);
|
}
|
|
@Override
|
public void releaseAll(Long companyId) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("companyId", companyId);
|
|
releaseColumns(4, companyId);
|
}
|
}
|