Browse Source

OA代码V0.3提交

fuyuchuan 4 weeks ago
parent
commit
ddeaf2e447
20 changed files with 442 additions and 20 deletions
  1. 3 3
      service-oa/service-oa-biz/pom.xml
  2. 4 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/ServiceOaApplication.java
  3. 1 1
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/MybatisGeneratorUtils.java
  4. 3 2
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaApprovalController.java
  5. 22 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaFlowController.java
  6. 22 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaNodeController.java
  7. 76 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaFlow.java
  8. 75 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaNode.java
  9. 18 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaFlowMapper.java
  10. 18 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaNodeMapper.java
  11. 2 1
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaApprovalService.java
  12. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaFlowService.java
  13. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaNodeService.java
  14. 6 5
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaApprovalServiceImpl.java
  15. 20 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFlowServiceImpl.java
  16. 71 3
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFormDefinitionServiceImpl.java
  17. 20 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaNodeServiceImpl.java
  18. 11 5
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/utils/OaProcessAnalysis.java
  19. 19 0
      service-oa/service-oa-biz/src/main/resources/mapper/oa/OaFlowMapper.xml
  20. 19 0
      service-oa/service-oa-biz/src/main/resources/mapper/oa/OaNodeMapper.xml

+ 3 - 3
service-oa/service-oa-biz/pom.xml

@@ -51,11 +51,11 @@
 
         <!-- 流程XML解析 -->
         <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
-        <dependency>
+<!--        <dependency>
             <groupId>org.dom4j</groupId>
             <artifactId>dom4j</artifactId>
-            <version>2.1.1</version>
-        </dependency>
+            <version>2.1.4</version>
+        </dependency>-->
 
     </dependencies>
 

+ 4 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/ServiceOaApplication.java

@@ -9,6 +9,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
@@ -23,6 +25,8 @@ import java.net.UnknownHostException;
 @MapperScan(value = "com.usky.oa.mapper")
 @ComponentScan("com.usky")
 @SpringBootApplication
+//开启异步
+@EnableAsync
 public class ServiceOaApplication
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOaApplication.class);

+ 1 - 1
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/MybatisGeneratorUtils.java

@@ -71,7 +71,7 @@ public class MybatisGeneratorUtils {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); // 使用lombok
         // 修改自己想要生成的表
-        strategy.setInclude("oa_jb_document");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude(new String[]{"oa_flow", "oa_node"});  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 3 - 2
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaApprovalController.java

@@ -76,10 +76,11 @@ public class OaApprovalController {
         oaApprovalService.approve(id, approvalStatus, opinion);
     }
 
-    @GetMapping("/analysisTest")
+    // xml 流程解析测试
+/*    @GetMapping("/analysisTest")
     public void analysisTest(@RequestParam(value = "id") Integer id) {
         oaApprovalService.analysisTest(id);
-    }
+    }*/
 
 }
 

+ 22 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaFlowController.java

@@ -0,0 +1,22 @@
+package com.usky.oa.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * oa_审批流程表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@RestController
+@RequestMapping("/oaFlow")
+public class OaFlowController {
+
+}
+

+ 22 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaNodeController.java

@@ -0,0 +1,22 @@
+package com.usky.oa.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * oa_流程节点表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@RestController
+@RequestMapping("/oaNode")
+public class OaNodeController {
+
+}
+

+ 76 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaFlow.java

@@ -0,0 +1,76 @@
+package com.usky.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * oa_审批流程表
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OaFlow implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 流程表主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 流程名称
+     */
+    private String flowName;
+
+    /**
+     * 表单标识
+     */
+    private String docType;
+
+    /**
+     * 流程说明
+     */
+    private String description;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+
+}

+ 75 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaNode.java

