Forráskód Böngészése

文档管理:
- 新增逻辑修复
- 递交文件完成
- 审核文件完成
- 查看审核记录完成

Huanyi 10 órája
szülő
commit
3152487c9b
15 módosított fájl, 370 hozzáadás és 7 törlés
  1. 2 0
      ruoyi-admin/src/main/resources/i18n/messages_en_US.properties
  2. 2 0
      ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties
  3. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java
  4. 42 0
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/controller/CommonOssController.java
  5. 9 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DocumentAuditorTypeConst.java
  6. 37 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/DocumentController.java
  7. 37 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/DocumentAuditLog.java
  8. 14 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentAuditBo.java
  9. 17 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentAuditLogBo.java
  10. 10 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentFilingBo.java
  11. 12 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentSubmitBo.java
  12. 50 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentAuditLogVo.java
  13. 8 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/mapper/DocumentAuditLogMapper.java
  14. 12 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java
  15. 117 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java

+ 2 - 0
ruoyi-admin/src/main/resources/i18n/messages_en_US.properties

@@ -77,3 +77,5 @@ applet.auth.nostrategy=The method is not supported.
 
 ## 文件夹管理
 document.folder.restrictionerror=The sum of the same level cannot exceed the maximum limit of the parent lavel.
+
+document.document.audit.documentnotfound=The document is not found.

+ 2 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -77,3 +77,5 @@ applet.auth.nostrategy=该方式不支持
 
 ## 文件夹管理
 document.folder.restrictionerror=子层级最大层级数相加不得大于父级的最大层级数
+
+document.document.audit.documentnotfound=对应文档未找到

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java

@@ -53,7 +53,7 @@ public class R<T> implements Serializable {
     }
 
     public static <T> R<T> fail() {
-        return restResult(null, FAIL, MessageUtils.message("r.ok"));
+        return restResult(null, FAIL, MessageUtils.message("r.fail"));
     }
 
     public static <T> R<T> fail(String msg) {

+ 42 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/controller/CommonOssController.java

@@ -0,0 +1,42 @@
+package com.yingpaipay.system.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.vo.SysOssUploadVo;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.dromara.system.service.ISysOssService;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/common/resource/oss")
+public class CommonOssController extends BaseController {
+
+    private final ISysOssService ossService;
+
+    @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<SysOssUploadVo> upload(@RequestPart("file") MultipartFile file) {
+        if (ObjectUtil.isNull(file)) {
+            return R.fail("上传文件不能为空");
+        }
+        SysOssVo oss = ossService.upload(file);
+        SysOssUploadVo uploadVo = new SysOssUploadVo();
+        uploadVo.setUrl(oss.getUrl());
+        uploadVo.setFileName(oss.getOriginalName());
+        uploadVo.setOssId(oss.getOssId().toString());
+        return R.ok(uploadVo);
+    }
+
+}

+ 9 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DocumentAuditorTypeConst.java

@@ -0,0 +1,9 @@
+package com.yingpaipay.business.constant;
+
+public interface DocumentAuditorTypeConst {
+
+    String AI = "0";
+
+    String MANUAL = "1";
+
+}

+ 37 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/DocumentController.java

@@ -2,7 +2,8 @@ package com.yingpaipay.business.controller;
 
 import java.util.List;
 
-import com.yingpaipay.business.domain.bo.DocumentMarkBo;
+import com.yingpaipay.business.domain.bo.*;
+import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -19,7 +20,6 @@ import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import com.yingpaipay.business.domain.vo.DocumentVo;
-import com.yingpaipay.business.domain.bo.DocumentBo;
 import com.yingpaipay.business.service.IDocumentService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
@@ -110,4 +110,39 @@ public class DocumentController extends BaseController {
     public R<Void> mark(@RequestBody DocumentMarkBo bo) {
         return toAjax(documentService.mark(bo));
     }
+
+    @SaCheckPermission("document:document:submit")
+    @Log(title = "文档", businessType = BusinessType.UPDATE)
+    @PutMapping("/submit")
+    public R<Void> submit(@RequestBody DocumentSubmitBo bo) {
+        return toAjax(documentService.submit(bo));
+    }
+
+    @SaCheckPermission("document:document:audit")
+    @Log(title = "文档", businessType = BusinessType.UPDATE)
+    @PutMapping("/audit")
+    public R<Void> audit(@RequestBody DocumentAuditBo bo) {
+        return toAjax(documentService.audit(bo));
+    }
+
+    @SaCheckPermission("document:document:confirmSubmit")
+    @Log(title = "文档", businessType = BusinessType.DELETE)
+    @DeleteMapping("/confirmSubmit")
+    public R<Void> confirmSubmit(@RequestParam("id") Long id) {
+        return toAjax(documentService.confirmSubmit(id));
+    }
+
+    @SaCheckPermission("document:document:logAudit")
+    @GetMapping("/logAudit")
+    public TableDataInfo<DocumentAuditLogVo> logAudit(DocumentAuditLogBo bo, PageQuery pageQuery) {
+        return documentService.logAudit(bo, pageQuery);
+    }
+
+    @SaCheckPermission("document:document:filing")
+    @Log(title = "文档", businessType = BusinessType.UPDATE)
+    @PutMapping("/filing")
+    public R<Void> filing(@RequestBody DocumentFilingBo bo) {
+        return toAjax(documentService.filing(bo));
+    }
+
 }

+ 37 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/DocumentAuditLog.java

@@ -0,0 +1,37 @@
+package com.yingpaipay.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("document_audit_log")
+public class DocumentAuditLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    private Long documentId;
+
+    private Long ossId;
+
+    private String auditorType;
+
+    private Long auditorId;
+
+    private Integer result;
+
+    private String rejectReason;
+
+    private Date auditTime;
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentAuditBo.java

@@ -0,0 +1,14 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class DocumentAuditBo {
+
+    private Long documentId;
+
+    private Integer result;
+
+    private String rejectReason;
+
+}

+ 17 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentAuditLogBo.java

@@ -0,0 +1,17 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class DocumentAuditLogBo {
+
+    private Long documentId;
+
+    private Integer result;
+
+    private Map<String, Object> params = new HashMap<>();
+
+}

+ 10 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentFilingBo.java

@@ -0,0 +1,10 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class DocumentFilingBo {
+
+    private Long documentId;
+
+}

+ 12 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentSubmitBo.java

@@ -0,0 +1,12 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class DocumentSubmitBo {
+
+    private Long documentId;
+
+    private Long ossId;
+
+}

+ 50 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentAuditLogVo.java

@@ -0,0 +1,50 @@
+package com.yingpaipay.business.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.yingpaipay.business.constant.DictTypeConst;
+import com.yingpaipay.business.domain.DocumentAuditLog;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.util.Date;
+
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = DocumentAuditLog.class)
+public class DocumentAuditLogVo {
+
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    @ExcelProperty(value = "审核文件")
+    private String documentName;
+    private Long documentId;
+
+    @ExcelProperty(value = "实际文件")
+    private String ossUrl;
+    private Long ossId;
+
+    @ExcelProperty(value = "审核人类型")
+    @ExcelDictFormat(dictType = DictTypeConst.AUDITOR_TYPE)
+    private String auditorType;
+
+    @ExcelProperty(value = "审核人")
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "auditorId")
+    private String auditorName;
+    private Long auditorId;
+
+    @ExcelProperty(value = "审核结果")
+    private String resultLabel;
+    private Integer result;
+
+    @ExcelProperty(value = "驳回理由")
+    private String rejectReason;
+
+    @ExcelProperty(value = "审核日期")
+    private Date auditTime;
+
+}

