result = new ArrayList<>();
+ for (String string : strings) {
+ result.add(Long.parseLong(string));
+ }
+
+ return result;
+ }
+
+ public static String getRandomString(int length) {
+ String str = "0123456789";
+ Random random = new Random();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < length; i++) {
+ int number = random.nextInt(10);
+ sb.append(str.charAt(number));
+ }
+ return sb.toString();
+
+ }
+
+ public static String getComplexRandomString(int length) {
+ String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ Random random = new Random();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < length; i++) {
+ int number = random.nextInt(62);
+ sb.append(str.charAt(number));
+ }
+ return sb.toString();
+ }
+
+ public static String convertPropertiesToHtml(String properties){
+ //1:容量:6:32GB_4:样式:12:塑料壳
+ StringBuilder sBuilder = new StringBuilder();
+ String[] propArr = properties.split("_");
+ for (String props : propArr) {
+ String[] valueArr = props.split(":");
+ sBuilder.append(valueArr[1]).append(":").append(valueArr[3]).append("
");
+ }
+ return sBuilder.toString();
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java
new file mode 100644
index 000000000..85f1a27e6
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java
@@ -0,0 +1,95 @@
+package com.ruoyi.common.utils.file;
+
+import java.io.File;
+import java.util.Objects;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件类型工具类
+ *
+ * @author ruoyi
+ */
+public class FileTypeUtils
+{
+ /**
+ * 获取文件类型
+ *
+ * 例如: ruoyi.txt, 返回: txt
+ *
+ * @param file 文件名
+ * @return 后缀(不含".")
+ */
+ public static String getFileType(File file)
+ {
+ if (null == file)
+ {
+ return StringUtils.EMPTY;
+ }
+ return getFileType(file.getName());
+ }
+
+ /**
+ * 获取文件类型
+ *
+ * 例如: ruoyi.txt, 返回: txt
+ *
+ * @param fileName 文件名
+ * @return 后缀(不含".")
+ */
+ public static String getFileType(String fileName)
+ {
+ int separatorIndex = fileName.lastIndexOf(".");
+ if (separatorIndex < 0)
+ {
+ return "";
+ }
+ return fileName.substring(separatorIndex + 1).toLowerCase();
+ }
+
+ /**
+ * 获取文件名的后缀
+ *
+ * @param file 表单文件
+ * @return 后缀名
+ */
+ public static final String getExtension(MultipartFile file)
+ {
+ String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+ if (StringUtils.isEmpty(extension))
+ {
+ extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
+ }
+ return extension;
+ }
+
+ /**
+ * 获取文件类型
+ *
+ * @param photoByte 文件字节码
+ * @return 后缀(不含".")
+ */
+ public static String getFileExtendName(byte[] photoByte)
+ {
+ String strFileExtendName = "JPG";
+ if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
+ && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
+ {
+ strFileExtendName = "GIF";
+ }
+ else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
+ {
+ strFileExtendName = "JPG";
+ }
+ else if ((photoByte[0] == 66) && (photoByte[1] == 77))
+ {
+ strFileExtendName = "BMP";
+ }
+ else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
+ {
+ strFileExtendName = "PNG";
+ }
+ return strFileExtendName;
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
index 6ca97fe60..e3cf52e01 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
@@ -37,4 +37,23 @@ public class MimeTypeUtils {
// pdf
"pdf"};
+ public static String getExtension(String prefix)
+ {
+ switch (prefix)
+ {
+ case IMAGE_PNG:
+ return "png";
+ case IMAGE_JPG:
+ return "jpg";
+ case IMAGE_JPEG:
+ return "jpeg";
+ case IMAGE_BMP:
+ return "bmp";
+ case IMAGE_GIF:
+ return "gif";
+ default:
+ return "";
+ }
+ }
+
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExportWordUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExportWordUtil.java
new file mode 100644
index 000000000..c61404002
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExportWordUtil.java
@@ -0,0 +1,138 @@
+package com.ruoyi.common.utils.poi;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.util.PoitlIOUtils;
+import org.springframework.util.Assert;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+/**
+ * word模板导出
+ * @author ljl
+ */
+public class ExportWordUtil {
+ private ExportWordUtil() {
+ }
+
+ /**
+ * 1.compile 编译模板
+ * 2.render 渲染数据
+ * 3.输出到流
+ * @param hashMap
+ */
+ public static String createWord(String templatePath, String fileDir, String fileName, Map hashMap ){
+ Assert.notNull(templatePath, "word模板文件路径不能为空");
+ Assert.notNull(fileDir, "生成的文件存放地址不能为空");
+ Assert.notNull(fileName, "生成的文件名不能为空");
+
+ // 生成的word格式
+ String formatSuffix = ".docx";
+ // 拼接后的文件名
+ fileName = fileName + formatSuffix;
+
+ // 生成的文件的存放路径
+ if (!fileDir.endsWith("/")) {
+ fileDir = fileDir + File.separator;
+ }
+
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ System.out.println("生成word数据时存储文件目录{}不存在,为您创建文件夹!");
+ dir.mkdirs();
+ }
+
+ String filePath = fileDir + fileName;
+ // 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
+ XWPFTemplate template = XWPFTemplate.compile(templatePath).render(hashMap);
+ try {
+ // 将填充之后的模板写入filePath
+ template.writeToFile(filePath);
+ template.close();
+ } catch (Exception e) {
+ System.out.println("生成word异常");
+ e.printStackTrace();
+ return "";
+ }
+ return filePath;
+ }
+
+ /**
+ * 输出到网络中
+ * @param response
+ * @param templatePath
+ * @param fileName
+ * @param hashMap
+ * @return
+ */
+ public static String createWord(HttpServletResponse response, String templatePath, String fileName, Map hashMap){
+ Assert.notNull(templatePath, "word模板文件路径不能为空");
+ //Assert.notNull(fileDir, "生成的文件存放地址不能为空");
+ Assert.notNull(fileName, "生成的文件名不能为空");
+ // 生成的word格式
+ String formatSuffix = ".docx";
+ // 拼接后的文件名
+// fileName = fileName + formatSuffix;
+ // 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
+ XWPFTemplate template = XWPFTemplate.compile(templatePath).render(hashMap);
+ try {
+ response.reset();
+ response.setCharacterEncoding("UTF-8");
+// response.setContentType("application/msword");
+ response.setContentType("application/octet-stream");
+ response.setHeader("Content-disposition","attachment;filename="+new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1));
+ OutputStream out = response.getOutputStream();
+ // 将填充之后的模板写入filePath
+// template.write(out);
+// out.flush();
+// template.close();
+ // HttpServletResponse response
+ BufferedOutputStream bos = new BufferedOutputStream(out);
+
+ template.write(bos);
+ bos.flush();
+ out.flush();
+ PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+ } catch (Exception e) {
+ System.out.println("生成word异常");
+ e.printStackTrace();
+ return "";
+ }
+ return fileName;
+ }
+
+
+ public static String createWord1(HttpServletResponse response, HttpServletRequest request, String templatePath, String fileName, Map hashMap, Configure configure){
+ Assert.notNull(templatePath, "word模板文件路径不能为空");
+ //Assert.notNull(fileDir, "生成的文件存放地址不能为空");
+ Assert.notNull(fileName, "生成的文件名不能为空");
+ // 生成的word格式
+ String formatSuffix = ".docx";
+ // 拼接后的文件名
+ //fileName = fileName + formatSuffix;
+ // 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板+渲染数据
+ XWPFTemplate template = XWPFTemplate.compile(templatePath,configure).render(hashMap);
+ try {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application/octet-stream");
+ response.setHeader("Content-disposition","attachment;filename="+new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1));
+ //OutputStream out = response.getOutputStream();
+ OutputStream out = response.getOutputStream();
+ //BufferedOutputStream bos = new BufferedOutputStream(out);
+ // 将填充之后的模板写入filePath
+ template.write(out);
+ template.close();
+ } catch (Exception e) {
+ System.out.println("生成word异常");
+ e.printStackTrace();
+ return "";
+ }
+ return fileName;
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java
new file mode 100644
index 000000000..8ddc4089d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java
@@ -0,0 +1,86 @@
+package com.ruoyi.common.utils.uuid;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+
+/**
+ * @author ruoyi 序列生成类
+ */
+public class Seq
+{
+ // 通用序列类型
+ public static final String commSeqType = "COMMON";
+
+ // 上传序列类型
+ public static final String uploadSeqType = "UPLOAD";
+
+ // 通用接口序列数
+ private static AtomicInteger commSeq = new AtomicInteger(1);
+
+ // 上传接口序列数
+ private static AtomicInteger uploadSeq = new AtomicInteger(1);
+
+ // 机器标识
+ private static final String machineCode = "A";
+
+ /**
+ * 获取通用序列号
+ *
+ * @return 序列值
+ */
+ public static String getId()
+ {
+ return getId(commSeqType);
+ }
+
+ /**
+ * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串
+ *
+ * @return 序列值
+ */
+ public static String getId(String type)
+ {
+ AtomicInteger atomicInt = commSeq;
+ if (uploadSeqType.equals(type))
+ {
+ atomicInt = uploadSeq;
+ }
+ return getId(atomicInt, 3);
+ }
+
+ /**
+ * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串
+ *
+ * @param atomicInt 序列数
+ * @param length 数值长度
+ * @return 序列值
+ */
+ public static String getId(AtomicInteger atomicInt, int length)
+ {
+ String result = DateUtils.dateTimeNow();
+ result += machineCode;
+ result += getSeq(atomicInt, length);
+ return result;
+ }
+
+ /**
+ * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数
+ *
+ * @return 序列值
+ */
+ private synchronized static String getSeq(AtomicInteger atomicInt, int length)
+ {
+ // 先取值再+1
+ int value = atomicInt.getAndIncrement();
+
+ // 如果更新后值>=10 的 (length)幂次方则重置为1
+ int maxSeq = (int) Math.pow(10, length);
+ if (atomicInt.get() >= maxSeq)
+ {
+ atomicInt.set(1);
+ }
+ // 转字符串,用0左补齐
+ return StringUtils.padl(value, length);
+ }
+}
diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml
index b64625d34..fbe3475e6 100644
--- a/ruoyi-demo/pom.xml
+++ b/ruoyi-demo/pom.xml
@@ -29,10 +29,10 @@
-
-
-
-
+
+ com.aliyun
+ dysmsapi20170525
+
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java b/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java
new file mode 100644
index 000000000..51009defa
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java
@@ -0,0 +1,94 @@
+/*
+package com.ruoyi.file.config;
+
+import io.minio.MinioClient;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+*/
+/**
+ * Minio 配置信息
+ *
+ * @author ruoyi
+ *//*
+
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfig
+{
+ */
+/**
+ * 服务地址
+ *//*
+
+ private String url;
+
+ */
+/**
+ * 用户名
+ *//*
+
+ private String accessKey;
+
+ */
+/**
+ * 密码
+ *//*
+
+ private String secretKey;
+
+ */
+/**
+ * 存储桶名称
+ *//*
+
+ private String bucketName;
+
+ public String getUrl()
+ {
+ return url;
+ }
+
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+
+ public String getAccessKey()
+ {
+ return accessKey;
+ }
+
+ public void setAccessKey(String accessKey)
+ {
+ this.accessKey = accessKey;
+ }
+
+ public String getSecretKey()
+ {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey)
+ {
+ this.secretKey = secretKey;
+ }
+
+ public String getBucketName()
+ {
+ return bucketName;
+ }
+
+ public void setBucketName(String bucketName)
+ {
+ this.bucketName = bucketName;
+ }
+
+ @Bean
+ public MinioClient getMinioClient()
+ {
+ return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
+ }
+}
+*/
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java b/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java
new file mode 100644
index 000000000..b4e99f4c7
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java
@@ -0,0 +1,62 @@
+/*
+package com.ruoyi.file.config;
+
+import java.io.File;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+*/
+/**
+ * 通用映射配置
+ *
+ * @author ruoyi
+ *//*
+
+@Configuration
+public class ResourcesConfig implements WebMvcConfigurer
+{
+ */
+/**
+ * 上传文件存储在本地的根路径
+ *//*
+
+ @Value("${file.path}")
+ private String localFilePath;
+
+ */
+/**
+ * 资源映射路径 前缀
+ *//*
+
+ @Value("${file.prefix}")
+ public String localFilePrefix;
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry)
+ {
+ */
+/** 本地文件上传路径 *//*
+
+ registry.addResourceHandler(localFilePrefix + "/**")
+ .addResourceLocations("file:" + localFilePath + File.separator);
+ }
+
+ */
+/**
+ * 开启跨域
+ *//*
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ // 设置允许跨域的路由
+ registry.addMapping(localFilePrefix + "/**")
+ // 设置允许跨域请求的域名
+ .allowedOrigins("*")
+ // 设置允许的方法
+ .allowedMethods("GET");
+ }
+}
+*/
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java b/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java
new file mode 100644
index 000000000..9743cf374
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java
@@ -0,0 +1,53 @@
+/*
+package com.ruoyi.file.service;
+
+import java.io.InputStream;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import com.github.tobato.fastdfs.domain.fdfs.StorePath;
+import com.github.tobato.fastdfs.service.FastFileStorageClient;
+import com.ruoyi.common.core.utils.file.FileTypeUtils;
+
+*/
+/**
+ * FastDFS 文件存储
+ *
+ * @author ruoyi
+ *//*
+
+@Service
+public class FastDfsSysFileServiceImpl implements ISysFileService
+{
+ */
+/**
+ * 域名或本机访问地址
+ *//*
+
+ @Value("${fdfs.domain}")
+ public String domain;
+
+ @Autowired
+ private FastFileStorageClient storageClient;
+
+ */
+/**
+ * FastDfs文件上传接口
+ *
+ * @param file 上传的文件
+ * @return 访问地址
+ * @throws Exception
+ *//*
+
+ @Override
+ public String uploadFile(MultipartFile file) throws Exception
+ {
+ InputStream inputStream = file.getInputStream();
+ StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
+ FileTypeUtils.getExtension(file), null);
+ inputStream.close();
+ return domain + "/" + storePath.getFullPath();
+ }
+}
+*/
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java b/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java
new file mode 100644
index 000000000..472ad5b40
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.file.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件上传接口
+ *
+ * @author ruoyi
+ */
+public interface ISysFileService
+{
+ /**
+ * 文件上传接口
+ *
+ * @param file 上传的文件
+ * @return 访问地址
+ * @throws Exception
+ */
+ public String uploadFile(MultipartFile file) throws Exception;
+}
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java b/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
new file mode 100644
index 000000000..1a2fe2104
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
@@ -0,0 +1,53 @@
+package com.ruoyi.file.service;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.file.utils.FileUploadUtils;
+
+/**
+ * 本地文件存储
+ *
+ * @author ruoyi
+ */
+@Primary
+@Service
+public class LocalSysFileServiceImpl implements ISysFileService
+{
+
+ /**
+ * 资源映射路径 前缀
+ */
+ @Value("${file.prefix}")
+ public String localFilePrefix;
+
+ /**
+ * 域名或本机访问地址
+ */
+ @Value("${file.domain}")
+ public String domain;
+
+ /**
+ * 上传文件存储在本地的根路径
+ */
+ @Value("${file.path}")
+ private String localFilePath;
+
+
+
+ /**
+ * 本地文件上传接口
+ *
+ * @param file 上传的文件
+ * @return 访问地址
+ * @throws Exception
+ */
+ @Override
+ public String uploadFile(MultipartFile file) throws Exception
+ {
+ String name = FileUploadUtils.upload(localFilePath, file);
+ String url = domain + localFilePrefix + name;
+ return url;
+ }
+}
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java b/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
new file mode 100644
index 000000000..33e3b3c39
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
@@ -0,0 +1,54 @@
+/*
+package com.ruoyi.file.service;
+
+import java.io.InputStream;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.file.config.MinioConfig;
+import com.ruoyi.file.utils.FileUploadUtils;
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+
+*/
+/**
+ * Minio 文件存储
+ *
+ * @author ruoyi
+ *//*
+
+@Service
+public class MinioSysFileServiceImpl implements ISysFileService
+{
+ @Autowired
+ private MinioConfig minioConfig;
+
+ @Autowired
+ private MinioClient client;
+
+ */
+/**
+ * Minio文件上传接口
+ *
+ * @param file 上传的文件
+ * @return 访问地址
+ * @throws Exception
+ *//*
+
+ @Override
+ public String uploadFile(MultipartFile file) throws Exception
+ {
+ String fileName = FileUploadUtils.extractFilename(file);
+ InputStream inputStream = file.getInputStream();
+ PutObjectArgs args = PutObjectArgs.builder()
+ .bucket(minioConfig.getBucketName())
+ .object(fileName)
+ .stream(inputStream, file.getSize(), -1)
+ .contentType(file.getContentType())
+ .build();
+ client.putObject(args);
+ inputStream.close();
+ return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
+ }
+}
+*/
diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java b/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
new file mode 100644
index 000000000..2f7ef168b
--- /dev/null
+++ b/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
@@ -0,0 +1,183 @@
+package com.ruoyi.file.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.Objects;
+
+import com.ruoyi.common.exception.file.FileException;
+import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
+import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
+import com.ruoyi.common.exception.file.InvalidExtensionException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileTypeUtils;
+import com.ruoyi.common.utils.file.MimeTypeUtils;
+import com.ruoyi.common.utils.uuid.Seq;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件上传工具类
+ *
+ * @author ruoyi
+ */
+public class FileUploadUtils
+{
+ /**
+ * 默认大小 50M
+ */
+ public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
+
+ /**
+ * 默认的文件名最大长度 100
+ */
+ public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+ /**
+ * 根据文件路径上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws IOException
+ */
+ public static final String upload(String baseDir, MultipartFile file) throws IOException
+ {
+ try
+ {
+ return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+ }
+ catch (FileException fe)
+ {
+ throw new IOException(fe.getDefaultMessage(), fe);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @param allowedExtension 上传文件类型
+ * @return 返回上传成功的文件名
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws FileNameLengthLimitExceededException 文件名太长
+ * @throws IOException 比如读写文件出错时
+ * @throws
+ */
+ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
+ throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException {
+ int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
+ if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+ {
+ throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+ }
+
+ assertAllowed(file, allowedExtension);
+
+ String fileName = extractFilename(file);
+
+ String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
+ file.transferTo(Paths.get(absPath));
+ return getPathFileName(fileName);
+ }
+
+ /**
+ * 编码文件名
+ */
+ public static final String extractFilename(MultipartFile file)
+ {
+ return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
+ FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file));
+ }
+
+ private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
+ {
+ File desc = new File(uploadDir + File.separator + fileName);
+
+ if (!desc.exists())
+ {
+ if (!desc.getParentFile().exists())
+ {
+ desc.getParentFile().mkdirs();
+ }
+ }
+ return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
+ }
+
+ private static final String getPathFileName(String fileName) throws IOException
+ {
+ String pathFileName = "/" + fileName;
+ return pathFileName;
+ }
+
+ /**
+ * 文件大小校验
+ *
+ * @param file 上传的文件
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws InvalidExtensionException 文件校验异常
+ */
+ public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+ throws FileSizeLimitExceededException, InvalidExtensionException {
+ long size = file.getSize();
+ if (size > DEFAULT_MAX_SIZE)
+ {
+ throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+ }
+
+ String fileName = file.getOriginalFilename();
+ String extension = FileTypeUtils.getExtension(file);
+ if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
+ {
+ if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else
+ {
+ throw new InvalidExtensionException(allowedExtension, extension, fileName);
+ }
+ }
+ }
+
+ /**
+ * 判断MIME类型是否是允许的MIME类型
+ *
+ * @param extension 上传文件类型
+ * @param allowedExtension 允许上传文件类型
+ * @return true/false
+ */
+ public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
+ {
+ for (String str : allowedExtension)
+ {
+ if (str.equalsIgnoreCase(extension))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
index d558a4ce7..d9f966beb 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.annotation.RateLimiter;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.enums.LimitType;
import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
@@ -112,7 +113,10 @@ public class RateLimiterAspect {
if (rateLimiter.limitType() == LimitType.IP) {
// 获取请求ip
stringBuffer.append(ServletUtils.getClientIP()).append(":");
- } else if (rateLimiter.limitType() == LimitType.CLUSTER) {
+ }else if (rateLimiter.limitType() == LimitType.USERID){
+ // 获取用户ID
+ stringBuffer.append(String.valueOf(LoginHelper.getUserId())).append(":");
+ }else if (rateLimiter.limitType() == LimitType.CLUSTER) {
// 获取客户端实例id
stringBuffer.append(RedisUtils.getClient().getId()).append(":");
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index ea83338ba..a8697d27d 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -1,15 +1,20 @@
package com.ruoyi.framework.config;
import com.ruoyi.framework.interceptor.PlusWebInvokeTimeInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import java.io.File;
+
/**
* 通用配置
*
@@ -18,15 +23,25 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
+ @Value("${file.path}")
+ private String localFilePath;
+
+ /**
+ * 资源映射路径 前缀
+ */
+ @Value("${file.prefix}")
+ public String localFilePrefix;
+
+
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 全局访问性能拦截
registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
}
- @Override
+ /* @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
- }
+ }*/
/**
* 跨域配置
@@ -49,4 +64,28 @@ public class ResourcesConfig implements WebMvcConfigurer {
// 返回新的CorsFilter
return new CorsFilter(source);
}
+ /**
+ * 上传文件存储在本地的根路径
+ */
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry)
+ {
+ /** 本地文件上传路径 */
+ registry.addResourceHandler(localFilePrefix + "/**")
+ .addResourceLocations("file:" + localFilePath + File.separator);
+ }
+
+ /**
+ * 开启跨域
+ */
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ // 设置允许跨域的路由
+ registry.addMapping(localFilePrefix + "/**")
+ // 设置允许跨域请求的域名
+ .allowedOrigins("*")
+ // 设置允许的方法
+ .allowedMethods("GET");
+ }
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
index a9de17e60..8ad8828bd 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
@@ -58,6 +58,23 @@ public class UserActionListener implements SaTokenListener {
log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
} else if (userType == UserType.APP_USER) {
// app端 自行根据业务编写
+ UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
+ String ip = ServletUtils.getClientIP();
+ LoginUser user = LoginHelper.getLoginUser();
+ UserOnlineDTO dto = new UserOnlineDTO();
+ dto.setIpaddr(ip);
+ dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
+ dto.setBrowser(userAgent.getBrowser().getName());
+ dto.setOs(userAgent.getOs().getName());
+ dto.setLoginTime(System.currentTimeMillis());
+ dto.setTokenId(tokenValue);
+ dto.setUserName(user.getUsername());
+ if(tokenConfig.getTimeout() == -1) {
+ RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
+ } else {
+ RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
+ }
+ log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
}
}
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 1e09c8283..9b7b00296 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -39,7 +39,6 @@
com.ruoyi
ruoyi-work
-
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/BuyHouses.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/BuyHouses.java
index de87c780d..c096535c9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/BuyHouses.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/BuyHouses.java
@@ -1,11 +1,14 @@
package com.ruoyi.system.domain;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import java.util.Date;
+import java.util.List;
/**
* 【请填写功能名称】对象 buy_houses
@@ -15,7 +18,7 @@ import java.util.Date;
*/
@Data
@TableName("buy_houses")
-public class BuyHouses {
+public class BuyHouses extends BaseEntity {
private static final long serialVersionUID=1L;
@@ -162,4 +165,11 @@ public class BuyHouses {
private String version;
+ private String companyId;
+
+ @TableField(exist = false)
+ private List buyHousesMemberList;
+
+
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/HousesReview.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/HousesReview.java
index 35c13a064..965742fc6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/HousesReview.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/HousesReview.java
@@ -127,4 +127,9 @@ public class HousesReview extends BaseEntity {
*/
private String companyAddressArea;
+ /**
+ * d类字段扩展
+ */
+ private String typeExtend;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialProof.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialProof.java
index e8772d63d..8e394cdc5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialProof.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialProof.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.domain;
+import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/User.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/User.java
new file mode 100644
index 000000000..1191f1c1c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/User.java
@@ -0,0 +1,104 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】对象 user
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("user")
+public class User extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 用户账号状态 1,未认定 2,认定中 ,3 未发卡,4 已发卡
+ */
+ private Long status;
+ /**
+ * 用户名
+ */
+ private String loginName;
+ /**
+ * 登陆密码
+ */
+ private String password;
+ /**
+ * 卡号
+ */
+ private String cardNumber;
+ /**
+ * 认定类型
+ */
+ private String type;
+ /**
+ * 卡有效期
+ */
+ private String validityDate;
+ /**
+ * 微信token
+ */
+ private String wxToken;
+ /**
+ * 登陆次数
+ */
+ private Long enterNumber;
+ /**
+ * 用户名称
+ */
+ private String userName;
+ /**
+ *
+ */
+ private Date lastTime;
+ /**
+ * 方向
+ */
+ private Long direction;
+ /**
+ * 用户限制 1,正常 2,禁用
+ */
+ private Long jurisdiction;
+ /**
+ * 求职意向
+ */
+ private String jobWanted;
+ /**
+ *
+ */
+ private Date registerTime;
+ /**
+ * 申报的微信token
+ */
+ private String wxToken1;
+ /**
+ * 身份证
+ */
+ private String cardId;
+
+ /**
+ * 用户类型
+ */
+ private String userType;
+
+ private String companyId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/BuyHousesBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/BuyHousesBo.java
index 4ba0b80df..070133e20 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/BuyHousesBo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/BuyHousesBo.java
@@ -3,6 +3,7 @@ package com.ruoyi.system.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.DownloadGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.system.domain.BuyHousesMember;
import lombok.Data;
@@ -39,7 +40,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 身份证/护照
*/
- @NotBlank(message = "身份证/护照不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "身份证/护照不能为空", groups = { AddGroup.class, EditGroup.class ,DownloadGroup.class})
private String cardId;
/**
@@ -51,13 +52,13 @@ public class BuyHousesBo extends BaseEntity {
/**
* 单位地址
*/
- @NotBlank(message = "单位地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "单位地址不能为空", groups = { AddGroup.class, EditGroup.class, DownloadGroup.class })
private String companyAddress;
/**
* 工作单位
*/
- @NotBlank(message = "工作单位不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "工作单位不能为空", groups = { AddGroup.class, EditGroup.class , DownloadGroup.class})
private String companyName;
/**
@@ -81,7 +82,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 学历
*/
- @NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String education;
/**
@@ -141,7 +142,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 手机号
*/
- @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String phone;
/**
@@ -159,7 +160,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 性别
*/
- @NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String sex;
/**
@@ -171,7 +172,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 统一社会信用代码
*/
- @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String socialCode;
/**
@@ -189,7 +190,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 类型 A B C D
*/
- @NotBlank(message = "类型 A B C D不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "类型 A B C D不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String type;
/**
@@ -201,7 +202,7 @@ public class BuyHousesBo extends BaseEntity {
/**
* 姓名
*/
- @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+ @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class,DownloadGroup.class })
private String userName;
/**
@@ -211,24 +212,34 @@ public class BuyHousesBo extends BaseEntity {
private Date affTime;
/**
- *
+ *人才影像卡
*/
@NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
private String pictureInformationUrl;
/**
- *
+ *工作地址
*/
@NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
private String workAddress;
+ /**
+ * 流程key
+ */
private String processKey;
+ /**
+ * 流程状态
+ */
+ private String processStatus;
+
@TableField(exist = false)
private List buyHousesMemberList;
private String version;
+ private String companyId;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/HousesReviewBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/HousesReviewBo.java
index 5229456da..0c8e3e9e8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/HousesReviewBo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/HousesReviewBo.java
@@ -178,6 +178,11 @@ public class HousesReviewBo extends BaseEntity {
private List materialProofList;
+ /**
+ * d类字段扩展
+ */
+ private String typeExtend;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialModuleBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialModuleBo.java
index ce542af70..6ce13d65c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialModuleBo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialModuleBo.java
@@ -40,7 +40,7 @@ public class MaterialModuleBo extends BaseEntity {
/**
* 审核部门
*/
- @NotBlank(message = "审核部门不能为空", groups = { AddGroup.class, EditGroup.class })
+// @NotBlank(message = "审核部门不能为空", groups = { AddGroup.class, EditGroup.class })
private String auditDept;
/**
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/UserBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/UserBo.java
new file mode 100644
index 000000000..ccdc58daf
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/UserBo.java
@@ -0,0 +1,136 @@
+package com.ruoyi.system.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】业务对象 user
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserBo extends BaseEntity {
+
+ /**
+ *
+ */
+ @NotNull(message = "不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 用户账号状态 1,未认定 2,认定中 ,3 未发卡,4 已发卡
+ */
+ @NotNull(message = "用户账号状态 1,未认定 2,认定中 ,3 未发卡,4 已发卡不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long status;
+
+ /**
+ * 用户名
+ */
+ @NotBlank(message = "用户名不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String loginName;
+
+ /**
+ * 登陆密码
+ */
+ @NotBlank(message = "登陆密码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String password;
+
+ /**
+ * 卡号
+ */
+ @NotBlank(message = "卡号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String cardNumber;
+
+ /**
+ * 认定类型
+ */
+ @NotBlank(message = "认定类型不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String type;
+
+ /**
+ * 卡有效期
+ */
+ @NotBlank(message = "卡有效期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String validityDate;
+
+ /**
+ * 微信token
+ */
+ @NotBlank(message = "微信token不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String wxToken;
+
+ /**
+ * 登陆次数
+ */
+ @NotNull(message = "登陆次数不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long enterNumber;
+
+ /**
+ * 用户名称
+ */
+ @NotBlank(message = "用户名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String userName;
+
+ /**
+ *
+ */
+ @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date lastTime;
+
+ /**
+ * 方向
+ */
+ @NotNull(message = "方向不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long direction;
+
+ /**
+ * 用户限制 1,正常 2,禁用
+ */
+ @NotNull(message = "用户限制 1,正常 2,禁用不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long jurisdiction;
+
+ /**
+ * 求职意向
+ */
+ @NotBlank(message = "求职意向不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String jobWanted;
+
+ /**
+ *
+ */
+ @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date registerTime;
+
+ /**
+ * 申报的微信token
+ */
+ @NotBlank(message = "申报的微信token不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String wxToken1;
+
+ /**
+ * 身份证
+ */
+ @NotBlank(message = "身份证不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String cardId;
+
+ /**
+ * 用户类型
+ */
+ private String userType;
+
+ private String companyId;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/DeclareListDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/DeclareListDTO.java
new file mode 100644
index 000000000..87d41d306
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/DeclareListDTO.java
@@ -0,0 +1,43 @@
+package com.ruoyi.system.domain.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ExcelIgnoreUnannotated
+public class DeclareListDTO {
+ /**
+ * 项目名称
+ */
+ private String projectName;
+
+ /**
+ * 提交时间
+ */
+ private Date createTime;
+
+ /**
+ * 状态
+ */
+ private String processStatus;
+
+ /**
+ * 业务id
+ */
+ private String businessId;
+
+ /**
+ * 申请人
+ */
+ private String userName;
+
+ /**
+ * 流程key
+ */
+ private String processKey;
+
+ private String cardId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/BuyHousesVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/BuyHousesVo.java
index 6985d44ed..8566bace7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/BuyHousesVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/BuyHousesVo.java
@@ -223,6 +223,8 @@ public class BuyHousesVo {
private String processKey;
+ private String processStatus;
+
@TableField(exist = false)
private List buyHousesMemberList;
@@ -231,5 +233,9 @@ public class BuyHousesVo {
@TableField(exist = false)
private List materialProofList;
+ private Date updateTime;
+
+ private String companyId;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/HousesReviewVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/HousesReviewVo.java
index 78de7b33b..427b246cb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/HousesReviewVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/HousesReviewVo.java
@@ -2,10 +2,12 @@ package com.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.BuyHousesReviewMember;
import lombok.Data;
+import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -18,14 +20,14 @@ import java.util.List;
*/
@Data
@ExcelIgnoreUnannotated
-public class HousesReviewVo {
+public class HousesReviewVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
- @ExcelProperty(value = "id")
+// @ExcelProperty(value = "id")
private Long id;
/**
@@ -152,6 +154,7 @@ public class HousesReviewVo {
* 企业所在地
*/
// @ExcelProperty(value = "企业所在地")
+
private String companyAddress;
/**
@@ -170,10 +173,16 @@ public class HousesReviewVo {
private String companyAddressArea;
+ @TableField(exist = false)
private List buyHousesMemberList;
private Date updateTime;
+ /**
+ * d类字段扩展
+ */
+ private String typeExtend;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserVo.java
new file mode 100644
index 000000000..efb9b606c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserVo.java
@@ -0,0 +1,138 @@
+package com.ruoyi.system.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 user
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class UserVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 用户账号状态 1,未认定 2,认定中 ,3 未发卡,4 已发卡
+ */
+ @ExcelProperty(value = "用户账号状态 1,未认定 2,认定中 ,3 未发卡,4 已发卡")
+ private Long status;
+
+ /**
+ * 用户名
+ */
+ @ExcelProperty(value = "用户名")
+ private String loginName;
+
+ /**
+ * 登陆密码
+ */
+ @ExcelProperty(value = "登陆密码")
+ private String password;
+
+ /**
+ * 卡号
+ */
+ @ExcelProperty(value = "卡号")
+ private String cardNumber;
+
+ /**
+ * 认定类型
+ */
+ @ExcelProperty(value = "认定类型")
+ private String type;
+
+ /**
+ * 卡有效期
+ */
+ @ExcelProperty(value = "卡有效期")
+ private String validityDate;
+
+ /**
+ * 微信token
+ */
+ @ExcelProperty(value = "微信token")
+ private String wxToken;
+
+ /**
+ * 登陆次数
+ */
+ @ExcelProperty(value = "登陆次数")
+ private Long enterNumber;
+
+ /**
+ * 用户名称
+ */
+ @ExcelProperty(value = "用户名称")
+ private String userName;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date lastTime;
+
+ /**
+ * 方向
+ */
+ @ExcelProperty(value = "方向")
+ private Long direction;
+
+ /**
+ * 用户限制 1,正常 2,禁用
+ */
+ @ExcelProperty(value = "用户限制 1,正常 2,禁用")
+ private Long jurisdiction;
+
+ /**
+ * 求职意向
+ */
+ @ExcelProperty(value = "求职意向")
+ private String jobWanted;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date registerTime;
+
+ /**
+ * 申报的微信token
+ */
+ @ExcelProperty(value = "申报的微信token")
+ private String wxToken1;
+
+ /**
+ * 身份证
+ */
+ @ExcelProperty(value = "身份证")
+ private String cardId;
+
+ /**
+ * 用户类型
+ */
+ private String userType;
+
+ private String companyId;
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
new file mode 100644
index 000000000..bf67854f3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.system.domain.User;
+import com.ruoyi.system.domain.vo.UserVo;
+import com.ruoyi.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+public interface UserMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IBuyHousesService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IBuyHousesService.java
index d642578c8..8e5992f09 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IBuyHousesService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IBuyHousesService.java
@@ -3,7 +3,9 @@ package com.ruoyi.system.service;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.system.domain.BuyHouses;
import com.ruoyi.system.domain.bo.BuyHousesBo;
+import com.ruoyi.system.domain.dto.DeclareListDTO;
import com.ruoyi.system.domain.vo.BuyHousesVo;
import java.util.Collection;
@@ -48,4 +50,14 @@ public interface IBuyHousesService {
Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
R> getMaterialInfo(BuyHousesBo bo);
+
+ BuyHouses getBuyHousesByCardId(String cardId);
+
+ R downloadWord(BuyHousesBo buyHouses);
+
+ List getDeclareList();
+
+ R> getInfo(BuyHouses buyHouses);
+
+ R getGaoXinCandidateInfoByCardId(String cardId);
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IUserService.java
new file mode 100644
index 000000000..2d2973614
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IUserService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.domain.User;
+import com.ruoyi.system.domain.vo.UserVo;
+import com.ruoyi.system.domain.bo.UserBo;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+public interface IUserService {
+
+ /**
+ * 查询【请填写功能名称】
+ */
+ UserVo queryById(Long id);
+
+ /**
+ * 查询【请填写功能名称】列表
+ */
+ TableDataInfo queryPageList(UserBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询【请填写功能名称】列表
+ */
+ List queryList(UserBo bo);
+
+ /**
+ * 新增【请填写功能名称】
+ */
+ Boolean insertByBo(UserBo bo);
+
+ /**
+ * 修改【请填写功能名称】
+ */
+ Boolean updateByBo(UserBo bo);
+
+ /**
+ * 校验并批量删除【请填写功能名称】信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 重置用户密码
+ *
+ * @param userName 用户名
+ * @param password 密码
+ * @return 结果
+ */
+ int resetUserPwd(String userName, String password);
+
+ R> getUserCandidateInfo(String cardId) throws Exception;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
index 3c29b85cf..d4ec93fa8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
@@ -4,10 +4,15 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.event.LogininforEvent;
import com.ruoyi.common.core.domain.dto.RoleDTO;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -16,6 +21,7 @@ import com.ruoyi.common.core.domain.model.XcxLoginUser;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.LoginType;
import com.ruoyi.common.enums.UserStatus;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserException;
@@ -26,7 +32,11 @@ import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
+import com.ruoyi.system.domain.BuyHouses;
+import com.ruoyi.system.domain.User;
+import com.ruoyi.system.domain.dto.DeclareListDTO;
import com.ruoyi.system.mapper.SysUserMapper;
+import com.ruoyi.system.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -34,7 +44,9 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
+import java.util.Date;
import java.util.List;
+import java.util.Map;
import java.util.function.Supplier;
/**
@@ -47,10 +59,14 @@ import java.util.function.Supplier;
@Service
public class SysLoginService {
- private final SysUserMapper userMapper;
+ private final IBuyHousesService iBuyHousesService;
+
+ private final SysUserMapper sysUserMapper;
private final ISysConfigService configService;
private final SysPermissionService permissionService;
+ private final UserMapper userMapper;
+
@Value("${user.password.maxRetryCount}")
private Integer maxRetryCount;
@@ -73,10 +89,10 @@ public class SysLoginService {
if (captchaEnabled) {
validateCaptcha(username, code, uuid, request);
}
- SysUser user = loadUserByUsername(username);
+ SysUser user = loadSysUserByUsername(username);
checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
- LoginUser loginUser = buildLoginUser(user);
+ LoginUser loginUser = buildLoginSysUser(user);
// 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.PC);
@@ -88,10 +104,9 @@ public class SysLoginService {
public String smsLogin(String phonenumber, String smsCode) {
// 通过手机号查找用户
SysUser user = loadUserByPhonenumber(phonenumber);
-
- checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode));
+ checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode,CacheConstants.CAPTCHA_CODE_KEY));
// 此处可根据登录用户的数据不同 自行创建 loginUser
- LoginUser loginUser = buildLoginUser(user);
+ LoginUser loginUser = buildLoginSysUser(user);
// 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.APP);
@@ -100,7 +115,11 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
-
+ /**
+ * 小程序登录
+ * @param xcxCode
+ * @return
+ */
public String xcxLogin(String xcxCode) {
// xcxCode 为 小程序调用 wx.login 授权后获取
// todo 以下自行实现
@@ -154,8 +173,8 @@ public class SysLoginService {
/**
* 校验短信验证码
*/
- private boolean validateSmsCode(String phonenumber, String smsCode) {
- String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + phonenumber);
+ private boolean validateSmsCode(String phonenumber, String smsCode,String key) {
+ String code = RedisUtils.getCacheObject(key + phonenumber);
if (StringUtils.isBlank(code)) {
recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
@@ -184,8 +203,8 @@ public class SysLoginService {
}
}
- private SysUser loadUserByUsername(String username) {
- SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
+ private SysUser loadSysUserByUsername(String username) {
+ SysUser user = sysUserMapper.selectOne(new LambdaQueryWrapper()
.select(SysUser::getUserName, SysUser::getStatus)
.eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) {
@@ -195,11 +214,11 @@ public class SysLoginService {
log.info("登录用户:{} 已被停用.", username);
throw new UserException("user.blocked", username);
}
- return userMapper.selectUserByUserName(username);
+ return sysUserMapper.selectUserByUserName(username);
}
private SysUser loadUserByPhonenumber(String phonenumber) {
- SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
+ SysUser user = sysUserMapper.selectOne(new LambdaQueryWrapper()
.select(SysUser::getPhonenumber, SysUser::getStatus)
.eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) {
@@ -209,7 +228,7 @@ public class SysLoginService {
log.info("登录用户:{} 已被停用.", phonenumber);
throw new UserException("user.blocked", phonenumber);
}
- return userMapper.selectUserByPhonenumber(phonenumber);
+ return sysUserMapper.selectUserByPhonenumber(phonenumber);
}
private SysUser loadUserByOpenid(String openid) {
@@ -229,7 +248,7 @@ public class SysLoginService {
/**
* 构建登录用户
*/
- private LoginUser buildLoginUser(SysUser user) {
+ private LoginUser buildLoginSysUser(SysUser user) {
LoginUser loginUser = new LoginUser();
loginUser.setUserId(user.getUserId());
loginUser.setDeptId(user.getDeptId());
@@ -243,6 +262,18 @@ public class SysLoginService {
return loginUser;
}
+ /**
+ * 构建登录用户
+ */
+ private LoginUser buildLoginUser(User user) {
+ LoginUser loginUser = new LoginUser();
+ loginUser.setUserId(user.getId());
+ loginUser.setUsername(user.getLoginName());
+ loginUser.setCompanyId(user.getCompanyId());
+ loginUser.setUserType(user.getUserType());
+ return loginUser;
+ }
+
/**
* 记录登录信息
*
@@ -254,7 +285,7 @@ public class SysLoginService {
sysUser.setLoginIp(ServletUtils.getClientIP());
sysUser.setLoginDate(DateUtils.getNowDate());
sysUser.setUpdateBy(username);
- userMapper.updateById(sysUser);
+ sysUserMapper.updateById(sysUser);
}
/**
@@ -287,8 +318,133 @@ public class SysLoginService {
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
}
}
-
// 登录成功 清空错误次数
RedisUtils.deleteObject(errorKey);
}
+//------------------------------------------------------------------------------------------------------------------------
+ private User loadUserByUsername(String username) {
+ User user = userMapper.selectOne(new LambdaQueryWrapper()
+ .eq(User::getLoginName, username));
+ if (ObjectUtil.isNull(user)) {
+ log.info("登录用户:{} 不存在.", username);
+ throw new UserException("user.not.exists", username);
+ } else if (user.getJurisdiction().equals(2L)) {
+ log.info("登录用户:{} 已被停用.", username);
+ throw new UserException("user.blocked", username);
+ }
+ return user;
+ }
+
+ /**
+ * 客户端用户登录
+ * @param username
+ * @param password
+ * @return
+ */
+ public String userLogin(String username, String password) {
+ User user = loadUserByUsername(username);
+ Date updateTime = user.getUpdateTime();
+ if (ObjectUtil.isNull(updateTime)){
+ log.info("登录用户:{},密码已过期", username);
+ throw new UserException("user.password.expired",username);
+ }else if (DateUtil.date().getTime()>DateUtil.offsetMonth(updateTime, 3).getTime()){
+ log.info("登录用户:{},密码已过期", username);
+ throw new UserException("user.password.expired",username);
+ }
+ //检验登录
+ checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+ // 此处可根据登录用户的数据不同 自行创建 loginUser
+ LoginUser loginUser = buildLoginUser(user);
+ // 生成token
+ LoginHelper.loginByDevice(loginUser, DeviceType.PC);
+ recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ return StpUtil.getTokenValue();
+ }
+
+ /**
+ * 忘记密码
+ * @param username
+ * @param password
+ * @param code
+ * @return
+ */
+ public R> userUpdatePwd(String username, String password, String code) {
+ String key = CacheConstants.RORGOT_PASSWORD_SEND_MSG+username;
+ boolean matches = username.matches("^1(3\\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$");
+ if (!matches) {
+ throw new ServiceException("手机号格式不正确");
+ }
+ if (!validateSmsCode(username, code,key)){
+ throw new UserException("user.jcaptcha.error");
+ }
+ //修改密码
+ User user = loadUserByUsername(username);
+ if (ObjectUtil.isNull(user)){
+ return R.fail("当前用户"+username+"不存在");
+ }
+ user.setPassword(BCrypt.hashpw(password));
+ user.setUpdateTime(DateUtils.getNowDate());
+ user.setUpdateBy(username);
+ if (userMapper.updateById(user)>0){
+ RedisUtils.deleteObject(key);
+ return R.ok("修改成功");
+ }
+ return R.fail("忘记密码修改异常");
+ }
+
+ /**
+ * 用户注册
+ * @param username
+ * @param password
+ * @param code
+ * @return
+ */
+ public R> userRegister(String username, String password, String code) {
+ String key =CacheConstants.REGISTER_SEND_MSG+username;
+ boolean matches = username.matches("^1(3\\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$");
+ if (!matches) {
+ throw new ServiceException("手机号格式不正确");
+ }
+ if (!validateSmsCode(username, code,key)){
+ throw new UserException("user.jcaptcha.error");
+ }
+ //判断当前账号是否存在
+ List userList = userMapper.selectList(new LambdaQueryWrapper()
+ .eq(User::getLoginName, username));
+ if (userList.size()>0){
+ return R.fail("当前用户已存在");
+ }
+ User user1 = new User();
+ user1.setPassword(BCrypt.hashpw(password));
+ user1.setUserType("app_user");
+ user1.setLoginName(username);
+ user1.setJurisdiction(1L);
+ if (userMapper.insert(user1)>0){
+ //删除验证码
+ RedisUtils.deleteObject(key);
+ return R.ok("注册成功");
+ }
+ return R.fail("注册异常");
+ }
+
+
+ /**
+ * 用户短信登录
+ * @param username
+ * @param code
+ * @return
+ */
+ public String userSmsLogin(String username, String code) {
+ // 通过手机号查找用户
+ User user = loadUserByUsername(username);
+ checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(username, code,CacheConstants.SMS_LOGIN_SEND_MSG));
+ // 此处可根据登录用户的数据不同 自行创建 loginUser
+ LoginUser loginUser = buildLoginUser(user);
+ // 生成token
+ LoginHelper.loginByDevice(loginUser, DeviceType.APP);
+
+ recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ return StpUtil.getTokenValue();
+
+ }
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BuyHousesServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BuyHousesServiceImpl.java
index bdbd89b15..d40cca430 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BuyHousesServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BuyHousesServiceImpl.java
@@ -1,29 +1,41 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.helper.LoginHelper;
+import com.ruoyi.common.utils.BeanCopyUtils;
import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExportWordUtil;
import com.ruoyi.system.domain.BuyHouses;
import com.ruoyi.system.domain.BuyHousesMember;
import com.ruoyi.system.domain.MaterialProof;
import com.ruoyi.system.domain.bo.BuyHousesBo;
+import com.ruoyi.system.domain.dto.DeclareListDTO;
import com.ruoyi.system.domain.vo.BuyHousesVo;
import com.ruoyi.system.domain.vo.MaterialModuleVo;
import com.ruoyi.system.mapper.BuyHousesMapper;
import com.ruoyi.system.mapper.BuyHousesMemberMapper;
import com.ruoyi.system.mapper.MaterialProofMapper;
import com.ruoyi.system.service.IBuyHousesService;
+import com.ruoyi.work.domain.vo.ProcessVo;
+import com.ruoyi.work.utils.WorkComplyUtils;
import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* 【请填写功能名称】Service业务层处理
@@ -33,8 +45,23 @@ import java.util.Map;
*/
@RequiredArgsConstructor
@Service
+@Transactional(rollbackFor = Exception.class)
public class BuyHousesServiceImpl implements IBuyHousesService {
+ @Value("${file.template}")
+ private String fileUpload;
+
+ @Value("${file.path}")
+ private String filePath;
+
+ @Value("${file.domain}")
+ private String download;
+
+ @Value("${file.prefix}")
+ private String prefix;
+
+ private final String URL = "http://192.168.0.54:8010//candidates/getCardId";
+
private final BuyHousesMapper baseMapper;
private final BuyHousesMemberMapper buyHousesMemberMapper;
@@ -123,11 +150,33 @@ public class BuyHousesServiceImpl implements IBuyHousesService {
*/
@Override
public Boolean insertByBo(BuyHousesBo bo) {
+ //验证这个身份证是否提交过
+ List buyHouses = baseMapper.selectList(new LambdaQueryWrapper<>(BuyHouses.class)
+ .eq(BuyHouses::getCardId, bo.getCardId()));
+ if (buyHouses.size()>0){
+ throw new ServiceException("当前人才已提交申请");
+ }
+ bo.setProcessStatus(Constants.WAIT);
BuyHouses add = BeanUtil.toBean(bo, BuyHouses.class);
- validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
+ //先删除家庭信息表
+ if (bo.getBuyHousesMemberList().size()>0) {
+ buyHousesMemberMapper.delete( new LambdaQueryWrapper<>(BuyHousesMember.class).eq(BuyHousesMember::getBuyHousesId, add.getId()));
+ //添加家庭信息
+ bo.getBuyHousesMemberList().stream().forEach(e ->e.setBuyHousesId(String.valueOf(add.getId())));
+ buyHousesMemberMapper.insertBatch(bo.getBuyHousesMemberList());
+ }
+ //将数据添加到流程中
+ ProcessVo processVo = new ProcessVo();
+ processVo.setProcessKey("apply_house");
+ processVo.setStep("1");
+ Map map = BeanUtil.beanToMap(bo);
+ processVo.setParams(map);
+ processVo.setBusinessId(bo.getId().toString());
+ processVo.setStartUser(bo.getUserName());
+ WorkComplyUtils.comply(processVo);
}
return flag;
}
@@ -139,7 +188,20 @@ public class BuyHousesServiceImpl implements IBuyHousesService {
public Boolean updateByBo(BuyHousesBo bo) {
BuyHouses update = BeanUtil.toBean(bo, BuyHouses.class);
validEntityBeforeSave(update);
- return baseMapper.updateById(update) > 0;
+ update.setProcessStatus(Constants.WAIT);
+ Boolean flag = baseMapper.updateById(update) > 0;
+ if (flag){
+ //将数据添加到流程中
+ ProcessVo processVo = new ProcessVo();
+ processVo.setProcessKey("apply_house");
+ processVo.setStep("1");
+ Map map = BeanUtil.beanToMap(bo);
+ processVo.setParams(map);
+ processVo.setBusinessId(bo.getId().toString());
+ processVo.setStartUser(bo.getUserName());
+ WorkComplyUtils.comply(processVo);
+ }
+ return flag;
}
/**
@@ -147,6 +209,21 @@ public class BuyHousesServiceImpl implements IBuyHousesService {
*/
private void validEntityBeforeSave(BuyHouses entity){
//TODO 做一些数据校验,如唯一约束
+ //验证当前状态是否可以修改
+ //判断数据库中是否存在该人才通过身份证去验证
+ BuyHouses buyHouses = baseMapper.selectOne(new LambdaQueryWrapper<>(BuyHouses.class)
+ .eq(BuyHouses::getCardId, entity.getCardId()));
+ if (!Constants.SUBMIT.equals(buyHouses.getProcessStatus()) && !Constants.FAILD.equals(buyHouses.getProcessStatus())){
+ throw new ServiceException("当前用户不可修改");
+ }
+ //删除家庭情况信息
+ //先删除家庭信息表
+ if (entity.getBuyHousesMemberList().size()>0) {
+ buyHousesMemberMapper.delete( new LambdaQueryWrapper<>(BuyHousesMember.class).eq(BuyHousesMember::getBuyHousesId, entity.getId()));
+ //添加家庭信息
+ entity.getBuyHousesMemberList().stream().forEach(e ->e.setBuyHousesId(String.valueOf(entity.getId())));
+ buyHousesMemberMapper.insertBatch(entity.getBuyHousesMemberList());
+ }
}
/**
@@ -166,4 +243,171 @@ public class BuyHousesServiceImpl implements IBuyHousesService {
List materialInfo = materialModuleService.getMaterialInfo(map);
return R.ok(materialInfo);
}
+
+ @Override
+ public BuyHouses getBuyHousesByCardId(String cardId) {
+ //验证当前人是否哦申请过购房信息
+ List buyHouses = baseMapper.selectList(
+ new LambdaQueryWrapper()
+ .eq(BuyHouses::getCardId, cardId));
+
+ if (buyHouses.size()>0){
+ BuyHouses buyHouses1 = buyHouses.get(0);
+ List buyHousesMembers = buyHousesMemberMapper.selectList(new LambdaQueryWrapper<>(BuyHousesMember.class)
+ .eq(BuyHousesMember::getBuyHousesId, buyHouses1.getId()));
+ buyHouses1.setBuyHousesMemberList(buyHousesMembers);
+ return buyHouses1;
+ }
+ return null;
+ }
+
+ /**
+ * 先保存再执行下载
+ * @param buyHousesBo
+ */
+ @Override
+ public R downloadWord(BuyHousesBo buyHousesBo) {
+ LinkedHashMap map = new LinkedHashMap<>();
+ //判断数据库中是否存在该人才通过身份证去验证
+ BuyHouses buyHouses = baseMapper.selectOne(new LambdaQueryWrapper<>(BuyHouses.class)
+ .eq(BuyHouses::getCardId, buyHousesBo.getCardId()));
+ //当前用户没提交过
+ if (ObjectUtil.isNull(buyHouses)){
+ buyHousesBo.setProcessStatus(Constants.SUBMIT);
+ buyHousesBo.setUpdateTime(new Date());
+ buyHousesBo.setCreateTime(new Date());
+ BuyHouses toBean = BeanUtil.toBean(buyHousesBo, BuyHouses.class);
+ baseMapper.insert(toBean);
+ map.put("buyHouses",toBean);
+ }else {
+ //如果不是待提交或者
+ if (Constants.SUBMIT.equals(buyHouses.getProcessStatus()) || Constants.FAILD.equals(buyHouses.getProcessStatus())){
+ //执行修改操作
+ buyHousesBo.setUpdateTime(new Date());
+ BuyHouses toBean = BeanUtil.toBean(buyHousesBo, BuyHouses.class);
+ baseMapper.updateById(toBean);
+ map.put("buyHouses",toBean);
+ }
+ }
+ LinkedHashMap hashMap = new LinkedHashMap<>();
+ hashMap.put("companyName",buyHousesBo.getCompanyName());
+ hashMap.put("socialCode",buyHousesBo.getSocialCode());
+ hashMap.put("phone",buyHousesBo.getPhone());
+ hashMap.put("companyAddress",buyHousesBo.getCompanyAddress());
+ hashMap.put("name",buyHousesBo.getUserName());
+ hashMap.put("cardId",buyHousesBo.getCardId());
+ hashMap.put("education",buyHousesBo.getEducation());
+ hashMap.put("type",buyHousesBo.getType());
+ String fileName = UUID.randomUUID().toString();
+ String templatePath = fileUpload + "Houses_template.docx";
+ String word = ExportWordUtil.createWord(templatePath, filePath, fileName, hashMap);
+ System.out.println("word = " + word);
+ String file= download + prefix + "/" + fileName + ".docx";
+ map.put("file",file);
+ return R.ok(map);
+ }
+
+ /**
+ * 获取进度列表
+ * @return
+ */
+ @Override
+ public List getDeclareList() {
+ ArrayList list = new ArrayList<>();
+ //查询购房信息
+ Long userId = LoginHelper.getUserId();
+ List buyHouses = baseMapper.selectList(new LambdaQueryWrapper<>(BuyHouses.class).eq(BuyHouses::getUserId, userId));
+ if (buyHouses.size()>0) {
+ buyHouses.stream().forEach(e -> {
+ DeclareListDTO declareListDTO = new DeclareListDTO();
+ declareListDTO.setProjectName("人才安居");
+ declareListDTO.setProcessStatus(e.getProcessStatus());
+ declareListDTO.setCreateTime(e.getCreateTime());
+ declareListDTO.setUserName(e.getUserName());
+ declareListDTO.setProcessKey(e.getProcessKey());
+ declareListDTO.setBusinessId(e.getId().toString());
+ declareListDTO.setCardId(e.getCardId());
+ list.add(declareListDTO);
+ });
+ }
+ return list;
+ }
+
+ /**
+ * 根据身份证或者用户信息
+ * @param buyHouses
+ * @return
+ */
+ @Override
+ public R> getInfo(BuyHouses buyHouses) {
+ //先判断本地数据库是否有值
+ BuyHousesVo buyHousesVo = baseMapper.selectVoOne(new LambdaQueryWrapper<>(BuyHouses.class).eq(BuyHouses::getCardId,buyHouses.getCardId()));
+ if (ObjectUtil.isNotNull(buyHousesVo)){
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
+ .eq(MaterialProof::getHouseId, buyHousesVo.getId())
+ .eq(MaterialProof::getProcessKey, buyHousesVo.getProcessKey());
+ List materialProofs = materialProofMapper.selectList(wrapper);
+ buyHousesVo.setMaterialProofList(materialProofs);
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
+ .eq(BuyHousesMember::getBuyHousesId, buyHousesVo.getId());
+ List buyHousesMembers = buyHousesMemberMapper.selectList(queryWrapper);
+ buyHousesVo.setBuyHousesMemberList(buyHousesMembers);
+ return R.ok(buyHousesVo);
+ }
+ HashMap paramMap = new HashMap<>();
+ paramMap.put("cardId", buyHouses);
+ String json = HttpUtil.get(URL, paramMap);
+ JSONObject entrie = JSONUtil.parseObj(json);
+ String data = String.valueOf(entrie.get("date"));
+ if (ObjectUtil.isNull(data)){
+ return R.fail("获取失败");
+ }
+ JSONObject entries = JSONUtil.parseObj(data);
+ BuyHouses buyHousesDto = new BuyHouses();
+ buyHousesDto.setCardId(String.valueOf(entries.get("cardId")));
+ buyHousesDto.setNationality(String.valueOf(entries.get("nationality")));
+ buyHousesDto.setUserName(String.valueOf(entries.get("name")));
+ buyHousesDto.setPhone(String.valueOf(entries.get("phone")));
+ buyHousesDto.setCompanyName(String.valueOf(entries.get("companyName")));
+ buyHousesDto.setDistrict(String.valueOf(entries.get("district")));
+ buyHousesDto.setSex(String.valueOf(entries.get("sex")));
+ buyHousesDto.setProcessStatus(Constants.SUBMIT);
+ buyHousesDto.setType(String.valueOf(entries.get("type")));
+ buyHousesDto.setProcessKey("apply_house");
+ return R.ok(buyHousesDto);
+ }
+
+ /**
+ * 验证是否具有人才资格
+ * @param cardId
+ * @return
+ */
+ @Override
+ public R getGaoXinCandidateInfoByCardId(String cardId) {
+ HashMap paramMap = new HashMap<>();
+ paramMap.put("cardId", cardId);
+ String json = HttpUtil.get(URL, paramMap);
+ JSONObject entries = JSONUtil.parseObj(json);
+ String code = String.valueOf(entries.get("code"));
+ LinkedHashMap hashMap = new LinkedHashMap<>();
+ if (ObjectUtil.isNull(code)){
+ return R.fail("获取人才信息失败");
+ }else {
+ if ("666666".equals(code)){
+ BuyHouses buyHouses = baseMapper.selectOne(new LambdaQueryWrapper<>(BuyHouses.class).eq(BuyHouses::getCardId, cardId));
+ if (ObjectUtil.isNotNull(buyHouses)){
+ hashMap.put("status",buyHouses.getProcessStatus());
+ hashMap.put("processKey",buyHouses.getProcessKey());
+ hashMap.put("businessId",buyHouses.getId());
+ return R.ok("获取成功",hashMap);
+ }
+ hashMap.put("status",Constants.SUBMIT);
+ hashMap.put("processKey","apply_house");
+ hashMap.put("businessId",null);
+ return R.ok("获取成功",hashMap);
+ }else {
+ return R.fail("暂无资格");
+ }
+ }
+ }
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/HousesReviewServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/HousesReviewServiceImpl.java
index 7108e278b..79b3b0511 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/HousesReviewServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/HousesReviewServiceImpl.java
@@ -145,6 +145,7 @@ public class HousesReviewServiceImpl implements IHousesReviewService {
*/
@Override
public Boolean updateByBo(HousesReviewBo bo) {
+ bo.setProcessStatus("wait");
//先删除存在的关系表
LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
.eq(BuyHousesReviewMember::getBuyHousesId, bo.getId());
@@ -162,17 +163,17 @@ public class HousesReviewServiceImpl implements IHousesReviewService {
}
if (ObjectUtil.isNotNull(e.getInsidepageUrl())) {
if (!buyHousesMemberList.stream().anyMatch(b -> e.getInsidepageUrl().equals(b.getInsidepageUrl()))) {
- list.add(new Long(e.getFrontUrl()));
+ list.add(new Long(e.getInsidepageUrl()));
}
}
if (ObjectUtil.isNotNull(e.getHomeRecordUrl())) {
if (!buyHousesMemberList.stream().anyMatch(b -> ObjectUtil.isNotNull(e.getHomeRecordUrl()) && e.getHomeRecordUrl().equals(b.getHomeRecordUrl()))) {
- list.add(new Long(e.getFrontUrl()));
+ list.add(new Long(e.getHomeRecordUrl()));
}
}
if (ObjectUtil.isNotNull(e.getReverseUrl())) {
if (!buyHousesMemberList.stream().anyMatch(b -> ObjectUtil.isNotNull(e.getReverseUrl()) && e.getReverseUrl().equals(b.getReverseUrl()))) {
- list.add(new Long(e.getFrontUrl()));
+ list.add(new Long(e.getReverseUrl()));
}
}
});
@@ -241,6 +242,7 @@ public class HousesReviewServiceImpl implements IHousesReviewService {
materialProof.setStatus(0L);
materialProof.setModulePathId(e.getId().toString());
materialProof.setId(null);
+ materialProof.setProcessKey("house_review");
list.add(materialProof);
});
materialProofMapper.insertBatch(list);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialModuleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialModuleServiceImpl.java
index c1bed6692..0b978d1bd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialModuleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialModuleServiceImpl.java
@@ -136,7 +136,7 @@ public class MaterialModuleServiceImpl implements IMaterialModuleService {
.apply(DataBaseHelper.findInSet(materialTalentsVo.getId(), "selected"));
List materialTalents = materialTalentsMapper.selectList(wrapper);
ArrayList list = new ArrayList<>();
- if (ObjectUtil.isNotNull(materialTalentsVo.getMaterials())){
+ if (!"".equals(materialTalentsVo.getMaterials()) && ObjectUtil.isNotNull(materialTalentsVo.getMaterials())){
list.add(materialTalentsVo.getMaterials());
}
for (MaterialTalents materialTalent : materialTalents) {
@@ -150,14 +150,10 @@ public class MaterialModuleServiceImpl implements IMaterialModuleService {
}
}
}
-
String join = String.join(",", list);
List strings = Arrays.asList(join.split(","));
-
List collect = strings.stream().distinct().map(Long ::parseLong).collect(Collectors.toList());
-
List materialTalentsVos = baseMapper.selectVoBatchIds(collect);
-
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
.eq(MaterialProof::getHouseId, map.get("id"))
.eq(MaterialProof::getProcessKey,map.get("processKey"));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
index 1cd176f79..16cf31c56 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
@@ -49,7 +49,6 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
HttpServletRequest request = logininforEvent.getRequest();
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
final String ip = ServletUtils.getClientIP(request);
-
String address = AddressUtils.getRealAddressByIP(ip);
StringBuilder s = new StringBuilder();
s.append(getBlock(ip));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
new file mode 100644
index 000000000..77673a6d9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
@@ -0,0 +1,159 @@
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.HttpRequest;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.AesUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.domain.bo.UserBo;
+import com.ruoyi.system.domain.vo.UserVo;
+import com.ruoyi.system.domain.User;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.IUserService;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-04-03
+ */
+@RequiredArgsConstructor
+@Service
+public class UserServiceImpl implements IUserService {
+
+ private final UserMapper baseMapper;
+
+ /**
+ * 查询【请填写功能名称】
+ */
+ @Override
+ public UserVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询【请填写功能名称】列表
+ */
+ @Override
+ public TableDataInfo queryPageList(UserBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询【请填写功能名称】列表
+ */
+ @Override
+ public List queryList(UserBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(UserBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getStatus() != null, User::getStatus, bo.getStatus());
+ lqw.like(StringUtils.isNotBlank(bo.getLoginName()), User::getLoginName, bo.getLoginName());
+ lqw.eq(StringUtils.isNotBlank(bo.getPassword()), User::getPassword, bo.getPassword());
+ lqw.eq(StringUtils.isNotBlank(bo.getCardNumber()), User::getCardNumber, bo.getCardNumber());
+ lqw.eq(StringUtils.isNotBlank(bo.getType()), User::getType, bo.getType());
+ lqw.eq(StringUtils.isNotBlank(bo.getValidityDate()), User::getValidityDate, bo.getValidityDate());
+ lqw.eq(StringUtils.isNotBlank(bo.getWxToken()), User::getWxToken, bo.getWxToken());
+ lqw.eq(bo.getEnterNumber() != null, User::getEnterNumber, bo.getEnterNumber());
+ lqw.like(StringUtils.isNotBlank(bo.getUserName()), User::getUserName, bo.getUserName());
+ lqw.eq(bo.getLastTime() != null, User::getLastTime, bo.getLastTime());
+ lqw.eq(bo.getDirection() != null, User::getDirection, bo.getDirection());
+ lqw.eq(bo.getJurisdiction() != null, User::getJurisdiction, bo.getJurisdiction());
+ lqw.eq(StringUtils.isNotBlank(bo.getJobWanted()), User::getJobWanted, bo.getJobWanted());
+ lqw.eq(bo.getRegisterTime() != null, User::getRegisterTime, bo.getRegisterTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getWxToken1()), User::getWxToken1, bo.getWxToken1());
+ lqw.eq(StringUtils.isNotBlank(bo.getCardId()), User::getCardId, bo.getCardId());
+ return lqw;
+ }
+
+ /**
+ * 新增【请填写功能名称】
+ */
+ @Override
+ public Boolean insertByBo(UserBo bo) {
+ User add = BeanUtil.toBean(bo, User.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改【请填写功能名称】
+ */
+ @Override
+ public Boolean updateByBo(UserBo bo) {
+ User update = BeanUtil.toBean(bo, User.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(User entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除【请填写功能名称】
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+
+ /**
+ * 重置用户密码
+ *
+ * @param userName 用户名
+ * @param password 密码
+ * @return 结果
+ */
+ @Override
+ public int resetUserPwd(String userName, String password) {
+ return baseMapper.update(null,
+ new LambdaUpdateWrapper()
+ .set(User::getPassword, password)
+ .eq(User::getLoginName, userName));
+ }
+
+ @Override
+ public R> getUserCandidateInfo(String cardId) throws Exception {
+ LinkedHashMap hashMap = new LinkedHashMap<>();
+ hashMap.put("loginName",AesUtil.decryptBASE64("18716148446"));
+ hashMap.put("password",AesUtil.decryptBASE64("1234Qwer"));
+ HttpRequest.post("https://gx.chengdutalent.cn:8010/user/login")
+ .form(hashMap)
+ .timeout(20000)
+ .execute().body();
+ //调用高新的接口
+ return null;
+
+ }
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/HousesReviewMapper.xml b/ruoyi-system/src/main/resources/mapper/system/HousesReviewMapper.xml
index e7f154f65..aa5087698 100644
--- a/ruoyi-system/src/main/resources/mapper/system/HousesReviewMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/HousesReviewMapper.xml
@@ -35,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
diff --git a/ruoyi-system/src/main/resources/mapper/system/MaterialModuleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/MaterialModuleMapper.xml
index eae5a748c..a92f40b03 100644
--- a/ruoyi-system/src/main/resources/mapper/system/MaterialModuleMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/MaterialModuleMapper.xml
@@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
diff --git a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
new file mode 100644
index 000000000..9849548b6
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/controller/ProcessController.java b/ruoyi-work/src/main/java/com/ruoyi/work/controller/ProcessController.java
index 1da4f3f01..bf259c67e 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/controller/ProcessController.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/controller/ProcessController.java
@@ -25,7 +25,7 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
- * 流程
+ * 流程配置模块
*
* @author ruoyi
* @date 2023-03-24
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/controller/WorkController.java b/ruoyi-work/src/main/java/com/ruoyi/work/controller/WorkController.java
index de54fef27..fef0863c5 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/controller/WorkController.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/controller/WorkController.java
@@ -29,7 +29,7 @@ import java.util.List;
import java.util.Map;
/**
- * 流程相关
+ * 公共流程相关
*/
@Validated
@RequiredArgsConstructor
@@ -105,7 +105,7 @@ public class WorkController extends BaseController {
* 流程办理
*/
@Log(title = "流程办理",businessType = BusinessType.OTHER)
- @SaCheckPermission("work:task:batchDeleted")
+// @SaCheckPermission("work:task:batchDeleted")
@PostMapping("/batchDeleted")
public R> batchDeleted(@RequestBody HisProcess hisProcess){
if (ObjectUtil.isNull(hisProcess.getStatus())){
@@ -117,16 +117,14 @@ public class WorkController extends BaseController {
if (ObjectUtil.isNull(hisProcess.getBusinessId())){
return R.fail("业务id不可为空");
}
- LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
- .eq(TProcess::getProcessKey, hisProcess.getProcessKey());
- List tProcesses = processMapper.selectList(wrapper);
+ List tProcesses = processMapper.selectList(new LambdaQueryWrapper()
+ .eq(TProcess::getProcessKey, hisProcess.getProcessKey()));
if (tProcesses.size()==0){
throw new ServiceException("当前流程不存在");
}
Map map = WorkUtils.getInfoToMap(tProcesses.get(0).getBean(),hisProcess.getBusinessId());
hisProcess.setParams(map);
String s = WorkComplyUtils.batchDeleted(hisProcess);
-
if (s.equals(Constants.NONENTITY)){
return R.fail("暂无审核");
}else{
@@ -162,7 +160,15 @@ public class WorkController extends BaseController {
@Log(title = "回退",businessType = BusinessType.OTHER)
@PostMapping("/rollBackLog")
public R> rollBackLog(@RequestBody RollBackLog rollBackLog){
- return toAjax(WorkComplyUtils.rollBack(rollBackLog));
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
+ .eq(TProcess::getProcessKey, rollBackLog.getProcessKey());
+ List tProcesses = processMapper.selectList(wrapper);
+ if (tProcesses.size()==0){
+ throw new ServiceException("当前流程不存在");
+ }
+ Map map = WorkUtils.getInfoToMap(tProcesses.get(0).getBean(),rollBackLog.getBusinessId());
+ rollBackLog.setParams(map);
+ return toAjax(WorkComplyUtils.rollBack(rollBackLog)>1?1:0);
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/ActProcess.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/ActProcess.java
index d9c4e5700..87494bd63 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/ActProcess.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/ActProcess.java
@@ -47,6 +47,7 @@ public class ActProcess {
private Date createTime;
+
/**
* 是由存在下一步骤
*/
@@ -56,7 +57,6 @@ public class ActProcess {
private String startUser;
- @TableField(exist = false)
private String userId;
@TableField(exist = false)
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/HisProcess.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/HisProcess.java
index 4ae188246..4fdb9fd17 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/HisProcess.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/HisProcess.java
@@ -64,7 +64,6 @@ public class HisProcess{
private String startUser;
- @TableField(exist = false)
private String userId;
@TableField(exist = false)
@@ -99,6 +98,10 @@ public class HisProcess{
@TableField(exist = false)
private String audit1;
+ private String updateTime;
+
+ private Boolean isNext;
+
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/RollBackLog.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/RollBackLog.java
index 4430ebf20..d9ad6e648 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/RollBackLog.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/RollBackLog.java
@@ -54,4 +54,7 @@ public class RollBackLog extends BaseEntity {
@TableField(exist = false)
private String audit;
+ @TableField(exist = false)
+ private String processKey;
+
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/ActProcessBo.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/ActProcessBo.java
index 30bb2bc05..4104e199c 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/ActProcessBo.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/ActProcessBo.java
@@ -53,5 +53,7 @@ public class ActProcessBo {
@NotBlank(message = "步骤不能为空", groups = { AddGroup.class, EditGroup.class })
private String step;
+ private String userId;
+
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/HisProcessBo.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/HisProcessBo.java
index 51dbf5dc7..01a1fa05c 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/HisProcessBo.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/bo/HisProcessBo.java
@@ -58,5 +58,7 @@ public class HisProcessBo extends BaseEntity {
private String companyName;
+ private String userId;
+
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ActProcessVo.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ActProcessVo.java
index 1bf8ffba6..c1232cfb1 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ActProcessVo.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ActProcessVo.java
@@ -71,5 +71,7 @@ public class ActProcessVo {
private String startUser;
+ private String userId;
+
}
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/HisProcessVo.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/HisProcessVo.java
index 7aef867d0..eef3e3a8f 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/HisProcessVo.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/HisProcessVo.java
@@ -78,6 +78,9 @@ public class HisProcessVo {
@TableField(exist = false)
private String bean;
+
+ private String userId;
+
@TableField(exist = false)
private String description;
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ProcessVo.java b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ProcessVo.java
index 85dbdf24e..6263a3f99 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ProcessVo.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/domain/vo/ProcessVo.java
@@ -114,6 +114,16 @@ public class ProcessVo {
@TableField(exist = false)
private List auditLogList;
+ @TableField(exist = false)
+ private List auditLogList1;
+
+ @TableField(exist = false)
+ private Integer size;
+
+ @TableField(exist = false)
+ private List actProcessVoList;
+
+
diff --git a/ruoyi-work/src/main/java/com/ruoyi/work/utils/WorkComplyUtils.java b/ruoyi-work/src/main/java/com/ruoyi/work/utils/WorkComplyUtils.java
index ccfa42997..fa51f15d8 100644
--- a/ruoyi-work/src/main/java/com/ruoyi/work/utils/WorkComplyUtils.java
+++ b/ruoyi-work/src/main/java/com/ruoyi/work/utils/WorkComplyUtils.java
@@ -82,6 +82,7 @@ public class WorkComplyUtils {
throw new ServiceException("当前业务正在审核中,请耐心等待");
}
ProcessVo tProcessByKey = processMapper.selectVoOne(lqw);
+ actProcessVo.setUserId(String.valueOf(LoginHelper.getUserId()));
actProcessVo.setCreateTime(DateUtils.getNowDate());
actProcessVo.setCheckType(tProcessByKey.getCheckType());
actProcessVo.setStep(tProcessByKey.getStep());
@@ -156,12 +157,14 @@ public class WorkComplyUtils {
//根据审核人员类型判断流程中那条数据属于当前人的
String checkType = actProcessVos.get(0).getCheckType();
String audit ="";
- if ("1".equals(checkType) || "4".equals(checkType)){
+ if ("1".equals(checkType)){
audit=loginUser.getUserId().toString();
}else if ("2".equals(checkType)){
audit = loginUser.getDeptId().toString();
}else if ("3".equals(checkType)){
audit = loginUser.getRoleId().toString();
+ }else if ("4".equals(checkType)){
+ audit =String.valueOf(loginUser.getCompanyId());
}
String finalAudit = audit;
List collect = actProcessVos.stream().filter(e -> checkType.equals(e.getCheckType()) && finalAudit.equals(e.getAudit())).collect(Collectors.toList());
@@ -170,10 +173,12 @@ public class WorkComplyUtils {
hisProcess.setCheckType(actProcessVo.getCheckType());
//往历史表里面添加当前数据
hisProcess.setProcessId(actProcessVo.getProcessId());
+ hisProcess.setUserId(actProcessVo.getUserId());
hisProcess.setCreateTime(actProcessVo.getCreateTime());
hisProcess.setStep(actProcessVo.getStep());
hisProcess.setType(actProcessVo.getType());
hisProcess.setStartUser(actProcessVo.getStartUser());
+ hisProcess.setIsNext(actProcessVo.getIsNext());
if ("1".equals(actProcessVo.getCheckType())) {//人员id
Long userId = loginUser.getUserId();
hisProcess.setAudit(ObjectUtil.isNotEmpty(userId) ? userId.toString() : "");
@@ -184,13 +189,12 @@ public class WorkComplyUtils {
Long roleId = loginUser.getRoleId();
hisProcess.setAudit(ObjectUtil.isNotEmpty(roleId) ? roleId.toString() : "");
} else if ("4".equals(actProcessVo.getCheckType())) {//企业
- Long userId = loginUser.getUserId();
+ String userId = String.valueOf(hisProcess.getParams().get("companyId"));
hisProcess.setCompanyName(hisProcess.getParams().get("companyName").toString());
- hisProcess.setAudit(ObjectUtil.isNotEmpty(userId) ? userId.toString() : "");
+ hisProcess.setAudit(ObjectUtil.isNotEmpty(userId) ? userId : "");
}
//先添加一个属于当前用户的记录
hisProcessMapper.insert(hisProcess);
-
//todo 保存一条审核日志
AuditLog auditLog = new AuditLog();
auditLog.setOtherId(hisProcess.getBusinessId());//业务id
@@ -249,48 +253,60 @@ public class WorkComplyUtils {
if (ObjectUtil.isNull(userId)){
throw new ServiceException("请先登录");
}
- //获取到历史表中的需要回退到那一步的最新数据
- LambdaQueryWrapper lqw = new LambdaQueryWrapper()
- .eq(HisProcess::getStep,rollBackLog.getStep())
- .eq(HisProcess::getBusinessId,rollBackLog.getBusinessId())
- .eq(HisProcess::getCheckType,rollBackLog.getCheckType())
- .eq(HisProcess::getAudit,rollBackLog.getAudit())
- .orderByDesc(HisProcess::getEndTime);
- List hisProcessVos = hisProcessMapper.selectVoList(lqw);
- String param ="";
- //获取当前流程的数据
- LambdaQueryWrapper eq = new LambdaQueryWrapper()
- .eq(ObjectUtil.isNotEmpty(rollBackLog.getBusinessId()), ActProcess::getBusinessId, rollBackLog.getBusinessId());
- ActProcess actProcesses = actProcessMapper.selectList(eq).get(0);
- //如果选择回退的步骤在历史表之前,将流程表中的流程替换为当前历史表中的数据
- if (!rollBackLog.getStep().equals(actProcesses.getStep())){
- LambdaQueryWrapper eq1 = new LambdaQueryWrapper()
- .eq(ObjectUtil.isNotNull(rollBackLog.getBusinessId()), ActProcess::getBusinessId, rollBackLog.getBusinessId());
- List actProcesses1 = actProcessMapper.selectList(eq1);
- List collect = actProcesses1.stream().map(ActProcess::getId).collect(Collectors.toList());
- param = JsonUtils.toJsonString(actProcesses1);
- actProcessMapper.deleteBatchIds(collect);
- }else {
- param = JsonUtils.toJsonString(hisProcessVos.get(0));
+ Object updateTime = rollBackLog.getParams().get("updateTime");
+ if (ObjectUtil.isNull(updateTime)){
+ throw new ServiceException("updateTime不可为空");
}
- //如果回退的是当前流程中的步骤(会签),当前会签流程已走了一半,将流程历史表中的记录返回到流程表中
- HisProcessVo hisProcessVo = hisProcessVos.get(0);
+ //获取出当前流程所在的步骤
+ LambdaQueryWrapper lwq = new LambdaQueryWrapper<>();
+ lwq.eq(ActProcess::getBusinessId,rollBackLog.getBusinessId());
+ List actProcessVos = actProcessMapper.selectVoList(lwq);
+ //获取去可退回步骤
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("business_id",rollBackLog.getBusinessId());
+ wrapper.ge("h.step","1");
+ wrapper.le("h.step",actProcessVos.get(0).getStep());
+ wrapper.ge("h.create_time",updateTime);
+ wrapper.groupBy("h.audit");
+ wrapper.orderByAsc("h.step");
+ List hisProcessVos = hisProcessMapper.selectVoHisList(wrapper);
+ //如果只有一步就提示可直接退回
+ if (hisProcessVos.size()==1){
+ throw new ServiceException("当前流程不允许退回,请直接驳回");
+ }
+ //取出当前流程中最后的步骤
+ String step = hisProcessVos.stream().max(Comparator.comparing(HisProcess::getStep)).get().getStep();
+ //判断当前撤销的步骤是否是跳步
+ if (new Integer(rollBackLog.getStep())< new Integer(step)){
+ //回退当前rollBackLog中的id,将大于step的id给删除
+ List collect = hisProcessVos.stream().filter(h -> !h.getId().equals(rollBackLog.getId())).map(HisProcess::getId).collect(Collectors.toList());
+ hisProcessMapper.deleteBatchIds(collect);
+ }else {
+ List collect = hisProcessVos.stream().filter(h -> h.getId().equals(rollBackLog.getId())).map(HisProcess::getId).collect(Collectors.toList());
+ hisProcessMapper.deleteBatchIds(collect);
+ }
+ //把当前流程运行表中的数据删除
+ List collect = actProcessVos.stream().map(ActProcessVo::getId).collect(Collectors.toList());
+ actProcessMapper.deleteBatchIds(collect);
+ HisProcess hisProcess = hisProcessVos.stream().filter(h -> h.getId().equals(rollBackLog.getId())).collect(Collectors.toList()).get(0);
+ String param = JsonUtils.toJsonString(hisProcess);
ActProcess actProcess = new ActProcess();
- actProcess.setIsNext(actProcesses.getIsNext());
- actProcess.setType(hisProcessVo.getType());
- actProcess.setCheckType(hisProcessVo.getCheckType());
- actProcess.setCompanyName(hisProcessVo.getCompanyName());
- actProcess.setCreateTime(hisProcessVo.getCreateTime());
- actProcess.setStep(hisProcessVo.getStep());
- actProcess.setStartUser(hisProcessVo.getStartUser());
- actProcess.setBusinessId(hisProcessVo.getBusinessId());
- actProcess.setAudit(hisProcessVo.getAudit());
- actProcess.setProcessId(hisProcessVo.getProcessId());
- int insert = actProcessMapper.insert(actProcess);
+ actProcess.setIsNext(hisProcess.getIsNext());
+ actProcess.setType(hisProcess.getType());
+ actProcess.setUserId(hisProcess.getUserId());
+ actProcess.setCheckType(hisProcess.getCheckType());
+ actProcess.setCompanyName(hisProcess.getCompanyName());
+ actProcess.setCreateTime(hisProcess.getCreateTime());
+ actProcess.setStep(hisProcess.getStep());
+ actProcess.setStartUser(hisProcess.getStartUser());
+ actProcess.setBusinessId(hisProcess.getBusinessId());
+ actProcess.setAudit(hisProcess.getAudit());
+ actProcess.setProcessId(hisProcess.getProcessId());
+ int insert = actProcessMapper.insert(actProcess);
rollBackLog.setCreateTime(DateUtils.getNowDate());
rollBackLog.setParam(param);
rollBackLog.setUpdateBy(userId.toString());
- rollBackLogMapper.insert(rollBackLog);
+ insert += rollBackLogMapper.insert(rollBackLog);
return insert;
}
/**
@@ -336,52 +352,51 @@ public class WorkComplyUtils {
ActProcessVo actProcessVo = actProcessVos.get(0);
String step = actProcessVo.getStep();
//如果当前业务就是在第一步,则不返回数据
- if (!"1".equals(step)){
- //获取历史表中在该业务流程步骤之前的人员数据,根据业务表的更新时间为节点
- Object updateTime = businessDTO.getParams().get("updateTime");
- if (ObjectUtil.isNull(updateTime)){
- throw new ServiceException("updateTime不可为空");
- }
- QueryWrapper wrapper = new QueryWrapper<>();
- wrapper.eq("business_id",businessDTO.getBusinessId());
- wrapper.ge("h.step","1");
- wrapper.le("h.step",step);
- wrapper.ge("h.create_time",updateTime);
- wrapper.orderByAsc("h.step");
- List hisProcessVos = hisProcessMapper.selectVoHisList(wrapper);
- for (HisProcess hisProcessVo : hisProcessVos) {
- if ("4".equals(hisProcessVo.getCheckType())) {//企业审核
- hisProcessVo.setAudit1(hisProcessVo.getCompanyName());
- } else if ("1".equals(hisProcessVo.getCheckType())) {
- //根据id获取人员信息
- SysUser sysUser = sysUserMapper.selectUserById(new Long(hisProcessVo.getAudit()));
- hisProcessVo.setAudit1(sysUser.getUserName());
- } else if ("2".equals(hisProcessVo.getCheckType())) {
- SysDept sysDept = sysDeptMapper.selectDeptById(new Long(hisProcessVo.getAudit()));
- hisProcessVo.setAudit1(sysDept.getDeptName());
- } else if ("3".equals(hisProcessVo.getCheckType())) {
- SysRole sysRole = sysRoleMapper.selectRoleById(new Long(hisProcessVo.getAudit()));
- hisProcessVo.setAudit1(sysRole.getRoleName());
- }
- }
-
- //将每个步骤处理为单个对象
- Map> collect = hisProcessVos.stream().collect(Collectors.groupingBy(HisProcess::getStep));
- List collect1 = collect.entrySet()
- .stream()
- .map(e -> new HisProcessVoResultDto(e.getKey(), e.getValue()))
- .collect(Collectors.toList());
-
- collect1.forEach(e ->{
- String s = e.getHisProcessVoList().stream().map(HisProcess::getDescription).collect(Collectors.toList()).get(0);
- e.setStep(s);
- });
- System.out.println("collect = " + collect1);
- return collect1;
+// if (!"1".equals(step)){
+ //获取历史表中在该业务流程步骤之前的人员数据,根据业务表的更新时间为节点
+ Object updateTime = businessDTO.getParams().get("updateTime");
+ if (ObjectUtil.isNull(updateTime)){
+ throw new ServiceException("updateTime不可为空");
}
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("business_id",businessDTO.getBusinessId());
+// wrapper.ge("h.step","1");
+ wrapper.le("h.step",step);
+ wrapper.ge("h.create_time",updateTime);
+ wrapper.groupBy("h.audit");
+ wrapper.orderByAsc("h.step");
+ List hisProcessVos = hisProcessMapper.selectVoHisList(wrapper);
+ if (hisProcessVos.size()==0){
+ throw new ServiceException("当前流程没有可退回人员");
+ }
+ for (HisProcess hisProcessVo : hisProcessVos) {
+ if ("4".equals(hisProcessVo.getCheckType())) {//企业审核
+ hisProcessVo.setAudit1(hisProcessVo.getCompanyName());
+ } else if ("1".equals(hisProcessVo.getCheckType())) {
+ //根据id获取人员信息
+ SysUser sysUser = sysUserMapper.selectUserById(new Long(hisProcessVo.getAudit()));
+ hisProcessVo.setAudit1(sysUser.getUserName());
+ } else if ("2".equals(hisProcessVo.getCheckType())) {
+ SysDept sysDept = sysDeptMapper.selectDeptById(new Long(hisProcessVo.getAudit()));
+ hisProcessVo.setAudit1(sysDept.getDeptName());
+ } else if ("3".equals(hisProcessVo.getCheckType())) {
+ SysRole sysRole = sysRoleMapper.selectRoleById(new Long(hisProcessVo.getAudit()));
+ hisProcessVo.setAudit1(sysRole.getRoleName());
+ }
+ }
+ //将每个步骤处理为单个对象
+ Map> collect = hisProcessVos.stream().collect(Collectors.groupingBy(HisProcess::getStep));
+ List collect1 = collect.entrySet()
+ .stream()
+ .map(e -> new HisProcessVoResultDto(e.getKey(), e.getValue()))
+ .collect(Collectors.toList());
+ collect1.forEach(e ->{
+ String s = e.getHisProcessVoList().stream().map(HisProcess::getDescription).collect(Collectors.toList()).get(0);
+ e.setStep(s);
+ });
+ System.out.println("collect = " + collect1);
+ return collect1;
}
- return null;
-
}
/**
@@ -444,21 +459,18 @@ public class WorkComplyUtils {
Page actProcessVoCCList = actProcessMapper.selectCCList(pageQuery.build(), actProcess);
if (actProcessVoCCList.getRecords().size() > 0) {
for (ActProcess record : actProcessVoCCList.getRecords()) {
- if ("1".equals(record.getCheckType())){//人员
- String username = loginUser.getUsername();
- record.setAudit(username);
- }
- if ("2".equals(record.getCheckType())){//部门
- String deptName = loginUser.getDeptName();
- record.setAudit(deptName);
- }
- if ("3".equals(record.getCheckType())){//角色
- Long roleId = loginUser.getRoleId();
- SysRole sysRole = sysRoleMapper.selectRoleById(roleId);
- record.setAudit(sysRole.getRoleName());
- }
if ("4".equals(record.getCheckType())){//公司
record.setAudit(record.getCompanyName());
+ }else if("1".equals(record.getCheckType())) {
+ //根据id获取人员信息
+ SysUser sysUser = sysUserMapper.selectUserById(new Long( record.getAudit()));
+ record.setAudit(sysUser.getUserName());
+ }else if ("2".equals(record.getCheckType())){
+ SysDept sysDept = sysDeptMapper.selectDeptById(new Long(record.getAudit()));
+ record.setAudit(sysDept.getDeptName());
+ }else if ("3".equals(record.getCheckType())){
+ SysRole sysRole = sysRoleMapper.selectRoleById(new Long(record.getAudit()));
+ record.setAudit(sysRole.getRoleName());
}
if (ObjectUtil.isNotEmpty(record.getTimeout())&& ObjectUtil.isNotNull(record.getTimeout())){
DateTime beforeTime = DateUtil.offsetDay(record.getCreateTime(), new Integer(record.getTimeout()));
@@ -514,24 +526,21 @@ public class WorkComplyUtils {
}
return TableDataInfo.build(actProcessVoList);
}
-
actProcess.setUserId(ObjectUtil.isNotNull(loginUser.getUserId())?loginUser.getUserId().toString():"");
actProcess.setRoleId(ObjectUtil.isNotNull(loginUser.getRoleId())?loginUser.getRoleId().toString():"");
actProcess.setDeptId(ObjectUtil.isNotNull(loginUser.getDeptId())?loginUser.getDeptId().toString():"");
Page actProcessVoList = actProcessMapper.selectVoListPage(pageQuery.build(),actProcess);
List records = actProcessVoList.getRecords();
for (ActProcess record : records) {
- if ("1".equals(record.getCheckType())){//人员
- String username = loginUser.getUsername();
- record.setAudit(username);
- }
- if ("2".equals(record.getCheckType())){//部门
- String deptName = loginUser.getDeptName();
- record.setAudit(deptName);
- }
- if ("3".equals(record.getCheckType())){//角色
- Long roleId = loginUser.getRoleId();
- SysRole sysRole = sysRoleMapper.selectRoleById(roleId);
+ if("1".equals(record.getCheckType())) {
+ //根据id获取人员信息
+ SysUser sysUser = sysUserMapper.selectUserById(new Long( record.getAudit()));
+ record.setAudit(sysUser.getUserName());
+ }else if ("2".equals(record.getCheckType())){
+ SysDept sysDept = sysDeptMapper.selectDeptById(new Long(record.getAudit()));
+ record.setAudit(sysDept.getDeptName());
+ }else if ("3".equals(record.getCheckType())){
+ SysRole sysRole = sysRoleMapper.selectRoleById(new Long(record.getAudit()));
record.setAudit(sysRole.getRoleName());
}
switch (record.getType()){
@@ -567,17 +576,31 @@ public class WorkComplyUtils {
if (ObjectUtil.isNull(businessId)){
throw new ServiceException("业务id不可为空");
}
-
Map params = processVo.getParams();
if (ObjectUtil.isEmpty(params)){
throw new ServiceException("params不可为空");
}
+ Object processKey = params.get("processKey");
+ if (ObjectUtil.isNull(processKey)){
+ throw new ServiceException("processKey不可为空");
+ }
LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
.eq(TProcess::getProcessKey, params.get("processKey"))
.orderByAsc(TProcess::getStep);
List processVos = processMapper.selectVoList(wrapper);
List list1 = new ArrayList<>();
- processVos.forEach(e ->{
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
+ .eq(ActProcess::getBusinessId, businessId);
+ List actProcessVoList = actProcessMapper.selectVoList(queryWrapper);
+
+ LambdaQueryWrapper wrapperLog = new LambdaQueryWrapper()
+ .eq(AuditLog::getProcessKey, processKey)
+ .eq(AuditLog::getOtherId, businessId)
+ .orderByAsc(AuditLog::getCreateTime);
+ List auditLogs = auditLogMapper.selectList(wrapperLog);
+ processVos.stream().forEach(e ->{
+ e.setAuditLogList1(auditLogs);
+ e.setActProcessVoList(actProcessVoList);
e.setBusinessId(businessId);
e.setParams(params);
//遍历出他每一步所需要的审核人
@@ -602,8 +625,10 @@ public class WorkComplyUtils {
List list = new ArrayList<>();
if (1L == e.getProcessCheck()) {
String[] split = e.getAudit().split(",");
+ e.setSize(split.length);
for (String s : split) {
e.setAudit(s);
+ e.setChecked("");
dd(e);
ProcessVo processVo1 = new ProcessVo();
BeanCopyUtils.copy(e,processVo1);
@@ -618,8 +643,10 @@ public class WorkComplyUtils {
String[] split = e.getAudit().split(",");
Collections.addAll(personByRule, split);
}
+ e.setSize(personByRule.size());
for (String s : personByRule) {
e.setAudit(s);
+ e.setChecked("");
dd(e);
ProcessVo processVo1 = new ProcessVo();
BeanCopyUtils.copy(e,processVo1);
@@ -629,17 +656,14 @@ public class WorkComplyUtils {
}
}
});
-
list1.forEach(e ->{
e.setParams(null);
});
-
Map> collect = list1.stream().collect(Collectors.groupingBy(ProcessVo::getStep));
List collect1 = collect.entrySet()
.stream()
.map(e -> new ProcessVoResultDto(e.getKey(), e.getValue()))
.collect(Collectors.toList());
-
collect1.forEach(e ->{
String s = e.getProcessVoList().stream().map(ProcessVo::getDescription).collect(Collectors.toList()).get(0);
e.setStep(s);
@@ -653,41 +677,52 @@ public class WorkComplyUtils {
* @param e
*/
public static void dd(ProcessVo e){
- LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
- .eq(ActProcess::getBusinessId, e.getBusinessId());
- List actProcessVoList = actProcessMapper.selectVoList(queryWrapper);
-
+ List actProcessVoList =e.getActProcessVoList();
+ List auditLogs = e.getAuditLogList1();
+ List collect1 = actProcessVoList.stream().filter(a -> a.getAudit().equals(e.getAudit()) && a.getCheckType().equals(e.getCheckType()) && a.getStep().equals(e.getStep()) && a.getType().equals(e.getType())).collect(Collectors.toList());
if (actProcessVoList.size()>0){
- actProcessVoList.forEach(a ->{
+ actProcessVoList.stream().forEach(a ->{
if ( new Integer(e.getStep())< new Integer(a.getStep())){
- e.setChecked("1");
+ e.setChecked("1");//绿色
}else if ( new Integer(e.getStep()).equals(new Integer(a.getStep()))){
- e.setChecked("2");
+ if (collect1.size()>0){
+ e.setChecked("2");//红色
+ }else {
+ e.setChecked("1");
+ }
}else {
- e.setChecked("3");
+ e.setChecked("3");//无色
}
});
-
}else {
Map map = e.getParams();
Object process_status = map.get("processStatus");
if (ObjectUtil.isNotNull(process_status)){
if (Constants.SUCCEED.equals(process_status.toString())){
e.setChecked("1");
+ }else if (Constants.FAILD.equals(process_status.toString())){
+ if (auditLogs.size()>0){
+ AuditLog auditLog = auditLogs.get(auditLogs.size()-1);
+ if (auditLog.getAudit().equals(e.getAudit()) && auditLog.getStep().equals(e.getStep()) && auditLog.getAuditType().equals(e.getCheckType())){
+ e.setChecked("2");
+ }
+ }
}
}else {
e.setChecked("3");
}
}
- e.setAuditLogList(null);
- LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
- .eq(ObjectUtil.isNotNull(e.getProcessKey()) && StringUtils.isNotEmpty(e.getProcessKey()),AuditLog::getProcessKey, e.getProcessKey())
- .eq(AuditLog::getOtherId, e.getBusinessId())
- .orderByAsc(AuditLog::getCreateTime);
- List auditLogs = auditLogMapper.selectList(wrapper);
+
if (auditLogs.size()>0) {
+ if ("4".equals(e.getCheckType())){
+ Object companyId = e.getParams().get("companyId");
+ if (ObjectUtil.isNull(companyId)){
+ throw new ServiceException("companyId不可为空");
+ }
+ e.setAudit(String.valueOf(e.getParams().get("companyId")));
+ }
List collect = auditLogs.stream().filter(a -> e.getStep().equals(a.getStep()) && e.getAudit().equals(a.getAudit())).collect(Collectors.toList());
- collect.forEach(a -> {
+ collect.stream().forEach(a -> {
if (ObjectUtil.isNotNull(a.getStatus())) {
switch (a.getStatus()) {
case "1":
@@ -716,12 +751,21 @@ public class WorkComplyUtils {
}else if("1".equals(e.getCheckType())) {
//根据id获取人员信息
SysUser sysUser = sysUserMapper.selectUserById(new Long( e.getAudit()));
+ if(ObjectUtil.isNull(sysUser)){
+ throw new ServiceException("根据id获取人员信息失败");
+ }
e.setAudit(sysUser.getUserName());
}else if ("2".equals(e.getCheckType())){
SysDept sysDept = sysDeptMapper.selectDeptById(new Long(e.getAudit()));
+ if(ObjectUtil.isNull(sysDept)){
+ throw new ServiceException("根据id获取部门信息失败");
+ }
e.setAudit(sysDept.getDeptName());
}else if ("3".equals(e.getCheckType())){
SysRole sysRole = sysRoleMapper.selectRoleById(new Long(e.getAudit()));
+ if(ObjectUtil.isNull(sysRole)){
+ throw new ServiceException("根据id获取角色信息失败");
+ }
e.setAudit(sysRole.getRoleName());
}
}
diff --git a/ruoyi-work/src/main/resources/mapper/work/ActProcessMapper.xml b/ruoyi-work/src/main/resources/mapper/work/ActProcessMapper.xml
index 5818cab10..df6affb86 100644
--- a/ruoyi-work/src/main/resources/mapper/work/ActProcessMapper.xml
+++ b/ruoyi-work/src/main/resources/mapper/work/ActProcessMapper.xml
@@ -20,6 +20,7 @@
+