From 940310978b434994aced6b6220e904daeb1804c0 Mon Sep 17 00:00:00 2001 From: YBP Date: Sat, 28 Feb 2026 15:53:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=AE=B0=E5=BD=95=E5=88=86?= =?UTF-8?q?=E7=B1=BB-=E6=B7=BB=E5=8A=A0=E7=AE=A1=E7=90=86=E5=91=98-?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordapply/vo/RecordApplyPageReqVO.java | 5 +- .../recordapply/vo/RecordApplyRespVO.java | 6 +- .../recordapply/vo/RecordApplySaveReqVO.java | 7 +- .../RecordCategoryController.java | 5 +- .../recordrecord/RecordRecordController.java | 13 + .../vo/RecordRecordPageReqVO.java | 14 ++ .../recordrecord/vo/RecordRecordRespVO.java | 26 ++ .../vo/RecordRecordSaveReqVO.java | 13 + .../dataobject/recordapply/RecordApplyDO.java | 9 +- .../recordcategory/RecordCategoryDO.java | 2 +- .../recordrecord/RecordRecordDO.java | 29 +++ .../RecordCategoryServiceImpl.java | 15 +- .../recordrecord/RecordRecordService.java | 3 + .../recordrecord/RecordRecordServiceImpl.java | 226 +++++++++++++++--- 14 files changed, 324 insertions(+), 49 deletions(-) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyPageReqVO.java index 082036c6..b80f2bbd 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyPageReqVO.java @@ -26,7 +26,10 @@ public class RecordApplyPageReqVO extends PageParam { private String applyUserName; @Schema(description = "部门id") - private Long departmentCode; + private Long departmentId; + + @Schema(description = "部门名称", example = "研发部") + private String departmentName; @Schema(description = "评审范围") private String reviewRange; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java index c3e0dd2a..1086c268 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java @@ -34,7 +34,11 @@ public class RecordApplyRespVO { @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("部门id") - private Long departmentCode; + private Long departmentId; + + @Schema(description = "部门名称", example = "研发部") + @ExcelProperty("部门名称") + private String departmentName; @Schema(description = "评审范围") @ExcelProperty("评审范围") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java index 4dc041e6..77de6b06 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -32,7 +33,11 @@ public class RecordApplySaveReqVO { @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "部门id不能为空") - private Long departmentCode; + private Long departmentId; + + @Schema(description = "部门名称", example = "研发部") + @ExcelProperty("部门名称") + private String departmentName; @Schema(description = "评审范围") private String reviewRange; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordcategory/RecordCategoryController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordcategory/RecordCategoryController.java index 6b61ed3f..f1b7440c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordcategory/RecordCategoryController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordcategory/RecordCategoryController.java @@ -6,6 +6,7 @@ import com.zt.plat.module.qms.resource.record.controller.admin.recordcategory.vo import com.zt.plat.module.qms.resource.record.controller.admin.recordcategory.vo.RecordCategorySaveReqVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -62,8 +63,8 @@ public class RecordCategoryController extends AbstractFileUploadController imple @Operation(summary = "创建文件记录分类") //@PreAuthorize("@ss.hasPermission('qms:record-category:create')") public CommonResult createRecordCategory(@Valid @RequestBody RecordCategorySaveReqVO createReqVO) { - createReqVO.setParentId(0L); - createReqVO.setSortNo(1); + if (ObjectUtils.isEmpty(createReqVO.getParentId()))createReqVO.setParentId(0L); + if (ObjectUtils.isEmpty(createReqVO.getSortNo()))createReqVO.setSortNo(1); return success(recordCategoryService.createRecordCategory(createReqVO)); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java index 51ef42ec..46f673df 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java @@ -3,9 +3,12 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordrecord; import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore; import com.zt.plat.module.qms.common.service.BusinessFileService; import com.zt.plat.module.qms.resource.clientManage.controller.vo.VersionManagementRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionPageReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordSaveReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordpermission.RecordPermissionDO; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -133,6 +136,16 @@ public class RecordRecordController extends AbstractFileUploadController impleme return success(BeanUtils.toBean(pageResult, RecordRecordRespVO.class)); } + @GetMapping("/getMatchedPermissionList") + @Operation(summary = "获得记录权限列表") + //@PreAuthorize("@ss.hasPermission('qms:record-permission:query')") + public CommonResult> getMatchedPermissionList(@Valid RecordPermissionPageReqVO pageReqVO) { + Long sourceId = pageReqVO.getSourceId(); + if (sourceId == null) return success(null); + List matchedPermissionList = recordRecordService.getMatchedPermissionList(sourceId); + return success(BeanUtils.toBean(matchedPermissionList, RecordPermissionRespVO.class)); + } + @GetMapping("/export-excel") @Operation(summary = "导出文件、模板、记录 Excel") //@PreAuthorize("@ss.hasPermission('qms:record-record:export')") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java index c4c8573d..47efe649 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.*; import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; @@ -19,6 +20,15 @@ public class RecordRecordPageReqVO extends PageParam { @Schema(description = "文件编号") private String code; + @Schema(description = "业务类型") + private String businessType; + + @Schema(description = "部门IDS") + private String departmentIds; + + @Schema(description = "用户IDS") + private String userIds; + @Schema(description = "表单key") private String formKey; @@ -54,6 +64,10 @@ public class RecordRecordPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] expirationDate; + @Schema(description = "生效日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] effectiveDate; + @Schema(description = "过期标识,0-有效,1-过期", example = "1") private Integer expirationStatus; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java index de99db4f..80422027 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; import com.zt.plat.module.qms.core.aspect.annotation.Dict; @@ -14,6 +15,8 @@ import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; +import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + @Schema(description = "管理后台 - 文件、模板、记录 Response VO") @Data @ExcelIgnoreUnannotated @@ -31,6 +34,18 @@ public class RecordRecordRespVO { @ExcelProperty("文件编号") private String code; + @Schema(description = "业务类型") + @ExcelProperty("业务类型") + private String businessType; + + @Schema(description = "部门IDS") + @ExcelProperty("部门IDS") + private String departmentIds; + + @Schema(description = "用户IDS") + @ExcelProperty("用户IDS") + private String userIds; + @Schema(description = "表单key") @ExcelProperty("表单key") private String formKey; @@ -78,6 +93,10 @@ public class RecordRecordRespVO { @ExcelProperty("过期日期") private LocalDateTime expirationDate; + @Schema(description = "生效日期") + @ExcelProperty("生效日期") + private LocalDateTime effectiveDate; + @Schema(description = "过期标识,0-有效,1-过期", example = "1") @ExcelProperty("过期标识,0-有效,1-过期") @Dict(dicCode = "yes_or_no") @@ -132,4 +151,11 @@ public class RecordRecordRespVO { @Schema(description = "附件对象") private CommonResult> businessFileRet; + /** + * 所属分类的自定义配置(由 RecordCategoryDO.customConfig 解析而来) + */ + @Schema(description = "所属分类的自定义配置") + private Object customConfig; + + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java index e5d6d1aa..d0fbda84 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo; +import com.alibaba.excel.annotation.ExcelProperty; import com.zt.plat.module.qms.resource.clientManage.controller.vo.UploadFileVo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; @@ -24,6 +25,15 @@ public class RecordRecordSaveReqVO { @NotEmpty(message = "文件编号不能为空") private String code; + @Schema(description = "业务类型") + private String businessType; + + @Schema(description = "部门IDS") + private String departmentIds; + + @Schema(description = "用户IDS") + private String userIds; + @Schema(description = "表单key") private String formKey; @@ -60,6 +70,9 @@ public class RecordRecordSaveReqVO { @Schema(description = "过期日期") private LocalDateTime expirationDate; + @Schema(description = "生效日期") + private LocalDateTime effectiveDate; + @Schema(description = "过期标识,0-有效,1-过期", example = "1") private Integer expirationStatus; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java index b360bb6e..c2085331 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java @@ -56,8 +56,13 @@ public class RecordApplyDO extends BusinessBaseDO { /** * 部门id */ - @TableField("DEPT_CD") - private Long departmentCode; + @TableField("APL_DEPT_ID") + private Long applyDepartmentCode; + /** + * 部门名称 + */ + @TableField("APL_DEPT_NAME") + private Long applyDepartmentName; /** * 评审范围 */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordcategory/RecordCategoryDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordcategory/RecordCategoryDO.java index 63fdaaad..cac26108 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordcategory/RecordCategoryDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordcategory/RecordCategoryDO.java @@ -70,7 +70,7 @@ public class RecordCategoryDO extends BusinessBaseDO { * 自定义配置 */ @TableField("CST_CFG") - private Integer customConfig; + private String customConfig; /** * 数据来源,手工录入、手工归档、自动采集 */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java index ce6c34fb..d54ed869 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java @@ -44,6 +44,21 @@ public class RecordRecordDO extends BusinessBaseDO { @TableField("CD") private String code; /** + * 业务类型 + */ + @TableField("BSN_TP") + private String businessType; + /** + * 部门IDS + */ + @TableField("DEPT_IDS") + private String departmentIds; + /** + * 用户IDS + */ + @TableField("USER_IDS") + private String userIds; + /** * 表单key */ @TableField("FORM_KY") @@ -99,6 +114,11 @@ public class RecordRecordDO extends BusinessBaseDO { @TableField("EXPR_DT") private LocalDateTime expirationDate; /** + * 生效日期 + */ + @TableField("EFCT_DT") + private LocalDateTime effectiveDate; + /** * 过期标识,0-有效,1-过期 */ @TableField("EXPR_STS") @@ -157,4 +177,13 @@ public class RecordRecordDO extends BusinessBaseDO { @TableField(exist = false) private String newVersion; + +// ================临时文件=================> + + /** + * 所属分类的自定义配置(由 RecordCategoryDO.customConfig 解析而来) + */ + @TableField(exist = false) + private Object customConfig; + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordcategory/RecordCategoryServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordcategory/RecordCategoryServiceImpl.java index 537ee26d..e2607399 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordcategory/RecordCategoryServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordcategory/RecordCategoryServiceImpl.java @@ -70,12 +70,12 @@ public class RecordCategoryServiceImpl implements RecordCategoryService { @Override public RecordCategoryRespVO createRecordCategory(RecordCategorySaveReqVO createReqVO) { // 目录名称不能重复 - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(RecordCategoryDO::getName, createReqVO.getName()); - List list = recordCategoryMapper.selectList(queryWrapper); - if (CollUtil.isNotEmpty(list)) { - throw exception(RECORD_CATEGORY_NAME_EXISTS); - } +// LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); +// queryWrapper.eq(RecordCategoryDO::getName, createReqVO.getName()); +// List list = recordCategoryMapper.selectList(queryWrapper); +// if (CollUtil.isNotEmpty(list)) { +// throw exception(RECORD_CATEGORY_NAME_EXISTS); +// } // 插入 RecordCategoryDO recordCategory = BeanUtils.toBean(createReqVO, RecordCategoryDO.class); int insert = recordCategoryMapper.insert(recordCategory); @@ -349,6 +349,9 @@ public class RecordCategoryServiceImpl implements RecordCategoryService { queryWrapper.orderByAsc(RecordCategoryDO::getSortNo); // 升序 String name = pageReqVO.getName(); if (!ObjectUtils.isEmpty(name)) queryWrapper.eq(RecordCategoryDO::getName, name); + // 需要过滤name=null和""的情况 + queryWrapper.isNotNull(RecordCategoryDO::getName); // 排除 name 为 NULL 的数据 + queryWrapper.ne(RecordCategoryDO::getName, ""); // 排除 name 为空字符串的数据 return recordCategoryMapper.selectList(queryWrapper); } // public List getRecordCategoryTree(RecordCategoryPageReqVO pageReqVO) { diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java index ac6aa055..ad91db3d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java @@ -6,6 +6,7 @@ import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordSaveReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordpermission.RecordPermissionDO; import jakarta.validation.*; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO; import com.zt.plat.framework.common.pojo.PageResult; @@ -67,4 +68,6 @@ public interface RecordRecordService { PageResult getRecordHistoryPage(RecordRecordPageReqVO pageReqVO); CommonResult justRecordPermission(Long recordId); + + List getMatchedPermissionList(Long parentCategoryId); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java index 61337baf..f78be7b2 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java @@ -14,6 +14,7 @@ import com.zt.plat.module.qms.common.dic.service.DictionaryBusinessService; import com.zt.plat.module.qms.common.service.BusinessFileService; import com.zt.plat.module.qms.resource.clientManage.controller.vo.UploadFileVo; import com.zt.plat.module.qms.resource.record.constant.RecordConstants; +import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordSaveReqVO; @@ -25,7 +26,10 @@ import com.zt.plat.module.qms.resource.record.service.recordpermission.RecordPer import com.zt.plat.module.system.api.dept.DeptApi; import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; import com.zt.plat.module.system.api.permission.PermissionApi; + import java.util.Set; + +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -119,9 +123,9 @@ public class RecordRecordServiceImpl implements RecordRecordService { recordRecordDO.setCurrentFlag(0); try { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(RecordRecordDO::getMainId,recordRecordDO.getMainId()); // 所以main_id 和 current_flag = 1 的数据 - lambdaQueryWrapper.eq(RecordRecordDO::getCurrentFlag,1); // 0,旧版本 - recordRecordMapper.update(recordRecordDO,lambdaQueryWrapper); + lambdaQueryWrapper.eq(RecordRecordDO::getMainId, recordRecordDO.getMainId()); // 所以main_id 和 current_flag = 1 的数据 + lambdaQueryWrapper.eq(RecordRecordDO::getCurrentFlag, 1); // 0,旧版本 + recordRecordMapper.update(recordRecordDO, lambdaQueryWrapper); //创建新版本 recordRecordDO.setId(null); @@ -145,7 +149,7 @@ public class RecordRecordServiceImpl implements RecordRecordService { String newVersion = updateObj.getNewVersion();// 新版本 if (ObjectUtils.isEmpty(newVersion)) { // 不是新版本,直接更新 recordRecordMapper.updateById(updateObj); - }else {// 新版本 + } else {// 新版本 // 是否回收 Integer collectionFlag = updateReqVO.getCollectionFlag(); if (collectionFlag != null) { // 不为null, 回收旧版本权限 @@ -156,7 +160,7 @@ public class RecordRecordServiceImpl implements RecordRecordService { } // 更新 businessFileService.deleteBusinessFileList(updateReqVO.getDeleteFileIdList()); - return BeanUtils.toBean(updateReqVO, RecordRecordRespVO.class); + return BeanUtils.toBean(updateReqVO, RecordRecordRespVO.class); } @Override @@ -173,11 +177,11 @@ public class RecordRecordServiceImpl implements RecordRecordService { 2.没有:不操作 */ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(RecordRecordDO::getMainId,recordRecordDO.getMainId()); + lambdaQueryWrapper.eq(RecordRecordDO::getMainId, recordRecordDO.getMainId()); lambdaQueryWrapper.orderByDesc(RecordRecordDO::getCreateTime); // 根据时间倒叙排序,取第一个 List recordRecordDOS = recordRecordMapper.selectList(lambdaQueryWrapper); - log.info("recordRecordDOS--:{}",recordRecordDOS); - if (ObjectUtils.isEmpty(recordRecordDOS)) return ; + log.info("recordRecordDOS--:{}", recordRecordDOS); + if (ObjectUtils.isEmpty(recordRecordDOS)) return; // 修改状态为当前最新版本 // TODO 需要去判断文件作废状态 recordRecordDO = recordRecordDOS.get(0); @@ -191,7 +195,7 @@ public class RecordRecordServiceImpl implements RecordRecordService { validateRecordRecordExists(ids); // 删除 recordRecordMapper.deleteByIds(ids); - } + } private void validateRecordRecordExists(List ids) { List list = recordRecordMapper.selectByIds(ids); @@ -212,13 +216,23 @@ public class RecordRecordServiceImpl implements RecordRecordService { RecordRecordDO recordRecordDO = recordRecordMapper.selectById(id); hasPermissionByCategoryId(recordRecordDO.getCategoryId()); - if (!ObjectUtils.isEmpty(recordRecordDO)){ + if (!ObjectUtils.isEmpty(recordRecordDO)) { Long categoryId = recordRecordDO.getCategoryId(); RecordCategoryDO recordCategoryDO = recordCategoryMapper.selectById(categoryId); Long parentId = recordCategoryDO.getParentId(); + + String dept = RecordConstants.TargetType.DEPT; + String role = RecordConstants.TargetType.ROLE; + // 判断管理员权限 - List permissionDOList = judgeIsAdmin(parentId); - if (!ObjectUtils.isEmpty(permissionDOList)) return CommonResult.success(RecordConstants.PermissionType.ADMIN); + List permissionDOList = judgeIsAdmin(parentId,dept,role); + + // 判断当前用户的管理员权限 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(RecordPermissionDO::getTargetId, id); + recordPermissionMapper.selectList(); + if (!ObjectUtils.isEmpty(permissionDOList)) + return CommonResult.success(RecordConstants.PermissionType.ADMIN); String s = hasPermissionByCategoryId(parentId); return CommonResult.success(s); } @@ -229,11 +243,22 @@ public class RecordRecordServiceImpl implements RecordRecordService { public RecordRecordDO getRecordRecord(Long id) { RecordRecordDO recordRecordDO = recordRecordMapper.selectById(id); hasPermissionByCategoryId(recordRecordDO.getCategoryId()); - if (!ObjectUtils.isEmpty(recordRecordDO)){ + if (!ObjectUtils.isEmpty(recordRecordDO)) { Long categoryId = recordRecordDO.getCategoryId(); RecordCategoryDO recordCategoryDO = recordCategoryMapper.selectById(categoryId); - // 判断当前操作记录可执行的权限 recordRecordDO.setCategoryName(recordCategoryDO.getName()); + // 判断当前操作记录可执行的权限 + Long parentId = recordCategoryDO.getParentId(); + String dept = RecordConstants.TargetType.DEPT; + String role = RecordConstants.TargetType.ROLE; + List permissionDOList = judgeIsAdmin(parentId,dept,role); + if (!ObjectUtils.isEmpty(permissionDOList)){ + // 查询 category 的父级Id + if (ObjectUtils.isEmpty(parentId)) throw exception(RECORD_RECORD_NOT_EXISTS); + Object finalParse = customConfigParseJson(parentId); + recordRecordDO.setCustomConfig(finalParse); + } + } return recordRecordDO; } @@ -255,13 +280,13 @@ public class RecordRecordServiceImpl implements RecordRecordService { return businessDOList = dictionaryBusinessService.queryDictItemsByKey(targetKey); } - // 判断当前用户是管理员权限 - public List judgeIsAdmin(Long parentCategoryId) { + // 判断当前用户管理员权限(用户,角色,部门),返回权限列表 + public List judgeIsAdmin(Long parentCategoryId, String dept,String role) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); Long userId = loginUser.getId(); RecordPermissionDO recordPermissionDO = new RecordPermissionDO(); - businessDOList=selectDictPermissionByKey(RecordConstants.PermissionType.PERMISSION_KEY); + businessDOList = selectDictPermissionByKey(RecordConstants.PermissionType.PERMISSION_KEY); String permissionAdmin = getDictValueByKey(businessDOList, RecordConstants.PermissionType.ADMIN);// 管理员权限 dictionaryBusinessDOS = selectDictTargetTypeByKey(RecordConstants.TargetType.TARGET_KEY); String targetUser = getDictValueByKey(dictionaryBusinessDOS, RecordConstants.TargetType.USER);// 用户权限 @@ -269,36 +294,66 @@ public class RecordRecordServiceImpl implements RecordRecordService { recordPermissionDO.setTargetType(targetUser); recordPermissionDO.setTargetId(userId.toString()); recordPermissionDO.setPermission(permissionAdmin); + // 判断是否是最高管理员权限 recordPermissionDO.setSourceType(RecordConstants.TargetType.ADMIN); List recordPermissionDOS = recordPermissionService.selectRecordPermission(recordPermissionDO); - if (!ObjectUtils.isEmpty(recordPermissionDOS)) return recordPermissionDOS; + if (!ObjectUtils.isEmpty(recordPermissionDOS)) return recordPermissionDOS; // 判断是普通管理员权限 recordPermissionDO.setSourceType(null); recordPermissionDO.setSourceId(parentCategoryId); + if (!ObjectUtils.isEmpty(dept)){ + recordPermissionDO.setTargetType(dept); + // 当前用户部门ID + Long visitDeptId = loginUser.getVisitDeptId(); + recordPermissionDO.setTargetId(visitDeptId.toString()); + List permissionDOList = recordPermissionService.selectRecordPermission(recordPermissionDO); + if (!ObjectUtils.isEmpty(permissionDOList)) return permissionDOList; + } + if (!ObjectUtils.isEmpty(role)) { + recordPermissionDO.setTargetType(role); + // 当前角色Id + Set userRoleIdList = permissionApi.getUserRoleIdListByUserId(userId).getData(); + if (userRoleIdList.size() == 1) { + recordPermissionDO.setTargetId(userRoleIdList.stream().findFirst().get().toString()); + }else { + // Set 转 permissionDOList + List permissionDOList = new ArrayList<>(); + for (Long roleId : userRoleIdList) { + RecordPermissionDO rolePermissionDO = new RecordPermissionDO(); + rolePermissionDO.setSourceType(null); + rolePermissionDO.setSourceId(parentCategoryId); + rolePermissionDO.setTargetType(role); + rolePermissionDO.setTargetId(roleId.toString()); + rolePermissionDO.setPermission(permissionAdmin); + permissionDOList.add(rolePermissionDO); + } + } + } return recordPermissionService.selectRecordPermission(recordPermissionDO); } - // 根据当前用户部门获取所有父级部门列表 + // 根据当前用户部门获取所有父级部门列表 TODO 目前只查询当前部门 public List getParentDepts() { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); Long currentDeptId = loginUser.getVisitDeptId(); - //通过DeptApi获取完整部门信息(包括父部门) - CommonResult deptResult = deptApi.getDept(currentDeptId); - DeptRespDTO currentDept = deptResult.getData(); - Long parentDeptId = currentDept.getParentId(); // 获取父部门ID -// List parentDepts = new ArrayList<>(); - // 添加当前部门到父部门列表中 - Long tempParentId = parentDeptId; - while (tempParentId != null && tempParentId != 0) { - CommonResult parentResult = deptApi.getDept(tempParentId); - DeptRespDTO parentDept = parentResult.getData(); - parentDepts.add(parentDept); - tempParentId = parentDept.getParentId(); - } - parentDepts.add(currentDept); + parentDepts.add(new DeptRespDTO().setId(currentDeptId)); +// //通过DeptApi获取完整部门信息(包括父部门) +// CommonResult deptResult = deptApi.getDept(currentDeptId); +// DeptRespDTO currentDept = deptResult.getData(); +// Long parentDeptId = currentDept.getParentId(); // 获取父部门ID +//// +// // 添加当前部门到父部门列表中 +// Long tempParentId = parentDeptId; +// while (tempParentId != null && tempParentId != 0) { +// CommonResult parentResult = deptApi.getDept(tempParentId); +// DeptRespDTO parentDept = parentResult.getData(); +// parentDepts.add(parentDept); +// tempParentId = parentDept.getParentId(); +// } +// parentDepts.add(currentDept); return parentDepts; } @@ -406,15 +461,35 @@ public class RecordRecordServiceImpl implements RecordRecordService { wrapper.orderByAsc(RecordRecordDO::getCreateTime); // log.info("pageReqVO:{}", pageReqVO); + PageResult recordRecordDOPageResult; + // TODO 问价下发,跳过权限校验,后续完善 //不是管理员,判断部门、角色权限 // 获取分类ID 的父节点,并校验当前用户是否有权限 RecordCategoryDO recordCategoryDO = recordCategoryMapper.selectById(categoryId); + if (ObjectUtils.isEmpty(recordCategoryDO)) return new PageResult().setTotal(0L); Long parentId = recordCategoryDO.getParentId(); - List permissionDOList = judgeIsAdmin(parentId); - if (!ObjectUtils.isEmpty(permissionDOList)) return recordRecordMapper.selectPage(pageReqVO, wrapper); + String dept = RecordConstants.TargetType.DEPT; + String role = RecordConstants.TargetType.ROLE; + + List permissionDOList = judgeIsAdmin(parentId,dept,role); + if (!ObjectUtils.isEmpty(permissionDOList)) { + recordRecordDOPageResult = recordRecordMapper.selectPage(pageReqVO, wrapper); + // 通过 categoryId 查询所属分类的 customConfig(存储为JSON字符串),解析后追加到每条记录中 + // 使用 Map 缓存已查询的分类,避免同分类重复查库 +// Map categoryCache = new HashMap<>(); + Object finalParse = customConfigParseJson(parentId);; + recordRecordDOPageResult.getList().forEach(record -> { + try { + record.setCustomConfig(finalParse); + } catch (Exception e) { + throw exception(RECORD_RECORD_NOT_EXISTS); + } + }); + return recordRecordDOPageResult; + } // log.info("permissionDOList:{}", permissionDOList); String permission = hasPermissionByCategoryId(parentId); @@ -423,6 +498,18 @@ public class RecordRecordServiceImpl implements RecordRecordService { return recordRecordMapper.selectPage(pageReqVO, wrapper); } + private Object customConfigParseJson(Long parentId) { + RecordCategoryDO categoryDOByParent = recordCategoryMapper.selectById(parentId); + log.info("categoryDOByParent:{}", categoryDOByParent); + if (ObjectUtils.isEmpty(categoryDOByParent)) throw exception(RECORD_CATEGORY_NOT_EXISTS); + Object parse=new Object(); + if (!ObjectUtils.isEmpty(categoryDOByParent.getCustomConfig())) { + String customConfig = categoryDOByParent.getCustomConfig(); + parse = JSON.parse(customConfig); + } + return parse; + } + // 查询历史分页 @Override @@ -432,4 +519,73 @@ public class RecordRecordServiceImpl implements RecordRecordService { return recordRecordMapper.selectPage(pageReqVO); } + /** + * 根据 categoryId 查询 recordPermission 中关联 sourceId 的所有权限记录, + * 并通过当前用户的部门(含所有父级部门)、角色进行过滤,返回满足条件的权限列表。 + * + * @param categoryId 分类ID(对应 recordPermission.sourceId) + * @return 当前用户命中的权限记录列表(包含管理员/可编辑/可查看等所有类型) + */ + @Override + public List getMatchedPermissionList(Long categoryId) { + // 获取当前登录用户 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + Long userId = loginUser.getId(); + + // 1. 查询该分类下所有权限配置(sourceId = categoryId) + RecordPermissionDO query = new RecordPermissionDO(); + query.setSourceId(categoryId); + List permissionList = recordPermissionService.selectAllList(query); + if (ObjectUtils.isEmpty(permissionList)) { + return new ArrayList<>(); + } + + // 2. 加载字典:授权目标类型(部门/角色) + List targetTypeDicts = dictionaryBusinessService.queryDictItemsByKey(RecordConstants.TargetType.TARGET_KEY); + String targetDeptValue = getDictValueByKey(targetTypeDicts, RecordConstants.TargetType.DEPT); // 部门 + String targetRoleValue = getDictValueByKey(targetTypeDicts, RecordConstants.TargetType.ROLE); // 角色 + + // 3. 获取当前用户所在部门及所有父级部门列表 + List allDepts = getParentDepts(); // 包含当前部门和所有父级部门 + + // 4. 获取当前用户的角色ID集合 + Set userRoleIds = null; + try { + userRoleIds = permissionApi.getUserRoleIdListByUserId(userId).getData(); + } catch (Exception e) { + log.warn("获取用户角色ID失败,将跳过角色权限过滤: {}", e.getMessage()); + } + final Set finalUserRoleIds = userRoleIds; + + // 5. 过滤出当前用户命中的所有权限记录 + List recordPermissionDOS = judgeIsAdmin(categoryId,null,null); + List matchedList = new ArrayList<>(recordPermissionDOS); + for (RecordPermissionDO perm : permissionList) { + String targetType = perm.getTargetType(); + String targetId = perm.getTargetId(); + + // 5.1 部门条件:当前部门或任意父级部门匹配 + if (targetDeptValue != null && targetDeptValue.equals(targetType)) { + boolean deptMatch = allDepts.stream() + .anyMatch(dept -> dept.getId() != null && dept.getId().toString().equals(targetId)); + if (deptMatch) { + matchedList.add(perm); + continue; // 已命中,无需再判断角色 + } + } + + // 5.2 角色条件:当前用户的任意角色匹配 + if (targetRoleValue != null && targetRoleValue.equals(targetType) && finalUserRoleIds != null) { + boolean roleMatch = finalUserRoleIds.stream() + .anyMatch(roleId -> roleId.toString().equals(targetId)); + if (roleMatch) { + matchedList.add(perm); + } + } + } + + log.info("分类ID: {} 共命中权限记录数: {}", categoryId, matchedList.size()); + return matchedList; + } + } \ No newline at end of file