Qchen 1 год назад
Родитель
Сommit
1019a09cfa
20 измененных файлов с 749 добавлено и 25 удалено
  1. 70 4
      authentication/dependency-reduced-pom.xml
  2. 2 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoDto.java
  3. 31 4
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  4. 1 1
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoBankCard.java
  5. 31 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoFile.java
  6. 1 1
      commons/src/main/java/com/jzg/commons/entity/vo/IsDeleteVo.java
  7. 1 1
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserInfoListVo.java
  8. 21 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserVo.java
  9. 2 0
      platform/src/main/java/com/jzg/controller/FileUploadController.java
  10. 6 0
      tenant/openfeign/pom.xml
  11. 6 0
      tenant/organization/pom.xml
  12. 27 0
      tenant/organization/src/main/java/com/jzg/organization/config/MinioConfig.java
  13. 9 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUploadFilesMapper.java
  14. 9 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoFileMapper.java
  15. 7 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoFileService.java
  16. 16 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoFileServiceImpl.java
  17. 105 13
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  18. 392 0
      tenant/organization/src/main/java/com/jzg/organization/utils/MinioUtils.java
  19. 4 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoFileMapper.xml
  20. 8 1
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 70 - 4
authentication/dependency-reduced-pom.xml

@@ -18,12 +18,30 @@
     </plugins>
   </build>
   <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.26</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus</artifactId>
@@ -49,9 +67,39 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-web</artifactId>
-      <version>3.0.0</version>
+      <groupId>org.springframework.security.oauth</groupId>
+      <artifactId>spring-security-oauth2</artifactId>
+      <version>2.3.3.RELEASE</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.jzg</groupId>
+      <artifactId>commons</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.github.whvcse</groupId>
+      <artifactId>easy-captcha</artifactId>
+      <version>1.6.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson</artifactId>
+      <version>3.23.3</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson-spring-boot-starter</artifactId>
+      <version>3.23.3</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson-spring-data-27</artifactId>
+      <version>3.23.3</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
@@ -112,9 +160,27 @@
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-security</artifactId>
+      <artifactId>spring-boot-starter-aop</artifactId>
       <version>3.0.0</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-validation</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.statemachine</groupId>
+      <artifactId>spring-statemachine-core</artifactId>
+      <version>4.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>2.0.43</version>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 </project>

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoDto.java

