Ver código fonte

OA工作流V0.1代码提交

fuyuchuan 2 meses atrás
pai
commit
a32b662f97
24 arquivos alterados com 1186 adições e 15 exclusões
  1. 9 13
      service-oa/service-oa-biz/pom.xml
  2. 0 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/MybatisGeneratorUtils.java
  3. 0 2
      service-oa/service-oa-biz/src/main/java/com/usky/oa/ServiceOaApplication.java
  4. 108 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/MybatisGeneratorUtils.java
  5. 21 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaApprovalController.java
  6. 75 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaFormDefinitionController.java
  7. 21 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaQjDocumentController.java
  8. 110 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaApproval.java
  9. 135 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaFormDefinition.java
  10. 117 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaQjDocument.java
  11. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaApprovalMapper.java
  12. 18 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaFormDefinitionMapper.java
  13. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/mapper/OaQjDocumentMapper.java
  14. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaApprovalService.java
  15. 49 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaFormDefinitionService.java
  16. 16 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaQjDocumentService.java
  17. 48 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/enums/OaBuiltInDocument.java
  18. 20 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaApprovalServiceImpl.java
  19. 257 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFormDefinitionServiceImpl.java
  20. 20 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaQjDocumentServiceImpl.java
  21. 33 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/service/utils/OaDefinitionDocumentInfo.java
  22. 25 0
      service-oa/service-oa-biz/src/main/resources/mapper/oa/OaApprovalMapper.xml
  23. 30 0
      service-oa/service-oa-biz/src/main/resources/mapper/oa/OaFormDefinitionMapper.xml
  24. 26 0
      service-oa/service-oa-biz/src/main/resources/mapper/oa/OaQjDocumentMapper.xml

+ 9 - 13
service-oa/service-oa-biz/pom.xml

@@ -78,10 +78,7 @@
             <artifactId>weixin-java-mp</artifactId>
             <version>4.3.0</version>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-        </dependency>
+
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>service-alarm-api</artifactId>
@@ -94,18 +91,17 @@
             <artifactId>ruoyi-common-core</artifactId>
         </dependency>
 
-        <!--钉钉-->
-        <!--获取企业accessToken(企业内部应用) 新版SDK-->
         <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>dingtalk</artifactId>
-            <version>2.1.34</version>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.22</version>
+            <scope>provided</scope>
         </dependency>
-        <!--旧版SDK-->
         <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
-            <version>2.0.0</version>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.70</version>
+            <scope>compile</scope>
         </dependency>
 
     </dependencies>

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


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

@@ -3,7 +3,6 @@ import io.swagger.annotations.SwaggerDefinition;
 import org.mybatis.spring.annotation.MapperScan;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.amqp.rabbit.annotation.EnableRabbit;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
@@ -24,7 +23,6 @@ import java.net.UnknownHostException;
 @MapperScan(value = "com.usky.oa.mapper")
 @ComponentScan("com.usky")
 @SpringBootApplication
-@EnableRabbit
 public class ServiceOaApplication
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOaApplication.class);

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

@@ -0,0 +1,108 @@
+package com.usky.oa.controller;// package com.usky.iot.controller;//package com.usky.dm.controller.web.business;//package com.usky.dm.controller.web;
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yq
+ * @date 2021/7/6 11:42
+ */
+public class MybatisGeneratorUtils {
+    public static void main(String[] args) {
+
+        shell("service-oa", "service-oa-biz");
+    }
+
+    private static void shell(String parentName, String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        // 1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath += "/" + parentName;
+        projectPath += "/" + model;
+        gc.setOutputDir(projectPath + "/src/main/java");  // 生成路径(一般都是生成在此项目的src/main/java下面)
+        // 修改为自己的名字
+        gc.setAuthor("fu"); // 设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); // 第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); // 生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); // 生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        // 2、数据源配置
+        // 修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.oa");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+//        pc.setXml("mapper.demo");
+        // pc.setModuleName("test");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); // 使用lombok
+        // 修改自己想要生成的表
+        strategy.setInclude("oa_approval", "oa_flow", "oa_form_definition", "oa_qj_document", "oa_node");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        // 修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        // 如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/oa" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        // 5、执行
+        mpg.execute();
+    }
+}

