Merge pull request '合并主干分支代码' (#1042) from otto/microservices:dev_monitoring into dev_monitoring

This commit is contained in:
otto 2026-01-26 14:36:31 +08:00
commit 5daaa3d54a
39 changed files with 687 additions and 153 deletions

View File

@ -231,7 +231,7 @@ public class CmsDocController extends BaseController {
public AjaxResult editCmsDIr(@ApiParam(name = "id", value = "栏目Id") @PathVariable Long id,
@ApiParam(name = "cmsDirUpdateVo", value = "栏目更新对象") @RequestBody CmsDirUpdateVo cmsDirUpdateVo) {
cmsDocService.updateCmsDir(id, cmsDirUpdateVo);
return success("异步更新栏目信息");
return success("栏目信息更新成功");
}
/**

View File

@ -68,7 +68,7 @@ public class OpenController extends BaseController {
public GenericsTableDataInfo<CmsDocBaseDto> docList(@ApiParam(name = "dirId", value = "栏目Id") @PathVariable("dirId") Long dirId
, CmsDocSearchVo cmsDocSearchVo) {
cmsDocSearchVo.setIsOpen(true);
List<CmsDocBaseDto> list = cmsDocService.selectCmsDocList(dirId, cmsDocSearchVo);
List<CmsDocBaseDto> list = cmsDocService.selectSetDefaultHeadImgCmsDocList(dirId, cmsDocSearchVo);
return getAllGenericsDataTableToPage(list);
}

View File

@ -41,6 +41,9 @@ public class CmsDir implements Comparable<CmsDir> {
@ApiModelProperty(value = "排序", hidden = true)
private Integer sort;
@ApiModelProperty(value = "文章头图")
private String headImg;
public String getName() {
if (name != null) {
name = name.replaceAll(CmsConstants.DIR_SEPARATOR,

View File

@ -21,9 +21,6 @@ public class CmsDirUpdateVo {
@ApiModelProperty(value = "顺序")
private Integer order;
public CmsDir toCmsDir() {
CmsDir cmsDir = new CmsDir();
cmsDir.setName(name);
return cmsDir;
}
@ApiModelProperty(value = "文章头图")
private String headImg;
}

View File

@ -166,6 +166,7 @@ public class CmsDoc extends BaseSortEntity {
CmsDir cmsDir = new CmsDir();
cmsDir.setId(id);
cmsDir.setName(name);
cmsDir.setHeadImg(headImg);
cmsDir.setSort(this.getSort());
cmsDir.setCreatedAt(getCreateTime());
return cmsDir;
@ -186,6 +187,8 @@ public class CmsDoc extends BaseSortEntity {
HotCmsDocDto hotCmsDocDto = new HotCmsDocDto();
hotCmsDocDto.setId(id);
hotCmsDocDto.setName(name);
hotCmsDocDto.setSummary(summary);
hotCmsDocDto.setPublishTime(publishTime);
return hotCmsDocDto;
}

View File

@ -1,10 +1,13 @@
package com.microservices.cms.doc.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.microservices.common.core.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author otto
*/
@ -23,4 +26,11 @@ public class HotCmsDocDto {
@Excel(name = "文章名称")
@ApiModelProperty("文章名称")
private String name;
@ApiModelProperty("文章概要")
private String summary;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private Date publishTime;
}

View File

@ -1,5 +1,7 @@
package com.microservices.cms.doc.domain.gitlink;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.exception.ServiceException;
import lombok.Data;
/**
@ -22,4 +24,12 @@ public class EntryDto implements Comparable<EntryDto> {
// 重写Comparable接口的compareTo方法根据年龄升序排列降序修改相减顺序即可
return Math.toIntExact(entryDto.getCommit().getCreated_at_unix() - this.commit.getCreated_at_unix());
}
public static EntryDto getEntryDtoFromJson(JSONObject subEntriesResult) {
FileEntryDto fileEntryDto = subEntriesResult.toJavaObject(FileEntryDto.class);
if (fileEntryDto == null || fileEntryDto.getEntries() == null) {
throw new ServiceException("该文章不存在");
}
return fileEntryDto.getEntries();
}
}

View File

@ -31,6 +31,17 @@ public interface CmsDocMapper {
*/
public List<CmsDoc> selectCmsDocList(CmsDocSearchVo cmsDocSearchVo);
/**
* 查询文章信息列表(设置默认头图为栏目头图)
*
* @param cmsDocSearchVo 文章信息
* @return 文章信息集合
*/
List<CmsDoc> selectCmsDocListSetDefaultHeadImg(CmsDocSearchVo cmsDocSearchVo);
/**
* 新增文章信息
*
@ -172,4 +183,13 @@ public interface CmsDocMapper {
Long getNotAuditCmsCountByDeptId(Long deptId);
Long getCmsDocVisitsByDeptId(Long deptId);
/**
* 根据组织id获取专区下所有文章和栏目
* @param deptId 组织id
* @return 文章和栏目列表
*/
List<CmsDoc> selectCmsDocAndDirListByDept(Long deptId);
void updateCmsDocShaByPathAndDeptId(@Param("sha") String sha, @Param("filePath") String filePath, @Param("deptId") Long deptId);
}

View File

@ -91,7 +91,7 @@ public interface ICmsAsyncService {
void asyncCreateBranchAndDeleteFileAndCreatePR(CmsDoc newDocWithAudit, CmsProject cmsProject);
void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir);
void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, String newCmsDirName);
/**
* 推送文章数据到搜索引擎

View File

@ -288,4 +288,10 @@ public interface ICmsDocService {
CmsDocBaseDto selectCmsDocBaseInfoById(Long id);
Long getCmsDocVisitsByDeptId(Long deptId);
List<CmsDocBaseDto> selectSetDefaultHeadImgCmsDocList(Long dirId, CmsDocSearchVo cmsDocSearchVo);
List<CmsDoc> selectCmsDocAndDirListByDept(Long deptId);
void updateCmsDocShaByPathAndDeptId(String sha, String filePath, Long deptId);
}

View File

@ -16,6 +16,7 @@ import com.microservices.cms.project.service.ICmsProjectService;
import com.microservices.cms.utils.CmsConstants;
import com.microservices.cms.utils.CmsGitLinkRequestUrl;
import com.microservices.cms.utils.CmsUtils;
import com.microservices.cms.utils.CustomExecutorFactory;
import com.microservices.common.core.constant.CacheConstants;
import com.microservices.common.core.constant.Constants;
import com.microservices.common.core.constant.SecurityConstants;
@ -24,6 +25,7 @@ import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.core.utils.html.EscapeUtil;
import com.microservices.common.core.utils.sign.Base64;
import com.microservices.common.core.utils.uuid.IdUtils;
import com.microservices.common.httpClient.constant.GitLinkConstants;
import com.microservices.common.httpClient.service.HttpAPIService;
@ -47,6 +49,7 @@ import org.springframework.util.DigestUtils;
import java.net.URISyntaxException;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -93,6 +96,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
private RemoteZoneService remoteZoneService;
@Autowired
private RequestConfig config;
/**
* 异步设置文章更新时间
*
@ -109,7 +113,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
} else {
redisService.setCacheObject(updateDocIntervalKey, cmsProject.getName(), 1L, TimeUnit.MINUTES);
}
CmsDocSearchVo cmsDocSearch=new CmsDocSearchVo();
CmsDocSearchVo cmsDocSearch = new CmsDocSearchVo();
cmsDocSearch.setDeptId(cmsProject.getDeptId());
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch);
for (EntryDto entryDto : entryDtoList) {
@ -150,7 +154,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
webhook.put("eventCondition", "push");
webhook.put("http_method", "POST");
webhook.put("secret", "");
webhook.put("url", gatewayUrl+"/cms/doc/open/dept/"+cmsProject.getDeptId());
webhook.put("url", gatewayUrl + "/cms/doc/open/dept/" + cmsProject.getDeptId());
webhook.put("events", new String[]{"push"});
jsonObject.put("webhook", webhook);
//增加Webhook
@ -231,7 +235,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
}
private void syncDocAddedData(CmsProject cmsProject, List<String> addedList) {
for (String addedFilePath:addedList) {
for (String addedFilePath : addedList) {
try {
String[] filePathList = addedFilePath.split("/");
if (filePathList.length != 2) {
@ -250,15 +254,15 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
syncCreateDoc(entry, dirName, cmsProject.getDeptId(), fileEntry.getLast_commit());
}
}
}catch (Exception e){
} catch (Exception e) {
logger.error("[{}]同步新增文章发生异常:{}"
, cmsProject.getName(), e.getMessage());
}
}
}
private void syncDocRemovedData(CmsProject cmsProject,List<String> removedList) {
for (String removedFilePath:removedList) {
private void syncDocRemovedData(CmsProject cmsProject, List<String> removedList) {
for (String removedFilePath : removedList) {
try {
String[] filePathList = removedFilePath.split("/");
if (filePathList.length != 2) {
@ -357,7 +361,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
cmsDocSearch.setDeptId(cmsDir.getDeptId());
cmsDocSearch.setDirName(cmsDir.getName());
cmsDocSearch.setIsDir(false);
List<CmsDoc> cmsDocList=cmsDocMapper.selectCmsDocList(cmsDocSearch);
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch);
//获取数据库所有文件的filePath
List<String> databaseFilePathList = cmsDocList.stream().map(CmsDoc::getFilePath).collect(Collectors.toList());
//获取需要新增的文章
@ -383,16 +387,16 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
@Override
public void asyncDocData(Long deptId, String bodyStr) {
//防止多次操作同时执行将同步内容放入队列根据先后时间执行同步动作
String cmsSyncDeptIdKey=CacheConstants.CMS_SYNC_DEPT_ID_KEY+deptId;
String cmsSyncDeptIdKey = CacheConstants.CMS_SYNC_DEPT_ID_KEY + deptId;
//为当前同步操作生成UUID若拿到的UUID为自身则执行本次同步动作
String UUID= IdUtils.fastSimpleUUID();
String UUID = IdUtils.fastSimpleUUID();
redisService.leftPush(cmsSyncDeptIdKey, UUID);
//设置缓存过期时间防止异常情况导致同步无法继续执行
redisService.expire(cmsSyncDeptIdKey, 3600, TimeUnit.SECONDS);
String currentUUID = String.valueOf(redisService.listIndexOf(cmsSyncDeptIdKey, -1));
//设置最大循环阈值防止意外情况导致死循环(7200次约1小时左右)
int threshold=7200;
while (!UUID.equals(currentUUID)&&threshold!=0){
int threshold = 7200;
while (!UUID.equals(currentUUID) && threshold != 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
@ -402,41 +406,41 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
threshold--;
}
try{
CmsProject cmsProject=cmsProjectService.selectCmsProjectByDeptId(deptId);
JSONObject body=JSONObject.parseObject(bodyStr);
try {
CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(deptId);
JSONObject body = JSONObject.parseObject(bodyStr);
//获取本次推送中Commit总数
Integer totalCommits=body.getInteger("total_commits");
Integer totalCommits = body.getInteger("total_commits");
//从webhook请求中获取本次提交内容
JSONArray commits=body.getJSONArray("commits");
JSONArray commits = body.getJSONArray("commits");
//当commit总数大于提交的列表数量时代表此次PUSH未携带所有commit此时进行一次全量同步
if(totalCommits!=null
&&commits!=null
&&totalCommits>commits.size()){
if (totalCommits != null
&& commits != null
&& totalCommits > commits.size()) {
fullSyncDocData(cmsProject);
}else{
for (int i = commits.size()-1; i >=0 ; i--) {
JSONObject commit=commits.getJSONObject(i);
} else {
for (int i = commits.size() - 1; i >= 0; i--) {
JSONObject commit = commits.getJSONObject(i);
//获取新增的文件列表
JSONArray addedList=commit.getJSONArray("added");
if(addedList!=null){
syncDocAddedData(cmsProject,addedList.toJavaList(String.class));
JSONArray addedList = commit.getJSONArray("added");
if (addedList != null) {
syncDocAddedData(cmsProject, addedList.toJavaList(String.class));
}
//获取删除的文件列表
JSONArray removedList=commit.getJSONArray("removed");
if(removedList!=null){
syncDocRemovedData(cmsProject,removedList.toJavaList(String.class));
JSONArray removedList = commit.getJSONArray("removed");
if (removedList != null) {
syncDocRemovedData(cmsProject, removedList.toJavaList(String.class));
}
//获取更新的文件列表
JSONArray modifiedList=commit.getJSONArray("modified");
if(modifiedList!=null){
JSONArray modifiedList = commit.getJSONArray("modified");
if (modifiedList != null) {
syncDocModifiedData(cmsProject, modifiedList.toJavaList(String.class));
}
}
}
}catch (Exception e) {
} catch (Exception e) {
logger.error("同步文章时发送异常:{}", e.getMessage());
}finally {
} finally {
//本次同步执行完成后再弹出该UUID
redisService.rightPop(cmsSyncDeptIdKey, 500, TimeUnit.MICROSECONDS);
}
@ -469,12 +473,12 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
}
@Override
public void syncCreateDir(String dirName,EntryDto entry,CmsProject cmsProject,boolean isCreateKeep){
public void syncCreateDir(String dirName, EntryDto entry, CmsProject cmsProject, boolean isCreateKeep) {
CmsDoc cmsDir = new CmsDoc();
cmsDir.setName(dirName);
cmsDir.setCreateTime(entry.getCommit().getCreated_at());
boolean insertResult;
if(isCreateKeep){
if (isCreateKeep) {
//若该栏目不存在检查文件夹中是否存在.keep文件
JSONObject subEntriesResult = gitLinkRequestHelper.doGet(
CmsGitLinkRequestUrl.GET_FILE_SUB_ENTRIES(cmsProject, cmsDir.getName(), CmsConstants.BRANCH_MASTER));
@ -484,14 +488,14 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
if (keepEntry != null) {
//若存在则在数据库中创建该栏目
insertResult=createCmsDir(cmsDir,cmsProject.getDeptId(),keepEntry);
insertResult = createCmsDir(cmsDir, cmsProject.getDeptId(), keepEntry);
} else {
//若不存在则在数据库中创建该栏目同时在仓库的该文件夹下创建.keep文件
insertResult = cmsDocService.insertCmsDocDir(cmsProject.getDeptId(), cmsDir.copyToCmsDir());
}
}else{
} else {
//若不自动创建则在数据库中创建根据文件名该栏目
insertResult=createCmsDir(cmsDir,cmsProject.getDeptId(),entry);
insertResult = createCmsDir(cmsDir, cmsProject.getDeptId(), entry);
}
@ -500,7 +504,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
}
}
private boolean createCmsDir(CmsDoc cmsDir,Long deptId,EntryDto entry){
private boolean createCmsDir(CmsDoc cmsDir, Long deptId, EntryDto entry) {
cmsDir.setIsDir(true);
cmsDir.setFilePath(cmsDir.getDirPath());
cmsDir.setDeptId(deptId);
@ -678,6 +682,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
requestBody);
cmsDoc.setAuditPrNumber(result.getString("pull_request_number") + "-" + result.getString("pull_request_id"));
}
@Override
public CmsDoc updateCmsDocDatabaseAndUpdateForGitLink(CmsDoc oldCmsDoc, CmsDocDto cmsDocDto, String branchName) {
if (oldCmsDoc == null) {
@ -871,27 +876,87 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService {
}
@Override
@Async
public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir) {
public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, String newCmsDirName) {
try {
remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 1, SecurityConstants.INNER);
//创建新栏目
String message = String.format("重命名栏目:由[%s]重命名为[%s]", oldCmsDir.getName(), newCmsDir.getName());
cmsDocService.createFileByGitLink(newCmsDir, message, "");
//在数据库中重命名该栏目防止后续操作推送的WebHook重复创建栏目
cmsDocService.updateCmsCommonDatabase(newCmsDir, CmsConstants.BRANCH_MASTER);
//将原栏目中所有文章移动到新栏目中
moveCmsDocToNewCmsDir(cmsProject, oldCmsDir.getName(), newCmsDir.getName(), message);
//删除旧栏目
deleteCmsDocByGitLink(cmsProject, oldCmsDir);
JSONObject dirFilesJson = gitLinkRequestHelper.doGet(CmsGitLinkRequestUrl.GET_DIR_SUB_ENTRIES(
cmsProject,
oldCmsDir.getName(),
CmsConstants.BRANCH_MASTER));
List<EntryDto> entryDtoList = cmsDocService.getEntriesFromRequestResult(dirFilesJson, cmsProject, false);
CountDownLatch countDownLatch = new CountDownLatch(entryDtoList.size());
// 异步获取每篇文章内容
entryDtoList.forEach(entryDto -> {
CustomExecutorFactory.threadPoolExecutor.execute(() -> {
try {
JSONObject fileSubEntriesResult = gitLinkRequestHelper.doGet(
CmsGitLinkRequestUrl.GET_FILE_SUB_ENTRIES(
cmsProject,
entryDto.getPath(),
CmsConstants.BRANCH_MASTER));
EntryDto cmsDocEntryDto = EntryDto.getEntryDtoFromJson(fileSubEntriesResult);
entryDto.setContent(cmsDocEntryDto.getContent());
} finally {
countDownLatch.countDown();
}
});
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
logger.error("栏目重命名失败(将对应代码库中文章移动至新文件夹失败):{}", e.getMessage());
throw new ServiceException("栏目重命名失败");
}
for (EntryDto entryDto : entryDtoList) {
JSONObject updateFileBody = new JSONObject();
updateFileBody.put("branch", CmsConstants.BRANCH_MASTER);
updateFileBody.put("message", "移动文章至新栏目");
updateFileBody.put("from_path", entryDto.getPath());
String newFilePath = newCmsDirName + "/" + entryDto.getName();
updateFileBody.put("filepath", newFilePath);
updateFileBody.put("base64_filepath", Base64.contentToBase64(newFilePath));
updateFileBody.put("sha", entryDto.getSha());
String content = entryDto.getContent();
if (content == null) {
content = "";
}
updateFileBody.put("content", content);
gitLinkRequestHelper.doPut(CmsGitLinkRequestUrl.UPDATE_FILE(cmsProject), updateFileBody);
}
CmsDoc newCmsDoc = oldCmsDir.copyToRenameCmsDir(newCmsDirName);
//在数据库中重命名该栏目
cmsDocService.updateCmsCommonDatabase(newCmsDoc, CmsConstants.BRANCH_MASTER);
} catch (Exception e) {
logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]){}", oldCmsDir.getName(), newCmsDir.getName(), e.getMessage());
throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDir.getName() + "])");
} finally {
remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER);
logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]){}", oldCmsDir.getName(), newCmsDirName, e.getMessage());
throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDirName + "])");
}
// finally {
// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER);
// }
}
// @Override
// @Async
// public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir) {
// try {
// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 1, SecurityConstants.INNER);
// //创建新栏目
// String message = String.format("重命名栏目:由[%s]重命名为[%s]", oldCmsDir.getName(), newCmsDir.getName());
// cmsDocService.createFileByGitLink(newCmsDir, message, "");
// //在数据库中重命名该栏目防止后续操作推送的WebHook重复创建栏目
// cmsDocService.updateCmsCommonDatabase(newCmsDir, CmsConstants.BRANCH_MASTER);
// //将原栏目中所有文章移动到新栏目中
// moveCmsDocToNewCmsDir(cmsProject, oldCmsDir.getName(), newCmsDir.getName(), message);
// //删除旧栏目
// deleteCmsDocByGitLink(cmsProject, oldCmsDir);
// } catch (Exception e) {
// logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]){}", oldCmsDir.getName(), newCmsDir.getName(), e.getMessage());
// throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDir.getName() + "])");
// } finally {
// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER);
// }
// }
@Async
@Override
public void pushDocDataSearchEngine(CmsDoc cmsDoc) {

View File

@ -103,7 +103,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId());
String branchName = DocAuditStatus.AUDIT_PASS.getAuditCode().equals(cmsDoc.getAuditStatus()) ? CmsConstants.BRANCH_MASTER : cmsDoc.getAuditTmpBranchName();
String branchName = DocAuditStatus.AUDIT_PASS.getAuditCode().equals(cmsDoc.getAuditStatus()) ? CmsConstants.BRANCH_MASTER : cmsDoc.getAuditTmpBranchName();
FileEntryDto fileEntryDto = getFileEntryDto(cmsProject, cmsDoc.getFilePath(), branchName);
EntryDto entryDto = fileEntryDto.getEntries();
@ -197,20 +197,21 @@ public class CmsDocServiceImpl implements ICmsDocService {
@Override
public void updateCmsDir(Long id, CmsDirUpdateVo cmsDirUpdateVo) {
CmsDoc oldCmsDir = selectCmsDir(id);
checkCmsLockStatus(oldCmsDir.getDeptId());
//设置栏目排序
setCmsSort(cmsDirUpdateVo.getOrder(), oldCmsDir, false, null);
oldCmsDir.setHeadImg(cmsDirUpdateVo.getHeadImg());
updateCmsCommonDatabase(oldCmsDir, CmsConstants.BRANCH_MASTER);
CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(oldCmsDir.getDeptId());
CmsDoc newCmsDir = oldCmsDir.copyToRenameCmsDir(cmsDirUpdateVo.getName());
String newCmsDirName = cmsDirUpdateVo.getName();
if (StringUtils.isNotEmpty(newCmsDir.getName()) && !newCmsDir.getName().equals(oldCmsDir.getName())) {
CmsDoc cmsDir = cmsDocMapper.selectCmsDocDirByNameAndDeptId(newCmsDir.getName(), oldCmsDir.getDeptId());
if (StringUtils.isNotEmpty(newCmsDirName) && !newCmsDirName.equals(oldCmsDir.getName())) {
CmsDoc cmsDir = cmsDocMapper.selectCmsDocDirByNameAndDeptId(newCmsDirName, oldCmsDir.getDeptId());
if (cmsDir != null) {
throw new ServiceException("栏目名称已存在,不允许进行重命名(新栏目名称[" + newCmsDir.getName() + "])");
}
cmsAsyncService.asyncMoveFileToNewDir(cmsProject, oldCmsDir, newCmsDir);
throw new ServiceException("栏目名称已存在,不允许进行重命名(新栏目名称[" + newCmsDirName + "])");
}
// 异步修改栏目名称将仓库内原文件夹下所有文章移动到新文件夹下
cmsAsyncService.asyncMoveFileToNewDir(cmsProject, oldCmsDir, newCmsDirName);
}
}
@Override
@ -237,7 +238,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
cmsDocSearchVo.setDirName(cmsDir.getName());
cmsDocSearchVo.setDeptId(cmsDir.getDeptId());
cmsDocSearchVo.setIsDir(false);
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearchVo);
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearchVo);
List<CompletableFuture<CmsDocDetailDto>> futures = new ArrayList();
for (CmsDoc cmsDoc : cmsDocList) {
CompletableFuture<CmsDocDetailDto> future = CompletableFuture.supplyAsync(() -> {
@ -283,6 +284,21 @@ public class CmsDocServiceImpl implements ICmsDocService {
return selectCmsDocListByDatabase(dirId, cmsDocSearchVo);
}
@Override
public List<CmsDocBaseDto> selectSetDefaultHeadImgCmsDocList(Long dirId, CmsDocSearchVo cmsDocSearchVo) {
return selectCmsDocListSetDefaultHeadImgByDatabase(dirId, cmsDocSearchVo);
}
@Override
public List<CmsDoc> selectCmsDocAndDirListByDept(Long deptId) {
return cmsDocMapper.selectCmsDocAndDirListByDept(deptId);
}
@Override
public void updateCmsDocShaByPathAndDeptId(String sha, String filePath, Long deptId) {
cmsDocMapper.updateCmsDocShaByPathAndDeptId(sha,filePath,deptId);
}
private List<CmsDocBaseDto> selectCmsDocListByDatabase(Long dirId, CmsDocSearchVo cmsDocSearchVo) {
CmsDoc cmsDocDir = selectCmsDir(dirId);
@ -295,6 +311,24 @@ public class CmsDocServiceImpl implements ICmsDocService {
return cmsDocList.stream().map(CmsDoc::copyToCmsDocBaseDto).collect(Collectors.toList());
}
/**
* 设置文章默认头图为栏目头图
* @param dirId 栏目id
* @param cmsDocSearchVo 文章查询条件
* @return 文章列表
*/
private List<CmsDocBaseDto> selectCmsDocListSetDefaultHeadImgByDatabase(Long dirId, CmsDocSearchVo cmsDocSearchVo) {
CmsDoc cmsDocDir = selectCmsDir(dirId);
cmsDocSearchVo.setDeptId(cmsDocDir.getDeptId());
cmsDocSearchVo.setDirName(cmsDocDir.getName());
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearchVo);
if (cmsDocList == null || cmsDocList.isEmpty()) {
return new ArrayList<>();
}
return cmsDocList.stream().map(CmsDoc::copyToCmsDocBaseDto).collect(Collectors.toList());
}
/**
* 检查专区资讯是否处于锁定状态若处于则抛出异常
*
@ -552,6 +586,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
throw new ServiceException("计算字符串Sha出错");
}
}
@Override
public void setCmsSort(Integer order, CmsDoc oldCmsDoc, boolean isChangeOnDir, String isHomePage) {
//调整文章/栏目顺序
@ -697,7 +732,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
Long originCmsDocId = Long.parseLong(oldCmsDoc.getAuditType().split("-")[1]);
CmsDoc originCmsDoc = cmsDocMapper.selectCmsDocById(originCmsDocId);
deleteTmpBranchIfBranchExist(oldCmsDoc);
BeanUtils.copyProperties(originCmsDoc,oldCmsDoc);
BeanUtils.copyProperties(originCmsDoc, oldCmsDoc);
cmsDocMapper.deleteCmsDocById(id);
} else
//文章审核类型create 直接新增文章
@ -724,11 +759,11 @@ public class CmsDocServiceImpl implements ICmsDocService {
} else
//更新已发布文章
if (oldCmsDoc.getAuditStatus().equals(DocAuditStatus.AUDIT_PASS.getAuditCode())) {
//1.创建一条auditType="update-原文章id"audit_status为2其余字段与待更新文章一致的新文章数据
newDocWithAudit = insertDocWithAudit(oldCmsDoc,
DocAndZoneOperation.OPERATION_UPDATE.getOperationCode() + "-" + id,
DocAuditStatus.TO_BE_AUDIT.getAuditCode());
}
//1.创建一条auditType="update-原文章id"audit_status为2其余字段与待更新文章一致的新文章数据
newDocWithAudit = insertDocWithAudit(oldCmsDoc,
DocAndZoneOperation.OPERATION_UPDATE.getOperationCode() + "-" + id,
DocAuditStatus.TO_BE_AUDIT.getAuditCode());
}
cmsAsyncService.asyncUpdateBranchAndFileAndCreatePR(newDocWithAudit, cmsDocDto);
return true;
}
@ -785,7 +820,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
gitLinkRequestHelper.doDelete(CmsGitLinkRequestUrl.DELETE_BRANCH(cmsProject, cmsDoc.getAuditTmpBranchName()));
} catch (ServiceException e) {
//忽略分支不存在异常
if(!"分支不存在!".equals(e.getMessage())) {
if (!"分支不存在!".equals(e.getMessage())) {
throw new ServiceException(e.getMessage());
}
}
@ -863,6 +898,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
cmsDoc.setIsDir(true);
cmsDoc.setFilePath(cmsDoc.getDirPath(cmsDir.getName()));
cmsDoc.setDeptId(deptId);
cmsDoc.setHeadImg(cmsDir.getHeadImg());
cmsDoc.setName(cmsDir.getName());
return insertCommonCmsDoc(cmsDoc, "创建栏目:" + cmsDir.getName(), "");
}
@ -949,7 +985,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
List<CmsDoc> cmsDocList = cmsDocMapper.selectHotCmsDocList(cmsDocInput);
if (cmsDocList != null) {
//todo:需检查该文章是否在GitLink中存在
return cmsDocList.stream().map(x -> x.copyToHotCmsDocDto()).collect(Collectors.toList());
return cmsDocList.stream().map(CmsDoc::copyToHotCmsDocDto).collect(Collectors.toList());
}
return new ArrayList<>();
@ -990,7 +1026,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
for (CmsDoc cmsDir : cmsDirList) {
CmsDocSearchVo cmsDocSearchVo = new CmsDocSearchVo();
cmsDocSearchVo.setIsOpen(isOpen);
List<CmsDocBaseDto> cmsDocBaseDtoList = selectCmsDocList(cmsDir.getId(), cmsDocSearchVo);
List<CmsDocBaseDto> cmsDocBaseDtoList = selectSetDefaultHeadImgCmsDocList(cmsDir.getId(), cmsDocSearchVo);
CmsDocOverviewDto cmsDocOverviewDto = new CmsDocOverviewDto();
cmsDocOverviewDto.setId(cmsDir.getId());
cmsDocOverviewDto.setName(cmsDir.getName());
@ -1104,7 +1140,7 @@ public class CmsDocServiceImpl implements ICmsDocService {
CmsDocSearchVo cmsDocSearch = new CmsDocSearchVo();
cmsDocSearch.setDeptId(deptId);
cmsDocSearch.setIsHomepage(CmsConstants.TRUE);
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch);
List<CmsDoc> cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearch);
List<CmsDocBaseDto> cmsDocBaseDtoList = new ArrayList<>();
for (CmsDoc cmsDoc : cmsDocList) {
CmsDocBaseDto cmsDocBaseDto = cmsDoc.copyToCmsDocBaseDto();

View File

@ -95,8 +95,12 @@ public class CmsProjectController extends BaseController {
@GetMapping("/getProjectByDeptId/{deptId}")
public R<String> getProjectByDeptId(
@ApiParam(name = "deptId", value = "组织Id") @PathVariable(value = "deptId") Long deptId) {
CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(deptId);
return R.ok(JSONObject.toJSONString(cmsProject));
CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptIdAndNoException(deptId);
if (cmsProject == null) {
return R.ok(null);
} else {
return R.ok(JSONObject.toJSONString(cmsProject));
}
}
/**
@ -170,4 +174,16 @@ public class CmsProjectController extends BaseController {
public R<Boolean> removeByDeptId(@PathVariable(value = "deptId") Long deptId) {
return R.ok(cmsProjectService.deleteCmsProjectByDeptId(deptId) > 0);
}
/**
* 初始化专区对应项目
*/
@RequiresPermissions("zone:project:add")
@ApiOperation("初始化专区对应项目")
@Log(title = "初始化专区对应项目", businessType = BusinessType.INSERT)
@PostMapping("initCmsProject/dept/{deptId}")
public AjaxResult initCmsProject(
@ApiParam(name = "deptId", value = "组织Id") @PathVariable(value = "deptId") Long deptId) {
return toAjax(cmsProjectService.initZoneCmsProjectByDept(deptId));
}
}