@@ -15,6 +15,8 @@ public class SysUserJzgInfoDto {
 
     public String username;
 
+    public String name;
+
     public String mobile;
 
     public String deptId;

+ 31 - 4
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java

@@ -8,6 +8,8 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author quchen
  * @date 2025/1/16 9:05
@@ -34,7 +36,7 @@ public class SysUserJzgInfo extends BaseModel {
     private Integer status;
 
     @TableField(value = "is_enable")
-    @Schema(description = "是否启用 1:启用 0:禁用")
+    @Schema(description = "是否启用 0:启用 1:禁用")
     private Integer isEnable;
 
     @TableField(value = "system_code")
@@ -103,7 +105,7 @@ public class SysUserJzgInfo extends BaseModel {
     private String partnerLevel;
 
     @TableField(value = "type_attr")
-    @Schema(description = "用户类型:1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队长")
+    @Schema(description = "用户类型:0个代,1渠道,2团队,3电销组")
     private String typeAttr;
 
     @TableField(value = "factor_verify")
@@ -204,11 +206,36 @@ public class SysUserJzgInfo extends BaseModel {
 
     @TableField(exist = false)
     @Schema(description = "身份证正面")
-    private String idCardUp;
+    private String sfz1;
 
     @TableField(exist = false)
     @Schema(description = "身份证反面")
-    private String idCardDown;
+    private String sfz2;
+
+    @TableField(exist = false)
+    @Schema(description = "展业资格证")
+    private String qualification;
+
+    @TableField(exist = false)
+    @Schema(description = "劳动合同")
+    private String contract;
+
+    @TableField(exist = false)
+    @Schema(description = "应聘表")
+    private String applicant;
+
+    @TableField(exist = false)
+    @Schema(description = "定薪表")
+    private String salaryTable;
+
+    @TableField(exist = false)
+    @Schema(description = "离职表")
+    private String leaveTable;
+
+
+    @TableField(exist = false)
+    @Schema(description = "附件列表")
+    private List<SysUserJzgInfoFile> fileList;
 
 
 }

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoBankCard.java

@@ -26,7 +26,7 @@ public class SysUserJzgInfoBankCard {
     @Schema(description = "银行卡号")
     private String bankCardNumber;
 
-    @TableField(value = "bank_card_name")
+    @TableField(value = "bank_name")
     @Schema(description = "银行名称")
     private String bankName;
 

+ 31 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoFile.java

@@ -0,0 +1,31 @@
+package com.jzg.commons.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/1/20 16:06
+ */
+
+@Data
+@TableName("sys_user_jzg_info_file")
+public class SysUserJzgInfoFile {
+    @TableId(value = "file_id")
+    private String fileId;
+
+    @TableField(value = "user_jzg_info_id")
+    private String userJzgInfoId;
+
+    @TableField(value = "file_name")
+    private String fileName;
+
+    @TableField(value = "file_url")
+    private String fileUrl;
+
+    @TableField(value = "file_type")
+    private String fileType;
+
+}

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/vo/IsDeleteVo.java

@@ -14,5 +14,5 @@ import java.util.List;
 @Data
 public class IsDeleteVo {
     @Schema(description = "id集合")
-    private List<String> ids;
+    private List<String> id;
 }

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/vo/SysUserInfoListVo.java

@@ -30,7 +30,7 @@ public class SysUserInfoListVo extends PageRequest {
 
     // 启用禁用
     @Schema(description = "启用禁用")
-    public Integer isEnable;
+    public String isEnable;
 
     // 管理人id
     @Schema(description = "管理人id")

+ 21 - 0
commons/src/main/java/com/jzg/commons/entity/vo/SysUserVo.java

@@ -145,6 +145,27 @@ public class SysUserVo extends PageRequest {
     @Schema(description = "平台信息id")
     private String userInfoId;
 
+    @Schema(description = "身份证正面")
+    private String sfz1;
+
+    @Schema(description = "身份证反面")
+    private String sfz2;
+
+    @Schema(description = "展业资格证")
+    private String qualification;
+
+    @Schema(description = "劳动合同")
+    private String contract;
+
+    @Schema(description = "应聘表")
+    private String applicant;
+
+    @Schema(description = "定薪表")
+    private String salaryTable;
+
+    @Schema(description = "离职表")
+    private String leaveTable;
+
     @Data
     @AllArgsConstructor
     @NoArgsConstructor

+ 2 - 0
platform/src/main/java/com/jzg/controller/FileUploadController.java

@@ -9,6 +9,7 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.mapper.SysUploadFilesMapper;
 import com.jzg.util.MinioUtils;
 import io.minio.*;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -43,6 +44,7 @@ public class FileUploadController extends BaseController {
 
 
     @PostMapping("/upload")
+    @Operation(summary = "文件上传接口", description = "文件上传接口")
     public HttpResult uploadFile(@RequestParam("file") MultipartFile file) {
         try {
             // 获取文件原始名称和扩展名

+ 6 - 0
tenant/openfeign/pom.xml

@@ -21,6 +21,12 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.5.7</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
     <build>

+ 6 - 0
tenant/organization/pom.xml

@@ -28,6 +28,12 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>${minio.version}</version>
+        </dependency>
+
     </dependencies>
     <build>
         <finalName>organization</finalName>

+ 27 - 0
tenant/organization/src/main/java/com/jzg/organization/config/MinioConfig.java

@@ -0,0 +1,27 @@
+package com.jzg.organization.config;
+
+import io.minio.MinioClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MinioConfig {
+
+    @Value("${minio.url}")
+    private String minioUrl;
+
+    @Value("${minio.access-key}")
+    private String accessKey;
+
+    @Value("${minio.secret-key}")
+    private String secretKey;
+
+    @Bean
+    public MinioClient minioClient() {
+        return MinioClient.builder()
+                .endpoint(minioUrl)
+                .credentials(accessKey, secretKey)
+                .build();
+    }
+}

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUploadFilesMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.SysUploadFiles;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUploadFilesMapper extends BaseMapper<SysUploadFiles> {
+}

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoFileMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.SysUserJzgInfoFile;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserJzgInfoFileMapper extends BaseMapper<SysUserJzgInfoFile> {
+}

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoFileService.java

@@ -0,0 +1,7 @@
+package com.jzg.organization.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.po.SysUserJzgInfoFile;
+
+public interface SysUserJzgInfoFileService extends IService<SysUserJzgInfoFile> {
+}

+ 16 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoFileServiceImpl.java

@@ -0,0 +1,16 @@
+package com.jzg.organization.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.po.SysUserJzgInfoFile;
+import com.jzg.organization.mapper.SysUserJzgInfoFileMapper;
+import com.jzg.organization.service.SysUserJzgInfoFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author quchen
+ * @date 2025/1/20 17:08
+ */
+
+@Service
+public class SysUserJzgInfoFileServiceImpl extends ServiceImpl<SysUserJzgInfoFileMapper, SysUserJzgInfoFile> implements SysUserJzgInfoFileService {
+}

+ 105 - 13
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -1,25 +1,19 @@
 package com.jzg.organization.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jzg.commons.core.base.PageRequest;
 import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.po.SysDept;
-import com.jzg.commons.entity.po.SysUser;
-import com.jzg.commons.entity.po.SysUserJzgInfo;
-import com.jzg.commons.entity.po.SysUserJzgInfoBankCard;
+import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.PasswordUtils;
 import com.jzg.commons.util.idgen.IdGenerate;
+import com.jzg.organization.mapper.SysUploadFilesMapper;
 import com.jzg.organization.mapper.SysUserJzgInfoMapper;
 import com.jzg.organization.mapper.SysUserMapper;
-import com.jzg.organization.service.SysDeptService;
-import com.jzg.organization.service.SysUserJzgInfoBankCardService;
-import com.jzg.organization.service.SysUserJzgInfoService;
-import com.jzg.organization.service.SysUserService;
+import com.jzg.organization.service.*;
+import com.jzg.organization.utils.MinioUtils;
 import jakarta.annotation.Resource;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -46,6 +40,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     private SysUserJzgInfoMapper sysUserJzgInfoMapper;
 
+    @Resource
+    private SysUploadFilesMapper sysUploadFilesMapper;
+
+    @Resource
+    private SysUserJzgInfoFileService sysUserJzgInfoFileService;
+
+    @Resource
+    private MinioUtils minioUtils;
+
     @Override
     public List<SysUserVo> getUserInfo(SysUserVo sysUserVo) {
         return baseMapper.getUserInfo(sysUserVo);
@@ -71,8 +74,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             BeanUtils.copyProperties(sysUserVo, sysUserJzgInfo);
             sysUserJzgInfo.setUserId(sysUser.getId());
             sysUserJzgInfo.setStatus(0);
-            sysUserJzgInfo.setIsEnable(1);
+            sysUserJzgInfo.setIsEnable(0);
+            sysUserJzgInfo.setIsDelete(0);
             sysUserJzgInfoService.save(sysUserJzgInfo);
+            saveFile(sysUserVo.getSfz1(), sysUserVo.getSfz2(), sysUserVo.getQualification(), sysUserVo.getContract(), sysUserVo.getApplicant(), sysUserVo.getSalaryTable(), sysUserVo.getLeaveTable(),sysUserJzgInfo.getId());
 
             //如果表单输入的银行卡号和银行名不为空,则保存银行卡信息
             if (sysUserVo.getBankCardId() != null && sysUserVo.getBankName() != null) {
@@ -103,6 +108,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             sysUserJzgInfo.setId(IdGenerate.nextId());
             sysUserJzgInfo.setUserId(sysUser1.getId());
             sysUserJzgInfo.setStatus(0);
+            sysUserJzgInfo.setIsEnable(0);
+            sysUserJzgInfo.setIsDelete(0);
             sysUserJzgInfoService.save(sysUserJzgInfo);
 
             //如果表单输入的银行卡号和银行名不为空,则保存银行卡信息
@@ -124,7 +131,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult<Boolean> deleteUserInfo(IsDeleteVo isDeleteVo) {
-        for (String id : isDeleteVo.getIds()) {
+        for (String id : isDeleteVo.getId()) {
             SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getById(id);
             if (sysUserJzgInfo == null) {
                 throw new SystemException("该用户不存在");
@@ -146,7 +153,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             sysUserJzgInfo.setIsEnable(isEnableVo.getIsEnable());
             sysUserJzgInfoService.updateById(sysUserJzgInfo);
         }
-        return HttpResult.ok("删除业务员成功");
+        return HttpResult.ok("业务员状态修改成功");
     }
 
     @Override
@@ -200,6 +207,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         if (sysUserJzgInfo == null) {
             throw new SystemException("该用户不存在");
         }
+        List<SysUserJzgInfoFile> sysUserJzgInfoFile = sysUserJzgInfoFileService.list
+                (new LambdaQueryWrapper<SysUserJzgInfoFile>().eq(SysUserJzgInfoFile::getUserJzgInfoId,id));
+        sysUserJzgInfo.setFileList(sysUserJzgInfoFile);
         return HttpResult.ok(sysUserJzgInfo);
     }
 
@@ -224,6 +234,88 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw new SystemException("所选推荐人不存在");
         }
     }
+
+    public void saveFile(String sfz1, String sfz2, String qualification, String contract, String applicant, String salaryTable, String leaveTable,String userId) {
+        if (sfz1 != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne(new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, sfz1));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(sfz1);
+            sysUserJzgInfoFile.setFileType("sfz1");
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (sfz2 != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, sfz2));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(sfz2);
+            sysUserJzgInfoFile.setFileType("sfz2");
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (qualification != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, qualification));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(qualification);
+            sysUserJzgInfoFile.setFileType("qualification");
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (contract != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, contract));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(contract);
+            sysUserJzgInfoFile.setFileType("contract");
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (applicant != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, applicant));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(applicant);
+            sysUserJzgInfoFile.setFileType("applicant");
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (salaryTable != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, salaryTable));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(salaryTable);
+            sysUserJzgInfoFile.setFileType("salary");
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+        if (leaveTable != null) {
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne
+                    (new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getId, leaveTable));
+            SysUserJzgInfoFile sysUserJzgInfoFile = new SysUserJzgInfoFile();
+            sysUserJzgInfoFile.setFileId(leaveTable);
+            sysUserJzgInfoFile.setFileType("leave");
+            sysUserJzgInfoFile.setFileUrl(minioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName()));
+            sysUserJzgInfoFile.setUserJzgInfoId(userId);
+            sysUserJzgInfoFile.setFileName(sysUploadFiles.getFileName());
+            sysUserJzgInfoFileService.save(sysUserJzgInfoFile);
+        }
+    }
+
+    public void verifyFile(String sfz1,String sfz2,String qualification,String contract,String applicant,String salaryTable,String leaveTable){
+
+    }
 }
 
 

+ 392 - 0
tenant/organization/src/main/java/com/jzg/organization/utils/MinioUtils.java

@@ -0,0 +1,392 @@
+package com.jzg.organization.utils;
+
+import io.minio.*;
+import io.minio.http.Method;
+import io.minio.messages.Bucket;
+import io.minio.messages.DeleteObject;
+import io.minio.messages.Item;
+import jakarta.annotation.Resource;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.beans.BeanProperty;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.*;
+
+/**
+ * @program: xxkfz-minio
+ * @ClassName MinioUtils.java
+ * @author: 公众号:小小开发者
+ * @create: 2024-03-13 10:55
+ * @description: MinIO操作工具类
+ **/
+@Slf4j
+@Component
+public class MinioUtils {
+
+
+    @Resource
+    private MinioClient minioClient;
+
+
+    /**
+     * 启动SpringBoot容器的时候初始化Bucket
+     * 如果没有Bucket则创建
+     *
+     * @param bucketName
+     */
+    public void createBucket(String bucketName) {
+        try {
+            if (!bucketExists(bucketName)) {
+                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+                log.info("创建bucketName = {}完成!", bucketName);
+                return;
+            }
+            log.info("bucketName = {}已存在!策略为:{}", bucketName, getBucketPolicy(bucketName));
+        } catch (Exception e) {
+            log.error("创建bucketName = {}异常!e = {}", bucketName, e);
+        }
+    }
+
+    /**
+     * 判断Bucket是否存在,true:存在,false:不存在
+     *
+     * @param bucketName
+     * @return
+     */
+    @SneakyThrows
+    public boolean bucketExists(String bucketName) {
+        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+    }
+
+    /**
+     * 获得Bucket的策略
+     *
+     * @param bucketName
+     * @return
+     */
+    @SneakyThrows
+    public String getBucketPolicy(String bucketName) {
+        return minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build());
+    }
+
+    /**
+     * 获得所有Bucket列表
+     *
+     * @return
+     */
+    @SneakyThrows
+    public List<Bucket> getAllBuckets() {
+        return minioClient.listBuckets();
+    }
+
+    /**
+     * 根据bucketName获取其相关信息
+     *
+     * @param bucketName
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public Optional<Bucket> getBucket(String bucketName) {
+        return getAllBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
+    }
+
+    /**
+     * 根据bucketName删除Bucket,true:删除成功; false:删除失败,文件或已不存在
+     *
+     * @param bucketName
+     * @throws Exception
+     */
+    @SneakyThrows(Exception.class)
+    public void removeBucket(String bucketName) {
+        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
+    }
+
+
+    /**
+     * 判断文件是否存在
+     *
+     * @param bucketName
+     * @param objectName
+     * @return
+     */
+    public boolean isObjectExist(String bucketName, String objectName) {
+        boolean exist = true;
+        try {
+            minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
+        } catch (Exception e) {
+            log.error("[Minio工具类]>>>> 判断文件是否存在, 异常:", e);
+            exist = false;
+        }
+        return exist;
+    }
+
+    /**
+     * 判断文件夹是否存在
+     *
+     * @param bucketName
+     * @param objectName
+     * @return
+     */
+    public boolean isFolderExist(String bucketName, String objectName) {
+        boolean exist = false;
+        try {
+            Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build());
+            for (Result<Item> result : results) {
+                Item item = result.get();
+                if (item.isDir() && objectName.equals(item.objectName())) {
+                    exist = true;
+                }
+            }
+        } catch (Exception e) {
+            log.error("[Minio工具类]>>>> 判断文件夹是否存在,异常:", e);
+            exist = false;
+        }
+        return exist;
+    }
+
+    /**
+     * 根据文件前置查询文件
+     *
+     * @param bucketName 存储桶
+     * @param prefix     前缀
+     * @param recursive  是否使用递归查询
+     * @return MinioItem 列表
+     */
+    @SneakyThrows(Exception.class)
+    public List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
+        List<Item> list = new ArrayList<>();
+        Iterable<Result<Item>> objectsIterator = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build());
+        if (objectsIterator != null) {
+            for (Result<Item> o : objectsIterator) {
+                Item item = o.get();
+                list.add(item);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取文件流
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名
+     * @return 二进制流
+     */
+    @SneakyThrows(Exception.class)
+    public InputStream getObject(String bucketName, String objectName) {
+        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+    /**
+     * 断点下载
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名称
+     * @param offset     起始字节的位置
+     * @param length     要读取的长度
+     * @return 二进制流
+     */
+    @SneakyThrows(Exception.class)
+    public InputStream getObject(String bucketName, String objectName, long offset, long length) {
+        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length).build());
+    }
+
+    /**
+     * 获取路径下文件列表
+     *
+     * @param bucketName 存储桶
+     * @param prefix     文件名称
+     * @param recursive  是否递归查找,false:模拟文件夹结构查找
+     * @return 二进制流
+     */
+    public Iterable<Result<Item>> listObjects(String bucketName, String prefix, boolean recursive) {
+        return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build());
+    }
+
+    /**
+     * 使用MultipartFile进行文件上传
+     *
+     * @param bucketName  存储桶
+     * @param file        文件名
+     * @param objectName  对象名
+     * @param contentType 类型
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {
+        InputStream inputStream = file.getInputStream();
+        return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(inputStream, inputStream.available(), -1).build());
+    }
+
+    /**
+     * 图片上传
+     *
+     * @param bucketName
+     * @param imageBase64
+     * @param imageName
+     * @return
+     */
+    public ObjectWriteResponse uploadImage(String bucketName, String imageBase64, String imageName) {
+        if (!StringUtils.isEmpty(imageBase64)) {
+            InputStream in = base64ToInputStream(imageBase64);
+            String newName = System.currentTimeMillis() + "_" + imageName + ".jpg";
+            String year = String.valueOf(new Date().getYear());
+            String month = String.valueOf(new Date().getMonth());
+            return uploadFile(bucketName, year + "/" + month + "/" + newName, in);
+
+        }
+        return null;
+    }
+
+    public static InputStream base64ToInputStream(String base64) {
+        ByteArrayInputStream stream = null;
+        try {
+            byte[] bytes = Base64.getEncoder().encode(base64.trim().getBytes());
+            stream = new ByteArrayInputStream(bytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return stream;
+    }
+
+
+    /**
+     * 上传本地文件
+     *
+     * @param bucketName 存储桶
+     * @param objectName 对象名称
+     * @param fileName   本地文件路径
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public ObjectWriteResponse uploadFile(String bucketName, String objectName, String fileName) {
+        return minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object(objectName).filename(fileName).build());
+    }
+
+    /**
+     * 通过流上传文件
+     *
+     * @param bucketName  存储桶
+     * @param objectName  文件对象
+     * @param inputStream 文件流
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public ObjectWriteResponse uploadFile(String bucketName, String objectName, InputStream inputStream) {
+        return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(inputStream, inputStream.available(), -1).build());
+    }
+
+    /**
+     * 创建文件夹或目录
+     *
+     * @param bucketName 存储桶
+     * @param objectName 目录路径
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public ObjectWriteResponse createDir(String bucketName, String objectName) {
+        return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(new ByteArrayInputStream(new byte[]{}), 0, -1).build());
+    }
+
+    /**
+     * 获取文件信息, 如果抛出异常则说明文件不存在
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名称
+     * @return
+     */
+    @SneakyThrows(Exception.class)
+    public String getFileStatusInfo(String bucketName, String objectName) {
+        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()).toString();
+    }
+
+    /**
+     * 拷贝文件
+     *
+     * @param bucketName    存储桶
+     * @param objectName    文件名
+     * @param srcBucketName 目标存储桶
+     * @param srcObjectName 目标文件名
+     */
+    @SneakyThrows(Exception.class)
+    public ObjectWriteResponse copyFile(String bucketName, String objectName, String srcBucketName, String srcObjectName) {
+        return minioClient.copyObject(CopyObjectArgs.builder().source(CopySource.builder().bucket(bucketName).object(objectName).build()).bucket(srcBucketName).object(srcObjectName).build());
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名称
+     */
+    @SneakyThrows(Exception.class)
+    public void removeFile(String bucketName, String objectName) {
+        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+    /**
+     * 批量删除文件
+     *
+     * @param bucketName 存储桶
+     * @param keys       需要删除的文件列表
+     * @return
+     */
+    public void removeFiles(String bucketName, List<String> keys) {
+        List<DeleteObject> objects = new LinkedList<>();
+        keys.forEach(s -> {
+            objects.add(new DeleteObject(s));
+            try {
+                removeFile(bucketName, s);
+            } catch (Exception e) {
+                log.error("[Minio工具类]>>>> 批量删除文件,异常:", e);
+            }
+        });
+    }
+
+    /**
+     * 获取文件外链
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名
+     * @param expires    过期时间 <=7 秒 (外链有效时间(单位:秒))
+     * @return url
+     */
+    @SneakyThrows(Exception.class)
+    public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) {
+        GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().expiry(expires).bucket(bucketName).object(objectName).build();
+        return minioClient.getPresignedObjectUrl(args);
+    }
+
+    /**
+     * 获得文件外链
+     *
+     * @param bucketName
+     * @param objectName
+     * @return url
+     */
+    @SneakyThrows(Exception.class)
+    public String getPresignedObjectUrl(String bucketName, String objectName) {
+        GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();
+        return minioClient.getPresignedObjectUrl(args);
+    }
+
+    /**
+     * 将URLDecoder编码转成UTF8
+     *
+     * @param str
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    public String getUtf8ByURLDecoder(String str) throws UnsupportedEncodingException {
+        String url = str.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
+        return URLDecoder.decode(url, "UTF-8");
+    }
+}

+ 4 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoFileMapper.xml

@@ -0,0 +1,4 @@
+<?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.jzg.organization.mapper.SysUserJzgInfoFileMapper">
+</mapper>

+ 8 - 1
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -6,6 +6,7 @@
         <id column="id" jdbcType="VARCHAR" property="id"/>
         <result column="user_id" jdbcType="VARCHAR" property="userId"/>
         <result column="username" jdbcType="VARCHAR" property="username"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
         <result column="mobile" jdbcType="VARCHAR" property="mobile"/>
         <result column="dept_id" jdbcType="VARCHAR" property="deptId"/>
         <result column="dept_name" jdbcType="VARCHAR" property="deptName"/>
@@ -38,6 +39,7 @@
             suji.id,
             suji.user_id,
             su.username,
+            suji.name,
             su.mobile,
             suji.dept_id,
             sd.name as dept_name,
@@ -54,6 +56,7 @@
         left join sys_dept sd on sd.id = suji.dept_id
         where
         1=1
+          and suji.is_delete = 0
         <if test="sysUserInfoListVo.deptId != null and sysUserInfoListVo.deptId != ''">
             and suji.dept_id = #{sysUserInfoListVo.deptId}
         </if>
@@ -67,14 +70,18 @@
         <if test="sysUserInfoListVo.status != null and sysUserInfoListVo.status != ''">
             and suji.status = #{sysUserInfoListVo.status}
         </if>
+        <if test="sysUserInfoListVo.isEnable != null and sysUserInfoListVo.isEnable != ''">
+            and suji.is_enable = #{sysUserInfoListVo.isEnable}
+        </if>
         <if test="sysUserInfoListVo.leaderId != null and sysUserInfoListVo.leaderId != ''">
             and (suji.leader_id = #{sysUserInfoListVo.leaderId}
             or  su.username = #{sysUserInfoListVo.leaderId)
         </if>
         <if test="sysUserInfoListVo.salesman != null and sysUserInfoListVo.salesman != ''">
-            and (su.username like concat('%',#{sysUserInfoListVo.salesman},'%')
+            and (suji.name like concat('%',#{sysUserInfoListVo.salesman},'%')
             or  su.mobile = #{sysUserInfoListVo.salesman}
             or  suji.id = #{sysUserInfoListVo.salesman})
         </if>
+        order by suji.create_time desc
     </select>
 </mapper>