+ 8 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/mapper/DocumentAuditLogMapper.java

@@ -0,0 +1,8 @@
+package com.yingpaipay.business.mapper;
+
+import com.yingpaipay.business.domain.DocumentAuditLog;
+import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+public interface DocumentAuditLogMapper extends BaseMapperPlus<DocumentAuditLog, DocumentAuditLogVo> {
+}

+ 12 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java

@@ -1,8 +1,8 @@
 package com.yingpaipay.business.service;
 
-import com.yingpaipay.business.domain.bo.DocumentMarkBo;
+import com.yingpaipay.business.domain.bo.*;
+import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
 import com.yingpaipay.business.domain.vo.DocumentVo;
-import com.yingpaipay.business.domain.bo.DocumentBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
@@ -68,4 +68,14 @@ public interface IDocumentService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     boolean mark(DocumentMarkBo bo);
+
+    boolean submit(DocumentSubmitBo bo);
+
+    boolean audit(DocumentAuditBo bo);
+
+    boolean confirmSubmit(Long id);
+
+    TableDataInfo<DocumentAuditLogVo> logAudit(DocumentAuditLogBo bo, PageQuery pageQuery);
+
+    boolean filing(DocumentFilingBo bo);
 }

+ 117 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java

@@ -1,8 +1,16 @@
 package com.yingpaipay.business.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yingpaipay.business.constant.DictTypeConst;
-import com.yingpaipay.business.domain.bo.DocumentMarkBo;
+import com.yingpaipay.business.constant.DocumentAuditorTypeConst;
+import com.yingpaipay.business.constant.DocumentStatusConst;
+import com.yingpaipay.business.domain.DocumentAuditLog;
+import com.yingpaipay.business.domain.bo.*;
+import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
+import com.yingpaipay.business.mapper.DocumentAuditLogMapper;
+import org.dromara.common.core.exception.BusinessException;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -11,17 +19,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.service.ISysDictDataService;
 import org.dromara.system.service.ISysDictTypeService;
 import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.ISysUserService;
 import org.springframework.stereotype.Service;