+ 21 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaApprovalController.java

@@ -0,0 +1,21 @@
+package com.usky.oa.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 审批表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Controller
+@RequestMapping("/oaApproval")
+public class OaApprovalController {
+
+}
+

+ 75 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaFormDefinitionController.java

@@ -0,0 +1,75 @@
+package com.usky.oa.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
+import com.usky.oa.domain.OaFormDefinition;
+import com.usky.oa.service.OaFormDefinitionService;
+import com.usky.oa.service.enums.OaBuiltInDocument;
+import com.usky.oa.service.utils.OaDefinitionDocumentInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 表单定义表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@RestController
+@RequestMapping("/oaFormDefinition")
+public class OaFormDefinitionController {
+
+    @Autowired
+    private OaFormDefinitionService oaFormDefinitionService;
+
+    // 新增、修改表单
+    @Log(title = "新增/修改表单", businessType = BusinessType.INSERT)
+    @PostMapping("/addForm")
+    public void addForm(@RequestBody OaFormDefinition oaFormDefinition) {
+        oaFormDefinitionService.addForm(oaFormDefinition);
+    }
+
+    // 表单状态修改(启用、停用)
+    @Log(title = "启停用表单", businessType = BusinessType.UPDATE)
+    @GetMapping("/updateStatus")
+    public void updateStatus(@RequestParam(value = "formId") Integer formId,
+                             @RequestParam(value = "formStatus") Integer formStatus) {
+        oaFormDefinitionService.validUpdateStatus(formId, formStatus);
+    }
+
+    // 删除表单
+    @Log(title = "删除表单", businessType = BusinessType.DELETE)
+    @DeleteMapping("{delForm}")
+    public void delForm(@RequestParam Integer formId) {
+        oaFormDefinitionService.delForm(formId);
+    }
+
+    // 表单管理-分页
+    @GetMapping("/manageForm")
+    public ApiResult<CommonPage<OaFormDefinition>> manageForm(@RequestParam(value = "formName", required = false) String formName,
+                                                              @RequestParam(value = "formId", required = false) Integer formId,
+                                                              @RequestParam(value = "formGroup", required = false) Integer formGroup,
+                                                              @RequestParam(value = "formStatus", required = false) Integer formStatus,
+                                                              @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
+                                                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+        return ApiResult.success(oaFormDefinitionService.pageList(formId, formName, formGroup, formStatus, pageNum, pageSize));
+    }
+
+    // 内置单据枚举列表
+    @GetMapping("/builtInFormEnums")
+    public List<OaDefinitionDocumentInfo> getBuiltInDocumentList() {
+        return Arrays.stream(OaBuiltInDocument.values())
+                .map(doc -> new OaDefinitionDocumentInfo(doc.getSign(), doc.getName()))
+                .collect(Collectors.toList());
+    }
+}
+

+ 21 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/controller/web/OaQjDocumentController.java

@@ -0,0 +1,21 @@
+package com.usky.oa.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 请假单据表 前端控制器
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Controller
+@RequestMapping("/oaQjDocument")
+public class OaQjDocumentController {
+
+}
+

+ 110 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaApproval.java

@@ -0,0 +1,110 @@
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 审批表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OaApproval implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 审批表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 单据id
+     */
+    private Integer docId;
+
+    /**
+     * 流程id
+     */
+    private Integer flowId;
+
+    /**
+     * 审批节点id
+     */
+    private Integer nodeId;
+
+    /**
+     * 审批人id
+     */
+    private Long approvalUid;
+
+    /**
+     * 审批类型(0:审批,1:知会)
+     */
+    private Integer type;
+
+    /**
+     * 审批状态(0:审批中 1:审批通过 2:审批不通过)
+     */
+    private Integer status;
+
+    /**
+     * 审批意见
+     */
+    private String opinion;
+
+    /**
+     * 提交时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime submitDate;
+
+    /**
+     * 审批时间
+     */
+    private LocalDateTime approvalDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 租户id
+     */
+    private Integer tenantId;
+
+
+}