@@ -0,0 +1,75 @@
+package com.usky.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * oa_流程节点表
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OaNode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 节点表主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 流程ID
+     */
+    private Integer flowId;
+
+    /**
+     * 节点名称
+     */
+    private String nodeName;
+
+    /**
+     * 上级节点
+     */
+    private Integer parentId;
+
+    /**
+     * 节点类型 (1:审批节点 2:抄送节点)
+     */
+    private Integer nodeType;
+
+    /**
+     * 节点审批权限范围(0:指定成员,1:部门主管,2:发起人自选,3:职位)
+     */
+    private Integer nodeScope;
+
+    /**
+     * 审批人id
+     */
+    private String proposer;
+
+    /**
+     * 审批部门id
+     */
+    private Integer deptId;
+
+    /**
+     * 职位id
+     */
+    private Integer jobId;
+
+    /**
+     * 节点编号
+     */
+    private String nodeNo;
+
+
+}

+ 18 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaFlowMapper.java

@@ -0,0 +1,18 @@
+package com.usky.oa.mapper;
+
+import com.usky.oa.domain.OaFlow;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * oa_审批流程表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Repository
+public interface OaFlowMapper extends CrudMapper<OaFlow> {
+
+}

+ 18 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaNodeMapper.java

@@ -0,0 +1,18 @@
+package com.usky.oa.mapper;
+
+import com.usky.oa.domain.OaNode;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * oa_流程节点表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Repository
+public interface OaNodeMapper extends CrudMapper<OaNode> {
+
+}

+ 2 - 1
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaApprovalService.java

@@ -46,5 +46,6 @@ public interface OaApprovalService extends CrudService<OaApproval> {
      */
     void approve(Integer id, Integer approvalStatus, String opinion);
 
-    void analysisTest(Integer id);
+    // xml 流程解析测试
+    // void analysisTest(Integer id);
 }

+ 16 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaFlowService.java

@@ -0,0 +1,16 @@
+package com.usky.oa.service;
+
+import com.usky.oa.domain.OaFlow;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * oa_审批流程表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+public interface OaFlowService extends CrudService<OaFlow> {
+
+}

+ 16 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaNodeService.java

@@ -0,0 +1,16 @@
+package com.usky.oa.service;
+
+import com.usky.oa.domain.OaNode;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * oa_流程节点表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+public interface OaNodeService extends CrudService<OaNode> {
+
+}

+ 6 - 5
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaApprovalServiceImpl.java

@@ -16,7 +16,7 @@ import com.usky.oa.mapper.OaDocumentMapper;
 import com.usky.oa.mapper.OaFormDefinitionMapper;
 import com.usky.oa.service.OaApprovalService;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.oa.service.utils.OaProcessAnalysis;
+// import com.usky.oa.service.utils.OaProcessAnalysis;
 import com.usky.oa.service.utils.OaSendMessageCenter;
 import com.usky.oa.service.vo.OaApprovalCountVO;
 import com.usky.system.domain.SysUser;
@@ -54,8 +54,8 @@ public class OaApprovalServiceImpl extends AbstractCrudService<OaApprovalMapper,
     @Autowired
     private OaSendMessageCenter oaSendMessageCenter;
 
-    @Autowired
-    private OaProcessAnalysis oaProcessAnalysis;
+/*    @Autowired
+    private OaProcessAnalysis oaProcessAnalysis;*/
 
     @Autowired
     private OaFormDefinitionMapper oaFormDefinitionMapper;
@@ -163,13 +163,14 @@ public class OaApprovalServiceImpl extends AbstractCrudService<OaApprovalMapper,
         oaSendMessageCenter.sendAsyncMessage(oaApproval.getCreateBy(), Long.valueOf(oaApproval.getProposer()), oaApproval.getId(), receivers, isPass);
     }
 