-import com.yingpaipay.business.domain.bo.DocumentBo;
 import com.yingpaipay.business.domain.vo.DocumentVo;
 import com.yingpaipay.business.domain.Document;
 import com.yingpaipay.business.mapper.DocumentMapper;
 import com.yingpaipay.business.service.IDocumentService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -37,6 +47,7 @@ import java.util.*;
 public class DocumentServiceImpl implements IDocumentService {
 
     private final DocumentMapper baseMapper;
+    private final DocumentAuditLogMapper auditLogMapper;
 
     private final ISysDictTypeService dictTypeService;
     private final ISysOssService ossService;
@@ -190,4 +201,108 @@ public class DocumentServiceImpl implements IDocumentService {
                 .set(Document::getType, bo.getType())
         ) > 0;
     }
+
+    @Override
+    public boolean submit(DocumentSubmitBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(Document.class)
+                .eq(Document::getId, bo.getDocumentId())
+                .set(Document::getOssId, bo.getOssId())
+                .set(Document::getSubmitterId, LoginHelper.getUserId())
+                .set(Document::getStatus, DocumentStatusConst.UN_AUDIT)
+        ) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean audit(DocumentAuditBo bo) {
+
+        Document document = baseMapper.selectById(bo.getDocumentId());
+        if (document == null) {
+            throw new BusinessException(MessageUtils.message("document.document.audit.documentnotfound"));
+        }
+        document.setStatus(bo.getResult());
+        boolean documentFlag = baseMapper.updateById(document) == 0;
+        if (documentFlag) {
+            throw new RuntimeException("修改文档状态失败");
+        }
+
+        boolean logFlag = auditLogMapper.insert(buildLog(document, DocumentAuditorTypeConst.MANUAL, bo)) == 0;
+        if (logFlag) {
+            throw new RuntimeException("新增审核日志失败");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean confirmSubmit(Long id) {
+        return baseMapper.deleteById(id) > 0;
+    }
+
+    @Override
+    public TableDataInfo<DocumentAuditLogVo> logAudit(DocumentAuditLogBo bo, PageQuery pageQuery) {
+        if (bo.getDocumentId() == null) {
+            return TableDataInfo.build();
+        }
+        IPage<DocumentAuditLogVo> page = auditLogMapper.selectVoPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(DocumentAuditLog.class)
+                .orderByDesc(DocumentAuditLog::getId)
+                .eq(DocumentAuditLog::getDocumentId, bo.getDocumentId())
+                .eq(bo.getResult() != null, DocumentAuditLog::getResult, bo.getResult())
+                .ge(bo.getParams().containsKey("earliestTime"), DocumentAuditLog::getAuditTime, bo.getParams().get("earliestTime"))
+                .le(bo.getParams().containsKey("lagtestTime"), DocumentAuditLog::getAuditTime, bo.getParams().get("lagtestTime"))
+        );
+        buildLogVos(page.getRecords());
+        return TableDataInfo.build(page);
+    }
+
+    private void buildLogVos(List<DocumentAuditLogVo> vos) {
+        List<Long> documentIds = new ArrayList<>();
+        Map<Long, Document> documentMap = new HashMap<>();
+        List<Long> ossIds = new ArrayList<>();
+        Map<Long, SysOssVo> ossMap = new HashMap<>();
+        vos.forEach(e -> {
+            documentIds.add(e.getDocumentId());
+            ossIds.add(e.getOssId());
+        });
+        ossService.queryListByIds(ossIds).forEach(e -> ossMap.put(e.getOssId(), e));
+        if (!documentIds.isEmpty()) {
+            baseMapper.selectByIds(documentIds).forEach(e -> documentMap.put(e.getId(), e));
+        }
+        vos.forEach(e -> {
+            SysOssVo ossVo = ossMap.get(e.getOssId());
+            Document document = documentMap.get(e.getDocumentId());
+            e.setOssUrl(Optional.ofNullable(ossVo).map(SysOssVo::getUrl).orElse(null));
+            e.setDocumentName(Optional.ofNullable(document).map(Document::getName).orElse(null));
+        });
+    }
+
+    @Override
+    public boolean filing(DocumentFilingBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(Document.class)
+                .eq(Document::getId, bo.getDocumentId())
+                .set(Document::getStatus, DocumentStatusConst.FILING)
+        ) > 0;
+    }
+
+    private DocumentAuditLog buildLog(Document document, String type, DocumentAuditBo bo) {
+        DocumentAuditLog log = new DocumentAuditLog();
+        log.setDocumentId(document.getId());
+        log.setOssId(document.getOssId());
+        log.setAuditorType(type);
+        log.setAuditorId(LoginHelper.getUserId());
+        log.setResult(bo.getResult());
+        log.setRejectReason(bo.getRejectReason());
+        log.setAuditTime(new Date());
+        log.setTenantId(TenantHelper.getTenantId());
+        log.setCreateDept(LoginHelper.getDeptId());
+        log.setCreateBy(LoginHelper.getUserId());
+        log.setCreateTime(new Date());
+        log.setUpdateBy(LoginHelper.getUserId());
+        log.setUpdateTime(new Date());
+        return log;
+    }
 }