diff --git a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java index 06c2ccbe..6b176931 100644 --- a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java +++ b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java @@ -249,4 +249,7 @@ public interface ErrorCodeConstants { /*================================= 部门信息、用户信息 ==================================*/ ErrorCode CURRENT_USER_COMPANY_NOT_EXISTS = new ErrorCode(1_032_350_000, "当前用户公司不存在"); ErrorCode CURRENT_USER_DEPT_NOT_EXISTS = new ErrorCode(1_032_350_000, "当前用户部门不存在"); + + // ========== 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 TODO 补充编号 ========== + ErrorCode RECORD_ASSIGN_NOT_EXISTS = new ErrorCode(1_032_450_000, "文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物不存在"); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/admin/OnlyOfficeController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/admin/OnlyOfficeController.java new file mode 100644 index 00000000..a645fea9 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/admin/OnlyOfficeController.java @@ -0,0 +1,147 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.admin; + + +import com.zt.plat.framework.business.annotation.FileUploadController; +import com.zt.plat.framework.business.controller.AbstractFileUploadController; +import com.zt.plat.framework.business.interceptor.BusinessControllerMarker; +import com.zt.plat.framework.common.enums.UserTypeEnum; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.security.core.LoginUser; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.framework.tenant.core.aop.TenantIgnore; +import com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.vo.OnlyOfficeEditorConfigRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.service.OnlyOfficeService; +import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.RecordRecordController; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +import static com.zt.plat.framework.common.pojo.CommonResult.success; + + +@Slf4j +@Tag(name = "管理后台 - 文件、模板、记录") +@RestController +@RequestMapping("/qms/common/only-office") +@Validated +//@DeptDataPermissionIgnore(enable = "true") +@FileUploadController(source = "qms.only-office", codeKey = "data.fileUploadBusinessCode") +public class OnlyOfficeController extends AbstractFileUploadController implements BusinessControllerMarker { + + static { + FileUploadController annotation = RecordRecordController.class.getAnnotation(FileUploadController.class); + if (annotation != null) { + setFileUploadInfo(annotation); + } + } + + @Resource + private OnlyOfficeService onlyOfficeService; + + @GetMapping("/editor-config") + @Operation(summary = "获取 OnlyOffice 编辑器配置") +// @PreAuthorize("@ss.hasPermission('infra:doc:edit')") + public CommonResult getEditorConfig(@RequestParam("id") Long id) { + return success(onlyOfficeService.getEditorConfig(id)); + } + + @PostMapping("/callback") + @Operation(summary = "OnlyOffice 回调接口") + @PermitAll + @TenantIgnore + public Map callback(@RequestParam("fileId") Long fileId, + @RequestParam(value = "userId", required = false) Long triggerUserId, + @RequestBody Map body, + HttpServletRequest request) { + try { + log.info("=== OnlyOffice 回调接口被调用 ==="); + log.info("请求URL: {}", request.getRequestURL()); + log.info("请求URI: {}", request.getRequestURI()); + log.info("请求方法: {}", request.getMethod()); + log.info("Content-Type: {}", request.getContentType()); + log.info("User-Agent: {}", request.getHeader("User-Agent")); +// log.info("客户端IP: {}", getClientIpAddress(request)); + log.info("OnlyOffice 回调请求: fileId={}, triggerUserId={}, body={}", fileId, triggerUserId, body); + + // 如果传入了triggerUserId,设置当前请求的登录用户为该用户 + if (triggerUserId != null) { + LoginUser mockUser = new LoginUser(); + mockUser.setId(triggerUserId); + mockUser.setUserType(UserTypeEnum.ADMIN.getValue()); + mockUser.setTenantId(1L); // 默认租户 + SecurityFrameworkUtils.setLoginUser(mockUser, request); + log.info("已设置登录用户上下文: userId={}", triggerUserId); + } + + Integer status = (Integer) body.get("status"); + String downloadUrl = (String) body.get("url"); + + // 扩展保存策略:更多状态下进行保存 + boolean shouldSave = false; + String saveReason = ""; + + if (status != null) { + switch (status) { + case 1: + // 文档正在编辑中 - 记录活动但不保存 + log.info("文档编辑中: fileId={}, users={}", fileId, body.get("users")); + break; + case 2: + // 文档已准备保存(用户主动保存或停止编辑)- 立即保存 + shouldSave = true; + saveReason = "用户主动保存"; + break; + case 3: + // 保存时出错 - 记录错误但不重试保存,避免循环 + log.warn("OnlyOffice保存出错: fileId={}, url={}", fileId, downloadUrl); + break; + case 4: + // 文档关闭且无错误 - 只在有实际内容时保存 + if (downloadUrl != null && !downloadUrl.trim().isEmpty()) { + shouldSave = true; + saveReason = "文档关闭保存"; + } + break; + case 6: + // 强制保存(通常是协作冲突解决) - 立即保存 + shouldSave = true; + saveReason = "协作保存"; + break; + case 7: + // 保存时出错但继续编辑 - 记录错误但不重试 + log.warn("OnlyOffice编辑中保存出错: fileId={}, url={}", fileId, downloadUrl); + break; + default: + log.info("OnlyOffice未处理的回调状态: fileId={}, status={}", fileId, status); + } + } + + if (shouldSave) { + if (downloadUrl == null || downloadUrl.trim().isEmpty()) { + log.error("OnlyOffice 回调 URL 为空: fileId={}, status={}, reason={}", fileId, status, saveReason); + return Map.of("error", 1, "message", "下载URL为空"); + } + + log.info("开始保存文档: fileId={}, triggerUserId={}, status={}, reason={}, url={}", + fileId, triggerUserId, status, saveReason, downloadUrl); + //TODO +// docFileService.saveDocumentContent(fileId, downloadUrl, saveReason, triggerUserId); + log.info("文档保存成功: fileId={}, triggerUserId={}, reason={}", fileId, triggerUserId, saveReason); + } + + // 按 OnlyOffice 协议返回 {error:0} + return Map.of("error", 0); + } catch (Exception e) { + log.error("OnlyOffice 回调处理失败: fileId={}, body={}", fileId, body, e); + return Map.of("error", 1, "message", e.getMessage()); + } + } +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/vo/OnlyOfficeEditorConfigRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/vo/OnlyOfficeEditorConfigRespVO.java new file mode 100644 index 00000000..262d05d9 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/vo/OnlyOfficeEditorConfigRespVO.java @@ -0,0 +1,99 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - OnlyOffice 编辑器配置 Response VO") +@Data +public class OnlyOfficeEditorConfigRespVO { + + @Schema(description = "文档类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "text") + private String documentType; + + @Schema(description = "文档配置", requiredMode = Schema.RequiredMode.REQUIRED) + private DocumentConfig document; + + @Schema(description = "编辑器配置", requiredMode = Schema.RequiredMode.REQUIRED) + private EditorConfig editorConfig; + + @Schema(description = "文档高度", requiredMode = Schema.RequiredMode.REQUIRED, example = "100%") + private String height; + + @Schema(description = "令牌", requiredMode = Schema.RequiredMode.REQUIRED) + private String token; + + @Schema(description = "OnlyOffice服务器地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://localhost:8085") + private String documentServerUrl; + + @Schema(description = "文档配置") + @Data + public static class DocumentConfig { + @Schema(description = "文件类型", example = "docx") + private String fileType; + + @Schema(description = "文档key", example = "doc123") + private String key; + + @Schema(description = "文档标题", example = "技术文档") + private String title; + + @Schema(description = "文档地址") + private String url; + + @Schema(description = "权限配置") + private Permissions permissions; + } + + @Schema(description = "权限配置") + @Data + public static class Permissions { + @Schema(description = "是否可编辑", example = "true") + private Boolean edit; + + @Schema(description = "是否可下载", example = "true") + private Boolean download; + + @Schema(description = "是否可打印", example = "true") + private Boolean print; + } + + @Schema(description = "编辑器配置") + @Data + public static class EditorConfig { + @Schema(description = "回调地址") + private String callbackUrl; + + @Schema(description = "语言", example = "zh-CN") + private String lang; + + @Schema(description = "模式", example = "edit") + private String mode; + + @Schema(description = "用户配置") + private User user; + + @Schema(description = "协作配置") + private CoEditing coEditing; + } + + @Schema(description = "用户配置") + @Data + public static class User { + @Schema(description = "用户ID", example = "1") + private String id; + + @Schema(description = "用户名", example = "admin") + private String name; + } + + @Schema(description = "协作配置") + @Data + public static class CoEditing { + @Schema(description = "协作模式", example = "fast") + private String mode; + + @Schema(description = "是否允许更改", example = "true") + private Boolean change; + } + +} \ 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/onlyOffice/controller/vo/OnlyOfficeFileDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/vo/OnlyOfficeFileDO.java new file mode 100644 index 00000000..834b34e8 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/controller/vo/OnlyOfficeFileDO.java @@ -0,0 +1,57 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.vo; + +import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OnlyOfficeFileDO extends BaseDO { + + /** + * 文档编号 + */ + private Long id; + /** + * 文档标题 + */ + private String title; + /** + * 文件编号 + */ + private Long fileId; + /** + * 文件类型 + * + * 枚举 {@link com.zt.plat.module.infra.enums.doc.DocFileTypeEnum} + */ + private String fileType; + /** + * 空间类型 + * + * 枚举 {@link com.zt.plat.module.infra.enums.doc.DocSpaceTypeEnum} + */ + private Integer spaceType; + /** + * 文档描述 + */ + private String description; + /** + * 最新版本编号 + */ + private Long latestVersionId; + /** + * 所有者用户编号 + */ + private Long ownerUserId; + /** + * 状态 + * + * 枚举 {@link com.zt.plat.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + +} \ 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/onlyOffice/service/OnlyOfficeService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/service/OnlyOfficeService.java new file mode 100644 index 00000000..efedabf0 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/service/OnlyOfficeService.java @@ -0,0 +1,8 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.service; + +import com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.vo.OnlyOfficeEditorConfigRespVO; + +public interface OnlyOfficeService { + + OnlyOfficeEditorConfigRespVO getEditorConfig(Long id); +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/service/OnlyOfficeServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/service/OnlyOfficeServiceImpl.java new file mode 100644 index 00000000..c30fb72d --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/onlyOffice/service/OnlyOfficeServiceImpl.java @@ -0,0 +1,261 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.service; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.jwt.JWT; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.module.infra.api.businessfile.BusinessFileApi; +import com.zt.plat.module.infra.api.file.FileApi; +import com.zt.plat.module.infra.api.file.dto.FileRespDTO; +import com.zt.plat.module.qms.resource.record.controller.admin.onlyOffice.controller.vo.OnlyOfficeEditorConfigRespVO; +import com.zt.plat.module.system.api.user.AdminUserApi; +import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.module.infra.enums.ErrorCodeConstants.DOC_NOT_EXISTS; + +@Service +@Validated +@Slf4j +public class OnlyOfficeServiceImpl implements OnlyOfficeService{ + + @Resource + private AdminUserApi adminUserApi; + + private static final String TEXT_DOCUMENT_EXTENSIONS = "doc,docx,odt,rtf,txt,html,htm,mht,pdf,djvu,fb2,epub,xps"; + private static final String SPREADSHEET_EXTENSIONS = "xls,xlsx,ods,csv"; + private static final String PRESENTATION_EXTENSIONS = "ppt,pptx,odp"; + + // 文档类型常量 + private static final String DOCUMENT_TYPE_TEXT = "text"; + private static final String DOCUMENT_TYPE_SPREADSHEET = "spreadsheet"; + private static final String DOCUMENT_TYPE_PRESENTATION = "presentation"; + + @Value("${onlyoffice.base-url:http://localhost:8085}") + private String onlyOfficeBaseUrl; + @Value("${onlyoffice.callback-base-url:http://host.docker.internal:48080}") + private String onlyOfficeCallbackBaseUrl; + @Value("${onlyoffice.jwt-secret:P@ssword25}") + private String onlyOfficeJwtSecret; + + + private String getDocumentType(String fileExtension) { + if (StrUtil.isEmpty(fileExtension)) { + return DOCUMENT_TYPE_TEXT; + } + + String ext = fileExtension.toLowerCase(); + + // 文本文档类型 + if (TEXT_DOCUMENT_EXTENSIONS.contains(ext)) { + return DOCUMENT_TYPE_TEXT; + } + + // 电子表格类型 + if (SPREADSHEET_EXTENSIONS.contains(ext)) { + return DOCUMENT_TYPE_SPREADSHEET; + } + + // 演示文稿类型 + if (PRESENTATION_EXTENSIONS.contains(ext)) { + return DOCUMENT_TYPE_PRESENTATION; + } + + // 默认返回text类型 + return DOCUMENT_TYPE_TEXT; + } + + public String generateFileToken(Long fileId) { + String fileToken = ""; + if (StrUtil.isNotBlank(onlyOfficeJwtSecret)) { + // 创建文件访问token,包含fileId和过期时间(1小时后过期) + long expTime = System.currentTimeMillis() / 1000 + 3600; // 1小时后过期 + fileToken = JWT.create() + .setPayload("fileId", fileId) + .setPayload("exp", expTime) + .setPayload("iat", System.currentTimeMillis() / 1000) + .setKey(onlyOfficeJwtSecret.getBytes()) + .sign(); + } + return fileToken; + } + + @Resource + private FileApi fileApi; + + @Override + public OnlyOfficeEditorConfigRespVO getEditorConfig(Long id) { +// DocFileDO doc = docFileMapper.selectById(id); +// if (doc == null) { +// throw exception(DOC_NOT_EXISTS); +// } + Long userId = SecurityFrameworkUtils.getLoginUserId(); + OnlyOfficeEditorConfigRespVO resp = new OnlyOfficeEditorConfigRespVO(); + +// // 根据文件类型动态设置文档类型 +// String documentType = getDocumentType(doc.getFileType()); +// resp.setDocumentType(documentType); +// +// DocEditorConfigRespVO.DocumentConfig document = new DocEditorConfigRespVO.DocumentConfig(); +// document.setFileType(doc.getFileType()); +// +// // 关键修复:使用基于文档版本的稳定key策略 +// // 只有当文档内容真正发生版本变更时,key才会改变 +// String documentKey; +// if (doc.getLatestVersionId() != null) { +// // 使用文档ID + 最新版本ID,确保同一版本在编辑期间key保持不变 +// documentKey = doc.getId() + "_v" + doc.getLatestVersionId(); +// } else { +// // 如果没有版本信息,使用文档ID + 创建时间(不会变化) +// documentKey = doc.getId() + "_init_" + doc.getCreateTime().toEpochSecond(java.time.ZoneOffset.UTC); +// } +// +// document.setKey(documentKey); +// document.setTitle(doc.getTitle()); +// +// log.info("生成文档key: docId={}, key={}, latestVersionId={}, userId={}", +// doc.getId(), documentKey, doc.getLatestVersionId(), userId); +// +// // 使用新的接口生成文件 URL +// String fileUrl = ""; +// if (doc.getFileId() != null) { +// // 生成文件访问的JWT token +// String fileToken = generateFileToken(doc.getFileId()); +// +// // 生成通过新接口访问文件的URL,包含JWT token +// fileUrl = StrUtil.removeSuffix(onlyOfficeCallbackBaseUrl, "/") + "/admin-api/infra/doc-file/file-content?fileId=" + doc.getFileId(); +// if (StrUtil.isNotBlank(fileToken)) { +// fileUrl += "&token=" + fileToken; +// } +// } +// document.setUrl(fileUrl); + + CommonResult file = fileApi.getFile(id); + log.info("file:{}",file); + if (file.getData() == null) throw exception(DOC_NOT_EXISTS); + FileRespDTO data = file.getData(); + + // 根据文件类型动态设置文档类型 + String documentType = getDocumentType(data.getType()); + resp.setDocumentType(documentType); + + OnlyOfficeEditorConfigRespVO.DocumentConfig document = new OnlyOfficeEditorConfigRespVO.DocumentConfig(); + // 获取文件类型,通过后缀名 + String fileName = data.getName(); + String fileType = getFileSuffix(fileName); + document.setFileType(fileType); + + // 关键修复:使用基于文档版本的稳定key策略 + // 只有当文档内容真正发生版本变更时,key才会改变 + String documentKey; + // TODO +// if (doc.getLatestVersionId() != null) { +// // 使用文档ID + 最新版本ID,确保同一版本在编辑期间key保持不变 +// documentKey = doc.getId() + "_v" + doc.getLatestVersionId(); +// } else { +// // 如果没有版本信息,使用文档ID + 创建时间(不会变化) +// documentKey = doc.getId() + "_init_" + doc.getCreateTime().toEpochSecond(java.time.ZoneOffset.UTC); +// } +// +// document.setKey(documentKey); + document.setTitle(fileName); + +// log.info("生成文档key: docId={}, key={}, latestVersionId={}, userId={}", +// doc.getId(), documentKey, doc.getLatestVersionId(), userId); + + // 使用新的接口生成文件 URL TODO + String fileUrl = ""; + if (data.getId() != null) { + // 生成文件访问的JWT token + String fileToken = generateFileToken(data.getId()); + + // 生成通过新接口访问文件的URL,包含JWT token + fileUrl = StrUtil.removeSuffix(onlyOfficeCallbackBaseUrl, "/") + "/admin-api/infra/doc-file/file-content?fileId=" + data.getId(); + if (StrUtil.isNotBlank(fileToken)) { + fileUrl += "&token=" + fileToken; + } + } + document.setUrl(fileUrl); + + + OnlyOfficeEditorConfigRespVO.Permissions permissions = new OnlyOfficeEditorConfigRespVO.Permissions(); + // TODO 权限 +// permissions.setEdit(hasPermission(id, userId, DocPermissionTypeEnum.EDIT.getType()) || hasPermission(id, userId, DocPermissionTypeEnum.MANAGE.getType())); + permissions.setEdit(true); + permissions.setDownload(true); + permissions.setPrint(true); + document.setPermissions(permissions); + resp.setDocument(document); + + OnlyOfficeEditorConfigRespVO.EditorConfig editorConfig = new OnlyOfficeEditorConfigRespVO.EditorConfig(); + // 在回调URL中添加触发用户ID,确保回调时能准确记录操作用户 + String callbackUrl = StrUtil.removeSuffix(onlyOfficeCallbackBaseUrl, "/") + + "/admin-api/qms/common/only-office/callback?fileId=" + id + "&userId=" + userId; + editorConfig.setCallbackUrl(callbackUrl); + editorConfig.setLang("zh-CN"); + editorConfig.setMode(permissions.getEdit() ? "edit" : "view"); + + // 重要:设置正确的用户信息以支持多人协作 + OnlyOfficeEditorConfigRespVO.User user = new OnlyOfficeEditorConfigRespVO.User(); + user.setId(String.valueOf(userId)); + + // 获取真实用户姓名 + String userName = "User" + userId; // 默认值 + try { + AdminUserRespDTO userInfo = adminUserApi.getUser(userId).getCheckedData(); + if (userInfo != null && StrUtil.isNotBlank(userInfo.getNickname())) { + userName = userInfo.getNickname(); + } + } catch (Exception e) { + log.warn("获取用户姓名失败,使用默认值,用户ID: {}", userId, e); + } + user.setName(userName); + editorConfig.setUser(user); + + // 添加协作配置 + OnlyOfficeEditorConfigRespVO.CoEditing coEditing = new OnlyOfficeEditorConfigRespVO.CoEditing(); + coEditing.setMode("fast"); // 快速协作模式 + coEditing.setChange(true); // 允许实时变更 + editorConfig.setCoEditing(coEditing); + + resp.setEditorConfig(editorConfig); + resp.setHeight("100%"); + resp.setDocumentServerUrl(onlyOfficeBaseUrl); + + // 生成 token(可选 JWT) + if (StrUtil.isNotBlank(onlyOfficeJwtSecret)) { + // OnlyOffice 标准 JWT payload 格式 + String token = JWT.create() + .setPayload("document", resp.getDocument()) + .setPayload("documentType", resp.getDocumentType()) + .setPayload("editorConfig", resp.getEditorConfig()) + .setPayload("height", resp.getHeight()) + .setKey(onlyOfficeJwtSecret.getBytes()) + .sign(); + resp.setToken(token); + } else { + // 如果没有 JWT secret,不设置 token,让 OnlyOffice 在无验证模式工作 + resp.setToken(null); + } + return resp; + } + + public String getFileSuffix(String fileName){ + //从文件名中最后一个点截取,例:1111.111.222.docx,截取 docx + if (fileName == null || fileName.isEmpty()) { + return ""; + } + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) { + return ""; + } + return fileName.substring(lastDotIndex + 1).toLowerCase(); + } + + +} 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 9c2412e9..7ceacb50 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 @@ -132,6 +132,8 @@ public class RecordApplyRespVO { @Schema(description = "明细列表") private List detailList; + private List assignList; + // ===============临时字段=================》 diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java index 4aeb9fc1..a06c44ef 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java @@ -1,5 +1,7 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo; +import com.zt.plat.module.qms.core.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -19,6 +21,12 @@ public class RecordApplyDetailJoinVO { private String businessStatus; private String businessType; private String flowInstanceId; + private String formData; + private String applyContent; + private String changeBefore; + private String changeAfter; + +// private String permanently; // RecordApplyDetailDO 字段 private Long detailId; @@ -29,4 +37,9 @@ public class RecordApplyDetailJoinVO { private String sortNo; private String systemDepartmentCode; private String remark; + private Long id; + private String targetType; + private String targetName; + private Long targetId; + private String detailFormData; } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailPageReqVO.java index 99c5817e..fe5fd7c4 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailPageReqVO.java @@ -28,6 +28,9 @@ public class RecordApplyDetailPageReqVO extends PageParam { @Schema(description = "授权Id") private Long targetId; + @Schema(description = "授权名称") + private String targetName; + @Schema(description = "是否需要更改") @Dict(dicCode = "yes_or_no") private Integer isModify; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailRespVO.java index 7b7b239a..aa6b2d00 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailRespVO.java @@ -30,6 +30,9 @@ public class RecordApplyDetailRespVO { @ExcelProperty("授权类型") private String TargetType; + @Schema(description = "授权名称") + private String targetName; + @Schema(description = "文件id", example = "3188") @ExcelProperty("文件id") private Long documentId; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailSaveReqVO.java index aab7ad42..37fef6f3 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailSaveReqVO.java @@ -19,7 +19,10 @@ public class RecordApplyDetailSaveReqVO { private Long applyId; @Schema(description = "授权类型") - private String TargetType; + private String targetType; + + @Schema(description = "授权名称") + private String targetName; @Schema(description = "文件id", example = "3188") private Long documentId; @@ -54,4 +57,8 @@ public class RecordApplyDetailSaveReqVO { @Schema(description = "备注") private String remark; + //================================ + @Schema(description = "分发号") + private String assignCode; + } \ 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/recordassign/RecordAssignController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/RecordAssignController.java new file mode 100644 index 00000000..c09b32ec --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/RecordAssignController.java @@ -0,0 +1,114 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.recordassign; + +import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog; +import com.zt.plat.framework.business.annotation.FileUploadController; +import com.zt.plat.framework.business.controller.AbstractFileUploadController; +import com.zt.plat.framework.business.interceptor.BusinessControllerMarker; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageParam; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO; +import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.framework.excel.core.util.ExcelUtils; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignPageReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignSaveReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; +import com.zt.plat.module.qms.resource.record.service.recordassign.RecordAssignService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") +@RestController +@RequestMapping("/qms/record-assign") +@Validated +@FileUploadController(source = "qms.recordassign") +public class RecordAssignController extends AbstractFileUploadController implements BusinessControllerMarker{ + + static { + FileUploadController annotation = RecordAssignController.class.getAnnotation(FileUploadController.class); + if (annotation != null) { + setFileUploadInfo(annotation); + } + } + + @Resource + private RecordAssignService recordAssignService; + + @PostMapping("/create") + @Operation(summary = "创建文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") + @PreAuthorize("@ss.hasPermission('qms:record-assign:create')") + public CommonResult createRecordAssign(@Valid @RequestBody RecordAssignSaveReqVO createReqVO) { + return success(recordAssignService.createRecordAssign(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") + @PreAuthorize("@ss.hasPermission('qms:record-assign:update')") + public CommonResult updateRecordAssign(@Valid @RequestBody RecordAssignSaveReqVO updateReqVO) { + recordAssignService.updateRecordAssign(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('qms:record-assign:delete')") + public CommonResult deleteRecordAssign(@RequestParam("id") Long id) { + recordAssignService.deleteRecordAssign(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") + @PreAuthorize("@ss.hasPermission('qms:record-assign:delete')") + public CommonResult deleteRecordAssignList(@RequestBody BatchDeleteReqVO req) { + recordAssignService.deleteRecordAssignListByIds(req.getIds()); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('qms:record-assign:query')") + public CommonResult getRecordAssign(@RequestParam("id") Long id) { + RecordAssignDO recordAssign = recordAssignService.getRecordAssign(id); + return success(BeanUtils.toBean(recordAssign, RecordAssignRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物分页") + @PreAuthorize("@ss.hasPermission('qms:record-assign:query')") + public CommonResult> getRecordAssignPage(@Valid RecordAssignPageReqVO pageReqVO) { + PageResult pageResult = recordAssignService.getRecordAssignPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RecordAssignRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 Excel") + @PreAuthorize("@ss.hasPermission('qms:record-assign:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportRecordAssignExcel(@Valid RecordAssignPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = recordAssignService.getRecordAssignPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物.xls", "数据", RecordAssignRespVO.class, + BeanUtils.toBean(list, RecordAssignRespVO.class)); + } + +} \ 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/recordassign/vo/RecordAssignPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignPageReqVO.java new file mode 100644 index 00000000..20841c08 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignPageReqVO.java @@ -0,0 +1,54 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zt.plat.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物分页 Request VO") +@Data +public class RecordAssignPageReqVO extends PageParam { + + @Schema(description = "申请明细ID", example = "13369") + private Long applyDetailId; + + @Schema(description = "目标类型,人/部门", example = "2") + private String targetType; + + @Schema(description = "目标名称", example = "ZT") + private String targetName; + + @Schema(description = "目标ID", example = "3088") + private Long targetId; + + @Schema(description = "分发开始时间") + private String assignCode; + + @Schema(description = "分发结束时间") + private LocalDateTime assignStartDate; + + @Schema(description = "是否收回") + private LocalDateTime assignEndDate; + + @Schema(description = "分发号") + private Integer CollectionFlag; + + @Schema(description = "通知") + private String adviceFlag; + + @Schema(description = "所属部门") + private String systemDepartmentCode; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/recordassign/vo/RecordAssignRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignRespVO.java new file mode 100644 index 00000000..50e9c86e --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignRespVO.java @@ -0,0 +1,63 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 Response VO") +@Data +@ExcelIgnoreUnannotated +public class RecordAssignRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28660") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "申请明细ID", example = "13369") + @ExcelProperty("申请明细ID") + private Long applyDetailId; + + @Schema(description = "目标类型,人/部门", example = "2") + @ExcelProperty("目标类型,人/部门") + private String targetType; + + @Schema(description = "目标名称", example = "ZT") + @ExcelProperty("目标名称") + private String targetName; + + @Schema(description = "目标ID", example = "3088") + @ExcelProperty("目标ID") + private Long targetId; + + @Schema(description = "分发号") + @ExcelProperty("分发号") + private String assignCode; + + @Schema(description = "分发结束时间") + private LocalDateTime assignStartDate; + + @Schema(description = "是否收回") + private LocalDateTime assignEndDate; + + @Schema(description = "分发号") + private Integer CollectionFlag; + + @Schema(description = "通知") + private String adviceFlag; + + @Schema(description = "所属部门") + @ExcelProperty("所属部门") + private String systemDepartmentCode; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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/recordassign/vo/RecordAssignSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignSaveReqVO.java new file mode 100644 index 00000000..7e05bc4d --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordassign/vo/RecordAssignSaveReqVO.java @@ -0,0 +1,50 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物新增/修改 Request VO") +@Data +public class RecordAssignSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28660") + private Long id; + + @Schema(description = "申请明细ID", example = "13369") + private Long applyDetailId; + + @Schema(description = "目标类型,人/部门", example = "2") + private String targetType; + + @Schema(description = "目标名称", example = "ZT") + private String targetName; + + @Schema(description = "目标ID", example = "3088") + private Long targetId; + + @Schema(description = "分发号") + private String assignCode; + + @Schema(description = "分发结束时间") + private LocalDateTime assignStartDate; + + @Schema(description = "是否收回") + private LocalDateTime assignEndDate; + + @Schema(description = "分发号") + private Integer CollectionFlag; + + @Schema(description = "通知") + private String adviceFlag; + + @Schema(description = "所属部门") + private String systemDepartmentCode; + + @Schema(description = "备注") + private String remark; + +} \ 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/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 b692b32c..9aca278c 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 @@ -2,6 +2,7 @@ package com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply; import com.alibaba.fastjson2.JSONObject; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapplydetail.RecordApplyDetailDO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; import lombok.*; import java.util.*; import java.time.LocalDateTime; @@ -158,4 +159,8 @@ public class RecordApplyDO extends BusinessBaseDO { @TableField(exist = false) private List detailList; + @TableField(exist = false) + private List assignList; + + } \ 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/dal/dataobject/recordapplydetail/RecordApplyDetailDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapplydetail/RecordApplyDetailDO.java index dca52f5d..2ae0e1ec 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapplydetail/RecordApplyDetailDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapplydetail/RecordApplyDetailDO.java @@ -52,6 +52,12 @@ public class RecordApplyDetailDO extends BusinessBaseDO { */ @TableField("TGT_TP") private String targetType; + + /** + * 授权名称 + */ + @TableField("TGT_NAME") + private String targetName; /** * 授权ID(下发流程使用) */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordassign/RecordAssignDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordassign/RecordAssignDO.java new file mode 100644 index 00000000..302d07f9 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordassign/RecordAssignDO.java @@ -0,0 +1,90 @@ +package com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign; + +import lombok.*; +import java.util.*; + import java.time.LocalDateTime; + import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO; +/** +* 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 DO +* +* @author YBP +*/ +@TableName("t_rcd_asn") +@KeySequence("t_rcd_asn_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** +* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO +*/ +public class RecordAssignDO extends BusinessBaseDO { + + + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 申请ID + */ + @TableField("APL_DL_ID") + private Long applyDetailId; + /** + * 目标类型,人/部门 + */ + @TableField("TGT_TP") + private String targetType; + /** + * 目标名称 + */ + @TableField("TGT_NAME") + private String targetName; + /** + * 目标ID + */ + @TableField("TGT_ID") + private Long targetId; + /** + * 分发号 + */ + @TableField("ASN_CD") + private String assignCode; + /** + * 分发开始时间 + */ + @TableField("ASN_STRT_DT") + private LocalDateTime assignStartDate; + /** + * 分发结束时间 + */ + @TableField("ASN_END_DT") + private LocalDateTime assignEndDate; + /** + * 是否收回 + */ + @TableField("COLT_FLG") + private Integer CollectionFlag; + /** + * 通知 + */ + @TableField("ADV_FLG") + private String adviceFlag; + /** + * 所属部门 + */ + @TableField("SYS_DEPT_CD") + private String systemDepartmentCode; + /** + * 备注 + */ + @TableField("RMK") + private String remark; + +} \ 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/dal/mapper/RecordApplyDetailMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.java index 4c55ebf5..dfe32066 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.java @@ -59,5 +59,4 @@ public interface RecordApplyDetailMapper extends BaseMapperX selectDistributionDetailAndRecordList(@Param("applyId") Long applyId); - List updateDistributionPermissionJob(); } \ 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/dal/mapper/RecordAssignMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordAssignMapper.java new file mode 100644 index 00000000..5ebb3440 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordAssignMapper.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.qms.resource.record.dal.mapper; + +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignPageReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 Mapper + * + * @author YBP + */ +@Mapper +public interface RecordAssignMapper extends BaseMapperX { + + default PageResult selectPage(RecordAssignPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RecordAssignDO::getApplyDetailId, reqVO.getApplyDetailId()) + .eqIfPresent(RecordAssignDO::getTargetType, reqVO.getTargetType()) + .likeIfPresent(RecordAssignDO::getTargetName, reqVO.getTargetName()) + .eqIfPresent(RecordAssignDO::getTargetId, reqVO.getTargetId()) + .eqIfPresent(RecordAssignDO::getAssignCode, reqVO.getAssignCode()) + .eqIfPresent(RecordAssignDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) + .eqIfPresent(RecordAssignDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(RecordAssignDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RecordAssignDO::getId)); + } + +} \ 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/dal/mapper/RecordRecordMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.java index 9586f824..ee8849ef 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.java @@ -104,6 +104,8 @@ public interface RecordRecordMapper extends BaseMapperX { IPage getEffectiveRecordPage(Page page, RecordRecordPageReqVO reqVO); + IPage getEffectiveRecordBySubmitFlagPage(Page page, @Param("reqVO") RecordRecordPageReqVO reqVO); + // TODO // List selectViewApplyRecordList(@Param("pageReqVO") RecordRecordPageReqVO pageReqVO); } \ 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/job/RecordRecordJob.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/job/RecordRecordJob.java index 5758ba2d..123e255d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/job/RecordRecordJob.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/job/RecordRecordJob.java @@ -42,21 +42,41 @@ public class RecordRecordJob { } /** - * 定时获取文件下发到期状态 - * 检测 effectiveDate <= 当前时间 且 recordStatus != 1 的记录,将其更新为已生效(recordStatus = 1) + * 定时更新文件到期状态(到期自动作废) + * 检测 expireDate <= 当前时间 ,将其更新为已过期,且自动作废(expireStatus = 1 cancelFlag = 1) * * JobHandler 名称: updateRecordStatusJob * 推荐 Cron: 0 0 0 * * ?(每天零点执行) */ - @XxlJob("updateDistributionPermissionJob") - public void updateDistributionPermissionJob() { + @XxlJob("updateExpireRecordJob") + public void updateExpireRecordJob() { log.info("[updateDistributionPermissionJob] 开始执行文件记录生效状态更新任务"); try { - Integer updateCount = recordApplyService.updateDistributionPermissionJob(); - log.info("[updateDistributionPermissionJob] 任务执行成功,共更新 {} 条记录", updateCount); + Integer updateCount = recordRecordService.updateExpireRecordJob(); + log.info("[updateExpireRecordJob] 任务执行成功,共更新 {} 条记录", updateCount); XxlJobHelper.handleSuccess(String.format("任务执行成功,共更新 %d 条记录", updateCount)); } catch (Exception e) { - log.error("[updateDistributionPermissionJob] 任务执行失败:{}", e.getMessage(), e); + log.error("[updateExpireRecordJob] 任务执行失败:{}", e.getMessage(), e); + throw e; + } + } + + /** + * 权限到期,定时回收权限 + * 检测 expireDate <= 当前时间 ,将其更新为已过期,且自动作废(expireStatus = 1 cancelFlag = 1) + * + * JobHandler 名称: updateRecordStatusJob + * 推荐 Cron: 0 0 0 * * ?(每天零点执行) + */ + @XxlJob("withdrawPermissionJob") + public void withdrawPermissionJob() { + log.info("[withdrawPermissionJob] 开始执行文件记录生效状态更新任务"); + try { + Integer updateCount = recordRecordService.withdrawPermissionJob(); + log.info("[withdrawPermissionJob] 任务执行成功,共更新 {} 条记录", updateCount); + XxlJobHelper.handleSuccess(String.format("任务执行成功,共更新 %d 条记录", updateCount)); + } catch (Exception e) { + log.error("[withdrawPermissionJob] 任务执行失败:{}", e.getMessage(), e); throw e; } } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java index aebedef3..55c51d5e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java @@ -74,23 +74,6 @@ public interface RecordApplyService { */ CommonResult createApplyData(@Valid RecordApplySaveReqVO createReqVO); - - /** - * 删除明细 - * - * @param param 参数 - * @return 结果 - */ - CommonResult removeDetail(JSONObject param); - - /** - * 保存申请 - * - * @param updateReqVO 更新信息 - * @return 结果 - */ - CommonResult saveRecordApply(@Valid RecordApplySaveReqVO updateReqVO); - /** * 提交申请-发起流程 * @@ -99,14 +82,6 @@ public interface RecordApplyService { */ CommonResult submitRecordApply(@Valid RecordApplySaveReqVO param); - /** - * 获取申请及意见 - * - * @param id 申请ID - * @return 申请及意见信息 - */ - CommonResult getWithOpinions(Long id); - /** * 流程回调 * @@ -132,7 +107,7 @@ public interface RecordApplyService { // 更改作废 PageResult recordInvalidPage(@Valid RecordApplyPageReqVO pageReqVO); - Integer updateDistributionPermissionJob(); +// Integer updateDistributionPermissionJob(); // List selectApplyByStatus(String businessType, java.util.List documentIds, java.util.List businessStatuses); } \ 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/recordapply/RecordApplyServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java index fd4396f1..1b592170 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java @@ -32,11 +32,13 @@ import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply.RecordApplyDO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapplydetail.RecordApplyDetailDO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordcategory.RecordCategoryDO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordpermission.RecordPermissionDO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO; import com.zt.plat.module.qms.resource.record.dal.mapper.RecordApplyMapper; import com.zt.plat.module.qms.resource.record.service.recordapplydetail.RecordApplyDetailService; +import com.zt.plat.module.qms.resource.record.service.recordassign.RecordAssignService; import com.zt.plat.module.qms.resource.record.service.recordcategory.RecordCategoryService; import com.zt.plat.module.qms.resource.record.service.recordpermission.RecordPermissionService; import com.zt.plat.module.qms.resource.record.service.recordrecord.RecordRecordService; @@ -103,6 +105,9 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn @Resource private DeptApi deptApi; + @Resource + private RecordAssignService recordAssignService; + private LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); @Override @@ -179,6 +184,13 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn else recordApplyDetailDOS = recordApplyDetailService.selectDetailAndRecordList(id); if (!recordApplyDetailDOS.isEmpty()) recordApplyDO.setDetailList(recordApplyDetailDOS); + List detailDOIdS = new ArrayList<>(); + for (RecordApplyDetailDO detailDO : recordApplyDetailDOS) { + Long detailDOId = detailDO.getId(); + detailDOIdS.add(detailDOId); + } + List recordAssignDOList = recordAssignService.selectRecordAssignList(detailDOIdS); + recordApplyDO.setAssignList(recordAssignDOList); return recordApplyDO; } @@ -261,6 +273,28 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn boolean recordApplyDetailBatch = recordApplyDetailService.createRecordApplyDetailBatch(detailSaveReqVOList); if (!recordApplyDetailBatch) throw exception(RECORD_APPLY_NOT_EXISTS, "保存申请明细失败"); + + if (businessType.equals(RecordConstants.BusinessType.DISTRIBUTION)){ // 创建关联分发号 + Long applyId = recordApply.getId(); + List detailList = param.getDetailList(); + String assignCode = detailList.get(0).getAssignCode(); + // TODO + if (ObjectUtils.isEmpty(assignCode)) assignCode = "检-XXX"; + List recordApplyDetailDOS = recordApplyDetailService.selectAllList(applyId); + List recordAssignDOList = new ArrayList<>(); + for (RecordApplyDetailDO item : recordApplyDetailDOS) { + RecordAssignDO recordAssignDO = new RecordAssignDO(); + recordAssignDO.setApplyDetailId(item.getId()); + recordAssignDO.setAssignCode(assignCode); + recordAssignDO.setTargetType(item.getTargetType()); + recordAssignDO.setTargetId(item.getTargetId()); + recordAssignDO.setTargetName(item.getTargetName()); + recordAssignDO.setAssignStartDate(LocalDateTime.now()); + recordAssignDOList.add(recordAssignDO); + } + recordAssignService.createRecordAssignBatch(recordAssignDOList); + } + return CommonResult.success(BeanUtils.toBean(recordApply, RecordApplyRespVO.class)); } @@ -283,44 +317,52 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn // 添加分发明细 public List addDistributionDetail(RecordApplySaveReqVO param, RecordApplyDO recordApplyDO) { - Long recordId = param.getDetailList().get(0).getDocumentId(); -// String assignTarget = param.getAssignTarget(); - String applyFormData = param.getFormData(); - if (ObjectUtils.isEmpty(applyFormData)) throw exception0(RECORD_APPLY_NOT_EXISTS.getCode(),"过期日期不能为空"); - List detailSaveReqVOList = new ArrayList<>(); - String targetUserIds = param.getTargetUserIds(); - if (!ObjectUtils.isEmpty(targetUserIds)) { // 用户 - String[] userIds = targetUserIds.split(","); - for (String userId : userIds) { - if (ObjectUtils.isEmpty(userId)) break; // 过滤空 - RecordApplyDetailDO recordApplyDetailDO = new RecordApplyDetailDO(); - recordApplyDetailDO.setFormData(applyFormData); - recordApplyDetailDO.setApplyId(recordApplyDO.getId()); - recordApplyDetailDO.setDocumentId(recordId); - recordApplyDetailDO.setTargetId(Long.valueOf(userId));//用户Id - recordApplyDetailDO.setTargetType(RecordConstants.TargetType.USER); - recordApplyDetailDO.setApplyStartDate(LocalDateTime.now()); // TODO 申请开始时间 - detailSaveReqVOList.add(recordApplyDetailDO); - } + List detailList = param.getDetailList(); + if (ObjectUtils.isEmpty(detailList)) throw exception0(RECORD_APPLY_DETAIL_NOT_EXISTS.getCode(),"申请明细不存在"); + + for (RecordApplyDetailSaveReqVO item : detailList) { + item.setApplyId(recordApplyDO.getId()); + item.setApplyStartDate(LocalDateTime.now()); } - String targetDepartmentIds = param.getTargetDepartmentIds(); - if (!ObjectUtils.isEmpty(targetDepartmentIds)) { -// if (ObjectUtils.isEmpty(targetDepartmentIds)) throw exception0(RECORD_RECORD_NOT_EXISTS.getCode(),"分发部门不存在"); - String[] deptIds = targetDepartmentIds.split(","); - for (String deptId : deptIds) { - if (ObjectUtils.isEmpty(deptId)) break; // 过滤空 - RecordApplyDetailDO recordApplyDetailDO = new RecordApplyDetailDO(); - recordApplyDetailDO.setFormData(applyFormData); - recordApplyDetailDO.setApplyId(recordApplyDO.getId()); - recordApplyDetailDO.setDocumentId(recordId); - recordApplyDetailDO.setTargetId(Long.valueOf(deptId));//部门Id - recordApplyDetailDO.setTargetType(RecordConstants.TargetType.DEPT); - recordApplyDetailDO.setApplyStartDate(LocalDateTime.now()); // TODO 申请开始时间 - detailSaveReqVOList.add(recordApplyDetailDO); - } - } -// recordApplyDetailService.createRecordApplyDetailBatch(detailSaveReqVOList); - return detailSaveReqVOList; +// RecordApplyDetailSaveReqVO saveReqVO = param.getDetailList().get(0); +// String assignCode = saveReqVO.getAssignCode(); // 分发号 +// RecordAssignDO recordAssignDO = new RecordAssignDO(); +// recordAssignService.createRecordAssignBatch(recordAssignDO); +// Long recordId = param.getDetailList().get(0).getDocumentId(); +// String applyFormData = param.getFormData(); +// if (ObjectUtils.isEmpty(applyFormData)) throw exception0(RECORD_APPLY_NOT_EXISTS.getCode(),"过期日期不能为空"); +// List detailSaveReqVOList = new ArrayList<>(); +// String targetUserIds = param.getTargetUserIds(); +// if (!ObjectUtils.isEmpty(targetUserIds)) { // 用户 +// String[] userIds = targetUserIds.split(","); +// for (String userId : userIds) { +// if (ObjectUtils.isEmpty(userId)) break; // 过滤空 +// RecordApplyDetailDO recordApplyDetailDO = new RecordApplyDetailDO(); +// recordApplyDetailDO.setFormData(applyFormData); +// recordApplyDetailDO.setApplyId(recordApplyDO.getId()); +// recordApplyDetailDO.setDocumentId(recordId); +// recordApplyDetailDO.setTargetId(Long.valueOf(userId));//用户Id +// recordApplyDetailDO.setTargetType(RecordConstants.TargetType.USER); +// recordApplyDetailDO.setApplyStartDate(LocalDateTime.now()); // TODO 申请开始时间 +// detailSaveReqVOList.add(recordApplyDetailDO); +// } +// } +// String targetDepartmentIds = param.getTargetDepartmentIds(); +// if (!ObjectUtils.isEmpty(targetDepartmentIds)) { +// String[] deptIds = targetDepartmentIds.split(","); +// for (String deptId : deptIds) { +// if (ObjectUtils.isEmpty(deptId)) break; // 过滤空 +// RecordApplyDetailDO recordApplyDetailDO = new RecordApplyDetailDO(); +// recordApplyDetailDO.setFormData(applyFormData); +// recordApplyDetailDO.setApplyId(recordApplyDO.getId()); +// recordApplyDetailDO.setDocumentId(recordId); +// recordApplyDetailDO.setTargetId(Long.valueOf(deptId));//部门Id +// recordApplyDetailDO.setTargetType(RecordConstants.TargetType.DEPT); +// recordApplyDetailDO.setApplyStartDate(LocalDateTime.now()); // TODO 申请开始时间 +// detailSaveReqVOList.add(recordApplyDetailDO); +// } +// } + return BeanUtils.toBean(detailList,RecordApplyDetailDO.class); } // 添加更改申请明细 @@ -390,65 +432,6 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn return detailSaveReqVOList; } - @Override - public CommonResult removeDetail(JSONObject param) { - String detailIds = param.getString("detailIds"); - if (ObjectUtils.isEmpty(detailIds)) - return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "请选择需要删除的明细数据"); - List detailIdList = Arrays.stream(detailIds.split(",")).map(Long::valueOf).toList(); - recordApplyDetailService.deleteRecordApplyDetailListByIds(detailIdList); - return CommonResult.success(true); - } - - //保存 - @Override - @Transactional(rollbackFor = Exception.class) - public CommonResult saveRecordApply(RecordApplySaveReqVO updateReqVO) { - // 校验存在 - RecordApplyDO backData = getRecordApply(updateReqVO.getId()); - if (backData == null) - throw exception(RECORD_APPLY_NOT_EXISTS); - // 如果是临时数据,保存后状态变更为未发起 - if (QmsCommonConstant.TEMP_DATA_CODE.equals(backData.getBusinessStatus())) { - updateReqVO.setBusinessStatus(QmsCommonConstant.NOT_START); - } - // 更新 - RecordApplyDO updateObj = BeanUtils.toBean(updateReqVO, RecordApplyDO.class); - recordApplyMapper.updateById(updateObj); - return CommonResult.success(true); - } - - @Override - public CommonResult getWithOpinions(Long id) { - RecordApplyDO entity = recordApplyMapper.selectById(id); - if (entity == null) - return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "申请不存在"); - - List opinions = dataOpinionService.getListByBusId(entity.getId()); - JSONObject opinionJson = new JSONObject(); - for (DataOpinionDO opinion : opinions) { - String nodeKey = opinion.getNodeKey(); - if (ObjectUtils.isEmpty(nodeKey)) - continue; - JSONObject nodeJson = new JSONObject(); - LocalDateTime opinionTime = opinion.getOpinionTime(); - nodeJson.put("nodeName", opinion.getNodeName()); - nodeJson.put("nodeKey", opinion.getNodeKey()); - nodeJson.put("opinionContent", opinion.getOpinionContent()); - if (opinionTime != null) - nodeJson.put("opinionTime", opinionTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - nodeJson.put("opinionUserName", opinion.getOpinionUserName()); - nodeJson.put("opinionUserId", opinion.getOpinionUserId()); - nodeJson.put("opinionDepartmentName", opinion.getOpinionDepartmentName()); - nodeJson.put("opinionDepartmentId", opinion.getOpinionDepartmentId()); - nodeJson.put("opinionSignatureId", opinion.getOpinionSignatureId()); - opinionJson.put(nodeKey, nodeJson); - } - - JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(entity)); - json.put("opinions", opinionJson); - return CommonResult.success(json); - } // 判断文件提交是否需要走流程 public boolean justifyRecordApply(RecordRecordDO recordDO) { @@ -481,6 +464,7 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn } else { // 需要走流程 // 判断是否到生效日期 // RecordRecordDO effectiveRecordRecordDO = isEffective(recordDO); + recordDO.setSubmitFlag("1"); recordDO.setRecordStatus(0); recordRecordService.updateRecordRecordById(recordDO); } @@ -758,9 +742,9 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn if (now.isAfter(effectiveDate) || now.isEqual(effectiveDate)) { entity.setRecordStatus(1); // 已生效 } - else { - entity.setRecordStatus(3); // 待生效 - } +// else { +// entity.setRecordStatus(3); // 待生效 +// } } else { entity.setRecordStatus(1); // 默认已生效 } @@ -816,9 +800,9 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn // recordPermissionDO.setDeleted(true); recordPermissionDOList.add(recordPermissionDO); } - recordPermissionService.updateRecordPermissionBatch(recordPermissionDOList); + if (!ObjectUtils.isEmpty(recordPermissionDOList)) recordPermissionService.updateRecordPermissionBatch(recordPermissionDOList); // 回收权限 - recordPermissionService.deleteRecordPermissionListByIds(permissionIds); + if (!ObjectUtils.isEmpty(permissionIds)) recordPermissionService.deleteRecordPermissionListByIds(permissionIds); } /** @@ -913,33 +897,33 @@ public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackIn return null; } - @Override - public Integer updateDistributionPermissionJob() { - //根据当前时间查询出申请到期的文件申请记录, - List recordApplyDetailDOS = recordApplyDetailService.updateDistributionPermissionJob(); - if (ObjectUtils.isEmpty(recordApplyDetailDOS)) return 0; - // 获取所有文件记录Id - List recordPermissionDOList = new ArrayList<>(); - recordApplyDetailDOS.forEach(item -> { //TODO - RecordPermissionDO permissionDO = new RecordPermissionDO(); - permissionDO.setSourceId(item.getDocumentId()); - permissionDO.setPermission(RecordConstants.PermissionType.VIEW); - permissionDO.setSourceType(RecordConstants.PermissionSourceType.RECORD); - if (item.getTargetType().equals(RecordConstants.TargetType.USER)) - permissionDO.setTargetType(RecordConstants.TargetType.USER); - else if (item.getTargetType().equals(RecordConstants.TargetType.DEPT)) - permissionDO.setTargetType(RecordConstants.TargetType.DEPT); - permissionDO.setTargetId(String.valueOf(item.getTargetId())); - List recordPermissionDOS = recordPermissionService.selectRecordPermission(permissionDO); - recordPermissionDOList.addAll(recordPermissionDOS); - }); - List permissionIds = new ArrayList<>(); - recordPermissionDOList.forEach(item -> { - permissionIds.add(item.getId()); - }); - recordPermissionService.deleteRecordPermissionListByIds(permissionIds); - return permissionIds.size(); - } +// @Override +// public Integer updateDistributionPermissionJob() { +// //根据当前时间查询出申请到期的文件申请记录, +// List recordApplyDetailDOS = recordApplyDetailService.updateDistributionPermissionJob(); +// if (ObjectUtils.isEmpty(recordApplyDetailDOS)) return 0; +// // 获取所有文件记录Id +// List recordPermissionDOList = new ArrayList<>(); +// recordApplyDetailDOS.forEach(item -> { //TODO +// RecordPermissionDO permissionDO = new RecordPermissionDO(); +// permissionDO.setSourceId(item.getDocumentId()); +// permissionDO.setPermission(RecordConstants.PermissionType.VIEW); +// permissionDO.setSourceType(RecordConstants.PermissionSourceType.RECORD); +// if (item.getTargetType().equals(RecordConstants.TargetType.USER)) +// permissionDO.setTargetType(RecordConstants.TargetType.USER); +// else if (item.getTargetType().equals(RecordConstants.TargetType.DEPT)) +// permissionDO.setTargetType(RecordConstants.TargetType.DEPT); +// permissionDO.setTargetId(String.valueOf(item.getTargetId())); +// List recordPermissionDOS = recordPermissionService.selectRecordPermission(permissionDO); +// recordPermissionDOList.addAll(recordPermissionDOS); +// }); +// List permissionIds = new ArrayList<>(); +// recordPermissionDOList.forEach(item -> { +// permissionIds.add(item.getId()); +// }); +// recordPermissionService.deleteRecordPermissionListByIds(permissionIds); +// return permissionIds.size(); +// } //查询提交的流程是否存在没有处理或者通过的的数据 public List selectApplyByStatus(String businessType, java.util.List documentIds, java.util.List businessStatuses) { diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java index 3066cc99..78928d4e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java @@ -102,5 +102,5 @@ public interface RecordApplyDetailService { int deleteRecordApplyDetailByApplyId(Long applyId); - List updateDistributionPermissionJob(); +// List updateDistributionPermissionJob(); } \ 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/recordapplydetail/RecordApplyDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java index f6e58bdc..449f14c4 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java @@ -141,9 +141,5 @@ public class RecordApplyDetailServiceImpl implements RecordApplyDetailService { return 1; } - @Override - public List updateDistributionPermissionJob() { - return recordApplyDetailMapper.updateDistributionPermissionJob(); - } } \ 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/recordassign/RecordAssignService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordassign/RecordAssignService.java new file mode 100644 index 00000000..bb2b68cf --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordassign/RecordAssignService.java @@ -0,0 +1,67 @@ +package com.zt.plat.module.qms.resource.record.service.recordassign; + +import java.util.*; + +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignPageReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignSaveReqVO; +import jakarta.validation.*; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; +import com.zt.plat.framework.common.pojo.PageResult; + +/** + * 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 Service 接口 + * + * @author YBP + */ +public interface RecordAssignService { + + /** + * 创建文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + RecordAssignRespVO createRecordAssign(@Valid RecordAssignSaveReqVO createReqVO); + + /** + * 更新文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + * + * @param updateReqVO 更新信息 + */ + void updateRecordAssign(@Valid RecordAssignSaveReqVO updateReqVO); + + /** + * 删除文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + * + * @param id 编号 + */ + void deleteRecordAssign(Long id); + + /** + * 批量删除文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + * + * @param ids 编号 + */ + void deleteRecordAssignListByIds(List ids); + + /** + * 获得文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + * + * @param id 编号 + * @return 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 + */ + RecordAssignDO getRecordAssign(Long id); + + /** + * 获得文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物分页 + * + * @param pageReqVO 分页查询 + * @return 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物分页 + */ + PageResult getRecordAssignPage(RecordAssignPageReqVO pageReqVO); + + boolean createRecordAssignBatch(List recordAssignDOS); + + List selectRecordAssignList(List detailDOIdS); +} \ 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/recordassign/RecordAssignServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordassign/RecordAssignServiceImpl.java new file mode 100644 index 00000000..07b47fee --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordassign/RecordAssignServiceImpl.java @@ -0,0 +1,103 @@ +package com.zt.plat.module.qms.resource.record.service.recordassign; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignPageReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordassign.vo.RecordAssignSaveReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordassign.RecordAssignDO; +import com.zt.plat.module.qms.resource.record.dal.mapper.RecordAssignMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.module.qms.enums.ErrorCodeConstants.RECORD_ASSIGN_NOT_EXISTS; + +/** + * 文件记录分发号,记录文件分发与线下对应的分发号对应,且标记到目标人物 Service 实现类 + * + * @author YBP + */ +@Service +@Validated +public class RecordAssignServiceImpl implements RecordAssignService { + + @Resource + private RecordAssignMapper recordAssignMapper; + + @Override + public RecordAssignRespVO createRecordAssign(RecordAssignSaveReqVO createReqVO) { + // 插入 + RecordAssignDO recordAssign = BeanUtils.toBean(createReqVO, RecordAssignDO.class); + recordAssignMapper.insert(recordAssign); + // 返回 + return BeanUtils.toBean(recordAssign, RecordAssignRespVO.class); + } + + @Override + public void updateRecordAssign(RecordAssignSaveReqVO updateReqVO) { + // 校验存在 + validateRecordAssignExists(updateReqVO.getId()); + // 更新 + RecordAssignDO updateObj = BeanUtils.toBean(updateReqVO, RecordAssignDO.class); + recordAssignMapper.updateById(updateObj); + } + + @Override + public void deleteRecordAssign(Long id) { + // 校验存在 + validateRecordAssignExists(id); + // 删除 + recordAssignMapper.deleteById(id); + } + + @Override + public void deleteRecordAssignListByIds(List ids) { + // 校验存在 + validateRecordAssignExists(ids); + // 删除 + recordAssignMapper.deleteByIds(ids); + } + + private void validateRecordAssignExists(List ids) { + List list = recordAssignMapper.selectByIds(ids); + if (CollUtil.isEmpty(list) || list.size() != ids.size()) { + throw exception(RECORD_ASSIGN_NOT_EXISTS); + } + } + + private void validateRecordAssignExists(Long id) { + if (recordAssignMapper.selectById(id) == null) { + throw exception(RECORD_ASSIGN_NOT_EXISTS); + } + } + + @Override + public RecordAssignDO getRecordAssign(Long id) { + return recordAssignMapper.selectById(id); + } + + @Override + public PageResult getRecordAssignPage(RecordAssignPageReqVO pageReqVO) { + return recordAssignMapper.selectPage(pageReqVO); + } + + @Override + public boolean createRecordAssignBatch(List recordAssignDOS) { + return recordAssignMapper.insertBatch(recordAssignDOS); + } + + @Override + public List selectRecordAssignList(List detailDOIdS) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(RecordAssignDO::getApplyDetailId, detailDOIdS); + return recordAssignMapper.selectList(lambdaQueryWrapper); + } + +} \ 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/recordpermission/RecordPermissionService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionService.java index be76fb7d..7cfcfb99 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionService.java @@ -110,4 +110,6 @@ public interface RecordPermissionService { boolean isEditPermissionByUserId(Long categoryId); boolean updateRecordPermissionBatch(List recordPermissionDOList); + + void updatePermission(LambdaQueryWrapper queryWrapper); } \ 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/recordpermission/RecordPermissionServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionServiceImpl.java index ce5e3218..7d25eb04 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordpermission/RecordPermissionServiceImpl.java @@ -224,6 +224,11 @@ public class RecordPermissionServiceImpl implements RecordPermissionService { return BeanUtils.toBean(recordPermission, RecordPermissionRespVO.class); } + @Override + public void updatePermission(LambdaQueryWrapper queryWrapper) { + recordPermissionMapper.update(queryWrapper); + } + @Override public void updateRecordPermission(RecordPermissionSaveReqVO updateReqVO) { // 校验存在 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 02d4db81..74351b33 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 @@ -96,6 +96,10 @@ public interface RecordRecordService { PageResult getLookRecordList(RecordRecordPageReqVO pageReqVO); + Integer updateExpireRecordJob(); + + Integer withdrawPermissionJob(); + /** * 文件更改申请流程-- 查询文件记录数据 */ 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 9c4b7967..f714da44 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 @@ -83,20 +83,10 @@ public class RecordRecordServiceImpl implements RecordRecordService { if (parentId != null && parentId == 0) throw new RuntimeException("根节点不允许直接添加文件记录信息!"); recordRecord.setCurrentFlag(1);// 是否新版本 try { - String idPath = recordCategoryDO.getIdPath(); - Long rootCategoryId = getRootCategoryId(idPath); - RecordCategoryDO category = recordCategoryService.getRecordCategory(rootCategoryId); - String customConfig = category.getCustomConfig(); - LocalDateTime effectiveDate = recordRecord.getEffectiveDate(); - LocalDateTime expirationDate = recordRecord.getExpirationDate(); - - if (ObjectUtils.isEmpty(customConfig)) { //不需要提交,判断状态 - int sts = calculateRecordStatus(effectiveDate, expirationDate); - recordRecord.setRecordStatus(sts); - } - recordRecordMapper.insert(recordRecord); - recordRecord.setMainId(recordRecord.getId()); - recordRecordMapper.updateById(recordRecord); + RecordRecordDO recordRecordDO = judgeRootCategoryJson(recordRecord); + recordRecordMapper.insert(recordRecordDO); + recordRecordDO.setMainId(recordRecordDO.getId()); + recordRecordMapper.updateById(recordRecordDO); } catch (Exception e) { throw new RuntimeException("create record error"); } @@ -119,7 +109,7 @@ public class RecordRecordServiceImpl implements RecordRecordService { // 当前日期 < 生效日期,待生效 if (effectiveDate.isAfter(now)) { - return 3; + return 0; } // 生效日期 ≤ 当前日期,判断是否过期 @@ -145,19 +135,20 @@ public class RecordRecordServiceImpl implements RecordRecordService { lambdaQueryWrapper.eq(RecordRecordDO::getCurrentFlag, 1); // 0,旧版本 recordRecordMapper.update(recordRecordDO, lambdaQueryWrapper); - Long categoryId = recordRecordDO.getCategoryId(); - RecordCategoryDO recordCategoryDO = recordCategoryService.selectById(categoryId); - String idPath = recordCategoryDO.getIdPath(); - Long rootCategoryId = getRootCategoryId(idPath); - - RecordCategoryDO recordCategory = recordCategoryService.selectById(rootCategoryId); - String customConfig = recordCategory.getCustomConfig(); - if (ObjectUtils.isEmpty(customConfig)) { //不需要提交,判断状态 - LocalDateTime effectiveDate = recordRecordDO.getEffectiveDate(); - LocalDateTime expirationDate = recordRecordDO.getExpirationDate(); - int sts = calculateRecordStatus(effectiveDate, expirationDate); - recordRecordDO.setRecordStatus(sts); - } +// Long categoryId = recordRecordDO.getCategoryId(); +// RecordCategoryDO recordCategoryDO = recordCategoryService.selectById(categoryId); +// String idPath = recordCategoryDO.getIdPath(); +// Long rootCategoryId = getRootCategoryId(idPath); +// +// RecordCategoryDO recordCategory = recordCategoryService.selectById(rootCategoryId); +// String customConfig = recordCategory.getCustomConfig(); +// if (ObjectUtils.isEmpty(customConfig)) { //不需要提交,判断状态 +// LocalDateTime effectiveDate = recordRecordDO.getEffectiveDate(); +// LocalDateTime expirationDate = recordRecordDO.getExpirationDate(); +// int sts = calculateRecordStatus(effectiveDate, expirationDate); +// recordRecordDO.setRecordStatus(sts); +// } + recordRecordDO = judgeRootCategoryJson(recordRecordDO); //创建新版本 recordRecordDO.setId(null); recordRecordDO.setCurrentFlag(1); @@ -264,6 +255,32 @@ public class RecordRecordServiceImpl implements RecordRecordService { // return recordRecordMapper.selectViewApplyRecordList(pageReqVO); // } + //通过跟分类的自定义属性判断文件状态 + public RecordRecordDO judgeRootCategoryJson(RecordRecordDO recordDO){ + RecordCategoryDO categoryDO = recordCategoryService.getRecordCategory(recordDO.getCategoryId()); + String idPath = categoryDO.getIdPath(); + Long rootCategoryId = getRootCategoryId(idPath); + RecordCategoryDO category = recordCategoryService.getRecordCategory(rootCategoryId); + String customConfig = category.getCustomConfig(); + LocalDateTime effectiveDate = recordDO.getEffectiveDate(); + LocalDateTime expirationDate = recordDO.getExpirationDate(); + + if (ObjectUtils.isEmpty(customConfig)) { //不需要提交,判断状态 + int sts = calculateRecordStatus(effectiveDate, expirationDate); + recordDO.setRecordStatus(sts); + }else { + JSONObject jsonObject = JSONObject.parseObject(customConfig); + Integer submitFlag = jsonObject.getInteger("submitFlag"); + if (submitFlag == 0) { // 不需要提交的,判断状态 + int sts = calculateRecordStatus(effectiveDate, expirationDate); + recordDO.setRecordStatus(sts); + } + } + return recordDO; + } + + + @Override @Transactional(rollbackFor = Exception.class) public RecordRecordRespVO updateRecordRecord(RecordRecordSaveReqVO updateReqVO) { @@ -272,7 +289,8 @@ public class RecordRecordServiceImpl implements RecordRecordService { RecordRecordDO updateObj = BeanUtils.toBean(updateReqVO, RecordRecordDO.class); String newVersion = updateObj.getNewVersion();// 新版本 if (ObjectUtils.isEmpty(newVersion)) { // 不是新版本,直接更新 - recordRecordMapper.updateById(updateObj); + RecordRecordDO recordRecordDO = judgeRootCategoryJson(updateObj); + recordRecordMapper.updateById(recordRecordDO); } else {// 新版本 // 是否回收 Integer collectionFlag = updateReqVO.getCollectionFlag(); @@ -440,14 +458,7 @@ public class RecordRecordServiceImpl implements RecordRecordService { PageResult result = new PageResult<>(iPage.getRecords(), iPage.getTotal()); String admin = RecordConstants.PermissionType.ADMIN; -// AtomicBoolean havePermission = new AtomicBoolean(false); -// -// recordPermissionDOS.forEach(item -> { -// String permission = item.getPermission(); -// if (admin.equals(permission)) { -// havePermission.set(true); -// } -// }); + // 填充 customConfig(仅管理员权限时填充) List recordPermissionDOAdmins = recordPermissionService.selectPermissionList(parentId, admin, null); if (!ObjectUtils.isEmpty(recordPermissionDOAdmins)) { @@ -535,7 +546,14 @@ public class RecordRecordServiceImpl implements RecordRecordService { Long parentId = getRootCategoryId(idPath); if (parentId == null) return new PageResult().setTotal(0L); + RecordCategoryDO categoryDO = recordCategoryService.selectById(parentId); + + // 判断是否有当前分类的父分类权限 (可编辑,可查看,管理员--> 任意条件) + List recordPermissionDOS = recordPermissionService.selectPermissionList(parentId, null, null); + if (ObjectUtils.isEmpty(recordPermissionDOS)) return new PageResult().setTotal(0L); + + String customConfig = categoryDO.getCustomConfig(); String appraisalFlag = pageReqVO.getAppraisalFlag(); if (!ObjectUtils.isEmpty(appraisalFlag) && appraisalFlag.equals("1")){ // 需要评审的文件 // 查询所有 根分类上 appraisalFlag 为 1 的数据 @@ -551,18 +569,32 @@ public class RecordRecordServiceImpl implements RecordRecordService { categoryIdPath.add(path); }); if (ObjectUtils.isEmpty(categoryIdPath)) return new PageResult().setTotal(0L); + + if (!ObjectUtils.isEmpty(customConfig)) { + JSONObject jsonObject = JSONObject.parseObject(customConfig); + Integer submitFlag = jsonObject.getInteger("submitFlag"); // 提交标志 + if (submitFlag == 1){ // 需要提交的,需要判断流程状态 + IPage effectiveRecordBySubmitFlagPage = recordRecordMapper.getEffectiveRecordBySubmitFlagPage(page, pageReqVO); + return new PageResult<>(effectiveRecordBySubmitFlagPage.getRecords(), effectiveRecordBySubmitFlagPage.getTotal()); + } + } // 查询 分类下面所有的记录 - pageReqVO.setRecordStatus(1); - IPage recordRecordDOS = recordRecordMapper.selectRecordByIdPathLike(page,pageReqVO, categoryIdPath); +// pageReqVO.setRecordStatus(1); +// IPage recordRecordDOS = recordRecordMapper.selectRecordByIdPathLike(page,pageReqVO, categoryIdPath); + IPage recordRecordDOS = recordRecordMapper.getEffectiveRecordPage(page,pageReqVO); return new PageResult<>(recordRecordDOS.getRecords(), recordRecordDOS.getTotal()); } - // 判断是否有当前分类的父分类权限 (可编辑,可查看,管理员--> 任意条件) - List recordPermissionDOS = recordPermissionService.selectPermissionList(parentId, null, null); - if (ObjectUtils.isEmpty(recordPermissionDOS)) return new PageResult().setTotal(0L); + // 判断是否需要提交(json) + if (!ObjectUtils.isEmpty(customConfig)) { + JSONObject jsonObject = JSONObject.parseObject(customConfig); + Integer submitFlag = jsonObject.getInteger("submitFlag"); // 提交标志 + if (submitFlag == 1){ // 需要提交的,需要判断流程状态 + IPage effectiveRecordBySubmitFlagPage = recordRecordMapper.getEffectiveRecordBySubmitFlagPage(page, pageReqVO); + return new PageResult<>(effectiveRecordBySubmitFlagPage.getRecords(), effectiveRecordBySubmitFlagPage.getTotal()); + } + } - // 设置默认查询最新版 -// pageReqVO.setCurrentFlag(1); // 查询有效,且即将生效的文件 IPage recordRecordDOPageResult = recordRecordMapper.getEffectiveRecordPage(page,pageReqVO); @@ -575,4 +607,42 @@ public class RecordRecordServiceImpl implements RecordRecordService { PageResult recordRecordDOPageResult = recordRecordMapper.selectPage(pageReqVO); return BeanUtils.toBean(recordRecordDOPageResult, RecordRecordRespVO.class); } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer updateExpireRecordJob() { + LocalDateTime now = LocalDateTime.now(); + LambdaQueryWrapper updateWrapper = Wrappers.lambdaQuery(); + updateWrapper.eq(RecordRecordDO::getExpirationStatus, 0) + .le(RecordRecordDO::getExpirationDate, now); + List recordRecordDOS = recordRecordMapper.selectList(updateWrapper); + if (ObjectUtils.isEmpty(recordRecordDOS)) return 0; + List recordIds = new ArrayList<>(); + recordRecordDOS.forEach(item -> { + recordIds.add(item.getId()); + item.setExpirationStatus(1); + item.setCancelFlag(1); + }); + recordRecordMapper.updateBatch(recordRecordDOS); + + // 回收权限 + LambdaQueryWrapper query = Wrappers.lambdaQuery(); + query.eq(RecordPermissionDO::getSourceType,RecordConstants.PermissionSourceType.RECORD); + query.in(RecordPermissionDO::getTargetId,recordIds); + List recordPermissionDOS = recordPermissionService.selectList(query); + if (ObjectUtils.isEmpty(recordPermissionDOS)) return recordRecordDOS.size(); + List permissionIds = new ArrayList<>(); + recordPermissionDOS.forEach(item -> { + item.setExpirationStatus("1"); + permissionIds.add(item.getId()); + }); + recordPermissionService.updateRecordPermissionBatch(recordPermissionDOS); // 更新过期 + recordPermissionService.deleteRecordPermissionListByIds(permissionIds); // 删除 + return recordRecordDOS.size(); + } + + @Override + public Integer withdrawPermissionJob() { + return 0; + } } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.xml b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.xml index b56cf99b..8641a2de 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.xml +++ b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordApplyDetailMapper.xml @@ -15,6 +15,7 @@ trad.DOC_ID as documentId, trad.TGT_TP as targetType, trad.TGT_ID as targetId, + trad.TGT_NAME as targetName, trad.IS_MDF as isModify, trad.MDF_CAUS as modifyCause, trad.APL_STRT_DT as applyStartDate, @@ -38,6 +39,7 @@ trad.DOC_ID as documentId, trad.TGT_TP as targetType, trad.TGT_ID as targetId, + trad.TGT_NAME as targetName, trad.IS_MDF as isModify, trad.MDF_CAUS as modifyCause, trad.APL_STRT_DT as applyStartDate, @@ -55,13 +57,14 @@ WHERE t.rn = 1 - - SELECT trad.ID as id, trad.APL_ID as applyId, trad.DOC_ID as documentId, trad.TGT_TP as targetType, trad.TGT_ID as targetId, + trad.TGT_NAME as targetName, trad.IS_MDF as isModify, trad.MDF_CAUS as modifyCause, trad.APL_STRT_DT as applyStartDate, @@ -82,10 +85,6 @@ FROM T_RCD_APL_DTL trad LEFT JOIN T_RCD_APL tra ON tra.ID = trad.APL_ID where tra.DELETED = 0 - and tra.BSN_TP = '文件分发' - and now() > tra.expirationDate - - - + \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordAssignMapper.xml b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordAssignMapper.xml new file mode 100644 index 00000000..6afce0eb --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordAssignMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.xml b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.xml index ce8376b9..500539a6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.xml +++ b/zt-module-qms/zt-module-qms-server/src/main/resources/com/zt/plat/module/qms/resource/record/dal/mapper/RecordRecordMapper.xml @@ -7,9 +7,7 @@ - trr - . - ID + trr.ID , trr.CTGR_ID AS categoryId, trr.CD AS code, trr.BSN_TP AS businessType, trr.FORM_KY AS formKey, trr.NAME, trr.VER AS version, trr.CRNT_FLG AS currentFlag, @@ -47,31 +45,25 @@ resultType="com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO"> SELECT , - (SELECT tra.ID - FROM t_rcd_apl_dtl trad - INNER JOIN t_rcd_apl tra ON trad.APL_ID = tra.ID AND tra.BSN_TP = '文件提交' - WHERE trad.DOC_ID = trr.ID - AND ROWNUM = 1) AS applyId, - (SELECT tra.FLW_INSC_ID - FROM t_rcd_apl_dtl trad - INNER JOIN t_rcd_apl tra ON trad.APL_ID = tra.ID AND tra.BSN_TP = '文件提交' - WHERE trad.DOC_ID = trr.ID - AND ROWNUM = 1) AS flowInstanceId, - (SELECT tra.BSN_STS - FROM t_rcd_apl_dtl trad - INNER JOIN t_rcd_apl tra ON trad.APL_ID = tra.ID AND tra.BSN_TP = '文件提交' - WHERE trad.DOC_ID = trr.ID - AND ROWNUM = 1) AS applyBusinessStatus + apply_info.ID AS applyId, + apply_info.FLW_INSC_ID AS flowInstanceId, + apply_info.BSN_STS AS applyBusinessStatus FROM t_rcd_rcd trr + LEFT JOIN ( + SELECT + trad.DOC_ID, + tra.ID, + tra.FLW_INSC_ID, + tra.BSN_STS, + -- 使用 DOC_ID 分组,按照规则排序(比如想要最新的申请,就用 CREATE_TIME DESC) + ROW_NUMBER() OVER (PARTITION BY trad.DOC_ID ORDER BY tra.ID DESC) as rn + FROM t_rcd_apl_dtl trad + INNER JOIN t_rcd_apl tra ON trad.APL_ID = tra.ID AND tra.BSN_TP = '文件提交' + ) + apply_info ON trr.ID = apply_info.DOC_ID AND apply_info.rn = 1 + trr.deleted = 0 - - - - - - - AND trr.CNL_FLG = #{reqVO.cancelFlag} @@ -148,12 +140,10 @@ FROM T_RCD_RCD trr INNER JOIN T_RCD_CTGR trc ON trr.CTGR_ID = trc.ID WHERE trr.deleted = 0 and trr.EXPR_STS = 0 and trr.CNL_FLG = 0 - - and (trr.PMNT = "1" or trr.RCD_STS = 1 or trr.RCD_STS = 3) + + and (trr.PMNT = '1' or + (trr.RCD_STS = 1 or now() > trr.EFCT_DT) + ) @@ -189,6 +179,79 @@ + + + +