View File

@ -78,4 +78,8 @@ public interface ICmsProjectService {
Boolean updateCmsProjectByDept(SysDept dept);
boolean operateProtectedBranchByZoneAuditSetting(String userName, String identifier, Long deptId, String operationType);
boolean initZoneCmsProjectByDept(Long deptId);
CmsProject selectCmsProjectByDeptIdAndNoException(Long deptId);
}

View File

@ -1,21 +1,23 @@
package com.microservices.cms.project.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.cms.doc.domain.CmsDir;
import com.microservices.cms.doc.domain.CmsDocBaseDto;
import com.microservices.cms.doc.domain.CmsDocSearchVo;
import com.microservices.cms.doc.domain.*;
import com.microservices.cms.doc.service.ICmsAsyncService;
import com.microservices.cms.doc.service.ICmsDocService;
import com.microservices.cms.project.domain.CmsProject;
import com.microservices.cms.project.mapper.CmsProjectMapper;
import com.microservices.cms.project.service.ICmsProjectService;
import com.microservices.cms.utils.CmsConstants;
import com.microservices.cms.utils.CmsGitLinkRequestUrl;
import com.microservices.common.core.constant.HttpStatus;
import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.enums.SystemRole;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.PinYinStringUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.datascope.annotation.DataScope;
import com.microservices.common.httpClient.domain.GitLinkRequestUrl;
import com.microservices.common.httpClient.util.GitLinkRequestHelper;
import com.microservices.system.api.RemoteDeptService;
import com.microservices.system.api.RemoteUserService;
@ -23,6 +25,7 @@ import com.microservices.system.api.domain.SysDept;
import com.microservices.system.api.domain.SysRole;
import com.microservices.system.api.domain.SysUser;
import com.microservices.system.api.utils.FeignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@ -37,6 +40,7 @@ import java.util.List;
* @author otto
* @date 2023-03-27
*/
@Slf4j
@Service
public class CmsProjectServiceImpl implements ICmsProjectService {
@Autowired
@ -228,6 +232,75 @@ public class CmsProjectServiceImpl implements ICmsProjectService {
return true;
}
@Override
public boolean initZoneCmsProjectByDept(Long deptId) {
boolean initResult = false;
CmsProject cmsProject = cmsProjectMapper.selectCmsProjectByDeptId(deptId);
if (cmsProject != null) {
JSONObject project = null;
try {
project = gitLinkRequestHelper.doGet(CmsGitLinkRequestUrl.GET_PROJECT_DETAIL(cmsProject.getUsername(), cmsProject.getIdentifier()));
} catch (ServiceException e) {
if (!e.getCode().equals(HttpStatus.NOT_FOUND)) {
throw new ServiceException(e.getCode(), e.getMessage());
}
}
if (project != null) {
throw new ServiceException("专区对应项目已存在,不能重复初始化");
} else {
Long organizationId = getOrganizationId();
// 创建专区对应项目
JSONObject jsonObject = new JSONObject();
jsonObject.put("user_id", organizationId);
jsonObject.put("name", cmsProject.getName());
jsonObject.put("repository_name", cmsProject.getIdentifier());
jsonObject.put("description", cmsProject.getDescription());
jsonObject.put("private", false);
//调用GitLink接口创建项目
JSONObject result = gitLinkRequestHelper.doPost(CmsGitLinkRequestUrl.CREATE_PROJECT(), jsonObject);
initResult = result != null && cmsProject.getIdentifier().equals(result.getString("identifier"));
}
} else {
Long projectId = insertZoneCmsProjectByDept(deptId);
if (projectId != null && projectId > 0) {
cmsProject = cmsProjectMapper.selectCmsProjectById(projectId);
initResult = true;
}
}
if (initResult) {
// 批量创建文章对应代码库文件
List<CmsDoc> cmsDocAndDirList = cmsDocService.selectCmsDocAndDirListByDept(deptId);
if (cmsDocAndDirList == null || cmsDocAndDirList.isEmpty()) {
return initResult;
}
JSONObject docCommitJson = new JSONObject();
docCommitJson.put("branch", CmsConstants.BRANCH_MASTER);
docCommitJson.put("message", "初始化专区文章对应代码库文件");
JSONArray docFiles = new JSONArray();
for (CmsDoc cmsDoc : cmsDocAndDirList) {
JSONObject docFile = new JSONObject();
docFile.put("action_type", "create");
docFile.put("content", "");
docFile.put("encoding", "text");
docFile.put("file_path", cmsDoc.getFilePath());
docFiles.add(docFile);
}
docCommitJson.put("files", docFiles);
JSONObject result = gitLinkRequestHelper.doPost(
CmsGitLinkRequestUrl.BATCH_COMMIT(cmsProject.getUsername(), cmsProject.getIdentifier())
, docCommitJson);
if (result == null) {
throw new ServiceException("专区对应项目初始化成功,但专区文章在项目中创建失败");
}
JSONArray resultContents = result.getJSONArray("contents");
for (int i = 0; i < resultContents.size(); i++) {
JSONObject contentJson = resultContents.getJSONObject(i);
cmsDocService.updateCmsDocShaByPathAndDeptId(contentJson.getString("sha"), contentJson.getString("path"), deptId);
}
}
return initResult;
}
private String handleSpecialCharacters(String name) {
return StringUtils.replace(name, " ", "-");
@ -242,6 +315,11 @@ public class CmsProjectServiceImpl implements ICmsProjectService {
return cmsProject;
}
@Override
public CmsProject selectCmsProjectByDeptIdAndNoException(Long deptId) {
return cmsProjectMapper.selectCmsProjectByDeptId(deptId);
}
@Override
public Boolean changeUserRole(Long userId, Long oldDeptId, Long newDeptId, Long oldRoleId, Long newRoleId) {
SysUser sysUser = FeignUtils.getReturnData(remoteUserService.getSysUserByUserId(userId, SecurityConstants.INNER));

View File

@ -1,4 +1,4 @@
package com.microservices.cms.common.service.impl;
package com.microservices.cms.service.impl;
import com.microservices.cms.common.service.ISysUserService;
import com.microservices.common.core.constant.SecurityConstants;

View File

@ -148,19 +148,19 @@ public class CmsGitLinkRequestUrl extends GitLinkRequestUrl {
);
}
public static GitLinkRequestUrl CREATE_PROTECTED_BRANCHES(String username, String identifier, Map<String,String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
public static GitLinkRequestUrl CREATE_PROTECTED_BRANCHES(String username, String identifier, Map<String, String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
String path = buildUri(String.format("/api/%s/%s/protected_branches.json", username, identifier), params);
path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames);
return getGitLinkRequestUrl(path);
}
public static GitLinkRequestUrl UPDATE_PROTECTED_BRANCHES(String username, String identifier, Map<String,String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
public static GitLinkRequestUrl UPDATE_PROTECTED_BRANCHES(String username, String identifier, Map<String, String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
String path = buildUri(String.format("/api/%s/%s/protected_branches/master.json", username, identifier), params);
path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames);
return getGitLinkRequestUrl(path);
}
public static GitLinkRequestUrl DELETE_PROTECTED_BRANCHES(String username, String identifier, Map<String,String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
public static GitLinkRequestUrl DELETE_PROTECTED_BRANCHES(String username, String identifier, Map<String, String> params, List<String> pushWhitelistUsernames) throws URISyntaxException {
String path = buildUri(String.format("/api/%s/%s/protected_branches/master.json", username, identifier), params);
path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames);
return getGitLinkRequestUrl(path);
@ -197,4 +197,12 @@ public class CmsGitLinkRequestUrl extends GitLinkRequestUrl {
public static String ZONE_DOC_URL(String gitlinkUrl, String zoneKey, Long docId) {
return EscapeUtil.removeExtraSlashOfUrl(String.format("%s/zone/%s/newdetail/%d", gitlinkUrl, zoneKey, docId));
}
public static GitLinkRequestUrl GET_PROJECT_DETAIL(String username, String identifier) {
return getAdminGitLinkRequestUrl(String.format("/api/%s/%s/detail.json", username, identifier));
}
public static GitLinkRequestUrl BATCH_COMMIT(String username, String identifier) {
return getAdminGitLinkRequestUrl(String.format("/api/v1/%s/%s/contents/batch.json", username, identifier));
}
}

View File

@ -0,0 +1,37 @@
package com.microservices.cms.utils;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.threadPool.ThreadPoolExecutorWrap;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池工厂
*
* @author OTTO
*/
public class CustomExecutorFactory {
/**
* 创建线程池
* 存在并发处理的情况设置核心线程为2设置有界队列长度为100最大线程数为10
* 当超出队列已满且达到最大线程数时抛出异常
* Ncpu=CPU数量
* Ucpu=目标CPU的使用率0<=Ucpu<=1
* W/C=任务等待时间与任务计算时间的比率
* Nthreads =Ncpu*Ucpu*(1+W/C)
*/
public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutorWrap(
5
, 10
, 10
, TimeUnit.SECONDS
, new ArrayBlockingQueue<>(100)
, Executors.defaultThreadFactory()
, (r, executor) -> {
throw new ServiceException("目前处理的人太多了,请稍后再试");
}
);
}

View File

@ -107,6 +107,50 @@
from cms_doc cd
</sql>
<sql id="selectCmsDocAliasSetDefaultHeadImgVo">
select cd.id,
cd.create_by,
cd.create_time,
cd.update_by,
cd.update_time,
cd.name,
cd.file_name,
cd.file_path,
cd.file_sha,
cd.file_size,
cd.file_url,
cd.html_url,
cd.visits,
cd.sort,
cd.publish_time,
cd.publish_user,
cd.publish_user_image,
cd.publish_user_url,
cd.publish_user_nickname,
cd.summary,
-- 处理文章和栏目头图为NULL或空字符串的情况
CASE
-- 文章头图不为空非NULL且非空字符串
WHEN cd.head_img IS NOT NULL AND TRIM(cd.head_img) != '' THEN cd.head_img
-- 栏目存在且头图不为空
WHEN dir.head_img IS NOT NULL AND TRIM(dir.head_img) != '' THEN dir.head_img
END AS head_img,
cd.dir_name,
cd.dept_id,
cd.issue_id,
cd.is_homepage,
cd.editor_type,
cd.keywords,
cd.is_dir
from cms_doc cd
left join cms_doc dir on cd.dir_name = dir.name and cd.dept_id = dir.dept_id
</sql>
<select id="selectCmsDocAndDirListByDept" resultMap="CmsDocResult">
<include refid="selectCmsDocVo"/>
where dept_id=#{deptId}
</select>
<select id="selectCmsDocList" parameterType="com.microservices.cms.doc.domain.CmsDocSearchVo"
resultMap="CmsDocResult">
<include refid="selectCmsDocVo"/>
@ -150,13 +194,13 @@
where file_path = #{filePath} and dept_id = #{deptId} and is_dir = 0
</select>
<select id="selectHotCmsDocList" parameterType="com.microservices.cms.doc.domain.CmsDoc" resultMap="CmsDocResult">
<include refid="selectCmsDocVo"/>
<include refid="selectListWhere"/>
<include refid="selectCmsDocAliasSetDefaultHeadImgVo"/>
<include refid="selectListWhereAlias"/>
ORDER BY
visits DESC,
sort DESC,
update_time DESC,
create_time DESC
cd.visits DESC,
cd.sort DESC,
cd.update_time DESC,
cd.create_time DESC
</select>
<select id="selectCmsDocCount" resultType="java.lang.Integer">
@ -180,6 +224,23 @@
</where>
</sql>
<sql id="selectListWhereAlias">
<where>
<if test="name != null and name != ''">and cd.name like concat('%', #{name}, '%')</if>
<if test="keywords != null and keywords != ''">and cd.keywords like concat('%', #{keywords}, '%')</if>
<if test="fileName != null and fileName != ''">and cd.file_name like concat('%', #{fileName}, '%')</if>
<if test="filePath != null and filePath != ''">and cd.file_path = #{filePath}</if>
<if test="publishTime != null ">and cd.publish_time = #{publishTime}</if>
<if test="isDir != null ">and cd.is_dir = #{isDir}</if>
<if test="dirName != null ">and cd.dir_name = #{dirName}</if>
<if test="deptId != null ">and cd.dept_id = #{deptId}</if>
<if test="isHomepage != null ">and cd.is_homepage = #{isHomepage}</if>
<if test="auditStatus != null and auditStatus != '-1' ">and cd.audit_status = #{auditStatus}</if>
<if test="auditStatus == null ">and cd.audit_status = '1'</if>
<if test="createBy != null and createBy != '' ">and cd.create_by = #{createBy}</if>
</where>
</sql>
<select id="selectCmsDocDirByDeptIdAndInName" resultMap="CmsDocResult">
<include refid="selectCmsDocVo"/>
where dept_id = #{deptId} and is_dir = 1
@ -283,6 +344,15 @@
from cms_doc
where dept_id = #{deptId};
</select>
<select id="selectCmsDocListSetDefaultHeadImg" parameterType="com.microservices.cms.doc.domain.CmsDocSearchVo"
resultMap="CmsDocResult">
<include refid="selectCmsDocAliasSetDefaultHeadImgVo"/>
<include refid="selectListWhereAlias"/>
ORDER BY
cd.sort DESC,
cd.update_time DESC,
cd.create_time DESC
</select>
<insert id="insertCmsDoc" parameterType="com.microservices.cms.doc.domain.CmsDoc" useGeneratedKeys="true"
keyProperty="id">
@ -405,6 +475,12 @@
and dept_id = #{deptId}
and is_dir = #{isDir};
</update>
<update id="updateCmsDocShaByPathAndDeptId">
update cms_doc
set file_sha=#{sha}
where file_path=#{filePath}
and dept_id=#{deptId}
</update>
<delete id="deleteCmsDocById" parameterType="Long">
delete

View File

@ -133,7 +133,7 @@
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.3.4</version>
<version>portable-1.8.4</version>
</dependency>
</dependencies>

View File

@ -59,8 +59,8 @@ public class AchievementsServiceImpl implements IAchievementsService {
@Autowired
private IBehaviorImageService behaviorImageService;
@Value("${markerSpaceUrl}")
public String markerSpaceUrl;
@Value("${makerSpaceUrl}")
public String makerSpaceUrl;
@Value("${http.gitLinkUrl}")
public String gitLinkUrl;
@ -217,7 +217,7 @@ public class AchievementsServiceImpl implements IAchievementsService {
}
if (Objects.equals(source, "2")) {
concatUrl(list, markerSpaceUrl);
concatUrl(list, makerSpaceUrl);
}
if (Objects.equals(source, "4")) {

View File

@ -377,6 +377,9 @@ public class TalentReferralService {
*/
public Object competitionExpertTalentReferral(Long competitionId) {
TaskVo task = talentReferralMapper.selectCompetitionById(competitionId);
if (task == null) {
return new ArrayList<>();
}
List<KeyValueVo> categories = new ArrayList<>();
List<TaskVo> completedTasks = talentReferralMapper.selectCompetitionIdByStatus();
List<ExpertVo> allExperts = talentReferralMapper.selectExpertsBy(new ExpertVo());

View File

@ -22,8 +22,8 @@ import static com.microservices.dms.constant.TaskConstant.MARKER_SPACE_DOWNLOAD_
public class TaskResourceLibraryService {
private final TaskResourceLibraryMapper taskResourceLibraryMapper;
@Value("${markerSpaceUrl}")
public String markerSpaceUrl;
@Value("${makerSpaceUrl}")
public String makerSpaceUrl;
public int addClick(Clicker click) {
click.setCreatedAt(DateUtils.getNowDate());
@ -104,7 +104,7 @@ public class TaskResourceLibraryService {
List<KeyValVo<String, String>> attachments = taskResourceLibraryMapper.getAttachments(l.getPaperId());
for (KeyValVo<String, String> a : attachments) {
Object v = a.getV();
a.setV(String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, markerSpaceUrl, v));
a.setV(String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, makerSpaceUrl, v));
}
l.setAttachmentList(attachments);
}

View File

@ -32,8 +32,8 @@ public class ExpertResourceLibraryServiceImpl implements IExpertResourceLibraryS
@Autowired
private ExpertResourceLibraryMapper expertResourceLibraryMapper;
@Value("${markerSpaceUrl}")
public String markerSpaceUrl;
@Value("${makerSpaceUrl}")
public String makerSpaceUrl;
/**
* 查询专家资源库
*
@ -77,7 +77,7 @@ public class ExpertResourceLibraryServiceImpl implements IExpertResourceLibraryS
private void buildFullUrl(Map<String, Object> map) {
if (map != null && map.containsKey("id") && map.get("id") != null) {
String id = map.get("id").toString();
map.put("url", String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, markerSpaceUrl, id));
map.put("url", String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, makerSpaceUrl, id));
}
}

View File

@ -140,24 +140,55 @@
</select>
<select id="selectActivityUserLibraryListAll" resultType="com.microservices.dms.behaviorImage.domain.ActivityUserLibrary" parameterType="com.microservices.dms.behaviorImage.domain.ActivityUserLibrary">
select res.userId,res.loginName,res.userName,res.isExpert,res.isAuth,res.relatedCompetition,res.relatedTask,res.p1+res.p2+res.p3 as "relatedProject" from (
select u.id as "userId",u.login as "loginName",u.nickname as "userName",u.is_expert as "isExpert",u.authentication as "isAuth",
(select count(1) as "value" from tasks where is_delete='0' and status between 3 and 8 and user_id =u.id) as "relatedTask",
(select count(1) from competition_infos ci inner join competition_users cu on ci.id = cu.competition_info_id where cu.user_id =u.id) as "relatedCompetition",
(SELECT count(1) as "pCount" FROM `projects` WHERE id != 0 AND user_id =u.id) as p1,
( SELECT count(1) as "pCount"
FROM `projects`
INNER JOIN `members` ON `members`.`project_id` = `projects`.`id`
WHERE `projects`.`id` != 0 AND `projects`.`user_id` !=u.id AND `members`.`user_id` =u.id) as p2,
(SELECT count(1) as "pCount"
FROM `projects`
INNER JOIN `team_projects` ON `team_projects`.`project_id` = `projects`.`id`
INNER JOIN `teams` ON `teams`.`id` = `team_projects`.`team_id`
INNER JOIN `team_users` ON `team_users`.`team_id` = `teams`.`id`
WHERE `projects`.`id` != 0 AND `team_users`.`user_id` =u.id) as p3
from users u) res
where (res.relatedCompetition >0 or res.relatedTask >0 or res.p1+res.p2+res.p3>0)
<if test="userName != null and userName != ''"> and res.userName like concat('%', #{userName}, '%')</if>
SELECT
u.id AS userId,
u.login AS loginName,
u.nickname AS userName,
u.is_expert AS isExpert,
u.authentication AS isAuth,
IFNULL(t.relatedTask, 0) AS relatedTask,
IFNULL(c.relatedCompetition, 0) AS relatedCompetition,
IFNULL(p1.p1,0) + IFNULL(p2.p2,0) + IFNULL(p3.p3,0) AS relatedProject
FROM users u
LEFT JOIN (
SELECT user_id, COUNT(*) AS relatedTask
FROM tasks
WHERE is_delete = '0' AND status BETWEEN 3 AND 8
GROUP BY user_id
) t ON u.id = t.user_id
LEFT JOIN (
SELECT cu.user_id, COUNT(*) AS relatedCompetition
FROM competition_users cu
INNER JOIN competition_infos ci ON ci.id = cu.competition_info_id
GROUP BY cu.user_id
) c ON u.id = c.user_id
LEFT JOIN (
SELECT user_id, COUNT(*) AS p1
FROM projects
GROUP BY user_id
) p1 ON u.id = p1.user_id
LEFT JOIN (
SELECT m.user_id, COUNT(*) AS p2
FROM members m
INNER JOIN projects p ON m.project_id = p.id AND p.user_id != m.user_id
GROUP BY m.user_id
) p2 ON u.id = p2.user_id
LEFT JOIN (
SELECT tu.user_id, COUNT(DISTINCT tp.project_id) AS p3
FROM team_users tu
INNER JOIN teams tm ON tu.team_id = tm.id
INNER JOIN team_projects tp ON tm.id = tp.team_id
INNER JOIN projects p ON tp.project_id = p.id
GROUP BY tu.user_id
) p3 ON u.id = p3.user_id
WHERE (
IFNULL(c.relatedCompetition, 0) > 0
OR IFNULL(t.relatedTask, 0) > 0
OR (IFNULL(p1.p1,0) + IFNULL(p2.p2,0) + IFNULL(p3.p3,0)) > 0
)
<if test="userName != null and userName != ''">
AND u.nickname like concat('%', #{userName}, '%')
</if>
</select>
<select id="getrelatedProjectCount" resultType="long">
@ -308,23 +339,47 @@
</select>
<select id="getActivityStatistic" resultType="com.microservices.dms.behaviorImage.domain.ActivityUserTotal">
select count(1) as "totalUser",sum(r.isExpert) as "totalExpert",sum(r.enterprise_certification+r.authentication) as "authTotal" from (
select res.userId,res.loginName,res.userName,res.isExpert,res.authentication,res.enterprise_certification,res.relatedCompetition,res.relatedTask,res.p1+res.p2+res.p3 as "relatedProject" from (
select u.id as "userId",u.login as "loginName",u.nickname as "userName",u.is_expert as "isExpert",u.authentication,u.enterprise_certification,
(select count(1) as "value" from tasks where is_delete='0' and status between 3 and 8 and user_id =u.id) as "relatedTask",
(select count(1) from competition_infos ci inner join competition_users cu on ci.id = cu.competition_info_id where cu.user_id =u.id) as "relatedCompetition",
(SELECT count(1) as "pCount" FROM `projects` WHERE id != 0 AND user_id =u.id) as p1,
( SELECT count(1) as "pCount"
FROM `projects` INNER JOIN `members` ON `members`.`project_id` = `projects`.`id`
WHERE `projects`.`id` != 0 AND `projects`.`user_id` !=u.id AND `members`.`user_id` =u.id) as p2,
(SELECT count(1) as "pCount"
FROM `projects`
INNER JOIN `team_projects` ON `team_projects`.`project_id` = `projects`.`id`
INNER JOIN `teams` ON `teams`.`id` = `team_projects`.`team_id`
INNER JOIN `team_users` ON `team_users`.`team_id` = `teams`.`id`
WHERE `projects`.`id` != 0 AND `team_users`.`user_id` =u.id) as p3
from users u) res
where res.relatedCompetition >0 or res.relatedTask >0 or res.p1+res.p2+res.p3>0 )r
SELECT
COUNT(*) AS totalUser,
SUM(u.is_expert) AS totalExpert,
SUM(u.authentication + u.enterprise_certification) AS authTotal
FROM users u
LEFT JOIN (
SELECT user_id, COUNT(*) AS relatedTask
FROM tasks
WHERE is_delete = '0' AND status BETWEEN 3 AND 8
GROUP BY user_id
) t ON u.id = t.user_id
LEFT JOIN (
SELECT cu.user_id, COUNT(*) AS relatedCompetition
FROM competition_users cu
INNER JOIN competition_infos ci ON ci.id = cu.competition_info_id
GROUP BY cu.user_id
) c ON u.id = c.user_id
LEFT JOIN (
SELECT user_id, COUNT(*) AS p1
FROM projects
GROUP BY user_id
) p1 ON u.id = p1.user_id
LEFT JOIN (
SELECT m.user_id, COUNT(*) AS p2
FROM members m
INNER JOIN projects p ON m.project_id = p.id AND p.user_id != m.user_id
GROUP BY m.user_id
) p2 ON u.id = p2.user_id
LEFT JOIN (
SELECT tu.user_id, COUNT(DISTINCT tp.project_id) AS p3
FROM team_users tu
INNER JOIN teams tm ON tu.team_id = tm.id
INNER JOIN team_projects tp ON tm.id = tp.team_id
INNER JOIN projects p ON tp.project_id = p.id
GROUP BY tu.user_id
) p3 ON u.id = p3.user_id
WHERE (
IFNULL(c.relatedCompetition, 0) > 0
OR IFNULL(t.relatedTask, 0) > 0
OR (IFNULL(p1.p1, 0) + IFNULL(p2.p2, 0) + IFNULL(p3.p3, 0)) > 0
)
</select>
<select id="getUserBehaviorSum" resultType="com.microservices.dms.behaviorImage.domain.UserTypeTotalVo">

View File

@ -26,6 +26,7 @@ import com.microservices.pms.utils.PmsConstants;
import com.microservices.pms.utils.PmsGitLinkRequestUrl;
import com.microservices.pms.utils.PmsUtils;
import com.microservices.system.api.RemoteFileService;
import com.microservices.system.api.domain.SimpleSysUser;
import com.microservices.system.api.domain.SysUser;
import com.microservices.system.api.utils.FeignUtils;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -476,7 +476,7 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl {
}
public static GitLinkRequestUrl GET_ORGANIZATION_PUBLIC_REPO_LIST(String enterpriseIdentifier, JSONObject projectSearchInputVo) throws URISyntaxException {
String path = String.format("/api/v1/organizations/%s/projects", enterpriseIdentifier);
String path = String.format("/api/v1/organizations/%s/projects.json", enterpriseIdentifier);
return getGitLinkRequestUrl(buildUri(path, projectSearchInputVo));
}

View File

@ -277,15 +277,16 @@ public class OpenController extends BaseController {
@ApiOperation("查询特色专区资源聚合列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "当前记录起始索引", paramType = "query", dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页显示记录数", paramType = "query", dataType = "Integer")
@ApiImplicitParam(name = "pageSize", value = "每页显示记录数", paramType = "query", dataType = "Integer"),
@ApiImplicitParam(name = "orderByColumn", value = "排序列更新时间updateTime创建时间createTime", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "isAsc", value = "排序的方向desc或者asc,默认asc", paramType = "query", dataType = "String")
})
public GenericsTableDataInfo<ZoneResourceDataVo> resourceList(
@ApiParam(name = "zoneId", value = "专区Id", required = true) @PathVariable("zoneId") Long zoneId
, ZoneResourceOpenSearchVo zoneResourceSearchVo) {
ZoneResource zoneResource = zoneResourceSearchVo.toZoneResource();
zoneResource.setZoneId(zoneId);
zoneResourceSearchVo.setZoneId(zoneId);
startPage();
return zoneResourceService.selectZoneResourceList(zoneResource);
return zoneResourceService.selectZoneResourceList(zoneResourceSearchVo);
}
/**

View File

@ -468,6 +468,11 @@ public class ZoneAsyncServiceImpl implements IZoneAsyncService {
List<ZoneProject> zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo);
for (ZoneProject zoneProject : zoneProjectList) {
setProjectGitlinkInfoCache(zoneProject);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
logger.error("初始化gitlink项目统计的定时任务延时被中断");
}
}
}
}

View File

@ -1,5 +1,6 @@
package com.microservices.zone.resource.domain;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.utils.bean.BeanUtils;
import com.microservices.zone.detail.domain.ZoneSort;
import com.microservices.zone.resource.domain.vo.ZoneResourceDataVo;
@ -86,6 +87,15 @@ public class ZoneResource extends ZoneSort {
*/
private ZoneResourceDomain zoneResourceDomain;
/**
* 资源标签
*/
@ApiModelProperty(value = "资源标签")
private String keywords;
@ApiModelProperty(value = "拓展数据")
private String extendData;
public ZoneResourceDataVo toZoneResourceDataVo() {
ZoneResourceDataVo target = new ZoneResourceDataVo();
BeanUtils.copyProperties(this, target);

View File

@ -19,7 +19,7 @@ public class ZoneResourceDomain extends ZoneSort {
@Excel(name = "资源领域名称")
private String name;
/**
* 资源领域名称
* 资源领域简介
*/
@Excel(name = "资源领域简介")
private String introduction;

View File

@ -23,6 +23,8 @@ public class ZoneResourceDataVo {
private String name;
@ApiModelProperty(value = "资源介绍")
private String introduction;
@ApiModelProperty(value = "资源标签")
private String keywords;
@ApiModelProperty(value = "资源领域Id")
private Long domainId;
@ApiModelProperty(value = "资源领域名称")
@ -71,4 +73,6 @@ public class ZoneResourceDataVo {
private Date auditTime;
@ApiModelProperty(value = "审核人")
private String auditBy;
@ApiModelProperty(value = "拓展数据")
private String extendData;
}

View File

@ -26,12 +26,17 @@ public class ZoneResourceInputVo {
@ApiModelProperty(value = "资源领域Id", required = true)
@NotNull
private Long domainId;
@ApiModelProperty(value = "资源标签")
private String keywords;
@ApiModelProperty(value = "资源文件Id列表")
private String fileIds;
@ApiModelProperty(value = "所属专区", required = true)
@NotNull
private Long zoneId;
@ApiModelProperty(value = "拓展数据")
private String extendData;
public ZoneResource toZoneResource() {
ZoneResource target = new ZoneResource();
BeanUtils.copyProperties(this, target);

View File

@ -1,6 +1,8 @@
package com.microservices.zone.resource.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.microservices.common.core.utils.bean.BeanUtils;
import com.microservices.common.core.web.domain.BaseEntity;
import com.microservices.zone.resource.domain.ZoneResource;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -11,7 +13,12 @@ import lombok.Data;
*/
@Data
@ApiModel("资源搜索对象")
public class ZoneResourceOpenSearchVo {
public class ZoneResourceOpenSearchVo extends BaseEntity {
@JsonIgnore
private Long zoneId;
@JsonIgnore
private Long deptId;
@ApiModelProperty(value = "资源名称")
private String name;
@ -34,6 +41,18 @@ public class ZoneResourceOpenSearchVo {
@ApiModelProperty(value = "是否首页展示0代表不展示 1代表展示")
private String isHomepage;
@ApiModelProperty(value = "资源标签")
private String keywords;
@ApiModelProperty(value = "排序列")
private String orderByColumn;
@ApiModelProperty(value = "排序的方向desc或者asc")
private String isAsc = "asc";
@ApiModelProperty(value = "是否根据下载次数降序排序与orderByColumn互斥该属性优先级更高")
private Boolean orderByDownloadCount = false;
public ZoneResource toZoneResource() {
ZoneResource target = new ZoneResource();
BeanUtils.copyProperties(this, target);

View File

@ -27,6 +27,8 @@ public class ZoneResourceUpdateVo {
private String summary;
@ApiModelProperty(value = "资源领域Id")
private Long domainId;
@ApiModelProperty(value = "资源标签")
private String keywords;
@ApiModelProperty(value = "资源文件Id列表")
private String fileIds;
@ApiModelProperty(value = "是否首页展示0代表不展示 1代表展示")
@ -36,6 +38,8 @@ public class ZoneResourceUpdateVo {
private String auditStatus = "1";
@ApiModelProperty(value = "备注", hidden = true)
private String remark;
@ApiModelProperty(value = "拓展数据")
private String extendData;
public ZoneResource toZoneResource() {
ZoneResource target = new ZoneResource();

View File

@ -1,6 +1,7 @@
package com.microservices.zone.resource.mapper;
import com.microservices.zone.resource.domain.ZoneResource;
import com.microservices.zone.resource.domain.vo.ZoneResourceOpenSearchVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -30,6 +31,8 @@ public interface ZoneResourceMapper {
*/
public List<ZoneResource> selectZoneResourceList(ZoneResource zoneResource);
List<ZoneResource> selectZoneResourceListBySearchVo(ZoneResourceOpenSearchVo zoneResourceOpenSearchVo);
/**
* 新增特色专区资源聚合
*

View File

@ -3,10 +3,7 @@ package com.microservices.zone.resource.service;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.system.api.domain.SysFileInfo;
import com.microservices.zone.resource.domain.ZoneResource;
import com.microservices.zone.resource.domain.vo.ZoneResourceAuditVo;
import com.microservices.zone.resource.domain.vo.ZoneResourceDataVo;
import com.microservices.zone.resource.domain.vo.ZoneResourceInputVo;
import com.microservices.zone.resource.domain.vo.ZoneResourceUpdateVo;
import com.microservices.zone.resource.domain.vo.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@ -34,6 +31,9 @@ public interface IZoneResourceService {
*/
public GenericsTableDataInfo<ZoneResourceDataVo> selectZoneResourceList(ZoneResource zoneResource);
GenericsTableDataInfo<ZoneResourceDataVo> selectZoneResourceList(ZoneResourceOpenSearchVo zoneResourceSearchVo);
/**
* 新增特色专区资源聚合
*

View File

@ -102,6 +102,13 @@ public class ZoneResourceServiceImpl implements IZoneResourceService {
return PageUtils.toPage(zoneResourceList, this::zoneResourceToData);
}
@Override
@DataScope(deptAlias = "zr")
public GenericsTableDataInfo<ZoneResourceDataVo> selectZoneResourceList(ZoneResourceOpenSearchVo zoneResourceSearchVo) {
List<ZoneResource> zoneResourceList = zoneResourceMapper.selectZoneResourceListBySearchVo(zoneResourceSearchVo);
return PageUtils.toPage(zoneResourceList, this::zoneResourceToData);
}
private ZoneResourceDataVo zoneResourceToData(ZoneResource zoneResource) {
ZoneResourceDataVo zoneResourceDataVo = zoneResource.toZoneResourceDataVo();
int downloadCount = 0;
@ -172,6 +179,7 @@ public class ZoneResourceServiceImpl implements IZoneResourceService {
zoneResource.setAuditStatus(ZoneConstants.RESOURCE_NOT_AUDIT);
}
zoneResource.setCreateTime(DateUtils.getNowDate());
zoneResource.setUpdateTime(DateUtils.getNowDate());
zoneResource.setCreateBy(SecurityUtils.getUsername());
zoneResource.setDeptId(zoneDetail.getDeptId());
Integer maxSort = zoneSortService.getMaxSort(zoneResourceInputVo.getZoneId(), ZoneResource.table_name);

View File

@ -25,6 +25,8 @@
<result property="auditBy" column="audit_by"/>
<result property="summary" column="summary"/>
<result property="remark" column="remark"/>
<result property="keywords" column="keywords"/>
<result property="extendData" column="extend_data"/>
<association property="zoneResourceDomain" column="domain_id"
javaType="com.microservices.zone.resource.domain.ZoneResourceDomain"
resultMap="domainResult"/>
@ -55,7 +57,9 @@
audit_by,
summary,
remark,
update_time
update_time,
keywords,
extend_data
from zone_resource
</sql>
@ -79,6 +83,8 @@
zr.audit_by,
zr.summary,
zr.remark,
zr.keywords,
zr.extend_data,
zrd.name as domain_name
from zone_resource zr
left join zone_resource_domain zrd on zr.domain_id = zrd.id
@ -105,6 +111,8 @@
zr.audit_by,
zr.summary,
zr.remark,
zr.keywords,
zr.extend_data,
zrd.name as domain_name
from zone_resource zr
left join zone_resource_domain zrd on zr.domain_id = zrd.id
@ -118,6 +126,7 @@
<if test="zoneId != null ">and zr.zone_id = #{zoneId}</if>
<if test="deptId != null ">and zr.dept_id = #{deptId}</if>
<if test="createBy != null and createBy != ''">and zr.create_by = #{createBy}</if>
<if test="keywords != null and keywords != ''">and zr.keywords like concat('%', #{keywords}, '%')</if>
<choose>
<when test="auditStatus != null and auditStatus !=''">
and zr.audit_status = #{auditStatus}
@ -134,11 +143,43 @@
ORDER BY zr.sort DESC
</where>
</sql>
<sql id="selectWhereBySearchVo">
<where>
<if test="name != null and name != ''">and zr.name like concat('%', #{name}, '%')</if>
<if test="domainId != null ">and zr.domain_id = #{domainId}</if>
<if test="isHomepage != null and isHomepage != ''">and zr.is_homepage = #{isHomepage}</if>
<if test="zoneId != null ">and zr.zone_id = #{zoneId}</if>
<if test="deptId != null ">and zr.dept_id = #{deptId}</if>
<if test="createBy != null and createBy != ''">and zr.create_by = #{createBy}</if>
<if test="keywords != null and keywords != ''">and zr.keywords like concat('%', #{keywords}, '%')</if>
<if test="searchTypeId != null ">
and zr.id in (select resource_id from zone_resource_to_type where type_id=#{searchTypeId})
</if>
<!-- 数据范围过滤 -->
${params.dataScope}
<choose>
<when test="orderByDownloadCount != null and orderByDownloadCount">
order by (select sum(download_count) from sys_file_info sf where FIND_IN_SET(sf.file_id,zr.file_ids)) desc
</when>
<when test="orderByDownloadCount = null and orderByColumn = null and orderByColumn =''">
order by zr.sort DESC
</when>
</choose>
</where>
</sql>
<select id="selectZoneResourceList" parameterType="ZoneResource" resultMap="ZoneResourceResult">
<include refid="selectZoneResourceAliasVo"/>
<include refid="selectWhere"/>
</select>
<select id="selectZoneResourceListBySearchVo"
resultMap="ZoneResourceResult">
<include refid="selectZoneResourceAliasVo"/>
<include refid="selectWhereBySearchVo"/>
</select>
<select id="selectZoneResourceById" parameterType="Long" resultMap="ZoneResourceResult">
<include refid="selectZoneResourceAndIntroductionAliasVo"/>
where zr.id = #{id}
@ -180,6 +221,8 @@
<if test="auditTime != null">audit_time,</if>
<if test="auditBy != null">audit_by,</if>
<if test="remark != null">remark,</if>
<if test="keywords != null">keywords,</if>
<if test="extendData != null">extend_data,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null">#{name},</if>
@ -201,6 +244,8 @@
<if test="auditTime != null">#{auditTime},</if>
<if test="auditBy != null">#{auditBy},</if>
<if test="remark != null">#{remark},</if>
<if test="keywords != null">#{keywords},</if>
<if test="extendData != null">#{extendData},</if>
</trim>
</insert>
@ -225,6 +270,8 @@
<if test="remark != null">remark = #{remark},</if>
<if test="auditTime != null">audit_time = #{auditTime},</if>
<if test="auditBy != null">audit_by = #{auditBy},</if>
<if test="keywords != null">keywords = #{keywords},</if>
<if test="extendData != null">extend_data = #{extendData},</if>
</trim>
where id = #{id}
</update>