+ 135 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaFormDefinition.java

@@ -0,0 +1,135 @@
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 表单定义表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OaFormDefinition implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 表单定义表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 表单名称
+     */
+    private String formName;
+
+    /**
+     * 所在分组
+     */
+    private Integer formGroup;
+
+    /**
+     * 表单说明
+     */
+    private String formExplain;
+
+    /**
+     * 单据类型(0:内置表单据;1:自定义表单据)
+     */
+    private Integer formType;
+
+    /**
+     * 表单设计器配置数据
+     */
+    private String fieldInfo;
+
+    /**
+     * 流程设计器配置数据
+     */
+    private String flowInfo;
+
+    /**
+     * 表单版本
+     */
+    private Integer formVersion;
+
+    /**
+     * 表单标识(必须字母,小于4位)
+     */
+    private String formSign;
+
+    /**
+     * 表单图标
+     */
+    private String formImage;
+
+    /**
+     * 表单权限范围(0:指定部门可见;1:全员可见;2:指定人可见)
+     */
+    private Integer formScope;
+
+    /**
+     * 表单状态(0:未启用;1:启用;2:停用)
+     */
+    private Integer formStatus;
+
+    /*
+     * 单据编号
+     */
+    //private Integer docNo;
+
+    /**
+     * 可见部门id集合
+     */
+    private String deptIds;
+
+    /**
+     * 可见人id集合
+     */
+    private String userIds;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 租户id
+     */
+    private Integer tenantId;
+
+
+}

+ 117 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/domain/OaQjDocument.java

@@ -0,0 +1,117 @@
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 请假单据表
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OaQjDocument implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 请假单据表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 请假类型(0:事假;1:年假;2:病假)
+     */
+    private Integer type;
+
+    /**
+     * 审批节点id
+     */
+    private Integer nodeId;
+
+    /**
+     * 单据编号
+     */
+    private String docNo;
+
+    /**
+     * 申请人id
+     */
+    private Long proposer;
+
+    /**
+     * 单据状态 (0:未提交可以修改,1:审批中,2:审批通过,3:审批不通过,4:撤销)
+     */
+    private Integer status;
+
+    /**
+     * 开始日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+
+    /**
+     * 结束日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
+
+    /**
+     * 请假时长
+     */
+    private Integer duration;
+
+    /**
+     * 请假事由
+     */
+    private String reason;
+
+    /**
+     * 图片URL
+     */
+    private String image;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 租户id
+     */
+    private Integer tenantId;
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.usky.oa.mapper;
+
+import com.usky.oa.domain.OaApproval;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 审批表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+public interface OaApprovalMapper extends CrudMapper<OaApproval> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.usky.oa.mapper;
+
+import com.usky.oa.domain.OaFormDefinition;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 表单定义表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Repository
+public interface OaFormDefinitionMapper extends CrudMapper<OaFormDefinition> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.usky.oa.mapper;
+
+import com.usky.oa.domain.OaQjDocument;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 请假单据表 Mapper 接口
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+public interface OaQjDocumentMapper extends CrudMapper<OaQjDocument> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.usky.oa.service;
+
+import com.usky.oa.domain.OaApproval;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 审批表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+public interface OaApprovalService extends CrudService<OaApproval> {
+
+}

+ 49 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/OaFormDefinitionService.java