-    @Override
+    // xml 流程解析测试
+/*    @Override
     public void analysisTest(Integer id) {
         LambdaQueryWrapper<OaFormDefinition> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(OaFormDefinition::getId, id);
         String flowInfo = oaFormDefinitionMapper.selectOne(queryWrapper).getFlowInfo();
         oaProcessAnalysis.processAnalysis(flowInfo);
-    }
+    }*/
 
     // 待处理
     private List<OaApproval> getPendingSum(Integer tenantId, Long userId, LocalDateTime oneYearAgo, LocalDateTime now) {

+ 20 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFlowServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.oa.service.impl;
+
+import com.usky.oa.domain.OaFlow;
+import com.usky.oa.mapper.OaFlowMapper;
+import com.usky.oa.service.OaFlowService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * oa_审批流程表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Service
+public class OaFlowServiceImpl extends AbstractCrudService<OaFlowMapper, OaFlow> implements OaFlowService {
+
+}

+ 71 - 3
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFormDefinitionServiceImpl.java

@@ -1,5 +1,7 @@
 package com.usky.oa.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.shaded.com.google.gson.JsonObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,10 +10,11 @@ import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
-import com.usky.oa.domain.OaDocument;
-import com.usky.oa.domain.OaFormDefinition;
+import com.usky.oa.domain.*;
 import com.usky.oa.mapper.OaDocumentMapper;
+import com.usky.oa.mapper.OaFlowMapper;
 import com.usky.oa.mapper.OaFormDefinitionMapper;
+import com.usky.oa.mapper.OaNodeMapper;
 import com.usky.oa.service.OaDocumentService;
 import com.usky.oa.service.OaFormDefinitionService;
 import com.usky.common.mybatis.core.AbstractCrudService;
@@ -42,6 +45,12 @@ public class OaFormDefinitionServiceImpl extends AbstractCrudService<OaFormDefin
     @Autowired
     private OaDocumentMapper oaDocumentMapper;
 
+    @Autowired
+    private OaNodeMapper oaNodeMapper;
+
+    @Autowired
+    private OaFlowMapper oaFlowMapper;
+
     /**
      * 新增/更新 表单
      * 此方法负责验证表单定义的合法性,包括表单名称和标识的唯一性、长度限制,并最终保存合法的表单定义
@@ -81,7 +90,6 @@ public class OaFormDefinitionServiceImpl extends AbstractCrudService<OaFormDefin
             // BeanUtils.copyBeanProp(oaFormDefinition, oaFormDefinition);
             // 判断表单名称和标识是否重复
             selectByNameOrSign(formName, formSign);
-
             oaFormDefinition.setCreateBy(username);
             oaFormDefinition.setDeptId(deptId);
             oaFormDefinition.setTenantId(tenantId);
@@ -104,6 +112,66 @@ public class OaFormDefinitionServiceImpl extends AbstractCrudService<OaFormDefin
 
             oaFormDefinitionMapper.updateById(oaFormDefinition);
         }
+
+        // 新增流程数据
+        OaFlow oaFlow = new OaFlow();
+        oaFlow.setFlowName(oaFormDefinition.getFormName() + "的流程");
+        oaFlow.setDocType(oaFormDefinition.getFormSign());
+        oaFlow.setCreateBy(username);
+        oaFlow.setCreateTime(now);
+        oaFlow.setDeptId(deptId);
+        oaFlow.setTenantId(tenantId);
+        oaFlowMapper.insert(oaFlow);
+
+        // 获取JSON字符串内的node节点信息
+        String fieldInfo = oaFormDefinition.getFlowInfo();
+        if (StringUtils.isBlank(fieldInfo)) {
+            throw new BusinessException("信息不能为空");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(fieldInfo);
+        if (jsonObject.containsKey("node")) {
+            List<JSONObject> nodeList = jsonObject.getJSONArray("node").toJavaList(JSONObject.class);
+            for (JSONObject node : nodeList) {
+                String nodeNo = node.getString("nodebh");
+                String nodeName = node.getString("nodeName");
+                Integer nodeType = node.getInteger("nodeType");
+                Integer nodeScope = node.getInteger("nodeScope");
+                String proposer = null;
+                Integer deptId2 = null;
+                Integer jobId = null;
+
+                // 用于记录上一个节点的 ID
+                Integer lastNodeId = null;
+
+                switch (nodeScope) {
+                    case 0:
+                    case 1:
+                    case 2:
+                        proposer = node.getString("appointApprover");
+                        break;
+                    case 3:
+                        deptId2 = node.getInteger("deptId");
+                        break;
+                    case 4:
+                        jobId = node.getInteger("jobId");
+                        break;
+                    default:
+                        throw new BusinessException("节点权限范围不正确");
+                }
+
+                OaNode oaNode = new OaNode();
+                oaNode.setNodeNo(nodeNo);
+                oaNode.setNodeName(nodeName);
+                oaNode.setNodeType(nodeType);
+                oaNode.setNodeScope(nodeScope);
+                oaNode.setProposer(proposer);
+                oaNode.setDeptId(deptId2);
+                oaNode.setJobId(jobId);
+                oaNode.setParentId(lastNodeId);
+                oaNodeMapper.insert(oaNode);
+                lastNodeId = oaNode.getId();
+            }
+        }
     }
 
     /**

+ 20 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaNodeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.oa.service.impl;
+
+import com.usky.oa.domain.OaNode;
+import com.usky.oa.mapper.OaNodeMapper;
+import com.usky.oa.service.OaNodeService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * oa_流程节点表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2025-02-06
+ */
+@Service
+public class OaNodeServiceImpl extends AbstractCrudService<OaNodeMapper, OaNode> implements OaNodeService {
+
+}

+ 11 - 5
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/utils/OaProcessAnalysis.java

@@ -1,3 +1,4 @@
+/*
 package com.usky.oa.service.utils;
 
 import com.usky.common.core.exception.BusinessException;
@@ -6,26 +7,30 @@ import org.dom4j.DocumentException;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 
-import java.io.StringReader;
-
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
 
+*/
 /**
  *
  * @author fyc
  * @email yuchuan.fu@chinausky.com
  * @date 2025/1/23
- */
+ *//*
+
 @Slf4j
 @Configuration
 public class OaProcessAnalysis {
     public void processAnalysis(String xmlString) {
         try {
-            // 创建 SAXReader 对象
+            // 移除潜在的空格/BOM
+            xmlString = xmlString.trim().replaceFirst("^\uFEFF", "");
+            // 替换HTML实体
+            // xmlString = xmlString.replace("&#34;", "\"");
+
             SAXReader reader = new SAXReader();
             // 将 XML 字符串解析为 Document 对象
-            Document document = reader.read(new StringReader(xmlString));
+            Document document = reader.read(new java.io.StringReader(xmlString));
 
             // 获取根元素
             Element root = document.getRootElement();
@@ -51,3 +56,4 @@ public class OaProcessAnalysis {
         });
     }
 }
+*/

+ 19 - 0
service-oa/service-oa-biz/src/main/resources/mapper/oa/OaFlowMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.oa.mapper.OaFlowMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.oa.domain.OaFlow">
+        <id column="id" property="id" />
+        <result column="flow_name" property="flowName" />
+        <result column="doc_type" property="docType" />
+        <result column="description" property="description" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
service-oa/service-oa-biz/src/main/resources/mapper/oa/OaNodeMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.oa.mapper.OaNodeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.oa.domain.OaNode">
+        <id column="id" property="id" />
+        <result column="flow_id" property="flowId" />
+        <result column="node_name" property="nodeName" />
+        <result column="parent_id" property="parentId" />
+        <result column="node_type" property="nodeType" />
+        <result column="node_scope" property="nodeScope" />
+        <result column="proposer" property="proposer" />
+        <result column="dept_id" property="deptId" />
+        <result column="job_id" property="jobId" />
+        <result column="node_no" property="nodeNo" />
+    </resultMap>
+
+</mapper>