From 426ea624ef099aa7a4682b04c3e2ca2809159beb Mon Sep 17 00:00:00 2001 From: otto <731554297@qq.com> Date: Tue, 19 Sep 2023 14:51:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E3=80=90=E4=B8=93=E5=8C=BA=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E3=80=91=E9=9C=80=E8=A6=81=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E6=A0=8F=E7=9B=AE=E5=90=8D=E7=A7=B0=20=E6=9B=B4=E6=94=B9):=20?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E6=A0=8F=E7=9B=AE=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=BC=82=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新增sql:专区新增资讯锁定状态字段 2、新增远程接口:通过组织id锁定/解锁专区资讯 3、异步修改文章栏目时锁定专区资讯 4、操作专区资讯及资讯栏目时检查专区资讯是否处于锁定1状态,若处于锁定状态则抛出异常 --- .../ruoyi/system/api/RemoteZoneService.java | 13 +++++++++ .../factory/RemoteZoneFallbackFactory.java | 5 ++++ .../doc/service/impl/CmsAsyncServiceImpl.java | 9 ++++++ .../doc/service/impl/CmsDocServiceImpl.java | 28 ++++++++++++++++--- .../controller/ZoneDetailController.java | 12 ++++++++ .../ruoyi/zone/detail/domain/ZoneDetail.java | 7 +++++ .../detail/domain/vo/ZoneDetailUpdateVo.java | 6 ++++ .../detail/service/IZoneDetailService.java | 9 ++++++ .../service/impl/ZoneDetailServiceImpl.java | 9 ++++++ .../mapper/zone/ZoneDetailMapper.xml | 6 ++++ ...9144707_alert_zone_detail_add_lock_cms.sql | 7 +++++ 11 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 sql/update/20230919144707_alert_zone_detail_add_lock_cms.sql diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteZoneService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteZoneService.java index c3fc448f3..25741ab82 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteZoneService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteZoneService.java @@ -80,4 +80,17 @@ public interface RemoteZoneService { @DeleteMapping("/zoneDetail/{deptName}") public R deleteByDeptName(@PathVariable(value = "deptName") String deptName , @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 通过组织id锁定/解锁专区资讯(0:未锁定,1:锁定) + * + * @param deptId 组织Id + * @param lockStatus 锁定状态(0:未锁定,1:锁定) + * @param source 来源 + * @return 结果 + */ + @PutMapping("/zoneDetail/{deptId}/lockCms/{lockStatus}") + public R lockCmsByDeptId(@PathVariable(value = "deptId") Long deptId + , @PathVariable(value = "lockStatus") Integer lockStatus + , @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteZoneFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteZoneFallbackFactory.java index ef12b0081..e749d53b9 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteZoneFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteZoneFallbackFactory.java @@ -51,6 +51,11 @@ public class RemoteZoneFallbackFactory implements FallbackFactory deleteByDeptName(String deptName, String source) { return R.fail("通过组织名称删除特色专区失败:" + throwable.getMessage()); } + + @Override + public R lockCmsByDeptId(Long deptId, Integer lockStatus, String source) { + return R.fail("通过组织id锁定/解锁专区资讯失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsAsyncServiceImpl.java b/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsAsyncServiceImpl.java index bd6b4520a..63f895e19 100644 --- a/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsAsyncServiceImpl.java +++ b/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsAsyncServiceImpl.java @@ -29,6 +29,7 @@ import com.ruoyi.common.httpClient.util.GitLinkRequestHelper; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.RemoteDeptService; +import com.ruoyi.system.api.RemoteZoneService; import com.ruoyi.system.api.utils.FeginUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,6 +104,10 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } } } + + @Autowired + private RemoteZoneService remoteZoneService; + @Async @Override public void asyncUpdateDoc(EntryDto entryDto, CmsDoc cmsDoc) { @@ -851,6 +856,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { @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, ""); @@ -861,7 +867,10 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { //删除旧栏目 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); } } diff --git a/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsDocServiceImpl.java b/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsDocServiceImpl.java index d05edfbe4..b86a3df08 100644 --- a/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsDocServiceImpl.java +++ b/ruoyi-modules/ruoyi-cms/src/main/java/com/ruoyi/cms/doc/service/impl/CmsDocServiceImpl.java @@ -162,6 +162,7 @@ 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); updateCmsCommonDatabase(oldCmsDir, CmsConstants.BRANCH_MASTER); @@ -259,6 +260,20 @@ public class CmsDocServiceImpl implements ICmsDocService { return cmsDocList.stream().map(x -> x.copyToCmsDocBaseDto()).collect(Collectors.toList()); } + /** + * 检查专区资讯是否处于锁定状态,若处于则抛出异常 + * + * @param deptId + */ + private void checkCmsLockStatus(Long deptId) { + JSONObject zoneJson = this.getZoneJSONByDeptId(deptId); + String isLock = zoneJson.getString("isLockCms"); + if (CmsConstants.TRUE.equals(isLock)) { + String name = zoneJson.getString("name"); + throw new ServiceException("当前专区资讯处于锁定状态,不允许修改(专区名称[%s])", name); + } + } + /** * 新增文章信息 * @@ -271,16 +286,19 @@ public class CmsDocServiceImpl implements ICmsDocService { public boolean insertCmsDoc(Long dirId, CmsDocInputDto cmsDocInputDto) { //通过SHA获取栏目 CmsDoc dirDoc = selectCmsDir(dirId); + checkCmsLockStatus(dirDoc.getDeptId()); CmsDoc cmsDoc = cmsDocInputDto.toCmsDoc(dirDoc); if (isNoAuditRequired(dirDoc.getDeptId()) || isCurrentUserZoneAdmin(dirDoc.getDeptId())) { - cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_PASS.getAuditCode()); //文章自动置为审核通过状态值 + //文章自动置为审核通过状态值 + cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_PASS.getAuditCode()); return insertCommonCmsDoc(cmsDoc, "创建文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), 100, "..."), cmsDocInputDto.getContent()); } else { //创建临时分支,创建文件,创建PR - cmsDoc.setAuditStatus(DocAuditStatus.TO_BE_AUDIT.getAuditCode()); //文章待审核状态值 + //文章待审核状态值 + cmsDoc.setAuditStatus(DocAuditStatus.TO_BE_AUDIT.getAuditCode()); cmsDoc.setAuditType(DocAndZoneOperation.OPERATION_CREATE.getOperationCode()); return insertCmsDocWithAudit(cmsDoc, "创建文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), 100, "..."), @@ -331,6 +349,7 @@ public class CmsDocServiceImpl implements ICmsDocService { @Override public boolean auditCmsDoc(Long docId, CmsDocAuditVo cmsDocAuditVo) { CmsDoc cmsDoc = cmsDocMapper.selectCmsDocById(docId); + checkCmsLockStatus(cmsDoc.getDeptId()); CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId()); if (cmsDocAuditVo.getPass() == 1) { //同意合并请求 @@ -422,7 +441,6 @@ public class CmsDocServiceImpl implements ICmsDocService { @Transactional(rollbackFor = Exception.class) public void handleUpdatedCmsDocWithPass(CmsProject cmsProject, CmsDoc cmsDoc) { - Long newDocId = cmsDoc.getId(); //同步更新人、发布人、发布人用户主页链接、发布人头像等信息 cmsAsyncService.updateCmsPublishDataByGitLink(cmsProject, cmsDoc, CmsConstants.BRANCH_MASTER); @@ -444,7 +462,6 @@ public class CmsDocServiceImpl implements ICmsDocService { @Transactional(rollbackFor = Exception.class) public void handleCreatedCmsDocWithPass(CmsProject cmsProject, CmsDoc cmsDoc) { - //同步更新人、发布人、发布人用户主页链接、发布人头像等信息 cmsAsyncService.updateCmsPublishDataByGitLink(cmsProject, cmsDoc, CmsConstants.BRANCH_MASTER); cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_PASS.getAuditCode()); @@ -616,6 +633,7 @@ public class CmsDocServiceImpl implements ICmsDocService { @Override public boolean updateCmsDoc(Long id, CmsDocDto cmsDocDto) { CmsDoc oldCmsDoc = cmsDocMapper.selectCmsDocById(id); + checkCmsLockStatus(oldCmsDoc.getDeptId()); //用户为专区管理员或专区无审核机制时,直接更新文章及仓库主分支 if (isCurrentUserZoneAdmin(oldCmsDoc.getDeptId()) || isNoAuditRequired(oldCmsDoc.getDeptId())) { //专区管理员重新编辑并提交审核未通过文章 或 重新编辑并提交待审核文章时专区不需审核机制 @@ -741,6 +759,7 @@ public class CmsDocServiceImpl implements ICmsDocService { @Override @Transactional(rollbackFor = Exception.class) public boolean insertCmsDocDir(Long deptId, CmsDir cmsDir) { + checkCmsLockStatus(deptId); CmsDoc cmsDoc = new CmsDoc(); cmsDoc.setIsDir(true); cmsDoc.setFilePath(cmsDoc.getDirPath(cmsDir.getName())); @@ -1115,6 +1134,7 @@ public class CmsDocServiceImpl implements ICmsDocService { if (cmsDoc == null) { throw new ServiceException("该文章不存在(文章Id[" + id + "])"); } + checkCmsLockStatus(cmsDoc.getDeptId()); //2、获取专区项目 CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId()); diff --git a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/controller/ZoneDetailController.java b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/controller/ZoneDetailController.java index 2534ab191..3c7091a59 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/controller/ZoneDetailController.java +++ b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/controller/ZoneDetailController.java @@ -144,4 +144,16 @@ public class ZoneDetailController extends BaseController { public R deleteByDeptId(@PathVariable(value = "deptName") String deptName) { return R.ok(zoneDetailService.deleteZoneDetailByDeptName(deptName) > 0); } + + /** + * 通过组织id锁定/解锁专区资讯 + */ + @InnerAuth + @Log(title = "锁定专区资讯", businessType = BusinessType.UPDATE) + @PutMapping("/{deptId}/lockCms/{lockStatus}") + @ApiOperation(value = "通过组织id锁定/解锁专区资讯(0:未锁定,1:锁定)", hidden = true) + public R lockCmsByDeptId(@PathVariable(value = "deptId") Long deptId + , @PathVariable(value = "lockStatus") Integer lockStatus) { + return R.ok(zoneDetailService.lockCmsByDeptId(deptId, lockStatus) > 0); + } } diff --git a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/ZoneDetail.java b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/ZoneDetail.java index 98119c050..4568aef2d 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/ZoneDetail.java +++ b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/ZoneDetail.java @@ -179,6 +179,13 @@ public class ZoneDetail extends BaseEntity { private Integer resourceNeedAudit; + /** + * 资讯是否锁定中(0:未锁定,1:锁定) + */ + @ApiModelProperty(value = "资讯是否锁定中(0:未锁定,1:锁定)") + private Integer isLockCms; + + public ZoneDetailDataVo toZoneDetailDataVo() { ZoneDetailDataVo target = new ZoneDetailDataVo(); BeanUtils.copyProperties(this, target); diff --git a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/vo/ZoneDetailUpdateVo.java b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/vo/ZoneDetailUpdateVo.java index 429f67ec9..177a65b5d 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/vo/ZoneDetailUpdateVo.java +++ b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/domain/vo/ZoneDetailUpdateVo.java @@ -111,6 +111,12 @@ public class ZoneDetailUpdateVo { @ApiModelProperty(value = "资源是否需要审核(0:不需要审核,1:需要审核)") private Integer resourceNeedAudit; + /** + * 资讯是否锁定中(0:未锁定,1:锁定) + */ + @ApiModelProperty(value = "资讯是否锁定中(0:未锁定,1:锁定)", hidden = true) + private Integer isLockCms; + public ZoneDetail toZoneDetail() { ZoneDetail target = new ZoneDetail(); BeanUtils.copyProperties(this, target); diff --git a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/IZoneDetailService.java b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/IZoneDetailService.java index 537be32b2..8049e6179 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/IZoneDetailService.java +++ b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/IZoneDetailService.java @@ -161,4 +161,13 @@ public interface IZoneDetailService { String getZoneJSONByDeptId(Long deptId); ZoneFrontRoleVo checkCurrentRoleInZone(Long zoneId); + + /** + * 通过组织id锁定/解锁专区资讯 + * + * @param deptId + * @param lockStatus + * @return + */ + int lockCmsByDeptId(Long deptId, Integer lockStatus); } diff --git a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/impl/ZoneDetailServiceImpl.java b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/impl/ZoneDetailServiceImpl.java index 9392ec4f5..62c032ee1 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/impl/ZoneDetailServiceImpl.java +++ b/ruoyi-modules/ruoyi-zone/src/main/java/com/ruoyi/zone/detail/service/impl/ZoneDetailServiceImpl.java @@ -514,6 +514,15 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { return zoneFrontRoleVo; } + @Override + public int lockCmsByDeptId(Long deptId, Integer lockStatus) { + ZoneDetail zoneDetail = zoneDetailMapper.selectZoneDetailByDeptId(deptId); + ZoneDetailUpdateVo zoneDetailUpdateVo = new ZoneDetailUpdateVo(); + zoneDetailUpdateVo.setId(zoneDetail.getId()); + zoneDetailUpdateVo.setIsLockCms(lockStatus); + return updateZoneDetail(zoneDetailUpdateVo); + } + /** * 通过组织Id查找特色专区,不存在时抛出异常 * diff --git a/ruoyi-modules/ruoyi-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml b/ruoyi-modules/ruoyi-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml index 2c0999895..f720c3e95 100644 --- a/ruoyi-modules/ruoyi-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml +++ b/ruoyi-modules/ruoyi-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml @@ -40,6 +40,7 @@ + @@ -76,6 +77,7 @@ homepage_member_title, homepage_partners_title, template, + is_lock_cms, resource_need_audit, doc_need_audit from zone_detail @@ -115,6 +117,7 @@ z.homepage_member_title, z.homepage_partners_title, z.template, + z.is_lock_cms, z.resource_need_audit, z.doc_need_audit from zone_detail as z @@ -191,6 +194,7 @@ helper_show, doc_need_audit, resource_need_audit, + is_lock_cms, #{name}, @@ -226,6 +230,7 @@ #{helperShow}, #{docNeedAudit}, #{resourceNeedAudit}, + #{isLockCms}, @@ -266,6 +271,7 @@ helper_title = #{helperTitle}, doc_need_audit = #{docNeedAudit}, resource_need_audit = #{resourceNeedAudit}, + is_lock_cms = #{isLockCms}, where id = #{id} diff --git a/sql/update/20230919144707_alert_zone_detail_add_lock_cms.sql b/sql/update/20230919144707_alert_zone_detail_add_lock_cms.sql new file mode 100644 index 000000000..8d664201f --- /dev/null +++ b/sql/update/20230919144707_alert_zone_detail_add_lock_cms.sql @@ -0,0 +1,7 @@ +-- 专区新增资讯锁定状态字段 +SET FOREIGN_KEY_CHECKS = 0; + +ALTER TABLE `zone_detail` + ADD COLUMN `is_lock_cms` tinyint(1) NULL DEFAULT 0 COMMENT '资讯是否锁定中(0:未锁定,1:锁定)'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file