@@ -0,0 +1,49 @@
+package com.usky.oa.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
+import com.usky.oa.domain.OaFormDefinition;
+import com.usky.common.mybatis.core.CrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 表单定义表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Service
+public interface OaFormDefinitionService extends CrudService<OaFormDefinition> {
+
+    /**
+     * 新增/更新 表单
+     * @param oaFormDefinition
+     */
+    void addForm(OaFormDefinition oaFormDefinition);
+
+    /**
+     * 删除表单
+     * @param formId
+     */
+    void delForm(Integer formId);
+
+    /**
+     * 分页查询表单列表
+     * @param formName 表单名称
+     * @param pageNum 页码
+     * @param pageSize 页大小
+     * @return
+     */
+    CommonPage<OaFormDefinition> pageList(Integer formId, String formName, Integer formGroup, Integer formStatus, Integer pageNum, Integer pageSize);
+
+    /**
+     * 更新表单状态并校验
+     * @param formId
+     * @param formStatus
+     */
+    void validUpdateStatus(Integer formId, Integer formStatus);
+
+}

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

@@ -0,0 +1,16 @@
+package com.usky.oa.service;
+
+import com.usky.oa.domain.OaQjDocument;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 请假单据表 服务类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+public interface OaQjDocumentService extends CrudService<OaQjDocument> {
+
+}

+ 48 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/enums/OaBuiltInDocument.java

@@ -0,0 +1,48 @@
+package com.usky.oa.service.enums;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author fyc
+ * @email yuchuan.fu@chinausky.com
+ * @date 2024/12/25
+ */
+public enum OaBuiltInDocument {
+
+    QJ("QJ", "请假表单"),
+    JB("JB", "加班表单"),
+    LZ("LZ", "离职表单"),
+    CC("CC", "出差表单"),
+    WC("WC", "外出表单"),
+    BHSQ("BHSQ", "项目编号申请表单"),
+    MPYS("MPYS", "名片印刷表单"),
+    DJP("DJP", "订机票表单"),
+    ZCLY("ZCLY", "固定资产领用表单"),
+    ZZJY("ZZJY", "印章资质借用表单"),
+    HTJY("HTJY", "合同借用表单"),
+    XMCG("XMCG", "项目采购表单"),
+    ZCCG("ZCCG", "固定资产采购表单"),
+    XZCG("XZCG", "行政(特殊)用品采购表单"),
+    YYSQ("YYSQ", "用印申请表单");
+
+    private final String sign;
+    private final String name;
+
+    OaBuiltInDocument(String sign, String name) {
+        this.sign = sign;
+        this.name = name;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+}

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

@@ -0,0 +1,20 @@
+package com.usky.oa.service.impl;
+
+import com.usky.oa.domain.OaApproval;
+import com.usky.oa.mapper.OaApprovalMapper;
+import com.usky.oa.service.OaApprovalService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 审批表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Service
+public class OaApprovalServiceImpl extends AbstractCrudService<OaApprovalMapper, OaApproval> implements OaApprovalService {
+
+}

+ 257 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/impl/OaFormDefinitionServiceImpl.java

@@ -0,0 +1,257 @@
+package com.usky.oa.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.OaFormDefinition;
+import com.usky.oa.mapper.OaFormDefinitionMapper;
+import com.usky.oa.service.OaFormDefinitionService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.oa.service.enums.OaBuiltInDocument;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.util.Arrays;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.Queue;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 表单定义表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Slf4j
+@Service
+public class OaFormDefinitionServiceImpl extends AbstractCrudService<OaFormDefinitionMapper, OaFormDefinition> implements OaFormDefinitionService {
+
+    @Autowired
+    private OaFormDefinitionMapper oaFormDefinitionMapper;
+
+    /**
+     * 新增/更新 表单
+     * 此方法负责验证表单定义的合法性,包括表单名称和标识的唯一性、长度限制,并最终保存合法的表单定义
+     * @param oaFormDefinition 表单定义对象,包含表单的详细信息
+     * @throws BusinessException 当表单名称或标识不符合规范或已存在时抛出
+     */
+    @Override
+    public void addForm(OaFormDefinition oaFormDefinition) {
+
+        String formName = oaFormDefinition.getFormName();
+        String formSign = oaFormDefinition.getFormSign();
+        String formExplain = oaFormDefinition.getFormExplain();
+        // 判断 表单名称、标识、说明 是否为空或超长
+        validateFormProperties(formName, formSign, formExplain);
+
+        // 判断 表单分组 是否为空、有效
+        isValidFormGroup(oaFormDefinition.getFormGroup());
+
+        if (Objects.isNull(oaFormDefinition.getFormType())) {
+            throw new BusinessException("表单字段信息不能为空");
+        } else if (oaFormDefinition.getFormType() < 0 || oaFormDefinition.getFormType() > 1) {
+            throw new BusinessException("表单类型不正确");
+        }
+
+        // 判断 表单可见范围 是否为空、有效
+        validFromScope(oaFormDefinition);
+
+        // 获取用户基本信息
+        Long userId = SecurityUtils.getUserId();
+        Integer tenantId = SecurityUtils.getTenantId();
+        String username = SecurityUtils.getUsername();
+        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+        LocalDateTime now = LocalDateTime.now();
+
+        // 判断表单是新增或者修改
+        if (oaFormDefinition.getId() == null) {
+            // BeanUtils.copyBeanProp(oaFormDefinition, oaFormDefinition);
+            // 判断表单名称和标识是否重复
+            selectByNameOrSign(formName, formSign);
+
+            oaFormDefinition.setCreateBy(username);
+            oaFormDefinition.setDeptId(deptId);
+            oaFormDefinition.setTenantId(tenantId);
+            oaFormDefinition.setCreateTime(now);
+            oaFormDefinition.setFormVersion(1);
+            oaFormDefinition.setFormStatus(0);
+            oaFormDefinitionMapper.insert(oaFormDefinition);
+        } else {
+            oaFormDefinition.setUpdateBy(username);
+            oaFormDefinition.setUpdateTime(now);
+
+            // 判断表单版本号是否需要更新
+            if (versionUpdateValid(oaFormDefinition)) {
+                oaFormDefinition.setFormVersion(oaFormDefinition.getFormVersion() + 1);
+            }
+
+            oaFormDefinitionMapper.updateById(oaFormDefinition);
+        }
+    }
+
+    /**
+     * 删除表单
+     * @param formId 表单ID,用于删除特定的表单定义
+     */
+    @Override
+    public void delForm(Integer formId) {
+        if (formId > 0) {
+            OaFormDefinition oaFormDefinition = oaFormDefinitionMapper.selectById(formId);
+            if (oaFormDefinition == null) {
+                throw new BusinessException("表单不存在!");
+            }
+            oaFormDefinitionMapper.deleteById(oaFormDefinition);
+        } else {
+            throw new BusinessException("表单ID不能为空或者小于0");
+        }
+    }
+
+    //判断表单下是否存在已生成单据
+    private void validDelete(Integer formId) {
+
+    }
+
+
+    // 表单管理-分页查询
+    @Override
+    public CommonPage<OaFormDefinition> pageList(Integer formId, String formName, Integer formGroup, Integer formStatus, Integer pageNum, Integer pageSize) {
+        IPage<OaFormDefinition> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<OaFormDefinition> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(formId != null, OaFormDefinition::getId, formId)
+                .like(StringUtils.isNotBlank(formName), OaFormDefinition::getFormName, formName)
+                .eq(formGroup != null, OaFormDefinition::getFormGroup, formGroup)
+                .eq(formStatus != null, OaFormDefinition::getFormStatus, formStatus)
+                .orderByDesc(OaFormDefinition::getId)
+                // 数据权限控制
+                .apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
+        return ToCommonPage(oaFormDefinitionMapper.selectPage(page, queryWrapper));
+    }
+
+    // 表单管理-修改表单状态
+    @Override
+    public void validUpdateStatus(Integer formId, Integer formStatus) {
+        if (formId == null || formId <= 0) {
+            throw new BusinessException("表单ID不能为空或者小于0!");
+        }
+        OaFormDefinition oaFormDefinition = oaFormDefinitionMapper.selectById(formId);
+        if (oaFormDefinition == null) {
+            throw new BusinessException("表单不存在!");
+        }
+
+        if (formStatus == null || formStatus < 1 || formStatus > 2) {
+            throw new BusinessException("表单状态为空或不在设定值范围!");
+        }
+        oaFormDefinition.setFormStatus(formStatus);
+        oaFormDefinitionMapper.updateById(oaFormDefinition);
+    }
+
+    // 表单版本更新验证
+    private Boolean versionUpdateValid(OaFormDefinition oaFormDefinition) {
+        boolean update = false;
+        OaFormDefinition selectOne = oaFormDefinitionMapper.selectById(oaFormDefinition.getId());
+        if (!selectOne.getFlowInfo().equals(oaFormDefinition.getFlowInfo()) || !selectOne.getFormExplain().equals(oaFormDefinition.getFormExplain())) {
+            update = true;
+        }
+        return update;
+    }
+
+    /**
+     * 根据表单id、名称查询
+     * @param formName 表单名称,用于查询特定的表单定义
+     * @return 返回查询到的表单定义对象,如果没有找到匹配的表单,则返回null
+     */
+    public void selectByNameOrSign(String formName, String formSign) {
+        LambdaQueryWrapper<OaFormDefinition> queryName = Wrappers.lambdaQuery();
+        queryName.eq(StringUtils.isNotBlank(formName), OaFormDefinition::getFormName, formName);
+        OaFormDefinition fromByName = oaFormDefinitionMapper.selectOne(queryName);
+
+        LambdaQueryWrapper<OaFormDefinition> querySign = Wrappers.lambdaQuery();
+        querySign.eq(StringUtils.isNotBlank(formSign), OaFormDefinition::getFormSign, formSign);
+        OaFormDefinition fromBySign = oaFormDefinitionMapper.selectOne(querySign);
+
+        if (fromByName != null) {
+            throw new BusinessException("表单名称已存在,请更换");
+        } else if (fromBySign != null) {
+            throw new BusinessException("表单标识已存在,请更换");
+        }
+    }
+
+    // 表单管理-表单属性(表单名称、标识、说明)验证
+    private void validateFormProperties(String formName, String formSign, String formExplain) {
+        // 判断表单名称是否为空或者超长
+        if (StringUtils.isBlank(formName) || formName.length() > 50) {
+            throw new BusinessException("表单名称不能为空或空字符串");
+        }
+
+        // 判断表单标识是否为空或者超长
+        if (StringUtils.isBlank(formSign)) {
+            throw new BusinessException("表单标识不能为空");
+        } else if (formSign.length() > 4) {
+            throw new BusinessException("表单标识长度不能超过4个字符");
+        } else if (!formSign.matches("^[A-Z]+$")) {
+            throw new BusinessException("表单标识只能包含大写字母!");
+        }
+
+        // 判断表单说明是否超长
+        if (StringUtils.isNotBlank(formExplain) && formExplain.length() > 100) {
+            throw new BusinessException("表单说明长度不能超过100个字符");
+        }
+    }
+
+    // 判断表单所在分组是否有效
+    private void isValidFormGroup(Integer formGroup) {
+        if (formGroup == null) {
+            throw new BusinessException("表单所在分组不能为空");
+        } else if (formGroup < 0 || formGroup > 6) {
+            throw new BusinessException("表单所在分组异常!请联系管理员");
+        }
+    }
+
+    // 校验表单可见范围是否有效
+    private void validFromScope(OaFormDefinition oaFormDefinition) {
+        if (oaFormDefinition.getFormScope() == null) {
+            throw new BusinessException("表单可见范围不能为空");
+        } else {
+            Integer formScope = oaFormDefinition.getFormScope();
+            String deptIds = oaFormDefinition.getDeptIds();
+            String userIds = oaFormDefinition.getUserIds();
+            switch (formScope) {
+                case 0:
+                    if (StringUtils.isBlank(deptIds)) {
+                        throw new BusinessException("表单可见范围为部门,部门集合不能为空");
+                    } else if (!deptIds.matches("^(?:\\d+)(,\\d+)*$")) {
+                        throw new BusinessException("部门集合格式不正确!");
+                    }
+                    break;
+
+                case 1:
+                    break;
+
+                case 2:
+                    if (StringUtils.isBlank(userIds)) {
+                        throw new BusinessException("表单可见范围为人员,人员集合不能为空");
+                    } else if (!userIds.matches("^(?:\\d+)(,\\d+)*$")) {
+                        throw new BusinessException("人员集合格式不正确!");
+                    }
+                    break;
+                default:
+                    throw new BusinessException("表单可见范围为异常!请联系管理员");
+            }
+        }
+
+    }
+
+}

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

@@ -0,0 +1,20 @@
+package com.usky.oa.service.impl;
+
+import com.usky.oa.domain.OaQjDocument;
+import com.usky.oa.mapper.OaQjDocumentMapper;
+import com.usky.oa.service.OaQjDocumentService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 请假单据表 服务实现类
+ * </p>
+ *
+ * @author fu
+ * @since 2024-12-10
+ */
+@Service
+public class OaQjDocumentServiceImpl extends AbstractCrudService<OaQjDocumentMapper, OaQjDocument> implements OaQjDocumentService {
+
+}

+ 33 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/service/utils/OaDefinitionDocumentInfo.java

@@ -0,0 +1,33 @@
+package com.usky.oa.service.utils;
+
+/**
+ *
+ * @author fyc
+ * @email yuchuan.fu@chinausky.com
+ * @date 2024/12/25
+ */
+public class OaDefinitionDocumentInfo {
+    private String sign;
+    private String name;
+
+    public OaDefinitionDocumentInfo(String sign, String name) {
+        this.sign = sign;
+        this.name = name;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 25 - 0
service-oa/service-oa-biz/src/main/resources/mapper/oa/OaApprovalMapper.xml

@@ -0,0 +1,25 @@
+<?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.OaApprovalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.oa.domain.OaApproval">
+        <id column="id" property="id" />
+        <result column="doc_id" property="docId" />
+        <result column="flow_id" property="flowId" />
+        <result column="node_id" property="nodeId" />
+        <result column="approval_uid" property="approvalUid" />
+        <result column="type" property="type" />
+        <result column="status" property="status" />
+        <result column="opinion" property="opinion" />
+        <result column="submit_date" property="submitDate" />
+        <result column="approval_date" property="approvalDate" />
+        <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>

+ 30 - 0
service-oa/service-oa-biz/src/main/resources/mapper/oa/OaFormDefinitionMapper.xml

@@ -0,0 +1,30 @@
+<?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.OaFormDefinitionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.oa.domain.OaFormDefinition">
+        <id column="id" property="id" />
+        <result column="form_name" property="formName" />
+        <result column="form_group" property="formGroup" />
+        <result column="form_explain" property="formExplain" />
+        <result column="form_type" property="formType" />
+        <result column="field_info" property="fieldInfo" />
+        <result column="flow_info" property="flowInfo" />
+        <result column="form_version" property="formVersion" />
+        <result column="form_sign" property="formSign" />
+        <result column="form_image" property="formImage" />
+        <result column="form_scope" property="formScope" />
+        <result column="form_status" property="formStatus" />
+        <!--<result column="doc_no" property="docNo" />-->
+        <result column="dept_ids" property="deptIds" />
+        <result column="user_ids" property="userIds" />
+        <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>

+ 26 - 0
service-oa/service-oa-biz/src/main/resources/mapper/oa/OaQjDocumentMapper.xml

@@ -0,0 +1,26 @@
+<?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.OaQjDocumentMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.oa.domain.OaQjDocument">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="node_id" property="nodeId" />
+        <result column="doc_no" property="docNo" />
+        <result column="proposer" property="proposer" />
+        <result column="status" property="status" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="duration" property="duration" />
+        <result column="reason" property="reason" />
+        <result column="image" property="image" />
+        <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>