diff --git a/.gitignore b/.gitignore index d498a38..0cddd63 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ rebel.xml ## backend **/target **/logs +**/yml ## front **/*.lock diff --git a/README.md b/README.md index 5b8e415..8a7ebab 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,41 @@ Docker快速启动项目 - [Docker启动微服务后台](https://help.jeecg.com/java/springcloud/docker.html) +git提交规范 +----------------------------------- +姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述 + +- demo: yxk-前端-20260327-新增功能-上传文件功能 + + +git提交规范 +----------------------------------- +姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述 + +- demo: yxk-前端-20260327-新增功能-上传文件功能 + + +git提交规范 +----------------------------------- +姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述 + +- demo: yxk-前端-20260327-新增功能-上传文件功能 + + +git提交规范 +----------------------------------- +姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述 + +- demo: yxk-前端-20260327-新增功能-上传文件功能 + + +git提交规范 +----------------------------------- +姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述 + +- demo: yxk-前端-20260327-新增功能-上传文件功能 + + 技术文档 ----------------------------------- diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml index c03a8fb..cc16906 100644 --- a/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot-base-core/pom.xml @@ -8,6 +8,7 @@ 4.0.0 jeecg-boot-base-core + 3.8.1 diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java new file mode 100644 index 0000000..f354fc8 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java @@ -0,0 +1,75 @@ +package org.jeecg.common.aspect; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.jeecg.common.aspect.annotation.CascadeDelete; +import org.jeecg.common.aspect.annotation.SonTable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Aspect +@Component +public class CascadeDeleteAspect { + + @Autowired + private ApplicationContext context; + + /** + * 环绕通知:通过 REQUIRED 传播属性确保事务一致性 + */ + @Around("@annotation(cascadeDelete)") + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)//已完成测试,子表删除时抛出异常主表会一起回滚 + public Object doCascadeDelete(ProceedingJoinPoint joinPoint, CascadeDelete cascadeDelete) throws Throwable { + // 1. 获取主表 ID (约定第一个参数) + Object[] args = joinPoint.getArgs(); + if (args == null || args.length == 0 || args[0] == null) { + return joinPoint.proceed(); + } + String mainId = args[0].toString(); + + // 2. 执行子表逻辑删除 + // 因为标记了 @Transactional,这里的删除操作会自动进入事务 + for (SonTable son : cascadeDelete.sons()) { + Object mapper = context.getBean(son.mapper()); + executeDelete(mapper, son.joinColumn(), mainId); + log.info("级联删除子表 [{}] 成功", son.mapper().getSimpleName()); + } + // 3. 执行主表删除逻辑 + if (true) { + throw new RuntimeException("模拟子表删除异常,触发回滚!"); + } + // 如果主表 Service 抛出异常,整个事务(含上面的子表删除)都会回滚 + return joinPoint.proceed(); + } + + /** + * 辅助方法:解决 MyBatis-Plus 泛型注入问题 + */ + @SuppressWarnings("unchecked") + private void executeDelete(Object mapper, String column, Object value) { + if (mapper instanceof BaseMapper) { + BaseMapper baseMapper = (BaseMapper) mapper; + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(column, value); + baseMapper.delete(wrapper); + } + } +} +// 使用方法如下 +//@Override +//@Transactional(rollbackFor = Exception.class) +//@CascadeDelete(sons = { +// // 配置子表1:Mapper类 + 子表中关联主表的字段名 +// @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"), +//}) +//public void delMain(String id) { +// testMainTableMapper.deleteById(id); +//} \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java new file mode 100644 index 0000000..d450151 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java @@ -0,0 +1,11 @@ +package org.jeecg.common.aspect.annotation; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) // 作用在方法上 +@Retention(RetentionPolicy.RUNTIME) // 运行时可见 +@Documented +public @interface CascadeDelete { + // 子表配置数组,支持一个主表对应多个子表 + SonTable[] sons(); +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java new file mode 100644 index 0000000..1001cbb --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java @@ -0,0 +1,16 @@ +package org.jeecg.common.aspect.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.ANNOTATION_TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface SonTable { + // 子表 Mapper 的类对象 + Class mapper(); + + // 子表中关联主表 ID 的字段名(数据库字段名,如 main_id) + String joinColumn(); +} \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java index 32d4b49..5b7bc50 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java @@ -138,4 +138,13 @@ public class LoginUser { /**设备id uniapp推送用*/ private String clientId; + + /**人员密级*/ + + private Integer userSecurityLevel; + + /** + * 人员密级 + */ + private Integer isSpecial; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java index d5a13c0..7705e87 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java @@ -8,8 +8,13 @@ import org.jeecg.common.util.filter.SsrfFileTypeFilter; import org.jeecg.common.util.filter.StrAttackFilter; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URLDecoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; /** * minio文件上传工具类 @@ -221,4 +226,315 @@ public class MinioUtil { return minioUrl+bucketName+"/"+relativePath; } + + /** + * 文件加密上传 + * + * @param file + * @param bizPath + * @return + */ + public static String encryptUpload(MultipartFile file, String bizPath) { + return encryptUpload(file, bizPath, null); + } + /** + * 加密上传文件(带年份,文件名) + * + * @param file + * @return + */ + public static String encryptUpload(File file, String bizPath, String customBucket, String year, String fileName) { + String file_url = ""; + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + bizPath = StrAttackFilter.filter(bizPath); + // fileName = StrAttackFilter.filter(fileName); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + String newBucket = bucketName; + if (oConvertUtils.isNotEmpty(customBucket)) { + newBucket = customBucket; + } + try { + initMinio(minioUrl, minioName, minioPass); + // 检查存储桶是否已经存在 + if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build()); + log.info("create a new bucket."); + } + //update-begin-author:liusq date:20210809 for: 过滤上传文件类型 + //FileTypeFilter.fileTypeFilter(file); + //SecretKey key = AESUtil.getKeyFromString(AES_KEY); + MultipartFile multipartFile = (MultipartFile) file; + byte[] fileBytes = multipartFile.getBytes(); + fileBytes = SecureUtils.encrypt(fileBytes); + InputStream stream = new ByteArrayInputStream(fileBytes); + /* + 原公文系统的加密 + InputStream inputStream = new FileInputStream(file); + InputStream stream = inputStreamEncrypt(inputStream); + */ + + + //update-end-author:liusq date:20210809 for: 过滤上传文件类型 + //InputStream stream = file.getInputStream(); + // 获取文件名 + String orgName = fileName; + if ("".equals(orgName)) { + orgName = file.getName(); + } + orgName = CommonUtils.getFileName(orgName); + String objectName = bizPath + "/" + + (orgName.indexOf(".") == -1 + ? orgName + "_" + System.currentTimeMillis() + : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")) + ); + + // 使用putObject上传一个本地文件到存储桶中。 + if (objectName.startsWith("/")) { + objectName = objectName.substring(1); + } + + + PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) + .bucket(newBucket) + .contentType("application/octet-stream") + .stream(stream, stream.available(), -1).build(); + minioClient.putObject(objectArgs); + stream.close(); + file_url = "/" + objectName; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return file_url; + } + /** + * 加密上传文件(带年份) + * + * @param file + * @return + */ + public static String encryptUpload(File file, String bizPath, String customBucket, String year) { + String file_url = ""; + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + bizPath = StrAttackFilter.filter(bizPath); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + String newBucket = bucketName; + if (oConvertUtils.isNotEmpty(customBucket)) { + newBucket = customBucket; + } + try { + initMinio(minioUrl, minioName, minioPass); + // 检查存储桶是否已经存在 + if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build()); + log.info("create a new bucket."); + } + //update-begin-author:liusq date:20210809 for: 过滤上传文件类型 + //FileTypeFilter.fileTypeFilter(file); + //SecretKey key = AESUtil.getKeyFromString(AES_KEY); + MultipartFile multipartFile = (MultipartFile) file; + byte[] fileBytes = multipartFile.getBytes(); + fileBytes = SecureUtils.encrypt(fileBytes); + InputStream stream = new ByteArrayInputStream(fileBytes); + /* + 原公文系统的加密 + InputStream inputStream = new FileInputStream(file); + InputStream stream = inputStreamEncrypt(inputStream); + */ + + //update-end-author:liusq date:20210809 for: 过滤上传文件类型 + //InputStream stream = file.getInputStream(); + // 获取文件名 + String orgName = file.getName(); + if ("".equals(orgName)) { + orgName = file.getName(); + } + orgName = CommonUtils.getFileName(orgName); + String objectName = bizPath + "/" + + (orgName.indexOf(".") == -1 + ? orgName + "_" + System.currentTimeMillis() + : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")) + ); + + // 使用putObject上传一个本地文件到存储桶中。 + if (objectName.startsWith("/")) { + objectName = objectName.substring(1); + } + + + PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) + .bucket(newBucket) + .contentType("application/octet-stream") + .stream(stream, stream.available(), -1).build(); + minioClient.putObject(objectArgs); + stream.close(); + file_url = "/" + objectName; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return file_url; + } + + /** + * 加密上传文件 + * + * @param file + * @return + */ + public static String encryptUpload(MultipartFile file, String bizPath, String customBucket) { + String file_url = ""; + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + bizPath = StrAttackFilter.filter(bizPath); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + String newBucket = bucketName; + if (oConvertUtils.isNotEmpty(customBucket)) { + newBucket = customBucket; + } + try { + initMinio(minioUrl, minioName, minioPass); + // 检查存储桶是否已经存在 + if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build()); + log.info("create a new bucket."); + } + //update-begin-author:liusq date:20210809 for: 过滤上传文件类型 + SsrfFileTypeFilter.checkUploadFileType(file); + //SecretKey key = AESUtil.getKeyFromString(AES_KEY); + byte[] fileBytes = file.getBytes(); + fileBytes = SecureUtils.encrypt(fileBytes); + InputStream stream = new ByteArrayInputStream(fileBytes); + /* + 原公文系统的加密 + InputStream inputStream = new FileInputStream(file); + InputStream stream = inputStreamEncrypt(inputStream); + */ + + //update-end-author:liusq date:20210809 for: 过滤上传文件类型 + //InputStream stream = file.getInputStream(); + // 获取文件名 + String orgName = file.getOriginalFilename(); + if ("".equals(orgName)) { + orgName = file.getName(); + } + orgName = CommonUtils.getFileName(orgName); + String objectName = bizPath + "/" + + (orgName.indexOf(".") == -1 + ? orgName + "_" + System.currentTimeMillis() + : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")) + ); + + // 使用putObject上传一个本地文件到存储桶中。 + if (objectName.startsWith("/")) { + objectName = objectName.substring(1); + } + + + PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) + .bucket(newBucket) + .contentType("application/octet-stream") + .stream(stream, stream.available(), -1).build(); + minioClient.putObject(objectArgs); + stream.close(); + file_url = objectName; +// file_url = minioUrl + newBucket + "/" + objectName; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return file_url; + } + + +// /* +//获取文件元数据 +// */ +// public static String getLastModifiedTime(String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { +// initMinio(minioUrl, minioName, minioPass); +// StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); +// +// return String.valueOf(statObjectResponse.lastModified().toInstant().toEpochMilli()) ; +// +// } +// /* +// 判断文件是否存在 +// */ +// public static String checkFileExistence( String objectName) { +// try { +// initMinio(minioUrl, minioName, minioPass); +// +// // 使用 StatObject 来获取对象的元数据,判断文件是否存在 +// StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); +// +// // 如果没有异常抛出,文件存在,返回 1 +// return minioUrl + bucketName + "/"+objectName; +// } catch (MinioException e) { +// // 如果文件不存在或发生错误,返回 0 +// return "0"; +// } catch (Exception e) { +// // 捕获其他异常,返回 0 +// return "0"; +// } +// } + + /** + * 上传并更新文件 + * + * @param file + * @return + */ + public static String uploadUpdate(MultipartFile file, String objectName, String customBucket) { + String file_url = ""; + //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 +// objectName = StrAttackFilter.filter(objectName); + //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 + String newBucket = bucketName; + if (oConvertUtils.isNotEmpty(customBucket)) { + newBucket = customBucket; + } + try { + initMinio(minioUrl, minioName, minioPass); + // 检查存储桶是否已经存在 + if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) { + log.info("Bucket already exists."); + } else { + // 创建一个名为ota的存储桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build()); + log.info("create a new bucket."); + } + //update-begin-author:liusq date:20210809 for: 过滤上传文件类型 + SsrfFileTypeFilter.checkUploadFileType(file); + //update-end-author:liusq date:20210809 for: 过滤上传文件类型 + + // 以下为管理信息化系统加密 + byte[] fileBytes = file.getBytes(); + fileBytes = SecureUtils.encrypt(fileBytes); + InputStream stream = new ByteArrayInputStream(fileBytes); + + + // 使用putObject上传一个本地文件到存储桶中。 + if (objectName.startsWith("/")) { + objectName = objectName.substring(1); + } + PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) + .bucket(newBucket) + .contentType("application/octet-stream") + .stream(stream, stream.available(), -1).build(); + minioClient.putObject(objectArgs); + stream.close(); + file_url = objectName; +// file_url = minioUrl + newBucket + "/" + objectName; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return file_url; + } + + } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java new file mode 100644 index 0000000..28b5dff --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java @@ -0,0 +1,44 @@ +package org.jeecg.common.util; + +import cn.hutool.crypto.SecureUtil; + +/* +* @ClassName SecureUtils +* @Description 功能说明: 对称加密工具类 aes、des对对称加密 ras非对称加密 +* 此为凌安公司在管理信息化系统中使用的加解密 +* 注意:密钥不要修改 + */ +public class SecureUtils { + /** + * 密钥 + */ + private final static byte[] KEY = {-40, -1, 45, -41, -51, -34, -33, 56, -22, 88, -46, 113, 110, -61, -82, -84}; + + /** + * 解密文件内容 + * + * @param fileContent 已加密的文件内容byte数组 + * @return 解密的文件内容byte数组 + */ + public static byte[] decrypt(byte[] fileContent) { + if (fileContent == null) { + throw new RuntimeException("需要解密的文件内容不能为空"); + } + + return SecureUtil.aes(SecureUtils.KEY).decrypt(fileContent); + } + + /** + * 加密文件内容 + * + * @param fileContent 的文件内容byte数组 + * @return 解密的文件内容byte数组 + */ + public static byte[] encrypt(byte[] fileContent) { + if (fileContent == null) { + throw new RuntimeException("需要加密的文件内容不能为空"); + } + + return SecureUtil.aes(SecureUtils.KEY).encrypt(fileContent); + } +} diff --git a/jeecg-module-supervision/pom.xml b/jeecg-module-supervision/pom.xml new file mode 100644 index 0000000..af038ac --- /dev/null +++ b/jeecg-module-supervision/pom.xml @@ -0,0 +1,24 @@ + + + + jeecg-boot-parent + org.jeecgframework.boot + 3.8.1 + + 4.0.0 + + jeecg-module-supervision + org.jeecgframework.boot + 3.8.1 + + + + org.jeecgframework.boot + jeecg-boot-base-core + 3.8.1 + + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java new file mode 100644 index 0000000..319fd6e --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.check.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.check.entity.DjCheck; +import org.jeecg.modules.demo.check.service.IDjCheckService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 党建检查台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Tag(name="党建检查台账") +@RestController +@RequestMapping("/check/djCheck") +@Slf4j +public class DjCheckController extends JeecgController { + @Autowired + private IDjCheckService djCheckService; + + /** + * 分页列表查询 + * + * @param djCheck + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "党建检查台账-分页列表查询") + @Operation(summary="党建检查台账-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(DjCheck djCheck, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djCheck, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = djCheckService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param djCheck + * @return + */ + @AutoLog(value = "党建检查台账-添加") + @Operation(summary="党建检查台账-添加") + @RequiresPermissions("check:dj_check:add") + @PostMapping(value = "/add") + public Result add(@RequestBody DjCheck djCheck) { + djCheckService.save(djCheck); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param djCheck + * @return + */ + @AutoLog(value = "党建检查台账-编辑") + @Operation(summary="党建检查台账-编辑") + @RequiresPermissions("check:dj_check:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody DjCheck djCheck) { + djCheckService.updateById(djCheck); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "党建检查台账-通过id删除") + @Operation(summary="党建检查台账-通过id删除") + @RequiresPermissions("check:dj_check:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + djCheckService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "党建检查台账-批量删除") + @Operation(summary="党建检查台账-批量删除") + @RequiresPermissions("check:dj_check:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.djCheckService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "党建检查台账-通过id查询") + @Operation(summary="党建检查台账-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + DjCheck djCheck = djCheckService.getById(id); + if(djCheck==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(djCheck); + } + + /** + * 导出excel + * + * @param request + * @param djCheck + */ + @RequiresPermissions("check:dj_check:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DjCheck djCheck) { + return super.exportXls(request, djCheck, DjCheck.class, "党建检查台账"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("check:dj_check:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DjCheck.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java new file mode 100644 index 0000000..55f668e --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java @@ -0,0 +1,105 @@ +package org.jeecg.modules.demo.check.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 党建检查台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Data +@TableName("dj_check") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="党建检查台账") +public class DjCheck implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**序号*/ + @Excel(name = "序号", width = 15) + @Schema(description = "序号") + private java.lang.Integer sortNo; + /**一级指标*/ + @Excel(name = "一级指标", width = 15) + @Schema(description = "一级指标") + private java.lang.String primaryIndex; + /**评价要点*/ + @Excel(name = "评价要点", width = 15) + @Schema(description = "评价要点") + private java.lang.String evalPoints; + /**评价内容*/ + @Excel(name = "评价内容", width = 15) + @Schema(description = "评价内容") + private java.lang.String evalContent; + /**问题表现*/ + @Excel(name = "问题表现", width = 15) + @Schema(description = "问题表现") + private java.lang.String problemManifestation; + /**整改措施*/ + @Excel(name = "整改措施", width = 15) + @Schema(description = "整改措施") + private java.lang.String rectificationMeasures; + /**完成时限*/ + @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时限") + private java.util.Date completionDeadline; + /**责任部门*/ + @Excel(name = "责任部门", width = 15) + @Schema(description = "责任部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String responsibleDept; + /**完成情况*/ + @Excel(name = "完成情况", width = 15) + @Schema(description = "完成情况") + private java.lang.String completionStatus; + /**是否可发起(0不可发起,1可发起)*/ + @Excel(name = "是否可发起", width = 15) + @Dict(dicCode = "is_launchable") + private String isLaunchable; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java new file mode 100644 index 0000000..9eddc5d --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.check.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.check.entity.DjCheck; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 党建检查台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface DjCheckMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml new file mode 100644 index 0000000..f2ff7d0 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java new file mode 100644 index 0000000..78b5608 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.check.service; + +import org.jeecg.modules.demo.check.entity.DjCheck; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 党建检查台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface IDjCheckService extends IService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java new file mode 100644 index 0000000..02b83db --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.check.service.impl; + +import org.jeecg.modules.demo.check.entity.DjCheck; +import org.jeecg.modules.demo.check.mapper.DjCheckMapper; +import org.jeecg.modules.demo.check.service.IDjCheckService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 党建检查台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Service +public class DjCheckServiceImpl extends ServiceImpl implements IDjCheckService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java new file mode 100644 index 0000000..5e210a8 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.demoMetting.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting; +import org.jeecg.modules.demo.demoMetting.service.IDjDemoLifeMeetingService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 所领导板子民主生活会问题台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Tag(name="所领导板子民主生活会问题台账") +@RestController +@RequestMapping("/demoMetting/djDemoLifeMeeting") +@Slf4j +public class DjDemoLifeMeetingController extends JeecgController { + @Autowired + private IDjDemoLifeMeetingService djDemoLifeMeetingService; + + /** + * 分页列表查询 + * + * @param djDemoLifeMeeting + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "所领导板子民主生活会问题台账-分页列表查询") + @Operation(summary="所领导板子民主生活会问题台账-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(DjDemoLifeMeeting djDemoLifeMeeting, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djDemoLifeMeeting, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = djDemoLifeMeetingService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param djDemoLifeMeeting + * @return + */ + @AutoLog(value = "所领导板子民主生活会问题台账-添加") + @Operation(summary="所领导板子民主生活会问题台账-添加") + @RequiresPermissions("demoMetting:dj_demo_life_meeting:add") + @PostMapping(value = "/add") + public Result add(@RequestBody DjDemoLifeMeeting djDemoLifeMeeting) { + djDemoLifeMeetingService.save(djDemoLifeMeeting); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param djDemoLifeMeeting + * @return + */ + @AutoLog(value = "所领导板子民主生活会问题台账-编辑") + @Operation(summary="所领导板子民主生活会问题台账-编辑") + @RequiresPermissions("demoMetting:dj_demo_life_meeting:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody DjDemoLifeMeeting djDemoLifeMeeting) { + djDemoLifeMeetingService.updateById(djDemoLifeMeeting); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "所领导板子民主生活会问题台账-通过id删除") + @Operation(summary="所领导板子民主生活会问题台账-通过id删除") + @RequiresPermissions("demoMetting:dj_demo_life_meeting:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + djDemoLifeMeetingService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "所领导板子民主生活会问题台账-批量删除") + @Operation(summary="所领导板子民主生活会问题台账-批量删除") + @RequiresPermissions("demoMetting:dj_demo_life_meeting:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.djDemoLifeMeetingService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "所领导板子民主生活会问题台账-通过id查询") + @Operation(summary="所领导板子民主生活会问题台账-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + DjDemoLifeMeeting djDemoLifeMeeting = djDemoLifeMeetingService.getById(id); + if(djDemoLifeMeeting==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(djDemoLifeMeeting); + } + + /** + * 导出excel + * + * @param request + * @param djDemoLifeMeeting + */ + @RequiresPermissions("demoMetting:dj_demo_life_meeting:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DjDemoLifeMeeting djDemoLifeMeeting) { + return super.exportXls(request, djDemoLifeMeeting, DjDemoLifeMeeting.class, "所领导板子民主生活会问题台账"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("demoMetting:dj_demo_life_meeting:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DjDemoLifeMeeting.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java new file mode 100644 index 0000000..5e07693 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java @@ -0,0 +1,114 @@ +package org.jeecg.modules.demo.demoMetting.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 所领导板子民主生活会问题台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Data +@TableName("dj_demo_life_meeting") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="所领导板子民主生活会问题台账") +public class DjDemoLifeMeeting implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**序号*/ + @Excel(name = "序号", width = 15) + @Schema(description = "序号") + private java.lang.Integer sortNo; + /**问题分类*/ + @Excel(name = "问题分类", width = 15) + @Schema(description = "问题分类") + private java.lang.Integer problemType; + /**问题清单*/ + @Excel(name = "问题清单", width = 15) + @Schema(description = "问题清单") + private java.lang.String problemList; + /**问题表现*/ + @Excel(name = "问题表现", width = 15) + @Schema(description = "问题表现") + private java.lang.String problemManifestation; + /**责任领导*/ + @Excel(name = "责任领导", width = 15) + @Schema(description = "责任领导") + private java.lang.String responsibleLeader; + /**责任部门*/ + @Excel(name = "责任部门", width = 15) + @Schema(description = "责任部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String responsibleDept; + /**整改措施*/ + @Excel(name = "整改措施", width = 15) + @Schema(description = "整改措施") + private java.lang.String rectificationMeasures; + /**完成时限*/ + @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时限") + private java.util.Date completionDeadline; + /**完成时间*/ + @Excel(name = "完成时间", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时间") + private java.util.Date completionDate; + /**输出成果*/ + @Excel(name = "输出成果", width = 15) + @Schema(description = "输出成果") + private java.lang.String outputResults; + /**完成情况*/ + @Excel(name = "完成情况", width = 15) + @Schema(description = "完成情况") + private java.lang.String completionStatus; + /**是否可发起(0不可发起,1可发起)*/ + @Excel(name = "是否可发起", width = 15) + @Dict(dicCode = "is_launchable") + private String isLaunchable; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java new file mode 100644 index 0000000..4f06700 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.demoMetting.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 所领导板子民主生活会问题台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface DjDemoLifeMeetingMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml new file mode 100644 index 0000000..432c353 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java new file mode 100644 index 0000000..12cb9e3 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.demoMetting.service; + +import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 所领导板子民主生活会问题台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface IDjDemoLifeMeetingService extends IService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java new file mode 100644 index 0000000..26241aa --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.demoMetting.service.impl; + +import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting; +import org.jeecg.modules.demo.demoMetting.mapper.DjDemoLifeMeetingMapper; +import org.jeecg.modules.demo.demoMetting.service.IDjDemoLifeMeetingService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 所领导板子民主生活会问题台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Service +public class DjDemoLifeMeetingServiceImpl extends ServiceImpl implements IDjDemoLifeMeetingService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java new file mode 100644 index 0000000..c98553c --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.peopleService.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.peopleService.entity.DjPeopleService; +import org.jeecg.modules.demo.peopleService.service.IDjPeopleServiceService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 我为群众办实事台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Tag(name="我为群众办实事台账") +@RestController +@RequestMapping("/peopleService/djPeopleService") +@Slf4j +public class DjPeopleServiceController extends JeecgController { + @Autowired + private IDjPeopleServiceService djPeopleServiceService; + + /** + * 分页列表查询 + * + * @param djPeopleService + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "我为群众办实事台账-分页列表查询") + @Operation(summary="我为群众办实事台账-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(DjPeopleService djPeopleService, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djPeopleService, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = djPeopleServiceService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param djPeopleService + * @return + */ + @AutoLog(value = "我为群众办实事台账-添加") + @Operation(summary="我为群众办实事台账-添加") + @RequiresPermissions("peopleService:dj_people_service:add") + @PostMapping(value = "/add") + public Result add(@RequestBody DjPeopleService djPeopleService) { + djPeopleServiceService.save(djPeopleService); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param djPeopleService + * @return + */ + @AutoLog(value = "我为群众办实事台账-编辑") + @Operation(summary="我为群众办实事台账-编辑") + @RequiresPermissions("peopleService:dj_people_service:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody DjPeopleService djPeopleService) { + djPeopleServiceService.updateById(djPeopleService); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "我为群众办实事台账-通过id删除") + @Operation(summary="我为群众办实事台账-通过id删除") + @RequiresPermissions("peopleService:dj_people_service:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + djPeopleServiceService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "我为群众办实事台账-批量删除") + @Operation(summary="我为群众办实事台账-批量删除") + @RequiresPermissions("peopleService:dj_people_service:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.djPeopleServiceService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "我为群众办实事台账-通过id查询") + @Operation(summary="我为群众办实事台账-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + DjPeopleService djPeopleService = djPeopleServiceService.getById(id); + if(djPeopleService==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(djPeopleService); + } + + /** + * 导出excel + * + * @param request + * @param djPeopleService + */ + @RequiresPermissions("peopleService:dj_people_service:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DjPeopleService djPeopleService) { + return super.exportXls(request, djPeopleService, DjPeopleService.class, "我为群众办实事台账"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("peopleService:dj_people_service:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DjPeopleService.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java new file mode 100644 index 0000000..d397cd6 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java @@ -0,0 +1,92 @@ +package org.jeecg.modules.demo.peopleService.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 我为群众办实事台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Data +@TableName("dj_people_service") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="我为群众办实事台账") +public class DjPeopleService implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**序号*/ + @Excel(name = "序号", width = 15) + @Schema(description = "序号") + private java.lang.Integer sortNo; + /**问题分类*/ + @Excel(name = "问题分类", width = 15) + @Schema(description = "问题分类") + private java.lang.String problemType; + /**具体措施*/ + @Excel(name = "具体措施", width = 15) + @Schema(description = "具体措施") + private java.lang.String specificMeasure; + /**完成时限*/ + @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时限") + private java.util.Date completionDeadline; + /**责任部门*/ + @Excel(name = "责任部门", width = 15) + @Schema(description = "责任部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String responsibleDept; + /**完成情况*/ + @Excel(name = "完成情况", width = 15) + @Schema(description = "完成情况") + private java.lang.String completionStatus; + /**是否可发起(0不可发起,1可发起)*/ + @Excel(name = "是否可发起", width = 15) + @Dict(dicCode = "is_launchable") + private String isLaunchable; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java new file mode 100644 index 0000000..61a41b7 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.peopleService.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.peopleService.entity.DjPeopleService; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 我为群众办实事台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface DjPeopleServiceMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml new file mode 100644 index 0000000..7b6cb99 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java new file mode 100644 index 0000000..e220f57 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.peopleService.service; + +import org.jeecg.modules.demo.peopleService.entity.DjPeopleService; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 我为群众办实事台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface IDjPeopleServiceService extends IService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java new file mode 100644 index 0000000..d090aa9 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.peopleService.service.impl; + +import org.jeecg.modules.demo.peopleService.entity.DjPeopleService; +import org.jeecg.modules.demo.peopleService.mapper.DjPeopleServiceMapper; +import org.jeecg.modules.demo.peopleService.service.IDjPeopleServiceService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 我为群众办实事台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Service +public class DjPeopleServiceServiceImpl extends ServiceImpl implements IDjPeopleServiceService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java new file mode 100644 index 0000000..85ad1d1 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java @@ -0,0 +1,298 @@ +package org.jeecg.modules.demo.rectifylist.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.system.vo.SelectTreeModel; +import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList; +import org.jeecg.modules.demo.rectifylist.service.IDjInspectionRectifyListService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + /** + * @Description: 党建巡视整改提升工作台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Tag(name="党建巡视整改提升工作台账") +@RestController +@RequestMapping("/rectifylist/djInspectionRectifyList") +@Slf4j +public class DjInspectionRectifyListController extends JeecgController{ + @Autowired + private IDjInspectionRectifyListService djInspectionRectifyListService; + + /** + * 分页列表查询 + * + * @param djInspectionRectifyList + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "党建巡视整改提升工作台账-分页列表查询") + @Operation(summary="党建巡视整改提升工作台账-分页列表查询") + @GetMapping(value = "/rootList") + public Result> queryPageList(DjInspectionRectifyList djInspectionRectifyList, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + String hasQuery = req.getParameter("hasQuery"); + if(hasQuery != null && "true".equals(hasQuery)){ + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap()); + List list = djInspectionRectifyListService.queryTreeListNoPage(queryWrapper); + IPage pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + }else{ + String parentId = djInspectionRectifyList.getPid(); + if (oConvertUtils.isEmpty(parentId)) { + parentId = "0"; + } + djInspectionRectifyList.setPid(null); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap()); + // 使用 eq 防止模糊查询 + queryWrapper.eq("pid", parentId); + Page page = new Page(pageNo, pageSize); + IPage pageList = djInspectionRectifyListService.page(page, queryWrapper); + return Result.OK(pageList); + } + } + + /** + * 【vue3专用】加载节点的子数据 + * + * @param pid + * @return + */ + @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET) + public Result> loadTreeChildren(@RequestParam(name = "pid") String pid) { + Result> result = new Result<>(); + try { + List ls = djInspectionRectifyListService.queryListByPid(pid); + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 【vue3专用】加载一级节点/如果是同步 则所有数据 + * + * @param async + * @param pcode + * @return + */ + @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET) + public Result> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) { + Result> result = new Result<>(); + try { + List ls = djInspectionRectifyListService.queryListByCode(pcode); + if (!async) { + loadAllChildren(ls); + } + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 【vue3专用】递归求子节点 同步加载用到 + * + * @param ls + */ + private void loadAllChildren(List ls) { + for (SelectTreeModel tsm : ls) { + List temp = djInspectionRectifyListService.queryListByPid(tsm.getKey()); + if (temp != null && temp.size() > 0) { + tsm.setChildren(temp); + loadAllChildren(temp); + } + } + } + + /** + * 获取子数据 + * @param djInspectionRectifyList + * @param req + * @return + */ + //@AutoLog(value = "党建巡视整改提升工作台账-获取子数据") + @Operation(summary="党建巡视整改提升工作台账-获取子数据") + @GetMapping(value = "/childList") + public Result> queryPageList(DjInspectionRectifyList djInspectionRectifyList,HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap()); + List list = djInspectionRectifyListService.list(queryWrapper); + IPage pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + } + + /** + * 批量查询子节点 + * @param parentIds 父ID(多个采用半角逗号分割) + * @return 返回 IPage + * @param parentIds + * @return + */ + //@AutoLog(value = "党建巡视整改提升工作台账-批量获取子数据") + @Operation(summary="党建巡视整改提升工作台账-批量获取子数据") + @GetMapping("/getChildListBatch") + public Result getChildListBatch(@RequestParam("parentIds") String parentIds) { + try { + QueryWrapper queryWrapper = new QueryWrapper<>(); + List parentIdList = Arrays.asList(parentIds.split(",")); + queryWrapper.in("pid", parentIdList); + List list = djInspectionRectifyListService.list(queryWrapper); + IPage pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("批量查询子节点失败:" + e.getMessage()); + } + } + + /** + * 添加 + * + * @param djInspectionRectifyList + * @return + */ + @AutoLog(value = "党建巡视整改提升工作台账-添加") + @Operation(summary="党建巡视整改提升工作台账-添加") + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:add") + @PostMapping(value = "/add") + public Result add(@RequestBody DjInspectionRectifyList djInspectionRectifyList) { + djInspectionRectifyListService.addDjInspectionRectifyList(djInspectionRectifyList); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param djInspectionRectifyList + * @return + */ + @AutoLog(value = "党建巡视整改提升工作台账-编辑") + @Operation(summary="党建巡视整改提升工作台账-编辑") + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody DjInspectionRectifyList djInspectionRectifyList) { + djInspectionRectifyListService.updateDjInspectionRectifyList(djInspectionRectifyList); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "党建巡视整改提升工作台账-通过id删除") + @Operation(summary="党建巡视整改提升工作台账-通过id删除") + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + djInspectionRectifyListService.deleteDjInspectionRectifyList(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "党建巡视整改提升工作台账-批量删除") + @Operation(summary="党建巡视整改提升工作台账-批量删除") + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.djInspectionRectifyListService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "党建巡视整改提升工作台账-通过id查询") + @Operation(summary="党建巡视整改提升工作台账-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + DjInspectionRectifyList djInspectionRectifyList = djInspectionRectifyListService.getById(id); + if(djInspectionRectifyList==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(djInspectionRectifyList); + } + + /** + * 导出excel + * + * @param request + * @param djInspectionRectifyList + */ + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DjInspectionRectifyList djInspectionRectifyList) { + return super.exportXls(request, djInspectionRectifyList, DjInspectionRectifyList.class, "党建巡视整改提升工作台账"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("rectifylist:dj_inspection_rectify_list:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DjInspectionRectifyList.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java new file mode 100644 index 0000000..d4ba8de --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java @@ -0,0 +1,126 @@ +package org.jeecg.modules.demo.rectifylist.entity; + +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 党建巡视整改提升工作台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Data +@TableName("dj_inspection_rectify_list") +@Schema(description="党建巡视整改提升工作台账") +public class DjInspectionRectifyList implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**父级节点*/ + @Excel(name = "父级节点", width = 15) + @Schema(description = "父级节点") + private java.lang.String pid; + /**是否有子节点*/ + @Excel(name = "是否有子节点", width = 15, dicCode = "yn") + @Dict(dicCode = "yn") + @Schema(description = "是否有子节点") + private java.lang.String hasChild; + /**问题名称*/ + @Excel(name = "问题名称", width = 15) + @Schema(description = "问题名称") + private java.lang.String issueName; + /**问题分类*/ + @Excel(name = "问题分类", width = 15) + @Schema(description = "问题分类") + private java.lang.Integer problemType; + /**面上问题*/ + @Excel(name = "面上问题", width = 15) + @Schema(description = "面上问题") + private java.lang.String msIssue; + /**具体问题*/ + @Excel(name = "具体问题", width = 15) + @Schema(description = "具体问题") + private java.lang.String specificIssue; + /**整改措施*/ + @Excel(name = "整改措施", width = 15) + @Schema(description = "整改措施") + private java.lang.String rectificationMeasures; + /**完成时限*/ + @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时限") + private java.util.Date completionDeadline; + /**责任部门*/ + @Excel(name = "责任部门", width = 15) + @Schema(description = "责任部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String responsibleDept; + /**分管所领导*/ + @Excel(name = "分管所领导", width = 15) + @Schema(description = "分管所领导") + private java.lang.String supervisingLeader; + /**标志性成果*/ + @Excel(name = "标志性成果", width = 15) + @Schema(description = "标志性成果") + private java.lang.String landmarkAchievement; + /**完成时间*/ + @Excel(name = "完成时间", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时间") + private java.util.Date completionDate; + /**监督意见*/ + @Excel(name = "监督意见", width = 15) + @Schema(description = "监督意见") + private java.lang.String supervisionOpinion; + /**措施数量*/ + @Excel(name = "措施数量", width = 15) + @Schema(description = "措施数量") + private java.lang.Integer measureCount; + /**是否可发起(0不可发起,1可发起)*/ + @Excel(name = "是否可发起", width = 15) + @Dict(dicCode = "is_launchable") + private String isLaunchable; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; + // 该表单未设置逻辑删除功能,因为该表单为树形结构 + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java new file mode 100644 index 0000000..9258f0e --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java @@ -0,0 +1,35 @@ +package org.jeecg.modules.demo.rectifylist.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.jeecg.common.system.vo.SelectTreeModel; +import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList; + +import java.util.List; +import java.util.Map; + +/** + * @Description: 党建巡视整改提升工作台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface DjInspectionRectifyListMapper extends BaseMapper { + + /** + * 编辑节点状态 + * @param id + * @param status + */ + void updateTreeNodeStatus(@Param("id") String id,@Param("status") String status); + + /** + * 【vue3专用】根据父级ID查询树节点数据 + * + * @param pid + * @param query + * @return + */ + List queryListByPid(@Param("pid") String pid, @Param("query") Map query); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml new file mode 100644 index 0000000..fbda438 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml @@ -0,0 +1,25 @@ + + + + + + update dj_inspection_rectify_list set has_child = #{status} where id = #{id} + + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java new file mode 100644 index 0000000..8cd18f3 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java @@ -0,0 +1,74 @@ +package org.jeecg.modules.demo.rectifylist.service; + +import org.jeecg.common.system.vo.SelectTreeModel; +import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.common.exception.JeecgBootException; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import java.util.List; + +/** + * @Description: 党建巡视整改提升工作台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface IDjInspectionRectifyListService extends IService { + + /**根节点父ID的值*/ + public static final String ROOT_PID_VALUE = "0"; + + /**树节点有子节点状态值*/ + public static final String HASCHILD = "1"; + + /**树节点无子节点状态值*/ + public static final String NOCHILD = "0"; + + /** + * 新增节点 + * + * @param djInspectionRectifyList + */ + void addDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList); + + /** + * 修改节点 + * + * @param djInspectionRectifyList + * @throws JeecgBootException + */ + void updateDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) throws JeecgBootException; + + /** + * 删除节点 + * + * @param id + * @throws JeecgBootException + */ + void deleteDjInspectionRectifyList(String id) throws JeecgBootException; + + /** + * 查询所有数据,无分页 + * + * @param queryWrapper + * @return List + */ + List queryTreeListNoPage(QueryWrapper queryWrapper); + + /** + * 【vue3专用】根据父级编码加载分类字典的数据 + * + * @param parentCode + * @return + */ + List queryListByCode(String parentCode); + + /** + * 【vue3专用】根据pid查询子节点集合 + * + * @param pid + * @return + */ + List queryListByPid(String pid); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java new file mode 100644 index 0000000..9bb9205 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java @@ -0,0 +1,219 @@ +package org.jeecg.modules.demo.rectifylist.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.system.vo.SelectTreeModel; +import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList; +import org.jeecg.modules.demo.rectifylist.mapper.DjInspectionRectifyListMapper; +import org.jeecg.modules.demo.rectifylist.service.IDjInspectionRectifyListService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 党建巡视整改提升工作台账 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Service +public class DjInspectionRectifyListServiceImpl extends ServiceImpl implements IDjInspectionRectifyListService { + + @Override + public void addDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) { + //新增时设置hasChild为0 + djInspectionRectifyList.setHasChild(IDjInspectionRectifyListService.NOCHILD); + if(oConvertUtils.isEmpty(djInspectionRectifyList.getPid())){ + djInspectionRectifyList.setPid(IDjInspectionRectifyListService.ROOT_PID_VALUE); + }else{ + //如果当前节点父ID不为空 则设置父节点的hasChildren 为1 + DjInspectionRectifyList parent = baseMapper.selectById(djInspectionRectifyList.getPid()); + if(parent!=null && !"1".equals(parent.getHasChild())){ + parent.setHasChild("1"); + baseMapper.updateById(parent); + } + } + baseMapper.insert(djInspectionRectifyList); + } + + @Override + public void updateDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) { + DjInspectionRectifyList entity = this.getById(djInspectionRectifyList.getId()); + if(entity==null) { + throw new JeecgBootException("未找到对应实体"); + } + String old_pid = entity.getPid(); + String new_pid = djInspectionRectifyList.getPid(); + if(!old_pid.equals(new_pid)) { + updateOldParentNode(old_pid); + if(oConvertUtils.isEmpty(new_pid)){ + djInspectionRectifyList.setPid(IDjInspectionRectifyListService.ROOT_PID_VALUE); + } + if(!IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(djInspectionRectifyList.getPid())) { + baseMapper.updateTreeNodeStatus(djInspectionRectifyList.getPid(), IDjInspectionRectifyListService.HASCHILD); + } + } + baseMapper.updateById(djInspectionRectifyList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDjInspectionRectifyList(String id) throws JeecgBootException { + //查询选中节点下所有子节点一并删除 + id = this.queryTreeChildIds(id); + if(id.indexOf(",")>0) { + StringBuffer sb = new StringBuffer(); + String[] idArr = id.split(","); + for (String idVal : idArr) { + if(idVal != null){ + DjInspectionRectifyList djInspectionRectifyList = this.getById(idVal); + String pidVal = djInspectionRectifyList.getPid(); + //查询此节点上一级是否还有其他子节点 + List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal).notIn("id",Arrays.asList(idArr))); + boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal); + if(flag){ + //如果当前节点原本有子节点 现在木有了,更新状态 + sb.append(pidVal).append(","); + } + } + } + //批量删除节点 + baseMapper.deleteBatchIds(Arrays.asList(idArr)); + //修改已无子节点的标识 + String[] pidArr = sb.toString().split(","); + for(String pid : pidArr){ + this.updateOldParentNode(pid); + } + }else{ + DjInspectionRectifyList djInspectionRectifyList = this.getById(id); + if(djInspectionRectifyList==null) { + throw new JeecgBootException("未找到对应实体"); + } + updateOldParentNode(djInspectionRectifyList.getPid()); + baseMapper.deleteById(id); + } + } + + @Override + public List queryTreeListNoPage(QueryWrapper queryWrapper) { + List dataList = baseMapper.selectList(queryWrapper); + List mapList = new ArrayList<>(); + for(DjInspectionRectifyList data : dataList){ + String pidVal = data.getPid(); + //递归查询子节点的根节点 + if(pidVal != null && !IDjInspectionRectifyListService.NOCHILD.equals(pidVal)){ + DjInspectionRectifyList rootVal = this.getTreeRoot(pidVal); + if(rootVal != null && !mapList.contains(rootVal)){ + mapList.add(rootVal); + } + }else{ + if(!mapList.contains(data)){ + mapList.add(data); + } + } + } + return mapList; + } + + @Override + public List queryListByCode(String parentCode) { + String pid = ROOT_PID_VALUE; + if (oConvertUtils.isNotEmpty(parentCode)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DjInspectionRectifyList::getPid, parentCode); + List list = baseMapper.selectList(queryWrapper); + if (list == null || list.size() == 0) { + throw new JeecgBootException("该编码【" + parentCode + "】不存在,请核实!"); + } + if (list.size() > 1) { + throw new JeecgBootException("该编码【" + parentCode + "】存在多个,请核实!"); + } + pid = list.get(0).getId(); + } + return baseMapper.queryListByPid(pid, null); + } + + @Override + public List queryListByPid(String pid) { + if (oConvertUtils.isEmpty(pid)) { + pid = ROOT_PID_VALUE; + } + return baseMapper.queryListByPid(pid, null); + } + + /** + * 根据所传pid查询旧的父级节点的子节点并修改相应状态值 + * @param pid + */ + private void updateOldParentNode(String pid) { + if(!IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(pid)) { + Long count = baseMapper.selectCount(new QueryWrapper().eq("pid", pid)); + if(count==null || count<=1) { + baseMapper.updateTreeNodeStatus(pid, IDjInspectionRectifyListService.NOCHILD); + } + } + } + + /** + * 递归查询节点的根节点 + * @param pidVal + * @return + */ + private DjInspectionRectifyList getTreeRoot(String pidVal){ + DjInspectionRectifyList data = baseMapper.selectById(pidVal); + if(data != null && !IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(data.getPid())){ + return this.getTreeRoot(data.getPid()); + }else{ + return data; + } + } + + /** + * 根据id查询所有子节点id + * @param ids + * @return + */ + private String queryTreeChildIds(String ids) { + //获取id数组 + String[] idArr = ids.split(","); + StringBuffer sb = new StringBuffer(); + for (String pidVal : idArr) { + if(pidVal != null){ + if(!sb.toString().contains(pidVal)){ + if(sb.toString().length() > 0){ + sb.append(","); + } + sb.append(pidVal); + this.getTreeChildIds(pidVal,sb); + } + } + } + return sb.toString(); + } + + /** + * 递归查询所有子节点 + * @param pidVal + * @param sb + * @return + */ + private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){ + List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal)); + if(dataList != null && dataList.size()>0){ + for(DjInspectionRectifyList tree : dataList) { + if(!sb.toString().contains(tree.getId())){ + sb.append(",").append(tree.getId()); + } + this.getTreeChildIds(tree.getId(),sb); + } + } + return sb; + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java new file mode 100644 index 0000000..c694faf --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.supervisiontest.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest; +import org.jeecg.modules.demo.supervisiontest.service.ISupervisionTestService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: supervision_test + * @Author: jeecg-boot + * @Date: 2026-03-20 + * @Version: V1.0 + */ +@Tag(name="supervision_test") +@RestController +@RequestMapping("/supervisiontest/supervisionTest") +@Slf4j +public class SupervisionTestController extends JeecgController { + @Autowired + private ISupervisionTestService supervisionTestService; + + /** + * 分页列表查询 + * + * @param supervisionTest + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "supervision_test-分页列表查询") + @Operation(summary="supervision_test-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(SupervisionTest supervisionTest, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(supervisionTest, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = supervisionTestService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param supervisionTest + * @return + */ + @AutoLog(value = "supervision_test-添加") + @Operation(summary="supervision_test-添加") + @RequiresPermissions("supervisiontest:supervision_test:add") + @PostMapping(value = "/add") + public Result add(@RequestBody SupervisionTest supervisionTest) { + supervisionTestService.save(supervisionTest); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param supervisionTest + * @return + */ + @AutoLog(value = "supervision_test-编辑") + @Operation(summary="supervision_test-编辑") + @RequiresPermissions("supervisiontest:supervision_test:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody SupervisionTest supervisionTest) { + supervisionTestService.updateById(supervisionTest); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "supervision_test-通过id删除") + @Operation(summary="supervision_test-通过id删除") + @RequiresPermissions("supervisiontest:supervision_test:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + supervisionTestService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "supervision_test-批量删除") + @Operation(summary="supervision_test-批量删除") + @RequiresPermissions("supervisiontest:supervision_test:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.supervisionTestService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "supervision_test-通过id查询") + @Operation(summary="supervision_test-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + SupervisionTest supervisionTest = supervisionTestService.getById(id); + if(supervisionTest==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(supervisionTest); + } + + /** + * 导出excel + * + * @param request + * @param supervisionTest + */ + @RequiresPermissions("supervisiontest:supervision_test:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SupervisionTest supervisionTest) { + return super.exportXls(request, supervisionTest, SupervisionTest.class, "supervision_test"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("supervisiontest:supervision_test:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SupervisionTest.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java new file mode 100644 index 0000000..1ecea13 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java @@ -0,0 +1,89 @@ +package org.jeecg.modules.demo.supervisiontest.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: supervision_test + * @Author: jeecg-boot + * @Date: 2026-03-20 + * @Version: V1.0 + */ +@Data +@TableName("supervision_test") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="supervision_test") +public class SupervisionTest implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**附件1*/ + @Excel(name = "附件1", width = 15) + @Schema(description = "附件1") + private java.lang.String fileurl1; + /**附件2*/ + @Excel(name = "附件2", width = 15) + @Schema(description = "附件2") + private java.lang.String fileurl2; + /**督办标题*/ + @Excel(name = "督办标题", width = 15) + @Schema(description = "督办标题") + private java.lang.String supervisionTitle; + /**督办人*/ + @Excel(name = "督办人", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username") + @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username") + @Schema(description = "督办人") + private java.lang.String supervisionPerson; + /**督办部门*/ + @Excel(name = "督办部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") + @Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") + @Schema(description = "督办部门") + private java.lang.String supervisionDepart; + /**督办类型*/ + @Excel(name = "督办类型", width = 15) + @Schema(description = "督办类型") + private java.lang.String supervitionType; + /**删除状态(0,正常,1已删除)*/ + @TableLogic + @Dict(dicCode = "del_flag") + private String delFlag; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java new file mode 100644 index 0000000..53da16c --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.supervisiontest.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: supervision_test + * @Author: jeecg-boot + * @Date: 2026-03-20 + * @Version: V1.0 + */ +public interface SupervisionTestMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml new file mode 100644 index 0000000..37a7817 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java new file mode 100644 index 0000000..0e86cd3 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.supervisiontest.service; + +import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: supervision_test + * @Author: jeecg-boot + * @Date: 2026-03-20 + * @Version: V1.0 + */ +public interface ISupervisionTestService extends IService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java new file mode 100644 index 0000000..a6a2350 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.supervisiontest.service.impl; + +import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest; +import org.jeecg.modules.demo.supervisiontest.mapper.SupervisionTestMapper; +import org.jeecg.modules.demo.supervisiontest.service.ISupervisionTestService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: supervision_test + * @Author: jeecg-boot + * @Date: 2026-03-20 + * @Version: V1.0 + */ +@Service +public class SupervisionTestServiceImpl extends ServiceImpl implements ISupervisionTestService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java new file mode 100644 index 0000000..3d48616 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.tzMetting.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord; +import org.jeecg.modules.demo.tzMetting.service.IDjMeetingRecordService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 统战座谈会意见台账及督办反馈 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Tag(name="统战座谈会意见台账及督办反馈") +@RestController +@RequestMapping("/tzMetting/djMeetingRecord") +@Slf4j +public class DjMeetingRecordController extends JeecgController { + @Autowired + private IDjMeetingRecordService djMeetingRecordService; + + /** + * 分页列表查询 + * + * @param djMeetingRecord + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "统战座谈会意见台账及督办反馈-分页列表查询") + @Operation(summary="统战座谈会意见台账及督办反馈-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(DjMeetingRecord djMeetingRecord, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djMeetingRecord, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = djMeetingRecordService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param djMeetingRecord + * @return + */ + @AutoLog(value = "统战座谈会意见台账及督办反馈-添加") + @Operation(summary="统战座谈会意见台账及督办反馈-添加") + @RequiresPermissions("tzMetting:dj_meeting_record:add") + @PostMapping(value = "/add") + public Result add(@RequestBody DjMeetingRecord djMeetingRecord) { + djMeetingRecordService.save(djMeetingRecord); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param djMeetingRecord + * @return + */ + @AutoLog(value = "统战座谈会意见台账及督办反馈-编辑") + @Operation(summary="统战座谈会意见台账及督办反馈-编辑") + @RequiresPermissions("tzMetting:dj_meeting_record:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody DjMeetingRecord djMeetingRecord) { + djMeetingRecordService.updateById(djMeetingRecord); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "统战座谈会意见台账及督办反馈-通过id删除") + @Operation(summary="统战座谈会意见台账及督办反馈-通过id删除") + @RequiresPermissions("tzMetting:dj_meeting_record:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + djMeetingRecordService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "统战座谈会意见台账及督办反馈-批量删除") + @Operation(summary="统战座谈会意见台账及督办反馈-批量删除") + @RequiresPermissions("tzMetting:dj_meeting_record:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.djMeetingRecordService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "统战座谈会意见台账及督办反馈-通过id查询") + @Operation(summary="统战座谈会意见台账及督办反馈-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + DjMeetingRecord djMeetingRecord = djMeetingRecordService.getById(id); + if(djMeetingRecord==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(djMeetingRecord); + } + + /** + * 导出excel + * + * @param request + * @param djMeetingRecord + */ + @RequiresPermissions("tzMetting:dj_meeting_record:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DjMeetingRecord djMeetingRecord) { + return super.exportXls(request, djMeetingRecord, DjMeetingRecord.class, "统战座谈会意见台账及督办反馈"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("tzMetting:dj_meeting_record:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DjMeetingRecord.class); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java new file mode 100644 index 0000000..7c58bc0 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java @@ -0,0 +1,92 @@ +package org.jeecg.modules.demo.tzMetting.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 统战座谈会意见台账及督办反馈 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Data +@TableName("dj_meeting_record") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="统战座谈会意见台账及督办反馈") +public class DjMeetingRecord implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**序号*/ + @Excel(name = "序号", width = 15) + @Schema(description = "序号") + private java.lang.Integer sortNo; + /**问题分类*/ + @Excel(name = "问题分类", width = 15) + @Schema(description = "问题分类") + private java.lang.Integer problemType; + /**具体措施*/ + @Excel(name = "具体措施", width = 15) + @Schema(description = "具体措施") + private java.lang.String specificMeasure; + /**完成时限*/ + @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @Schema(description = "完成时限") + private java.util.Date completionDeadline; + /**责任部门*/ + @Excel(name = "责任部门", width = 15) + @Schema(description = "责任部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private java.lang.String responsibleDept; + /**完成情况*/ + @Excel(name = "完成情况", width = 15) + @Schema(description = "完成情况") + private java.lang.String completionStatus; + /**是否可发起(0不可发起,1可发起)*/ + @Excel(name = "是否可发起", width = 15) + @Dict(dicCode = "is_launchable") + private String isLaunchable; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java new file mode 100644 index 0000000..1dd8148 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.tzMetting.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 统战座谈会意见台账及督办反馈 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface DjMeetingRecordMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml new file mode 100644 index 0000000..0add93d --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java new file mode 100644 index 0000000..f2da28b --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.tzMetting.service; + +import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 统战座谈会意见台账及督办反馈 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +public interface IDjMeetingRecordService extends IService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java new file mode 100644 index 0000000..c4c9d27 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.tzMetting.service.impl; + +import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord; +import org.jeecg.modules.demo.tzMetting.mapper.DjMeetingRecordMapper; +import org.jeecg.modules.demo.tzMetting.service.IDjMeetingRecordService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 统战座谈会意见台账及督办反馈 + * @Author: jeecg-boot + * @Date: 2026-03-24 + * @Version: V1.0 + */ +@Service +public class DjMeetingRecordServiceImpl extends ServiceImpl implements IDjMeetingRecordService { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java new file mode 100644 index 0000000..5cf41b6 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java @@ -0,0 +1,270 @@ +package org.jeecg.modules.test.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.vo.TestMainTablePage; +import org.jeecg.modules.test.service.ITestMainTableService; +import org.jeecg.modules.test.service.ITestSonTableService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + + /** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Tag(name="test") +@RestController +@RequestMapping("/test/testMainTable") +@Slf4j +public class TestMainTableController { + @Autowired + private ITestMainTableService testMainTableService; + @Autowired + private ITestSonTableService testSonTableService; + + /** + * 分页列表查询 + * + * @param testMainTable + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "test-分页列表查询") + @Operation(summary="test-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(TestMainTable testMainTable, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = testMainTableService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param testMainTablePage + * @return + */ + @AutoLog(value = "test-添加") + @Operation(summary="test-添加") + @RequiresPermissions("test:test_main_table:add") + @PostMapping(value = "/add") + public Result add(@RequestBody TestMainTablePage testMainTablePage) { + TestMainTable testMainTable = new TestMainTable(); + BeanUtils.copyProperties(testMainTablePage, testMainTable); + testMainTableService.saveMain(testMainTable, testMainTablePage.getTestSonTableList()); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param testMainTablePage + * @return + */ + @AutoLog(value = "test-编辑") + @Operation(summary="test-编辑") + @RequiresPermissions("test:test_main_table:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody TestMainTablePage testMainTablePage) { + TestMainTable testMainTable = new TestMainTable(); + BeanUtils.copyProperties(testMainTablePage, testMainTable); + TestMainTable testMainTableEntity = testMainTableService.getById(testMainTable.getId()); + if(testMainTableEntity==null) { + return Result.error("未找到对应数据"); + } + testMainTableService.updateMain(testMainTable, testMainTablePage.getTestSonTableList()); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "test-通过id删除") + @Operation(summary="test-通过id删除") + @RequiresPermissions("test:test_main_table:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + testMainTableService.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "test-批量删除") + @Operation(summary="test-批量删除") + @RequiresPermissions("test:test_main_table:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.testMainTableService.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "test-通过id查询") + @Operation(summary="test-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + TestMainTable testMainTable = testMainTableService.getById(id); + if(testMainTable==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(testMainTable); + + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "test通过主表ID查询") + @Operation(summary="test主表ID查询") + @GetMapping(value = "/queryTestSonTableByMainId") + public Result> queryTestSonTableListByMainId(@RequestParam(name="id",required=true) String id) { + List testSonTableList = testSonTableService.selectByMainId(id); + return Result.OK(testSonTableList); + } + + /** + * 导出excel + * + * @param request + * @param testMainTable + */ + @RequiresPermissions("test:test_main_table:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TestMainTable testMainTable) { + + // Step.1 组装查询条件查询数据 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List testMainTableList = testMainTableService.list(queryWrapper); + + // Step.3 组装pageList + List pageList = new ArrayList(); + for (TestMainTable main : testMainTableList) { + TestMainTablePage vo = new TestMainTablePage(); + BeanUtils.copyProperties(main, vo); + List testSonTableList = testSonTableService.selectByMainId(main.getId()); + vo.setTestSonTableList(testSonTableList); + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "test列表"); + mv.addObject(NormalExcelConstants.CLASS, TestMainTablePage.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("test数据", "导出人:"+sysUser.getRealname(), "test")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("test:test_main_table:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List list = ExcelImportUtil.importExcel(file.getInputStream(), TestMainTablePage.class, params); + for (TestMainTablePage page : list) { + TestMainTable po = new TestMainTable(); + BeanUtils.copyProperties(page, po); + testMainTableService.saveMain(po, page.getTestSonTableList()); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java new file mode 100644 index 0000000..603e89f --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java @@ -0,0 +1,65 @@ +package org.jeecg.modules.test.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Schema(description="test") +@Data +@TableName("test_main_table") +public class TestMainTable implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private String id; + /**创建人*/ + @Schema(description = "创建人") + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private String sysOrgCode; + /**a字段*/ + @Excel(name = "a字段", width = 15) + @Schema(description = "a字段") + private String fieldA; + /**b字段*/ + @Excel(name = "b字段", width = 15) + @Schema(description = "b字段") + private String fieldB; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java new file mode 100644 index 0000000..4dd3db8 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java @@ -0,0 +1,62 @@ +package org.jeecg.modules.test.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Schema(description="test") +@Data +@TableName("test_son_table") +public class TestSonTable implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private String id; + /**创建人*/ + @Schema(description = "创建人") + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private String sysOrgCode; + /**字段c*/ + @Excel(name = "字段c", width = 15) + @Schema(description = "字段c") + private String fieldC; + /**主表id*/ + @Schema(description = "主表id") + private String mainTableId; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java new file mode 100644 index 0000000..bf1dbc7 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.test.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.test.entity.TestMainTable; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface TestMainTableMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java new file mode 100644 index 0000000..ee502e6 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.test.mapper; + +import java.util.List; +import org.jeecg.modules.test.entity.TestSonTable; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface TestSonTableMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml new file mode 100644 index 0000000..3954740 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml new file mode 100644 index 0000000..87ca9ba --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM test_son_table + WHERE + main_table_id = #{mainId} + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java new file mode 100644 index 0000000..e84b5be --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.test.service; + +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface ITestMainTableService extends IService { + + /** + * 添加一对多 + * + * @param testMainTable + * @param testSonTableList + */ + public void saveMain(TestMainTable testMainTable,List testSonTableList) ; + + /** + * 修改一对多 + * + * @param testMainTable + * @param testSonTableList + */ + public void updateMain(TestMainTable testMainTable,List testSonTableList); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java new file mode 100644 index 0000000..c171ce5 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.test.service; + +import org.jeecg.modules.test.entity.TestSonTable; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface ITestSonTableService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java new file mode 100644 index 0000000..4b49b82 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java @@ -0,0 +1,83 @@ +package org.jeecg.modules.test.service.impl; + +import org.jeecg.common.aspect.annotation.CascadeDelete; +import org.jeecg.common.aspect.annotation.SonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.mapper.TestSonTableMapper; +import org.jeecg.modules.test.mapper.TestMainTableMapper; +import org.jeecg.modules.test.service.ITestMainTableService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; +import org.jeecg.common.aspect.annotation.AutoLog; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Service +public class TestMainTableServiceImpl extends ServiceImpl implements ITestMainTableService { + + @Autowired + private TestMainTableMapper testMainTableMapper; + @Autowired + private TestSonTableMapper testSonTableMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(TestMainTable testMainTable, List testSonTableList) { + testMainTableMapper.insert(testMainTable); + if(testSonTableList!=null && testSonTableList.size()>0) { + for(TestSonTable entity:testSonTableList) { + //外键设置 + entity.setMainTableId(testMainTable.getId()); + testSonTableMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(TestMainTable testMainTable,List testSonTableList) { + testMainTableMapper.updateById(testMainTable); + + //1.先删除子表数据 + testSonTableMapper.deleteByMainId(testMainTable.getId()); + + //2.子表数据重新插入 + if(testSonTableList!=null && testSonTableList.size()>0) { + for(TestSonTable entity:testSonTableList) { + //外键设置 + entity.setMainTableId(testMainTable.getId()); + testSonTableMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CascadeDelete(sons = { + // 配置子表1:Mapper类 + 子表中关联主表的字段名 + @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"), + }) + public void delMain(String id) { + testMainTableMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + testSonTableMapper.deleteByMainId(id.toString()); + testMainTableMapper.deleteById(id); + } + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java new file mode 100644 index 0000000..3bfc3c6 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.test.service.impl; + +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.mapper.TestSonTableMapper; +import org.jeecg.modules.test.service.ITestSonTableService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Service +public class TestSonTableServiceImpl extends ServiceImpl implements ITestSonTableService { + + @Autowired + private TestSonTableMapper testSonTableMapper; + + @Override + public List selectByMainId(String mainId) { + return testSonTableMapper.selectByMainId(mainId); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java new file mode 100644 index 0000000..0e73f8f --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java @@ -0,0 +1,64 @@ +package org.jeecg.modules.test.vo; + +import java.util.List; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.entity.TestSonTable; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Data +@Schema(description="test") +public class TestMainTablePage { + + /**主键*/ + @Schema(description = "主键") + private String id; + /**创建人*/ + @Schema(description = "创建人") + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private String sysOrgCode; + /**a字段*/ + @Excel(name = "a字段", width = 15) + @Schema(description = "a字段") + private String fieldA; + /**b字段*/ + @Excel(name = "b字段", width = 15) + @Schema(description = "b字段") + private String fieldB; + + @ExcelCollection(name="test") + @Schema(description = "test") + private List testSonTableList; + +} diff --git a/jeecg-module-supervision/src/test/controller/TestMainTableController.java b/jeecg-module-supervision/src/test/controller/TestMainTableController.java new file mode 100644 index 0000000..5cf41b6 --- /dev/null +++ b/jeecg-module-supervision/src/test/controller/TestMainTableController.java @@ -0,0 +1,270 @@ +package org.jeecg.modules.test.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.vo.TestMainTablePage; +import org.jeecg.modules.test.service.ITestMainTableService; +import org.jeecg.modules.test.service.ITestSonTableService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + + /** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Tag(name="test") +@RestController +@RequestMapping("/test/testMainTable") +@Slf4j +public class TestMainTableController { + @Autowired + private ITestMainTableService testMainTableService; + @Autowired + private ITestSonTableService testSonTableService; + + /** + * 分页列表查询 + * + * @param testMainTable + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "test-分页列表查询") + @Operation(summary="test-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(TestMainTable testMainTable, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = testMainTableService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param testMainTablePage + * @return + */ + @AutoLog(value = "test-添加") + @Operation(summary="test-添加") + @RequiresPermissions("test:test_main_table:add") + @PostMapping(value = "/add") + public Result add(@RequestBody TestMainTablePage testMainTablePage) { + TestMainTable testMainTable = new TestMainTable(); + BeanUtils.copyProperties(testMainTablePage, testMainTable); + testMainTableService.saveMain(testMainTable, testMainTablePage.getTestSonTableList()); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param testMainTablePage + * @return + */ + @AutoLog(value = "test-编辑") + @Operation(summary="test-编辑") + @RequiresPermissions("test:test_main_table:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody TestMainTablePage testMainTablePage) { + TestMainTable testMainTable = new TestMainTable(); + BeanUtils.copyProperties(testMainTablePage, testMainTable); + TestMainTable testMainTableEntity = testMainTableService.getById(testMainTable.getId()); + if(testMainTableEntity==null) { + return Result.error("未找到对应数据"); + } + testMainTableService.updateMain(testMainTable, testMainTablePage.getTestSonTableList()); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "test-通过id删除") + @Operation(summary="test-通过id删除") + @RequiresPermissions("test:test_main_table:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + testMainTableService.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "test-批量删除") + @Operation(summary="test-批量删除") + @RequiresPermissions("test:test_main_table:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.testMainTableService.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "test-通过id查询") + @Operation(summary="test-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + TestMainTable testMainTable = testMainTableService.getById(id); + if(testMainTable==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(testMainTable); + + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "test通过主表ID查询") + @Operation(summary="test主表ID查询") + @GetMapping(value = "/queryTestSonTableByMainId") + public Result> queryTestSonTableListByMainId(@RequestParam(name="id",required=true) String id) { + List testSonTableList = testSonTableService.selectByMainId(id); + return Result.OK(testSonTableList); + } + + /** + * 导出excel + * + * @param request + * @param testMainTable + */ + @RequiresPermissions("test:test_main_table:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TestMainTable testMainTable) { + + // Step.1 组装查询条件查询数据 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List testMainTableList = testMainTableService.list(queryWrapper); + + // Step.3 组装pageList + List pageList = new ArrayList(); + for (TestMainTable main : testMainTableList) { + TestMainTablePage vo = new TestMainTablePage(); + BeanUtils.copyProperties(main, vo); + List testSonTableList = testSonTableService.selectByMainId(main.getId()); + vo.setTestSonTableList(testSonTableList); + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "test列表"); + mv.addObject(NormalExcelConstants.CLASS, TestMainTablePage.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("test数据", "导出人:"+sysUser.getRealname(), "test")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("test:test_main_table:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List list = ExcelImportUtil.importExcel(file.getInputStream(), TestMainTablePage.class, params); + for (TestMainTablePage page : list) { + TestMainTable po = new TestMainTable(); + BeanUtils.copyProperties(page, po); + testMainTableService.saveMain(po, page.getTestSonTableList()); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-module-supervision/src/test/entity/TestMainTable.java b/jeecg-module-supervision/src/test/entity/TestMainTable.java new file mode 100644 index 0000000..cb498e0 --- /dev/null +++ b/jeecg-module-supervision/src/test/entity/TestMainTable.java @@ -0,0 +1,65 @@ +package org.jeecg.modules.test.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Schema(description="test") +@Data +@TableName("test_main_table") +public class TestMainTable implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**a字段*/ + @Excel(name = "a字段", width = 15) + @Schema(description = "a字段") + private java.lang.String fieldA; + /**b字段*/ + @Excel(name = "b字段", width = 15) + @Schema(description = "b字段") + private java.lang.String fieldB; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/test/entity/TestSonTable.java b/jeecg-module-supervision/src/test/entity/TestSonTable.java new file mode 100644 index 0000000..0895b9e --- /dev/null +++ b/jeecg-module-supervision/src/test/entity/TestSonTable.java @@ -0,0 +1,62 @@ +package org.jeecg.modules.test.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Schema(description="test") +@Data +@TableName("test_son_table") +public class TestSonTable implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**字段c*/ + @Excel(name = "字段c", width = 15) + @Schema(description = "字段c") + private java.lang.String fieldC; + /**主表id*/ + @Schema(description = "主表id") + private java.lang.String mainTableId; + @TableLogic(value = "0", delval = "1") + private int delFlag = 0; +} diff --git a/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java b/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java new file mode 100644 index 0000000..bf1dbc7 --- /dev/null +++ b/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.test.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.test.entity.TestMainTable; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface TestMainTableMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java b/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java new file mode 100644 index 0000000..ee502e6 --- /dev/null +++ b/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.test.mapper; + +import java.util.List; +import org.jeecg.modules.test.entity.TestSonTable; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface TestSonTableMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml b/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml new file mode 100644 index 0000000..3954740 --- /dev/null +++ b/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml b/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml new file mode 100644 index 0000000..87ca9ba --- /dev/null +++ b/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM test_son_table + WHERE + main_table_id = #{mainId} + + + diff --git a/jeecg-module-supervision/src/test/service/ITestMainTableService.java b/jeecg-module-supervision/src/test/service/ITestMainTableService.java new file mode 100644 index 0000000..e84b5be --- /dev/null +++ b/jeecg-module-supervision/src/test/service/ITestMainTableService.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.test.service; + +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface ITestMainTableService extends IService { + + /** + * 添加一对多 + * + * @param testMainTable + * @param testSonTableList + */ + public void saveMain(TestMainTable testMainTable,List testSonTableList) ; + + /** + * 修改一对多 + * + * @param testMainTable + * @param testSonTableList + */ + public void updateMain(TestMainTable testMainTable,List testSonTableList); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-module-supervision/src/test/service/ITestSonTableService.java b/jeecg-module-supervision/src/test/service/ITestSonTableService.java new file mode 100644 index 0000000..c171ce5 --- /dev/null +++ b/jeecg-module-supervision/src/test/service/ITestSonTableService.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.test.service; + +import org.jeecg.modules.test.entity.TestSonTable; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +public interface ITestSonTableService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); +} diff --git a/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java b/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java new file mode 100644 index 0000000..bc65fbf --- /dev/null +++ b/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java @@ -0,0 +1,82 @@ +package org.jeecg.modules.test.service.impl; + +import org.jeecg.common.aspect.annotation.CascadeDelete; +import org.jeecg.common.aspect.annotation.SonTable; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.mapper.TestSonTableMapper; +import org.jeecg.modules.test.mapper.TestMainTableMapper; +import org.jeecg.modules.test.service.ITestMainTableService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Service +public class TestMainTableServiceImpl extends ServiceImpl implements ITestMainTableService { + + @Autowired + private TestMainTableMapper testMainTableMapper; + @Autowired + private TestSonTableMapper testSonTableMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(TestMainTable testMainTable, List testSonTableList) { + testMainTableMapper.insert(testMainTable); + if(testSonTableList!=null && testSonTableList.size()>0) { + for(TestSonTable entity:testSonTableList) { + //外键设置 + entity.setMainTableId(testMainTable.getId()); + testSonTableMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(TestMainTable testMainTable,List testSonTableList) { + testMainTableMapper.updateById(testMainTable); + + //1.先删除子表数据 + testSonTableMapper.deleteByMainId(testMainTable.getId()); + + //2.子表数据重新插入 + if(testSonTableList!=null && testSonTableList.size()>0) { + for(TestSonTable entity:testSonTableList) { + //外键设置 + entity.setMainTableId(testMainTable.getId()); + testSonTableMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CascadeDelete(sons = { + // 配置子表1:Mapper类 + 子表中关联主表的字段名 + @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"), + }) + public void delMain(String id) { + testMainTableMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + testSonTableMapper.deleteByMainId(id.toString()); + testMainTableMapper.deleteById(id); + } + } + +} diff --git a/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java b/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java new file mode 100644 index 0000000..3bfc3c6 --- /dev/null +++ b/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.test.service.impl; + +import org.jeecg.modules.test.entity.TestSonTable; +import org.jeecg.modules.test.mapper.TestSonTableMapper; +import org.jeecg.modules.test.service.ITestSonTableService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Service +public class TestSonTableServiceImpl extends ServiceImpl implements ITestSonTableService { + + @Autowired + private TestSonTableMapper testSonTableMapper; + + @Override + public List selectByMainId(String mainId) { + return testSonTableMapper.selectByMainId(mainId); + } +} diff --git a/jeecg-module-supervision/src/test/vo/TestMainTablePage.java b/jeecg-module-supervision/src/test/vo/TestMainTablePage.java new file mode 100644 index 0000000..ac9359e --- /dev/null +++ b/jeecg-module-supervision/src/test/vo/TestMainTablePage.java @@ -0,0 +1,64 @@ +package org.jeecg.modules.test.vo; + +import java.util.List; +import org.jeecg.modules.test.entity.TestMainTable; +import org.jeecg.modules.test.entity.TestSonTable; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: test + * @Author: jeecg-boot + * @Date: 2026-04-03 + * @Version: V1.0 + */ +@Data +@Schema(description="test") +public class TestMainTablePage { + + /**主键*/ + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**a字段*/ + @Excel(name = "a字段", width = 15) + @Schema(description = "a字段") + private java.lang.String fieldA; + /**b字段*/ + @Excel(name = "b字段", width = 15) + @Schema(description = "b字段") + private java.lang.String fieldB; + + @ExcelCollection(name="test") + @Schema(description = "test") + private List testSonTableList; + +} diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts b/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts new file mode 100644 index 0000000..c985263 --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts @@ -0,0 +1,71 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/test/testMainTable/list', + save='/test/testMainTable/add', + edit='/test/testMainTable/edit', + deleteOne = '/test/testMainTable/delete', + deleteBatch = '/test/testMainTable/deleteBatch', + importExcel = '/test/testMainTable/importExcel', + exportXls = '/test/testMainTable/exportXls', + testSonTableList = '/test/testMainTable/queryTestSonTableByMainId', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 查询子表数据 + * @param params + */ +export const testSonTableList = Api.testSonTableList; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts b/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts new file mode 100644 index 0000000..6306a78 --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts @@ -0,0 +1,81 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + { + title: 'a字段', + align:"center", + dataIndex: 'fieldA' + }, + { + title: 'b字段', + align:"center", + dataIndex: 'fieldB' + }, +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +]; +//表单数据 +export const formSchema: FormSchema[] = [ + { + label: 'a字段', + field: 'fieldA', + component: 'Input', + }, + { + label: 'b字段', + field: 'fieldB', + component: 'Input', + }, + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, +]; +//子表单数据 +export const testSonTableFormSchema: FormSchema[] = [ + { + label: '字段c', + field: 'fieldC', + component: 'Input', + }, + { + label: '', + field: 'id', + component: 'Input', + show: false + }, +]; +//子表表格配置 + + +// 高级查询数据 +export const superQuerySchema = { + fieldA: {title: 'a字段',order: 0,view: 'text', type: 'string',}, + fieldB: {title: 'b字段',order: 1,view: 'text', type: 'string',}, + //子表高级查询 + testSonTable: { + title: 'test', + view: 'table', + fields: { + fieldC: {title: '字段c',order: 0,view: 'text', type: 'string',}, + } + }, +}; + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ +// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} \ No newline at end of file diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue b/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue new file mode 100644 index 0000000..27991f5 --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue @@ -0,0 +1,207 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue b/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue new file mode 100644 index 0000000..0886b2c --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue @@ -0,0 +1,115 @@ + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue b/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue new file mode 100644 index 0000000..58c3627 --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue @@ -0,0 +1,144 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue b/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue new file mode 100644 index 0000000..15b1fe1 --- /dev/null +++ b/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue @@ -0,0 +1,79 @@ + + + diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 67966d2..74e3fd1 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -1,5 +1,6 @@ package org.jeecg.common.system.api; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.jeecg.common.api.CommonAPI; import org.jeecg.common.api.dto.DataLogDTO; @@ -544,4 +545,21 @@ public interface ISysBaseAPI extends CommonAPI { */ boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields); +// 新增附件 + String addSysFileAttachment(JSONObject jsonObject); + + //删除附件 + void deleteFileAttachment(String id); + + String getFilePath(String id); + + JSONArray getFileDetialById(String ids); + + JSONArray getFileInfoByBussinessId(String bussinessId, String misFlag); + + String getFilesPath(String ids); + + Map queryFileMapById(String id); + + String updateBusinessId(String businessId, List deliverablesList); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java new file mode 100644 index 0000000..2620f44 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java @@ -0,0 +1,507 @@ +package org.jeecg.modules.system.controller; + + +import cn.hutool.core.date.DateUtil; +import com.alibaba.druid.util.StringUtils; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.UnauthorizedException; +import org.apiguardian.api.API; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.*; +import org.jeecg.modules.base.service.BaseCommonService; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.lang.reflect.Array; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.*; + +/** + * @Description: 文件上传下载更新接口 + * @Author: gelingjia + * @Date:2025.9.22 + * @Version:V1.0 + */ +@Tag(name = "文件上传下载更新接口") +@RestController +@RequestMapping("/sys/file") +@Slf4j +public class FileController { + + + @Autowired + public ISysBaseAPI sysBaseAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private BaseCommonService baseCommonService; + @Value(value = "${jeecg.appName}") + private String applicationName; + + + + /** + * 附件加密上传接口 + * + * @param request + * @param response + * @return + */ + @AutoLog(value = "系统自动日志:文件加密上传") + @Operation(summary = "附件加密上传接口") + @PostMapping(value = "/upload") + public Result> upload(HttpServletRequest request, HttpServletResponse response) throws Exception { + Result> result = new Result<>(); + + // 将请求转换为 MultipartHttpServletRequest + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + + //获取登录用户信息 + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser != null) { + // 获取前端传递来的密级 + String secLevel = multipartRequest.getParameter("secretLevel"); + if (secLevel == null || secLevel.equals("")) { + result.setSuccess(false); + result.setMessage("上传附件密级为空。无法上传"); + } else { + // 获取用户密级,如果为空则提示用户先设置密级 + Integer userSecLevelObj = sysUser.getUserSecurityLevel(); + if (userSecLevelObj == null) { + result.setSuccess(false); + result.setMessage("当前用户未设置人员密级,请先在用户管理中设置人员密级后再上传文件!(密级说明:1-非密,2-内部,3-秘密,4-机密)"); + return result; + } + int userSecLevel = userSecLevelObj.intValue(); + int fileSecLevel = Integer.parseInt(secLevel); + if (userSecLevel <= fileSecLevel) { + result.setSuccess(false); + result.setMessage("上传文件密级不能高于人员密级!"); + } else { + String savePath = ""; + String bizPath = request.getParameter("biz"); + String secretLevelText =securityLevel(secLevel); + //设置上传文档的存储路径 + if (StringUtils.isEmpty(bizPath)) { + Date now = new Date(); + + bizPath = "/"+secretLevelText + "/"+ DateUtil.year(now) + "/"+ (DateUtil.month(now) + 1) + "/"+ DateUtil.dayOfMonth(now); + } + else{ + if (oConvertUtils.isNotEmpty(bizPath) && (bizPath.contains("../") || bizPath.contains("..\\"))) { + throw new JeecgBootException("上传目录bizPath,格式非法!"); + } + bizPath = "/"+secretLevelText + "/"+ bizPath; + } + MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 + savePath = MinioUtil.encryptUpload(file, bizPath);//yxk-加密上传的地方在这里 + long size = file.getSize(); + String fileNameInDB = this.getFileNameinDB(secLevel, file); + JSONObject fileJsonObject = new JSONObject(); + fileJsonObject.put("fileName", fileNameInDB); + fileJsonObject.put("filePath", savePath); + fileJsonObject.put("size", Integer.parseInt(String.valueOf(size))); + fileJsonObject.put("secretText", secretLevelText); + fileJsonObject.put("secretLevel", secLevel); + fileJsonObject.put("fileUploadType",applicationName); + fileJsonObject.put("uploadTime",new Date()); + fileJsonObject.put("uploaderWorkNo", request.getParameter("workNo")); + fileJsonObject.put("uploader",request.getParameter("username")); + fileJsonObject.put("uploadPercent",request.getParameter("uploadPercent")); + fileJsonObject.put("uploadRes",request.getParameter("uploadRes")); + fileJsonObject.put("uploadStatus",request.getParameter("uploadStatus")); + fileJsonObject.put("isUploaded",request.getParameter("isUploaded")); + // 添加 business_id 支持(可选参数,用于关联业务表单) + String businessId = request.getParameter("business_id"); + if (oConvertUtils.isNotEmpty(businessId)) { + fileJsonObject.put("businessId", businessId); + } + if(fileNameInDB.lastIndexOf(".")>-1){ + fileJsonObject.put("fileSuffix",fileNameInDB.substring(fileNameInDB.lastIndexOf("."))); + } + String fileId = sysBaseAPI.addSysFileAttachment(fileJsonObject); + if (oConvertUtils.isNotEmpty(savePath)) { + HashMap res = new HashMap(); + res.put("savePath",savePath); + res.put("fileId",fileId); + res.put("fileUploadType",applicationName); + result.setResult(res); + result.setMessage(savePath); + result.setSuccess(true); + baseCommonService.addLog("附件加密上传:" + savePath, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2); + } else { + result.setMessage("上传失败!"); + result.setSuccess(false); + } + } + + } + } else { + result.setSuccess(false); + result.setMessage("当前用户失效,上传失败。请重新登录"); + } + return result; + } + + @AutoLog(value = "系统自动日志:文件删除") + @Operation(summary = "文件删除接口") + @GetMapping(value = "/delete") + public Result delete(@RequestParam String id){ + sysBaseAPI.deleteFileAttachment(id); + return Result.OK(); + } + + + /** + * 文件解密下载接口 + * 下载文件 + * + * @param fileUrl + * @param request + * @param response + * @return + */ + @AutoLog(value = "系统自动日志:文件解密下载") + @Operation(summary = "附件下载接口") + + @GetMapping(value = "/download") + public void download(@RequestParam String fileUrl, HttpServletRequest request, HttpServletResponse response) throws Exception { + boolean flag = TokenUtils.verifyToken(request, sysBaseAPI, redisUtil); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (flag) { + if (sysUser != null) { + String bucketName = MinioUtil.getBucketName(); + String objectName = fileUrl; + String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); + InputStream inputStream = MinioUtil.getMinioFile(bucketName, objectName); + //文件流解密 + byte[] fileBytes = IOUtils.toByteArray(inputStream); + byte[] decryptedBytes = SecureUtils.decrypt(fileBytes); + + //response.setContentType("application/force-download"); + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", "attachment;fileName=\"" + fileName + "\""); + //IOUtils.copy(inputStream,response.getOutputStream()); + baseCommonService.addLog("文件解密下载:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2); + response.getOutputStream().write(decryptedBytes); + response.flushBuffer(); + + + } else { + //"当前用户失效,下载失败。请重新登录 + baseCommonService.addLog("当前用户失效,下载失败。无法查看文件:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2, sysUser); + throw new UnauthorizedException("当前用户失效,下载失败。请重新登录"); + } + } else { + //"token 校验是被 + baseCommonService.addLog("token 校验失败。无法查看文件:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2, sysUser); + throw new UnauthorizedException("token 校验失败"); + } + } + +// @Operation(summary = "文件预览临时方案") +// @GetMapping(value = "/view") +// public Result downloadForView(@RequestParam String fileUrl, HttpServletRequest request, HttpServletResponse response) throws Exception { +// String bucketName = MinioUtil.getBucketName(); +// String minioUrl = MinioUtil.getMinioUrl(); +// String objectName = fileUrl; +// if(!objectName.startsWith("/")){ +// objectName = "/" + objectName; +// } +// int dotIndex = objectName.lastIndexOf("."); +// String extension = (dotIndex == -1) ? "" : objectName.substring(dotIndex); +// String nameWithoutExtension = (dotIndex == -1) ? objectName : objectName.substring(0, dotIndex); +// String time = MinioUtil.getLastModifiedTime(objectName); +// String newFileName = "/temp" + nameWithoutExtension + time + extension; +// String checkFileExistence = MinioUtil.checkFileExistence(newFileName); +// log.info("查询缓存路径:" + checkFileExistence); +// if ("0".equals(checkFileExistence)) { +// InputStream inputStream = MinioUtil.getMinioFile(bucketName, objectName); +// //文件流解密 +// byte[] fileBytes = IOUtils.toByteArray(inputStream); +// byte[] decryptedBytes = SecureUtils.decrypt(fileBytes); +// InputStream inputStream2 = new ByteArrayInputStream(decryptedBytes); +// String resPath = MinioUtil.upload(inputStream2, newFileName); +// if(!resPath.startsWith("/")){ +// minioUrl = "/" + minioUrl; +// } +// resPath=minioUrl + bucketName + resPath; +// log.info("得到新缓存路径:" + resPath); +// return Result.OK(resPath); +// } else { +// log.info("返回已有缓存路径:" + checkFileExistence); +// return Result.OK(checkFileExistence); +// } +// +// +// } + + /** + * 通过附件id查询附件路径 + * + * @param id + * @return + */ + + @Operation(summary = "通过附件id查询附件路径") + @GetMapping(value = "/getFilePathById") + public Result getFileById(@RequestParam(name = "id") String id, HttpServletRequest request, HttpServletResponse response) { + Result result = new Result(); + try { + String filePath = this.sysBaseAPI.getFilePath(id); + result.setResult(filePath); + } catch (Exception e) { + return result.error500("系统错误!"); + } + return result; + } + + /** + * 通过附件ids查询多个附件路径 + * + * @param ids + * @return + */ + + @Operation(summary = "通过附件ids查询多个附件路径") + @GetMapping(value = "/getFilePathByIds") + public Result getFileByIds(@RequestParam(name = "ids") String ids, HttpServletRequest request, HttpServletResponse response) { + Result result = new Result(); + try { + String filePath = this.sysBaseAPI.getFilesPath(ids); + result.setResult(filePath); + } catch (Exception e) { + return result.error500("系统错误!"); + } + return result; + } + + /** + * 通过附件id获取附件信息 + * @param id + * @return + */ + + + @Operation(summary = "通过附件id获取附件信息") + @RequestMapping(value = "/file/getFileDetailById", method = RequestMethod.GET) + public Result> getFileDetailById(@RequestParam(required = true) String id, HttpServletRequest request, HttpServletResponse response) { + Result result = new Result(); + try { + Map res = this.sysBaseAPI.queryFileMapById(id); + result.setResult(res); + } catch (Exception e) { + return result.error500("系统错误!"); + } + return result; + } + + + /** + * 通过附件ids获取(多)附件信息 + * @param ids + * @return + */ + + + @Operation(summary = "通过附件ids获取(多)附件信息") + @RequestMapping(value = "/file/getFileDetailByIds", method = RequestMethod.GET) + public Result getFileDetailByIds(@RequestParam(required = true) String ids, HttpServletRequest request, HttpServletResponse response) { + String[] idArray = ids.split(","); + if (idArray.length == 0) { + return Result.OK(); + } + JSONArray jsonArray = this.sysBaseAPI.getFileDetialById(ids); + return Result.OK(jsonArray); + } + + + /** + * 公文系统文件下载接口 + * 下载文件 + * 请求地址:http://localhost:8080/officialdoc/file/{http://192.168.137.200:9000/official-doc/项目策划-质量保证大纲(生产部门使用)_1722237648135.pdf} + * + * @param fileUrl + * @param request + * @param response + * @return + */ +// @AutoLog(value = "系统自动日志:在线编辑解密下载文件") +// @Operation(summary = "在线编辑解密下载文件") +// @ApiImplicitParams({ +// @ApiImplicitParam(name = "fileUrl", value = "fileUrl", required = false, dataType = "string", paramType = "body") +// }) +// @GetMapping(value = "/downloadOnlineEdit") +// public void downloadOnlineEdit(@RequestParam(required = true) String fileUrl, HttpServletRequest request, HttpServletResponse response) throws Exception { +// boolean flag = TokenUtils.verifyToken(request, sysBaseAPI, redisUtil); +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// if (flag) { +// if (sysUser != null) { +// +// String bucketName = MinioUtil.getBucketName(); +// String objectName = fileUrl; +// String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); +// InputStream inputStream = MinioUtil.getMinioFile(bucketName, objectName); +// response.reset(); +// response.setContentType("application/force-download"); +// response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName)); +// ServletOutputStream outputStream = response.getOutputStream(); +// byte[] fileBytes = IOUtils.toByteArray(inputStream); +// byte[] decryptedBytes = SecureUtils.decrypt(fileBytes); +// outputStream.write(decryptedBytes); +// baseCommonService.addLog("文件在线编辑解密下载:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2); +// inputStream.close(); +// +// +// +// } else { +// //"当前用户失效,下载失败。请重新登录 +// baseCommonService.addLog("当前用户失效,下载失败。无法查看文件:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2, "失败"); +// throw new UnauthorizedException("当前用户失效,下载失败。请重新登录"); +// } +// +// } else { +// //"token 校验是被 +// baseCommonService.addLog("token 校验失败。无法查看文件:" + fileUrl, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2, "失败"); +// throw new UnauthorizedException("token 校验失败"); +// } +// } + + @AutoLog(value = "系统自动日志:更新文件") + @Operation(summary = "更新文件") + @PostMapping(value = "/upload/update") + public Result uploadUpdate(@RequestParam(required = true) String fileUrl, HttpServletRequest request, HttpServletResponse response) { + Result result = new Result<>(); + String savePath = ""; + fileUrl = URLDecoder.decode(fileUrl); + log.info("更新路径:" + fileUrl); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 + savePath = MinioUtil.uploadUpdate(file, fileUrl, null); + + if (oConvertUtils.isNotEmpty(savePath)) { + result.setMessage(savePath); + baseCommonService.addLog("更新保存文件:" + savePath, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2); + result.setSuccess(true); + } else { + result.setMessage("上传失败!"); + baseCommonService.addLog("上传失败:", CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_2); + result.setSuccess(false); + } + return result; + } + + + /** + * 更新文件信息 + * + * + * @return + */ + @AutoLog(value = "更新文件信息") + @Operation(summary = "更新文件信息") + @GetMapping(value = "/updateFilesInfo") + public Result updateFilesInfo(HttpServletRequest request, HttpServletResponse response) { + Result result = new Result<>(); + String bussinessId = request.getParameter("bussinessId"); + String fileIds = request.getParameter("fileIds"); + List deliverablesList = Arrays.asList(fileIds.split(",")); + this.sysBaseAPI.updateBusinessId(bussinessId,deliverablesList); + return Result.OK("更新文件信息!"); + } + + + /** + * 通过附件BussinessId获取附件信息 + * @param bussinessId + * @return + */ + + @Operation(summary = "通过附件BussinessId获取附件信息") + @RequestMapping(value = "/getFileInfoByBussinessId", method = RequestMethod.GET) + public Result getFileInfoByBussinessId(@RequestParam(required = true) String bussinessId, + HttpServletRequest request, HttpServletResponse response) { +// String misFlag = request.getParameter("misFlag"); + String misFlag = "false"; + JSONArray jsonArray = this.sysBaseAPI.getFileInfoByBussinessId(bussinessId, misFlag); + return Result.OK(jsonArray); + } + + + + + private String securityLevel(String secLevel) { + if ("1".equals(secLevel)) { + return "非密"; + } else if ("2".equals(secLevel)) { + return "内部"; + } else if ("3".equals(secLevel)) { + return "秘密"; + } else if ("4".equals(secLevel)) { + return "机密"; + } else return null; + } + + /** + * 获取存储到数据库的文件名 + * + * @param secLevel 文件密级 + * @param file 上传的文件 + * @return 原始文件名 + */ + @NotNull + private String getFileNameinDB(String secLevel, MultipartFile file) { + String orgName = file.getOriginalFilename();// 获取文件名 + assert orgName != null; + String fileNameInDB = CommonUtils.getFileName(orgName); + String pre =null ; + String suffix = null ; + String secLevelText =null ; + + if(fileNameInDB.indexOf(".") == -1){ + pre = fileNameInDB; + suffix = ""; + } + else { + pre = fileNameInDB.substring(0, fileNameInDB.lastIndexOf(".")); + suffix = fileNameInDB.substring(fileNameInDB.lastIndexOf(".")); + } + if (org.apache.commons.lang3.StringUtils.isNotEmpty(secLevel)) { + //拼接文件名 + if ("1".equals(secLevel)) { + secLevelText="(非密)" ; + } else if ("2".equals(secLevel)) { + secLevelText="(内部)"; + } else if ("3".equals(secLevel)) { + secLevelText="(M)"; + } else if ("4".equals(secLevel)) { + secLevelText="(J)"; + } else { + secLevelText=""; + }; + + } + return pre+secLevelText+suffix; + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index 5e1b123..01266d5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -2,7 +2,8 @@ package org.jeecg.modules.system.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; @@ -11,16 +12,15 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.RedisUtil; -import org.jeecg.common.util.YouBianCodeUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserDepart; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.service.ISysDepartService; @@ -56,6 +56,7 @@ import java.util.*; @RestController @RequestMapping("/sys/sysDepart") @Slf4j +@Tag(name = "部门管理模块", description = "处理用户与角色、部门的关系") // 1. 分类 public class SysDepartController { @Autowired @@ -174,6 +175,50 @@ public class SysDepartController { } } + /** + * 获取某个用户的所有所在部门的id和部门名 + * + * @param userName 根据userName查所在部门 + */ + @GetMapping("/queryAffiliatedDepts") + @Operation(summary = "根据角色username,查询所在部门", description = "根据角色username,查询所在部门") // 2. 接口描述 + public Result> queryAffiliatedDepts( + @RequestParam(name = "userName", required = false) String userName) { + try { + // 2. 使用 Optional 处理空逻辑,代码更具现代感 + List departList = Optional.ofNullable(userName) + .filter(oConvertUtils::isNotEmpty) + .map(sysDepartService::queryUserAffiliatedDepts) + .orElse(Collections.emptyList()); // 3. 没数据返回只读空列表,性能更好 + return Result.OK(departList); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + /** + * 根据departType查询所有二级部门部门 + * + * @param departType 根据departType查询部门 + */ + @GetMapping("/querySecondLevelDepts") + @Operation(summary = "根据部门类别查询第二层级的部门", description = "根据部门类别查询第二层级的部门") // 2. 接口描述 + public Result> querySecondLevelDepts( + @RequestParam(name = "departType", required = false) Integer departType) { + try { + // 2. 使用 Optional 处理空逻辑,代码更具现代感 + List departList = Optional.ofNullable(departType) + .filter(oConvertUtils::isNotEmpty) + .map(sysDepartService::querySecondLevelDepts) + .orElse(Collections.emptyList()); // 3. 没数据返回只读空列表,性能更好 + return Result.OK(departList); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + /** * 添加新数据 添加用户新建的部门对象数据,并保存到数据库 * diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFileAttachmentController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFileAttachmentController.java new file mode 100644 index 0000000..781e43c --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFileAttachmentController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.system.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysFileAttachment; +import org.jeecg.modules.system.service.ISysFileAttachmentService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: sys_file_attachment + * @Author: jeecg-boot + * @Date: 2026-03-26 + * @Version: V1.0 + */ +@Tag(name="sys_file_attachment") +@RestController +@RequestMapping("/system/sysFileAttachment") +@Slf4j +public class SysFileAttachmentController extends JeecgController { + @Autowired + private ISysFileAttachmentService sysFileAttachmentService; + + /** + * 分页列表查询 + * + * @param sysFileAttachment + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "sys_file_attachment-分页列表查询") + @Operation(summary="sys_file_attachment-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(SysFileAttachment sysFileAttachment, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysFileAttachment, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysFileAttachmentService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysFileAttachment + * @return + */ + @AutoLog(value = "sys_file_attachment-添加") + @Operation(summary="sys_file_attachment-添加") + @RequiresPermissions("system:sys_file_attachment:add") + @PostMapping(value = "/add") + public Result add(@RequestBody SysFileAttachment sysFileAttachment) { + sysFileAttachmentService.save(sysFileAttachment); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysFileAttachment + * @return + */ + @AutoLog(value = "sys_file_attachment-编辑") + @Operation(summary="sys_file_attachment-编辑") + @RequiresPermissions("system:sys_file_attachment:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody SysFileAttachment sysFileAttachment) { + sysFileAttachmentService.updateById(sysFileAttachment); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "sys_file_attachment-通过id删除") + @Operation(summary="sys_file_attachment-通过id删除") + @RequiresPermissions("system:sys_file_attachment:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + sysFileAttachmentService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "sys_file_attachment-批量删除") + @Operation(summary="sys_file_attachment-批量删除") + @RequiresPermissions("system:sys_file_attachment:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.sysFileAttachmentService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "sys_file_attachment-通过id查询") + @Operation(summary="sys_file_attachment-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + SysFileAttachment sysFileAttachment = sysFileAttachmentService.getById(id); + if(sysFileAttachment==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(sysFileAttachment); + } + + /** + * 导出excel + * + * @param request + * @param sysFileAttachment + */ + @RequiresPermissions("system:sys_file_attachment:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysFileAttachment sysFileAttachment) { + return super.exportXls(request, sysFileAttachment, SysFileAttachment.class, "sys_file_attachment"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("system:sys_file_attachment:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysFileAttachment.class); + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java index 21c92af..a9fd4f8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java @@ -3,30 +3,29 @@ package org.jeecg.modules.system.controller; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.base.BaseMap; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.FlowEventTypeConst; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.modules.redis.client.JeecgRedisClient; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.base.service.BaseCommonService; +import org.jeecg.modules.system.dto.UserDeptSaveDTO; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.model.TreeModel; import org.jeecg.modules.system.service.*; @@ -69,28 +68,29 @@ import lombok.extern.slf4j.Slf4j; @RestController @RequestMapping("/sys/role") @Slf4j +@Tag(name = "角色管理模块", description = "处理用户与角色、部门的关系") // 1. 分类 public class SysRoleController { @Autowired private ISysRoleService sysRoleService; - + @Autowired private ISysPermissionDataRuleService sysPermissionDataRuleService; - + @Autowired private ISysRolePermissionService sysRolePermissionService; - + @Autowired private ISysPermissionService sysPermissionService; - @Autowired - private ISysUserRoleService sysUserRoleService; + @Autowired + private ISysUserRoleService sysUserRoleService; @Autowired private BaseCommonService baseCommonService; @Autowired private JeecgRedisClient jeecgRedisClient; - + /** - * 分页列表查询 【系统角色,不做租户隔离】 + * 分页列表查询 【系统角色,不做租户隔离】 * @param role * @param pageNo * @param pageSize @@ -100,15 +100,15 @@ public class SysRoleController { @RequiresPermissions("system:role:list") @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> queryPageList(SysRole role, - @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, - @RequestParam(name="isMultiTranslate", required = false) Boolean isMultiTranslate, - HttpServletRequest req) { - //update-begin---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对--- - if(null != isMultiTranslate && isMultiTranslate){ - pageSize = 100; - } - //update-end---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对--- + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + @RequestParam(name="isMultiTranslate", required = false) Boolean isMultiTranslate, + HttpServletRequest req) { + //update-begin---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对--- + if(null != isMultiTranslate && isMultiTranslate){ + pageSize = 100; + } + //update-end---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对--- Result> result = new Result>(); //QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap()); //IPage pageList = sysRoleService.page(page, queryWrapper); @@ -119,7 +119,7 @@ public class SysRoleController { result.setResult(pageList); return result; } - + /** * 分页列表查询【租户角色,做租户隔离】 * @param role @@ -130,15 +130,15 @@ public class SysRoleController { */ @RequestMapping(value = "/listByTenant", method = RequestMethod.GET) public Result> listByTenant(SysRole role, - @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, - HttpServletRequest req) { + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { Result> result = new Result>(); //此接口必须通过租户来隔离查询 if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { role.setTenantId(oConvertUtils.getInt(!"0".equals(TenantContext.getTenant()) ? TenantContext.getTenant() : "", -1)); } - + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap()); Page page = new Page(pageNo, pageSize); IPage pageList = sysRoleService.page(page, queryWrapper); @@ -146,21 +146,21 @@ public class SysRoleController { result.setResult(pageList); return result; } - + /** - * 添加 + * 添加 * @param role * @return */ @RequestMapping(value = "/add", method = RequestMethod.POST) - @RequiresPermissions("system:role:add") + @RequiresPermissions("system:role:add") public Result add(@RequestBody SysRole role) { Result result = new Result(); try { //开启多租户隔离,角色id自动生成10位 //update-begin---author:wangshuai---date:2024-05-23---for:【TV360X-42】角色新增时设置的编码,保存后不一致--- if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && oConvertUtils.isEmpty(role.getRoleCode())){ - //update-end---author:wangshuai---date:2024-05-23---for:【TV360X-42】角色新增时设置的编码,保存后不一致--- + //update-end---author:wangshuai---date:2024-05-23---for:【TV360X-42】角色新增时设置的编码,保存后不一致--- role.setRoleCode(RandomUtil.randomString(10)); } role.setCreateTime(new Date()); @@ -172,13 +172,13 @@ public class SysRoleController { } return result; } - + /** - * 编辑 + * 编辑 * @param role * @return */ - @RequiresPermissions("system:role:edit") + @RequiresPermissions("system:role:edit") @RequestMapping(value = "/edit",method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody SysRole role) { Result result = new Result(); @@ -201,7 +201,7 @@ public class SysRoleController { } } //------------------------------------------------------------------ - + boolean ok = sysRoleService.updateById(role); if(ok) { result.success("修改成功!"); @@ -209,17 +209,42 @@ public class SysRoleController { } return result; } - + /** - * 通过id删除 + * 编辑 + * @param userDeptSaveDTO + * @return + */ + @Operation(summary = "根据用户id,角色id更新部门id", description = "根据用户id,角色id更新部门id") // 2. 接口描述 + @RequestMapping(value = "/saveDeptsForUser", method = {RequestMethod.PUT, RequestMethod.POST}) + public Result saveDeptsForUser(@Valid @RequestBody UserDeptSaveDTO userDeptSaveDTO) { + // 1. 调用 Service 层,获取执行结果(通常 Service 返回 boolean) + boolean isSuccess = sysRoleService.saveDeptForRoleUser( + userDeptSaveDTO.getUserId(), + userDeptSaveDTO.getRoleId(), + userDeptSaveDTO.getDeptIds() + ); + + // 2. 根据结果返回对应的 Result 对象 + if (isSuccess) { + // 使用静态方法(假设你的 Result 类支持,这是最常见的做法) + return Result.ok("修改成功!"); + } else { + // 如果失败,返回错误状态,而不是 null + return Result.error("修改失败,请稍后重试"); + } + } + + /** + * 通过id删除 * @param id * @return */ - @RequiresPermissions("system:role:delete") + @RequiresPermissions("system:role:delete") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) public Result delete(@RequestParam(name="id",required=true) String id) { - //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 - if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ + //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 + if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ //获取当前用户 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); @@ -230,25 +255,23 @@ public class SysRoleController { return Result.error("删除角色失败,当前角色不在此租户中。"); } } - + //update-begin---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】禁止删除 admin 角色--- //是否存在admin角色 sysRoleService.checkAdminRoleRejectDel(id); //update-end---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】禁止删除 admin 角色--- - + sysRoleService.deleteRole(id); - // 角色删除,触发同步工作流 - this.throwSynchronizationProcessSignal(id); return Result.ok("删除角色成功"); } - + /** - * 批量删除 + * 批量删除 * @param ids * @return */ - @RequiresPermissions("system:role:deleteBatch") + @RequiresPermissions("system:role:deleteBatch") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { baseCommonService.addLog("删除角色操作,角色ids:" + ids, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_4); @@ -274,15 +297,13 @@ public class SysRoleController { //验证是否为admin角色 sysRoleService.checkAdminRoleRejectDel(ids); sysRoleService.deleteBatchRole(ids.split(",")); - // 角色删除,触发同步工作流 - this.throwSynchronizationProcessSignal(ids); result.success("删除角色成功!"); } return result; } - + /** - * 通过id查询 + * 通过id查询 * @param id * @return */ @@ -301,7 +322,7 @@ public class SysRoleController { /** * 查询全部角色(参与租户隔离) - * + * * @return */ @RequestMapping(value = "/queryall", method = RequestMethod.GET) @@ -343,14 +364,14 @@ public class SysRoleController { } return result; } - + /** - * 校验角色编码唯一 + * 校验角色编码唯一 */ @RequestMapping(value = "/checkRoleCode", method = RequestMethod.GET) public Result checkUsername(String id,String roleCode) { Result result = new Result<>(); - //如果此参数为false则程序发生异常 + //如果此参数为false则程序发生异常 result.setResult(true); log.info("--验证角色编码是否唯一---id:"+id+"--roleCode:"+roleCode); try { @@ -396,7 +417,7 @@ public class SysRoleController { sysRole.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0)); } //------------------------------------------------------------------------------------------------ - + // Step.1 组装查询条件 QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysRole, request.getParameterMap()); //Step.2 AutoPoi 导出Excel @@ -422,7 +443,7 @@ public class SysRoleController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - // 获取上传文件对象 + // 获取上传文件对象 MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); @@ -443,7 +464,7 @@ public class SysRoleController { } return Result.error("文件导入失败!"); } - + /** * 查询数据规则数据 */ @@ -472,7 +493,7 @@ public class SysRoleController { //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key } } - + /** * 保存数据规则至角色菜单关联表 */ @@ -499,8 +520,8 @@ public class SysRoleController { } return Result.ok("保存成功!"); } - - + + /** * 用户角色授权功能,查询菜单权限树 * @param request @@ -522,9 +543,9 @@ public class SysRoleController { List treeList = new ArrayList<>(); getTreeModelList(treeList, list, null); Map resMap = new HashMap(5); - //全部树节点数据 + //全部树节点数据 resMap.put("treeList", treeList); - //全部树ids + //全部树ids resMap.put("ids", ids); result.setResult(resMap); result.setSuccess(true); @@ -533,7 +554,7 @@ public class SysRoleController { } return result; } - + private void getTreeModelList(List treeList,List metaList,TreeModel temp) { for (SysPermission permission : metaList) { String tempPid = permission.getParentId(); @@ -549,19 +570,110 @@ public class SysRoleController { getTreeModelList(treeList, metaList, tree); } } - + } } - /** - * TODO 权限未完成(明道云接口,租户应用) - * 分页获取全部角色列表(包含每个角色的数量) - * @return - */ - @RequestMapping(value = "/queryPageRoleCount", method = RequestMethod.GET) - public Result> queryPageRoleCount(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { - Result> result = new Result<>(); + /** + * 根据指定的权限IDs,查询其下所有子孙节点并构建树 + */ + @RequestMapping(value = "/queryTreeListByIds", method = RequestMethod.GET) + @Operation(summary = "根据指定的部门id,返回其下属所有的syspermession", description = "根据指定的部门id,返回其下属所有的syspermession") + public Result> queryTreeList(@RequestParam(name = "ids") String idsStr) { + Result> result = new Result<>(); + try { + // 1. 获取所有原始数据 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); + query.orderByAsc(SysPermission::getSortNo); + List allList = sysPermissionService.list(query); + + // 2. 准备初始 ID 集合(假设传入逗号分隔的字符串) + List startIds = Arrays.asList(idsStr.split(",")); + + // 3. 筛选出目标范围:初始节点 + 它们的所有子孙 + List filteredList = new ArrayList<>(); + Set addedIds = new HashSet<>(); // 用于去重 + + for (SysPermission p : allList) { + if (startIds.contains(p.getId())) { + filteredList.add(p); + addedIds.add(p.getId()); + // 递归寻找当前节点的所有后代 + getChildrenSysPermission(p.getId(), allList, filteredList); + } + } + + // 4. 统计最终范围内所有的 ID(用于前端勾选等场景) + List finalIds = filteredList.stream().map(SysPermission::getId).collect(Collectors.toList()); + + // 5. 构建树形结构 + List treeList = new ArrayList<>(); + // 注意:这里的 startIds 用于告诉构建函数,谁是这棵“局部树”的根 + getTreeModelListByScope(treeList, filteredList, null, startIds); + + Map resMap = new HashMap<>(5); + resMap.put("treeList", treeList); + resMap.put("ids", finalIds); + + result.setResult(resMap); + result.setSuccess(true); + } catch (Exception e) { + log.error(e.getMessage(), e); + result.error500("查询失败"); + } + return result; + } + + /** + * 递归构建树模型(适配局部搜索) + */ + private void getTreeModelListByScope(List treeList, List metaList, TreeModel temp, List startIds) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(), permission.getRuleFlag(), permission.isLeaf()); + + if (temp == null) { + // 如果当前没有父节点,且该节点属于我们指定的初始起始点,则它就是根 + if (startIds.contains(permission.getId())) { + treeList.add(tree); + if (!tree.getIsLeaf()) { + getTreeModelListByScope(treeList, metaList, tree, startIds); + } + } + } else { + // 如果有父节点,匹配 PID + if (Objects.equals(tempPid, temp.getKey())) { + temp.getChildren().add(tree); + if (!tree.getIsLeaf()) { + getTreeModelListByScope(treeList, metaList, tree, startIds); + } + } + } + } + } + + /** + * 递归寻找子节点(顺藤摸瓜) + */ + private void getChildrenSysPermission(String permissionId, List metaList, List filteredList) { + for (SysPermission sysPermission : metaList) { + if (Objects.equals(sysPermission.getParentId(), permissionId)) { + filteredList.add(sysPermission); + // 继续深挖 + getChildrenSysPermission(sysPermission.getId(), metaList, filteredList); + } + } + } + + /** + * 分页获取全部角色列表(包含每个角色的数量) + * @return + */ + @RequestMapping(value = "/queryPageRoleCount", method = RequestMethod.GET) + public Result> queryPageRoleCount(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { + Result> result = new Result<>(); LambdaQueryWrapper query = new LambdaQueryWrapper(); //------------------------------------------------------------------------------------------------ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 @@ -569,38 +681,27 @@ public class SysRoleController { query.eq(SysRole::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0)); } //------------------------------------------------------------------------------------------------ - Page page = new Page<>(pageNo, pageSize); - IPage pageList = sysRoleService.page(page, query); - List records = pageList.getRecords(); - IPage sysRoleCountPage = new PageDTO<>(); - List sysCountVoList = new ArrayList<>(); - //循环角色数据获取每个角色下面对应的角色数量 - for (SysRole role:records) { - LambdaQueryWrapper countQuery = new LambdaQueryWrapper<>(); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = sysRoleService.page(page, query); + List records = pageList.getRecords(); + IPage sysRoleCountPage = new PageDTO<>(); + List sysCountVoList = new ArrayList<>(); + //循环角色数据获取每个角色下面对应的角色数量 + for (SysRole role:records) { + LambdaQueryWrapper countQuery = new LambdaQueryWrapper<>(); countQuery.eq(SysUserRole::getRoleId,role.getId()); - long count = sysUserRoleService.count(countQuery); - SysUserRoleCountVo countVo = new SysUserRoleCountVo(); - BeanUtils.copyProperties(role,countVo); - countVo.setCount(count); - sysCountVoList.add(countVo); - } - sysRoleCountPage.setRecords(sysCountVoList); - sysRoleCountPage.setTotal(pageList.getTotal()); - sysRoleCountPage.setSize(pageList.getSize()); - result.setSuccess(true); - result.setResult(sysRoleCountPage); - return result; - } - - /** - * 角色删除,触发同步工作流 - * - * @param roleIds - */ - private void throwSynchronizationProcessSignal(String roleIds) { - // 触发流程同步信号事件 - BaseMap baseMap = new BaseMap(); - baseMap.put("roleIds", roleIds); - jeecgRedisClient.sendMessage(FlowEventTypeConst.DELETE_ROLE_2_BPM_REDIS_HANDLER, baseMap); + long count = sysUserRoleService.count(countQuery); + SysUserRoleCountVo countVo = new SysUserRoleCountVo(); + BeanUtils.copyProperties(role,countVo); + countVo.setCount(count); + sysCountVoList.add(countVo); + } + sysRoleCountPage.setRecords(sysCountVoList); + sysRoleCountPage.setTotal(pageList.getTotal()); + sysRoleCountPage.setSize(pageList.getSize()); + result.setSuccess(true); + result.setResult(sysRoleCountPage); + return result; } + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java index f61a316..5cd140d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java @@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; @@ -27,6 +29,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.*; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.base.service.BaseCommonService; +import org.jeecg.modules.system.dto.DeptRoleVO; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.model.SysUserSysDepartModel; @@ -34,6 +37,7 @@ import org.jeecg.modules.system.service.*; import org.jeecg.modules.system.util.ImportOldUserUtil; import org.jeecg.modules.system.vo.SysDepartUsersVO; import org.jeecg.modules.system.vo.SysUserExportVo; +import org.jeecg.modules.system.vo.SysUserRoleDeptsVo; import org.jeecg.modules.system.vo.SysUserRoleVO; import org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo; import org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo; @@ -42,6 +46,7 @@ import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jetbrains.kotlin.com.intellij.psi.SyntaxTraverser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; @@ -66,6 +71,7 @@ import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/sys/user") +@Tag(name = "用户管理模块", description = "处理用户与角色、部门的关系") // 1. 分类 public class SysUserController { @Autowired @@ -106,7 +112,8 @@ public class SysUserController { @Autowired private JeecgRedisClient jeecgRedisClient; - + + /** * 获取租户下用户数据(支持租户隔离) * @param user @@ -152,6 +159,24 @@ public class SysUserController { return sysUserService.queryPageList(req, queryWrapper, pageSize, pageNo); } + /** + * 获取系统用户数据(查询全部用户,不做租户隔离) + * + * @param user + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequiresPermissions("system:user:listAll") + @RequestMapping(value = "/listAllExcludeAdmin", method = RequestMethod.GET) + public Result> queryAllPageListExcludeAdmin(SysUser user, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap()); + queryWrapper.notLike("username", "admin"); + return sysUserService.queryPageList(req, queryWrapper, pageSize, pageNo); + } + @RequiresPermissions("system:user:add") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody JSONObject jsonObject) { @@ -260,7 +285,7 @@ public class SysUserController { baseCommonService.addLog("批量删除用户, ids: " +ids ,CommonConstant.LOG_TYPE_2, 3); List userNameList = sysUserService.userIdToUsername(Arrays.asList(ids.split(","))); this.sysUserService.deleteBatchUsers(ids); - + // 用户变更,触发同步工作流 if (!userNameList.isEmpty()) { String joinedString = String.join(",", userNameList); @@ -475,15 +500,66 @@ public class SysUserController { @RequestParam(name="realname",required=false) String realname, @RequestParam(name="username",required=false) String username, @RequestParam(name="isMultiTranslate",required=false) String isMultiTranslate, - @RequestParam(name="id",required = false) String id) { + @RequestParam(name="id",required = false) String id, + @RequestParam(name="searchSecurityLevel",required = false) Integer searchSecurityLevel + ) { //update-begin-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 String[] arr = new String[]{departId, realname, username, id}; SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK); //update-end-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 - IPage pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id,isMultiTranslate); + IPage pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id,searchSecurityLevel,isMultiTranslate); return Result.OK(pageList); } + /** + * 用户选择组件 专用 根据用户账号或部门,角色分页查询 + * @param departId + * @param username + * @return + */ + @RequestMapping(value = "/queryUserRoleComponentData", method = RequestMethod.GET) + @Operation(summary = "根据角色ID,部门ID以及用户密级查询用户列表", description = "原生用户查询逻辑加上密级筛选以及角色筛选") // 2. 接口描述 + public Result> queryUserRoleComponentData( + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + @RequestParam(name = "departId", required = false) String departId, + @RequestParam(name = "roleId", required = false) String roleId, + @RequestParam(name="realname",required=false) String realname, + @RequestParam(name="username",required=false) String username, + @RequestParam(name="isMultiTranslate",required=false) String isMultiTranslate, + @RequestParam(name="id",required = false) String id, + @RequestParam(name="searchSecurityLevel",required = false) Integer searchSecurityLevel + ) { + //update-begin-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 + String[] arr = new String[]{departId, realname, username, id}; + SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK); + //update-end-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞 + IPage pageList = sysUserDepartService.queryDepartRoleUserPageList(departId,roleId,username, realname, pageSize, pageNo,id,searchSecurityLevel,isMultiTranslate); + return Result.OK(pageList); + } + + /** + * 用户选择组件 专用 根据用户账号或部门,角色分页查询 + * @param deptRoleVO + * @return + */ + @RequestMapping(value = "/queryUserByDeptAndROle", method = RequestMethod.GET) + @Operation(summary = "根据角色ID,部门ID以及用户密级查询当前用户列表", description = "原生用户查询逻辑加上密级筛选以及角色筛选") // 2. 接口描述 + public Result> queryUserByDeptAndROle(DeptRoleVO deptRoleVO + ) { + try { + List sysUserList = sysUserService.queryUserByDeptAndROle( + deptRoleVO.getDeptId(), + deptRoleVO.getRoleId(), + deptRoleVO.getSecretLevel() + ); + return Result.ok(sysUserList); // 假设你的 Result 有 ok 方法 + } catch (Exception e) { + log.error("查询用户列表失败", e); // 记得打日志 + return Result.error("查询失败:" + e.getMessage()); // 返回错误信息 + } + } + /** * 导出excel * @@ -607,6 +683,21 @@ public class SysUserController { return result; } + @RequestMapping(value = "/userRoleListWithDepts", method = RequestMethod.GET) + public Result> userRoleListWithDepts( + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result>(); + Page page = new Page(pageNo, pageSize); + String roleId = req.getParameter("roleId"); + String username = req.getParameter("username"); + IPage pageList = sysUserService.getUserByRoleIdWithDeptIds(page,roleId,username); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** * 给指定角色添加用户 * @@ -887,7 +978,7 @@ public class SysUserController { } return result; } - + /** * 查询当前用户的所有部门/当前部门编码 * @return @@ -910,12 +1001,12 @@ public class SysUserController { return result; } - + /** * 用户注册接口 - * + * * @param jsonObject * @param user * @return @@ -978,7 +1069,7 @@ public class SysUserController { if(oConvertUtils.isEmpty(realname)){ realname = username; } - + try { user.setCreateTime(new Date());// 设置创建时间 String salt = oConvertUtils.randomGen(8); @@ -1073,7 +1164,7 @@ public class SysUserController { result.setSuccess(true); return result; } - + /** * 用户更改密码 */ @@ -1125,11 +1216,11 @@ public class SysUserController { return result; } } - + /** * 根据TOKEN获取用户的部分信息(返回的数据是可供表单设计器使用的数据) - * + * * @return */ @GetMapping("/getUserSectionInfoByToken") @@ -1140,7 +1231,7 @@ public class SysUserController { if (oConvertUtils.isEmpty(token)) { username = JwtUtil.getUserNameByToken(request); } else { - username = JwtUtil.getUsername(token); + username = JwtUtil.getUsername(token); } log.debug(" ------ 通过令牌获取部分用户信息,当前用户: " + username); @@ -1161,7 +1252,7 @@ public class SysUserController { return Result.error(500, "查询失败:" + e.getMessage()); } } - + /** * 【APP端接口】获取用户列表 根据用户名和真实名 模糊匹配 * @param keyword @@ -1198,7 +1289,7 @@ public class SysUserController { log.error(e.getMessage(), e); return Result.error(500, "查询失败:" + e.getMessage()); } - + } /** @@ -1771,7 +1862,7 @@ public class SysUserController { Integer tenantId = sysUser.getLoginTenantId(); LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); - + // 判断 指定的租户ID是不是当前登录用户的租户 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysUserTenant::getTenantId, tenantId); @@ -1780,7 +1871,7 @@ public class SysUserController { if(null == one){ return result.error500("非租户下的用户,不允许修改!"); } - + // 修改 loginTenantId LambdaQueryWrapper update = new LambdaQueryWrapper() .eq(SysUser::getId, userId); @@ -1788,7 +1879,7 @@ public class SysUserController { updateUser.setLoginTenantId(tenantId); sysUserService.update(updateUser, update); return Result.ok(); - } + } /** * 应用用户导出 @@ -1799,7 +1890,7 @@ public class SysUserController { public ModelAndView exportAppUser(HttpServletRequest request) { return sysUserService.exportAppUser(request); } - + /** * 应用用户导入 * @param request diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/DeptRoleVO.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/DeptRoleVO.java new file mode 100644 index 0000000..6df21dd --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/DeptRoleVO.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class DeptRoleVO { + @NotBlank(message = "角色id不为空") + private String roleId; + @NotBlank(message = "deptId不为空") + private String deptId; + @NotBlank(message = "secretLevel不为空") + private Integer secretLevel; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/UserDeptSaveDTO.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/UserDeptSaveDTO.java new file mode 100644 index 0000000..ebb0e04 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/UserDeptSaveDTO.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class UserDeptSaveDTO { + @NotBlank(message = "角色id不为空") + private String roleId; + @NotBlank(message = "userId不为空") + private String userId; + @NotBlank(message = "deptId不为空") + private String deptIds; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java index d585e66..2b0ffcf 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java @@ -88,6 +88,7 @@ public class SysDepart implements Serializable { @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; + /**租户ID*/ private java.lang.Integer tenantId; @@ -102,7 +103,11 @@ public class SysDepart implements Serializable { @TableField(exist = false) private String oldDirectorUserIds; //update-end---author:wangshuai ---date:20200308 for:[JTC-119]新增字段负责人ids和旧的负责人ids - + + /**部门类型(0所领导,1职能部门,2业务部门,3专项组)*/ + @Dict(dicCode = "depart_type") + private String departType; + /** * 重写equals方法 */ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFileAttachment.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFileAttachment.java new file mode 100644 index 0000000..5d00a98 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFileAttachment.java @@ -0,0 +1,132 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: sys_file_attachment + * @Author: jeecg-boot + * @Date: 2026-03-26 + * @Version: V1.0 + */ +@Data +@TableName("sys_file_attachment") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="sys_file_attachment") +public class SysFileAttachment implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**单位编码*/ + @Excel(name = "单位编码", width = 15) + @Schema(description = "单位编码") + private java.lang.String orgCode; + /**附件名称*/ + @Excel(name = "附件名称", width = 15) + @Schema(description = "附件名称") + private java.lang.String fileName; + /**密级*/ + @Excel(name = "密级", width = 15) + @Schema(description = "密级") + private java.lang.String secretLevel; + /**路径*/ + @Excel(name = "路径", width = 15) + @Schema(description = "路径") + private java.lang.String path; + /**密级名称*/ + @Excel(name = "密级名称", width = 15) + @Schema(description = "密级名称") + private java.lang.String secretText; + /**部门编码*/ + @Excel(name = "部门编码", width = 15) + @Schema(description = "部门编码") + private java.lang.String deptCode; + /**租户id*/ + @Excel(name = "租户id", width = 15) + @Schema(description = "租户id") + private java.lang.String tenantId; + /**文件大小(b)*/ + @Excel(name = "文件大小(b)", width = 15) + @Schema(description = "文件大小(b)") + private java.lang.Integer size; + /**备用字段*/ + @Excel(name = "备用字段", width = 15) + @Schema(description = "备用字段") + private java.lang.String extend; + /**备用字段2*/ + @Excel(name = "备用字段2", width = 15) + @Schema(description = "备用字段2") + private java.lang.String extend2; + /**备用字段3*/ + @Excel(name = "备用字段3", width = 15) + @Schema(description = "备用字段3") + private java.lang.String extend3; + /**备用字段4*/ + @Excel(name = "备用字段4", width = 15) + @Schema(description = "备用字段4") + private java.lang.String extend4; + /**文件id*/ + @Excel(name = "文件id", width = 15) + @Schema(description = "文件id") + private java.lang.String fileId; + /**文件后缀*/ + @Excel(name = "文件后缀", width = 15) + @Schema(description = "文件后缀") + private java.lang.String fileSuffix; + /**文件类别*/ + @Excel(name = "文件类别", width = 15) + @Schema(description = "文件类别") + private java.lang.String fileType; + /**向上名称*/ + @Excel(name = "向上名称", width = 15) + @Schema(description = "向上名称") + private java.lang.String upName; + /**文件上传类型*/ + @Excel(name = "文件上传类型", width = 15) + @Schema(description = "文件上传类型") + private java.lang.String fileUploadType; + /**关联业务表单id*/ + @Excel(name = "关联业务表单id", width = 15) + @Schema(description = "关联业务表单id") + private java.lang.String businessId; + /**删除状态(0,正常,1已删除)*/ + @TableLogic + @Dict(dicCode = "del_flag") + private String delFlag; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java index 52d03d9..4ccab62 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java @@ -2,15 +2,12 @@ package org.jeecg.modules.system.entity; import java.util.Date; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonProperty; import org.jeecg.common.aspect.annotation.Dict; import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; @@ -30,6 +27,7 @@ import lombok.experimental.Accessors; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) +@TableName("sys_user") public class SysUser implements Serializable { private static final long serialVersionUID = 1L; @@ -211,4 +209,20 @@ public class SysUser implements Serializable { */ @TableField(exist = false) private boolean izBindThird; + + /** + * 人员密级(3非密,4一般,5重要) + */ + @Excel(name = "密级", width = 15,dicCode="user_security_level") + @Dict(dicCode = "user_security_level") + private Integer userSecurityLevel; + + + /** + * 是否为专项(0非专项,1专项) + */ + @Excel(name = "人员是否专项", width = 15,dicCode="user_is_special") + @Dict(dicCode = "is_special") + private Integer isSpecial; + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java index 1998e3d..8373e0e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java @@ -39,6 +39,11 @@ public class SysUserRole implements Serializable { /**租户ID*/ private java.lang.Integer tenantId; + + /** + * 部门id + */ + private String deptId; public SysUserRole() { } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFileAttachmentMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFileAttachmentMapper.java new file mode 100644 index 0000000..871929e --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFileAttachmentMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysFileAttachment; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: sys_file_attachment + * @Author: jeecg-boot + * @Date: 2026-03-26 + * @Version: V1.0 + */ +public interface SysFileAttachmentMapper extends BaseMapper { + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java index 0eb86f9..98c1374 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java @@ -9,6 +9,8 @@ import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserDepart; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import javax.validation.constraints.NotBlank; + /** * @Description: 用户部门mapper接口 * @author: jeecg-boot @@ -40,7 +42,18 @@ public interface SysUserDepartMapper extends BaseMapper{ */ IPage queryDepartUserPageList(Page page, @Param("orgCode") String orgCode, @Param("username") String username, @Param("realname") String realname); - /** + /** + * 根据部门查询部门用户 + * @param page + * @param orgCode + * @param username + * @param realname + * @return + */ + IPage queryOneDepartUserPageList(Page page, @Param("orgCode") String orgCode, @Param("username") String username, @Param("realname") String realname); + + + /** * 获取用户信息 * @param page * @param orgCode diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java index 568e1f8..5677ee6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java @@ -6,10 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.system.entity.SysUserDepart; import org.jeecg.modules.system.model.SysUserSysDepartModel; import org.jeecg.modules.system.vo.SysUserDepVo; +import org.jeecg.modules.system.vo.SysUserRoleDeptsVo; import java.util.List; @@ -77,7 +80,16 @@ public interface SysUserMapper extends BaseMapper { * @return */ IPage getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username); - + + /** + * 根据角色Id查询带部门的用户信息 + * @param page + * @param roleId 角色id + * @param username 用户登录账户 + * @return + */ + IPage getUserByRoleIdWithDeptIds(Page page, @Param("roleId") String roleId, @Param("username") String username); + /** * 根据用户名设置部门ID * @param username @@ -91,7 +103,8 @@ public interface SysUserMapper extends BaseMapper { * @return */ public SysUser getUserByPhone(@Param("phone") String phone); - + + public List queryUserAffiliatedDepts(@Param("userName") String userName); /** * 根据邮箱查询用户信息 @@ -222,4 +235,13 @@ public interface SysUserMapper extends BaseMapper { */ @Select("select id,phone from sys_user where phone = #{phone} and username = #{username}") SysUser getUserByNameAndPhone(@Param("phone") String phone, @Param("username") String username); + + /** + * 通过部门id和角色id,密级获取用户 + * @param deptId + * @param roleId + * @parm secretLevel + * @return + */ + List queryUserByDeptAndROle( String deptId, String roleId, Integer secretLevel); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java index 81048cf..be12a99 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java @@ -3,6 +3,7 @@ package org.jeecg.modules.system.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import org.jeecg.modules.system.entity.SysUserRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -40,4 +41,9 @@ public interface SysUserRoleMapper extends BaseMapper { @Select("select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") List getRoleIdByUserName(@Param("username") String username); + @Update("UPDATE sys_user_role SET dept_id = #{deptIds} " + + "WHERE user_id = #{userId} AND role_id = #{roleId}") + int saveDeptForRoleUser(@Param("userId") String userId, + @Param("roleId") String roleId, + @Param("deptIds") String deptIds); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysFileAttachmentMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysFileAttachmentMapper.xml new file mode 100644 index 0000000..c25b1a3 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysFileAttachmentMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml index dd97aac..67cb93e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml @@ -39,6 +39,23 @@ + + - + + + + UPDATE sys_user SET @@ -298,4 +323,20 @@ and sut.tenant_id=#{tenantId} and sut.status = '1' + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java index b50832e..6c540aa 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java @@ -75,6 +75,8 @@ public class SysDepartTreeModel implements Serializable{ private Date updateTime; + private String departType; + //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids /**部门负责人ids*/ private String directorUserIds; @@ -113,6 +115,7 @@ public class SysDepartTreeModel implements Serializable{ this.updateBy = sysDepart.getUpdateBy(); this.updateTime = sysDepart.getUpdateTime(); this.directorUserIds = sysDepart.getDirectorUserIds(); + this.departType = sysDepart.getDepartType(); if(0 == sysDepart.getIzLeaf()){ this.isLeaf = false; }else{ @@ -166,6 +169,14 @@ public class SysDepartTreeModel implements Serializable{ this.id = id; } + public String getDepartType() { + return departType; + } + + public void setDepartType(String departType) { + this.departType = departType; + } + public List getChildren() { return children; } @@ -385,7 +396,8 @@ public class SysDepartTreeModel implements Serializable{ Objects.equals(updateBy, model.updateBy) && Objects.equals(updateTime, model.updateTime) && Objects.equals(directorUserIds, model.directorUserIds) && - Objects.equals(children, model.children); + Objects.equals(children, model.children) && + Objects.equals(departType, model.departType); } /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index 5944f95..912c819 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -181,6 +181,10 @@ public interface ISysDepartService extends IService{ */ List getMyDepartList(); + List queryUserAffiliatedDepts(String userName); + + List querySecondLevelDepts(Integer departType); + /** * 删除部门 * @param id diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFileAttachmentService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFileAttachmentService.java new file mode 100644 index 0000000..7d467d9 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFileAttachmentService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysFileAttachment; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: sys_file_attachment + * @Author: jeecg-boot + * @Date: 2026-03-26 + * @Version: V1.0 + */ +public interface ISysFileAttachmentService extends IService { + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java index a8c15b4..68ac266 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java @@ -61,6 +61,15 @@ public interface ISysRoleService extends IService { */ public boolean deleteBatchRole(String[] roleids); + /** + * 批量删除角色 + * @param userId + * @param roleId + * @param deptIds + * @return + */ + Boolean saveDeptForRoleUser(String userId,String roleId,String deptIds); + /** * 根据角色id和当前租户判断当前角色是否存在这个租户中 * @param id diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java index 197cd48..761e377 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java @@ -54,9 +54,24 @@ public interface ISysUserDepartService extends IService { * @param isMultiTranslate 是否多字段翻译 * @return */ - IPage queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate); + IPage queryDepartUserPageList(String departId,String username, String realname, int pageSize, int pageNo,String id,Integer userSecurityLevel,String isMultiTranslate); - /** + /** + * 用户组件数据查询 + * @param departId + * @param roleId + * @param username + * @param pageSize + * @param pageNo + * @param realname + * @param id + * @param isMultiTranslate 是否多字段翻译 + * @return + */ + IPage queryDepartRoleUserPageList(String departId, String roleId, String username, String realname, int pageSize, int pageNo,String id,Integer userSecurityLevel,String isMultiTranslate); + + + /** * 获取用户信息 * @param tenantId * @param departId diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index 36611e8..5e1b815 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java @@ -13,12 +13,15 @@ import org.jeecg.modules.system.entity.SysRoleIndex; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.SysUserSysDepartModel; import org.jeecg.modules.system.vo.SysUserExportVo; +import org.jeecg.modules.system.vo.SysUserRoleDeptsVo; +import org.jeecg.modules.system.vo.SysUserRoleVO; import org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo; import org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; +import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.Collection; import java.util.List; @@ -181,6 +184,15 @@ public interface ISysUserService extends IService { */ public IPage getUserByRoleId(Page page,String roleId, String username); + /** + * 根据角色Id查询 + * @param page + * @param roleId 角色id + * @param username 用户账户名称 + * @return + */ + public IPage getUserByRoleIdWithDeptIds(Page page, String roleId, String username); + /** * 通过用户名获取用户角色集合 * @@ -482,4 +494,6 @@ public interface ISysUserService extends IService { * @param username */ void updatePasswordNotBindPhone(String oldPassword, String password, String username); + + List queryUserByDeptAndROle(@NotBlank(message = "deptId不为空") String deptId, @NotBlank(message = "角色id不为空") String roleId, @NotBlank(message = "secretLevel不为空") Integer secretLevel); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index b1725ba..6664920 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -1,5 +1,9 @@ package org.jeecg.modules.system.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -70,6 +74,7 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.*; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Value; /** * @Description: 底层共通业务API,提供其他独立模块调用 @@ -137,6 +142,12 @@ public class SysBaseApiImpl implements ISysBaseAPI { @Autowired private IDictTableWhiteListHandler dictTableWhiteListHandler; + @Autowired + ISysFileAttachmentService sysFileAttachmentService; + + @Value(value = "${jeecg.appName}") + private String applicationName; + @Override //@SensitiveDecode public LoginUser getUserByName(String username) { @@ -1841,4 +1852,251 @@ public class SysBaseApiImpl implements ISysBaseAPI { } } + /** + * 新增附件 + * + * @param jsonObject + * @return + */ + @Override + public String addSysFileAttachment(JSONObject jsonObject) { + + SysFileAttachment fileAttachment = new SysFileAttachment(); + String filePath = jsonObject.getString("filePath"); + String fileName = jsonObject.getString("fileName"); + Integer size = jsonObject.getInteger("size"); + fileAttachment.setFileName(fileName); + fileAttachment.setPath(filePath); + fileAttachment.setSize(size); + String secretLevel = ObjectUtil.isNotEmpty(jsonObject.get("secretLevel")) ? jsonObject.getString("secretLevel") : null; + String secretText = ObjectUtil.isNotEmpty(jsonObject.get("secretText")) ? jsonObject.getString("secretText") : null; + String businessId = ObjectUtil.isNotEmpty(jsonObject.get("businessId")) ? jsonObject.getString("businessId") : null; + fileAttachment.setSecretLevel(secretLevel); + fileAttachment.setSecretText(secretText); + fileAttachment.setBusinessId(businessId); + String fileSuffix = ObjectUtil.isNotEmpty(jsonObject.get("fileSuffix")) ? jsonObject.getString("fileSuffix") : null; + String fileUploadType = ObjectUtil.isNotEmpty(jsonObject.get("fileUploadType")) ? jsonObject.getString("fileUploadType") : null; + fileAttachment.setFileSuffix(fileSuffix); + fileAttachment.setFileUploadType(fileUploadType); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysFileAttachment::getPath, filePath).eq(SysFileAttachment::getFileName, fileName); + SysFileAttachment entity = this.sysFileAttachmentService.getOne(wrapper); + if(entity==null){ + boolean b = this.sysFileAttachmentService.save(fileAttachment); + if (b) { + return fileAttachment.getId(); + } + }else{ + return entity.getId(); + } + + return null; + } + + /** + * 删除附件 + * + * @param id + * @return + */ + @Override + public void deleteFileAttachment(String id) { + if (StringUtils.isNotEmpty(id)) { + this.sysFileAttachmentService.removeById(id); + } + } + + /** + * 通过附件id查询附件 + * + * @param id + * @return + */ + @Override + public String getFilePath(String id) { + if (StringUtils.isEmpty(id)) { + return null; + } + List list = Arrays.asList(id.split(",")); + List fileAttachments = this.sysFileAttachmentService.list(new LambdaQueryWrapper() + .in(SysFileAttachment::getId, list)); + if (!CollectionUtil.isEmpty(fileAttachments)) { + List> maps = new ArrayList<>(); + for (SysFileAttachment fileAttachment : fileAttachments) { + Map map = new HashMap<>(4); + map.put("fileName", fileAttachment.getFileName()); + map.put("filePath", fileAttachment.getPath()); + map.put("secretLevel", fileAttachment.getSecretLevel()); + map.put("secretText", fileAttachment.getSecretText()); + maps.add(map); + } + JSONArray array = JSONArray.parseArray(JSON.toJSONString(maps)); + return array.toString(); + } + return null; + } + + @Override + public JSONArray getFileDetialById(String ids) { + if (StringUtils.isEmpty(ids)) { + return null; + } + List list = Arrays.asList(ids.split(",")); + List fileAttachments = this.sysFileAttachmentService.list(new LambdaQueryWrapper() + .in(SysFileAttachment::getId, list)); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + Integer userSecretLevel = sysUser.getUserSecurityLevel(); + + if (!CollectionUtil.isEmpty(fileAttachments)) { + List> maps = new ArrayList<>(); + for (SysFileAttachment fileAttachment : fileAttachments) { + Map map = new HashMap<>(6); + + map.put("filePath", fileAttachment.getPath()); + map.put("fileName", fileAttachment.getFileName()); + map.put("secretLevel", fileAttachment.getSecretLevel() == null ? "0" : fileAttachment.getSecretLevel()); + map.put("secretText", fileAttachment.getSecretText()); + map.put("size", fileAttachment.getSize()); + map.put("id", fileAttachment.getId()); + map.put("fileSuffix", fileAttachment.getFileSuffix()); + map.put("fileUploadType", fileAttachment.getFileUploadType()); + map.put("createTime", DateUtil.format(fileAttachment.getCreateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("updateTIme", DateUtil.format(fileAttachment.getUpdateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("createBy", fileAttachment.getCreateBy()); + map.put("updateBy", fileAttachment.getUpdateBy()); + if (Integer.parseInt(map.get("secretLevel").toString()) < userSecretLevel) { + maps.add(map); + } + } + return JSONArray.parseArray(JSON.toJSONString(maps)); + } + return null; + } + + + @Override + public JSONArray getFileInfoByBussinessId(String bussinessId, String misFlag) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysFileAttachment::getBusinessId, bussinessId); + if(misFlag.equals("true")){ + queryWrapper.eq(SysFileAttachment::getFileUploadType,"Mis"); + }else{ + queryWrapper.eq(SysFileAttachment::getFileUploadType,applicationName); + } + + List fileAttachments = this.sysFileAttachmentService.list(queryWrapper); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + Integer userSecretLevel = sysUser.getUserSecurityLevel(); + + if (!CollectionUtil.isEmpty(fileAttachments)) { + List> maps = new ArrayList<>(); + for (SysFileAttachment fileAttachment : fileAttachments) { + Map map = new HashMap<>(6); + + map.put("filePath", fileAttachment.getPath()); + map.put("fileUrl", fileAttachment.getPath()); + map.put("fileName", fileAttachment.getFileName()); + map.put("secretLevel", fileAttachment.getSecretLevel() == null ? "0" : fileAttachment.getSecretLevel()); + map.put("secretText", fileAttachment.getSecretText()); + map.put("size", fileAttachment.getSize()); + map.put("id", fileAttachment.getId()); + map.put("fileSuffix", fileAttachment.getFileSuffix()); + map.put("fileUploadType", fileAttachment.getFileUploadType()); + map.put("createTime", DateUtil.format(fileAttachment.getCreateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("updateTIme", DateUtil.format(fileAttachment.getUpdateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("createBy", fileAttachment.getCreateBy()); + map.put("updateBy", fileAttachment.getUpdateBy()); + if (Integer.parseInt(map.get("secretLevel").toString()) < userSecretLevel) { + maps.add(map); + } + } + return JSONArray.parseArray(JSON.toJSONString(maps)); + } + return null; + } + + /** + * 通过附件id查询附件 + * + * @param ids + * @return + */ + @Override + public String getFilesPath(String ids) { + if (StringUtils.isEmpty(ids)) { + return null; + } + List list = Arrays.asList(ids.split(",")); + List fileAttachments = this.sysFileAttachmentService.list(new LambdaQueryWrapper() + .in(SysFileAttachment::getId, list)); + if (!CollectionUtil.isEmpty(fileAttachments)) { + StringBuilder sb = new StringBuilder(); + for (SysFileAttachment fileAttachment : fileAttachments) { + sb.append(fileAttachment.getPath()).append(","); + } + return sb.toString(); + } + return null; + } + + + /** + * 根据文件id查询文件对象 + * + * @param id + * @return + */ + @Override + public Map queryFileMapById(String id) { + Map map = new HashMap<>(); + SysFileAttachment fileAttachment = this.sysFileAttachmentService.getById(id); + if (ObjectUtil.isNotEmpty(fileAttachment)) { + map.put("fileName", fileAttachment.getFileName()); + map.put("id", fileAttachment.getId()); + map.put("filePath", fileAttachment.getPath()); + map.put("secretLevel", fileAttachment.getSecretLevel()); + map.put("secretText", fileAttachment.getSecretText()); + map.put("fileSuffix", fileAttachment.getFileSuffix()); + map.put("fileUploadType", fileAttachment.getFileUploadType()); + map.put("createTime", DateUtil.format(fileAttachment.getCreateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("updateTIme", DateUtil.format(fileAttachment.getUpdateTime(), DatePattern.NORM_DATETIME_FORMAT)); + map.put("createBy", fileAttachment.getCreateBy()); + map.put("updateBy", fileAttachment.getUpdateBy()); + return map; + } + return null; + } + + /** + * 通过fileId更新所有附件的bussinessId + * + * @param businessId + * @return + * @author ywy + */ + @Override + public String updateBusinessId(String businessId, List deliverablesList){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysFileAttachment::getBusinessId, businessId); + queryWrapper.eq(SysFileAttachment::getFileUploadType,applicationName); + List list = this.sysFileAttachmentService.list(queryWrapper); + for(SysFileAttachment file: list) { + file.setExtend(file.getBusinessId()); + file.setBusinessId(""); + this.sysFileAttachmentService.updateById(file); + } + for(String fileId: deliverablesList){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysFileAttachment::getId, fileId); + SysFileAttachment one = this.sysFileAttachmentService.getOne(wrapper); + if(one!=null){ + one.setBusinessId(businessId); + this.sysFileAttachmentService.updateById(one); + } + + } + return ""; + } + } \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index 4445619..dc962f5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -884,6 +884,37 @@ public class SysDepartServiceImpl extends ServiceImpl queryUserAffiliatedDepts(String userName){ + return this.sysUserMapper.queryUserAffiliatedDepts(userName); + } + + public interface OrgCategoryConstant { + String COMPANY = "1"; + String ORGANIZATION = "2"; + String POSITION = "3"; // 岗位 + } + + public interface OrgTypeConstant { + String FIRST_LEVEL_DEPT = "1"; + String SECOND_LEVEL_DEPT = "2"; + } + + @Override + public List querySecondLevelDepts(Integer departType) { + return this.lambdaQuery() + // 2. 状态:建议直接使用常量 + .eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0) + // 3. 核心条件 + .eq(SysDepart::getDepartType, departType) + .eq(SysDepart::getOrgType,OrgTypeConstant.SECOND_LEVEL_DEPT) + // 4. 使用常量替代魔法数字,且保持类型一致(String) + .ne(SysDepart::getOrgCategory, OrgCategoryConstant.POSITION) + // 5. 排序(树形结构通常需要排序) + .orderByAsc(SysDepart::getDepartOrder) + .list(); + } + @Override public void deleteDepart(String id) { //删除部门设置父级的叶子结点 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFileAttachmentServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFileAttachmentServiceImpl.java new file mode 100644 index 0000000..52414e7 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFileAttachmentServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysFileAttachment; +import org.jeecg.modules.system.mapper.SysFileAttachmentMapper; +import org.jeecg.modules.system.service.ISysFileAttachmentService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: sys_file_attachment + * @Author: jeecg-boot + * @Date: 2026-03-26 + * @Version: V1.0 + */ +@Service +public class SysFileAttachmentServiceImpl extends ServiceImpl implements ISysFileAttachmentService { + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java index f7b4e46..425f186 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java @@ -11,6 +11,7 @@ import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.modules.system.entity.SysRole; import org.jeecg.modules.system.mapper.SysRoleMapper; import org.jeecg.modules.system.mapper.SysUserMapper; +import org.jeecg.modules.system.mapper.SysUserRoleMapper; import org.jeecg.modules.system.service.ISysRoleService; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.entity.ImportParams; @@ -37,6 +38,8 @@ public class SysRoleServiceImpl extends ServiceImpl impl SysRoleMapper sysRoleMapper; @Autowired SysUserMapper sysUserMapper; + @Autowired + SysUserRoleMapper sysUserRoleMapper; @Override @@ -89,6 +92,15 @@ public class SysRoleServiceImpl extends ServiceImpl impl return true; } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveDeptForRoleUser(String userId,String roleId,String deptIds){ + if(sysUserRoleMapper.saveDeptForRoleUser(userId,roleId,deptIds) != 0){ + return true; + } + return false; + } + @Override @Transactional(rollbackFor = Exception.class) public boolean deleteBatchRole(String[] roleIds) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java index 66049a1..df327e9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; @@ -15,12 +16,14 @@ import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserDepart; +import org.jeecg.modules.system.entity.SysUserRole; import org.jeecg.modules.system.mapper.SysUserDepartMapper; import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.mapper.SysUserTenantMapper; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.service.ISysUserDepartService; +import org.jeecg.modules.system.service.ISysUserRoleService; import org.jeecg.modules.system.service.ISysUserService; import org.jeecg.modules.system.vo.SysUserDepVo; import org.springframework.beans.factory.annotation.Autowired; @@ -48,8 +51,10 @@ public class SysUserDepartServiceImpl extends ServiceImpl queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate) { + public IPage queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,Integer searchSecurityLevel,String isMultiTranslate) { IPage pageList = null; // 部门ID不存在 直接查询用户表即可 Page page = new Page(pageNo, pageSize); @@ -225,6 +230,139 @@ public class SysUserDepartServiceImpl extends ServiceImpl(map.values())); } + if (Objects.nonNull(searchSecurityLevel)) { + // 筛选:保留用户密级 >= 搜索密级的记录 + List filteredUsers = pageList.getRecords().stream() + .filter(user -> { + Integer userLevel = user.getUserSecurityLevel(); + // 注意这里的括号闭合:}) + return userLevel != null && userLevel >= searchSecurityLevel; + }) // 这里之前多了一个点,且少了一个反括号 + .collect(Collectors.toList()); + + // 重新设置到分页对象 + pageList.setRecords(filteredUsers); + } + return pageList; + } + + /** + * + * @param departId + * @param roleId + * @param username + * @param realname + * @param pageSize + * @param pageNo + * @param id + * @param isMultiTranslate 是否多字段翻译 + * @return + */ + @Override + public IPage queryDepartRoleUserPageList(String departId, String roleId, String username, String realname, int pageSize, int pageNo,String id,Integer searchSecurityLevel,String isMultiTranslate) { + IPage pageList = null; + // 部门ID不存在 直接查询用户表即可 + Page page = new Page(pageNo, pageSize); + if(oConvertUtils.isEmpty(departId)){ + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + //update-begin---author:wangshuai ---date:20220104 for:[JTC-297]已冻结用户仍可设置为代理人------------ + query.eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1)); + //update-end---author:wangshuai ---date:20220104 for:[JTC-297]已冻结用户仍可设置为代理人------------ + //update-begin---author:liusq ---date:20231215 for:逗号分割多个用户翻译问题------------ + if(oConvertUtils.isNotEmpty(username)){ + String COMMA = ","; + if(oConvertUtils.isNotEmpty(isMultiTranslate) && username.contains(COMMA)){ + String[] usernameArr = username.split(COMMA); + query.in(SysUser::getUsername,usernameArr); + }else { + query.like(SysUser::getUsername, username); + } + } + //update-end---author:liusq ---date:20231215 for:逗号分割多个用户翻译问题------------ + //update-begin---author:wangshuai ---date:20220608 for:[VUEN-1238]邮箱回复时,发送到显示的为用户id------------ + if(oConvertUtils.isNotEmpty(id)){ + //update-begin---author:wangshuai ---date:2024-06-25 for:【TV360X-1482】写信,选择用户后第一次回显没翻译------------ + String COMMA = ","; + if(oConvertUtils.isNotEmpty(isMultiTranslate) && id.contains(COMMA)){ + String[] idArr = id.split(COMMA); + query.in(SysUser::getId, Arrays.asList(idArr)); + }else { + query.eq(SysUser::getId, id); + } + //update-end---author:wangshuai ---date:2024-06-25 for:【TV360X-1482】写信,选择用户后第一次回显没翻译------------ + } + //update-end---author:wangshuai ---date:20220608 for:[VUEN-1238]邮箱回复时,发送到显示的为用户id------------ + //update-begin---author:wangshuai ---date:20220902 for:[VUEN-2121]临时用户不能直接显示------------ + query.ne(SysUser::getUsername,"_reserve_user_external"); + //update-end---author:wangshuai ---date:20220902 for:[VUEN-2121]临时用户不能直接显示------------ + + //------------------------------------------------------------------------------------------------ + //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 + if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { + String tenantId = oConvertUtils.getString(TenantContext.getTenant(), "0"); + //update-begin---author:wangshuai ---date:20221223 for:[QQYUN-3371]租户逻辑改造,改成关系表------------ + List userIdList = userTenantMapper.getUserIdsByTenantId(Integer.valueOf(tenantId)); + if(null!=userIdList && userIdList.size()>0){ + query.in(SysUser::getId,userIdList); + } + //update-end---author:wangshuai ---date:20221223 for:[QQYUN-3371]租户逻辑改造,改成关系表------------ + } + //------------------------------------------------------------------------------------------------ + pageList = sysUserMapper.selectPage(page, query); + }else{ + // 有部门ID 需要走自定义sql + SysDepart sysDepart = sysDepartService.getById(departId); + pageList = sysUserDepartMapper.queryOneDepartUserPageList(page, sysDepart.getOrgCode(), username, realname); + } + List userList = pageList.getRecords(); + if(userList!=null && userList.size()>0){ + List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + Map map = new HashMap(5); + if(userIds!=null && userIds.size()>0){ + // 查部门名称 + Map useDepNames = this.getDepNamesByUserIds(userIds); + userList.forEach(item->{ + //TODO 临时借用这个字段用于页面展示 + item.setOrgCodeTxt(useDepNames.get(item.getId())); + item.setSalt(""); + item.setPassword(""); + // 去重 + map.put(item.getId(), item); + }); + } + pageList.setRecords(new ArrayList(map.values())); + } + if (Objects.nonNull(searchSecurityLevel)) { + // 筛选:保留用户密级 >= 搜索密级的记录 + List filteredUsers = pageList.getRecords().stream() + .filter(user -> { + Integer userLevel = user.getUserSecurityLevel(); + // 注意这里的括号闭合:}) + return userLevel != null && userLevel >= searchSecurityLevel; + }) // 这里之前多了一个点,且少了一个反括号 + .collect(Collectors.toList()); + + // 重新设置到分页对象 + pageList.setRecords(filteredUsers); + } + + if (Objects.nonNull(roleId)) { + Set userIdSet = sysUserRoleService.listObjs( + Wrappers.lambdaQuery(SysUserRole.class) + .select(SysUserRole::getUserId) + .eq(SysUserRole::getRoleId, roleId), + String::valueOf + ).stream().collect(Collectors.toSet()); + List filteredUsers = pageList.getRecords().stream() + .filter(user -> { + String userId = user.getId(); + // 注意这里的括号闭合:}) + return userIdSet.contains(userId); + }) + .collect(Collectors.toList()); + pageList.setRecords(filteredUsers); + } + return pageList; } @@ -266,6 +404,8 @@ public class SysUserDepartServiceImpl extends ServiceImpl getUserInformation(Integer tenantId, String departId,String roleId, String keyword, Integer pageSize, Integer pageNo, String excludeUserIdList) { IPage pageList = null; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index 1b6808b..d7749e1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java @@ -42,10 +42,7 @@ import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.model.SysUserSysDepartModel; import org.jeecg.modules.system.service.*; -import org.jeecg.modules.system.vo.SysUserDepVo; -import org.jeecg.modules.system.vo.SysUserExportVo; -import org.jeecg.modules.system.vo.SysUserPositionVo; -import org.jeecg.modules.system.vo.UserAvatar; +import org.jeecg.modules.system.vo.*; import org.jeecg.modules.system.vo.lowapp.AppExportUserVo; import org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo; import org.jeecg.modules.system.vo.lowapp.DepartInfo; @@ -70,6 +67,7 @@ import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.validation.constraints.NotBlank; import java.io.IOException; import java.lang.reflect.Array; import java.util.*; @@ -135,6 +133,8 @@ public class SysUserServiceImpl extends ServiceImpl impl @Autowired private RedisUtil redisUtil; + @Autowired + private SysUserMapper sysUserMapper; @Override public Result> queryPageList(HttpServletRequest req, QueryWrapper queryWrapper, Integer pageSize, Integer pageNo) { @@ -170,6 +170,14 @@ public class SysUserServiceImpl extends ServiceImpl impl } //update-end-author:taoyan--date:20220104--for: JTC-372 【用户冻结问题】 online授权、用户组件,选择用户都能看到被冻结的用户 + // 假设前端传的参数名也是 userSecurityLevel + String securityLevel = req.getParameter("searchSecurityLevel"); + if (oConvertUtils.isNotEmpty(securityLevel)) { + int levelInt = Integer.parseInt(securityLevel); + // 将条件加入 queryWrapper,对应数据库字段名为 user_security_level + queryWrapper.ge("user_security_level", levelInt); + } + //update-begin---author:wangshuai---date:2024-03-08---for:【QQYUN-8110】在线通讯录支持设置权限(只能看分配的技术支持)--- String tenantId = TokenUtils.getTenantIdByRequest(req); String lowAppId = TokenUtils.getLowAppIdByRequest(req); @@ -576,6 +584,18 @@ public class SysUserServiceImpl extends ServiceImpl impl //update-end---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ } + /** + * 根据角色Id查询 + * @param page + * @param roleId 角色id + * @param username 用户账户名称 + * @return + */ + @Override + public IPage getUserByRoleIdWithDeptIds(Page page, String roleId, String username){ + //update-begin---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ + return userMapper.getUserByRoleIdWithDeptIds(page, roleId, username); + } @Override @CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, key="#username") @@ -2394,4 +2414,9 @@ public class SysUserServiceImpl extends ServiceImpl impl String newPassWord = PasswordUtil.encrypt(username, password, user.getSalt()); this.userMapper.update(new SysUser().setPassword(newPassWord), new LambdaQueryWrapper().eq(SysUser::getId, user.getId())); } + + @Override + public List queryUserByDeptAndROle(@NotBlank(message = "deptId不为空") String deptId, @NotBlank(message = "角色id不为空") String roleId, @NotBlank(message = "secretLevel不为空") Integer secretLevel){ + return sysUserMapper.queryUserByDeptAndROle(deptId,roleId,secretLevel); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleDeptsVo.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleDeptsVo.java new file mode 100644 index 0000000..45de561 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleDeptsVo.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.system.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.modules.system.entity.SysUser; + +@Data +@EqualsAndHashCode(callSuper = true) // hash值比较需考虑父值相等 +@Accessors(chain = true) // 开启链式调用 +public class SysUserRoleDeptsVo extends SysUser { + + /** 部门ID(来自中间表) */ + private String deptId; + + /** 用户ID */ + private String userId; + +} diff --git a/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-module-system/jeecg-system-start/pom.xml index ab8494d..1552a03 100644 --- a/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-module-system/jeecg-system-start/pom.xml @@ -24,6 +24,12 @@ jeecg-module-demo ${jeecgboot.version} + + + org.jeecgframework.boot + jeecg-module-supervision + 3.8.1 + diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 2e2f5da..a138d77 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -217,6 +217,7 @@ mybatis-plus: minidao: base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.* jeecg: + appName: supervision # 自定义资源请求前缀(js、css等解决nginx转发问题) custom-resource-prefix-path: # AI集成 diff --git a/pom.xml b/pom.xml index 92bebaa..c953640 100644 --- a/pom.xml +++ b/pom.xml @@ -92,42 +92,43 @@ 1.2.13 - + jeecg-boot-base-core jeecg-module-system jeecg-boot-module + jeecg-module-supervision - - + + aliyun aliyun Repository https://maven.aliyun.com/repository/public - false - + false + - + jeecg jeecg Repository https://maven.jeecg.org/nexus/content/repositories/jeecg - false - - - - jeecg-snapshots - jeecg-snapshots Repository - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - + false + + + + jeecg-snapshots + jeecg-snapshots Repository + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + @@ -158,63 +159,69 @@ commonmark ${commonmark.version} - + + org.jetbrains.kotlin + kotlin-compiler-embeddable + 2.2.0 + compile + + - - - - - org.springframework.cloud - spring-cloud-dependencies + + + + + org.springframework.cloud + spring-cloud-dependencies ${spring-cloud.version} - pom - import - - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} - pom - import - - - io.seata - seata-spring-boot-starter - ${seata.version} - + pom + import + + + io.seata + seata-spring-boot-starter + ${seata.version} + - - - org.jeecgframework.boot - jeecg-system-biz - ${jeecgboot.version} - + + + org.jeecgframework.boot + jeecg-system-biz + ${jeecgboot.version} + - - - org.jeecgframework.boot - jeecg-boot-common - ${jeecgboot.version} - - - - org.jeecgframework.boot - jeecg-boot-base-core - ${jeecgboot.version} - - - - org.jeecgframework.boot - jeecg-system-local-api - ${jeecgboot.version} - - - - org.jeecgframework.boot - jeecg-system-cloud-api - ${jeecgboot.version} - + + + org.jeecgframework.boot + jeecg-boot-common + ${jeecgboot.version} + + + + org.jeecgframework.boot + jeecg-boot-base-core + ${jeecgboot.version} + + + + org.jeecgframework.boot + jeecg-system-local-api + ${jeecgboot.version} + + + + org.jeecgframework.boot + jeecg-system-cloud-api + ${jeecgboot.version} + @@ -251,12 +258,12 @@ jeecg-boot-starter-shardingsphere 3.8.2-RC - - - org.jeecgframework.boot - jeecg-boot-starter-mongon - ${jeecgboot.version} - + + + org.jeecgframework.boot + jeecg-boot-starter-mongon + ${jeecgboot.version} + @@ -459,9 +466,9 @@ - - - + + + org.apache.maven.plugins maven-compiler-plugin @@ -473,17 +480,17 @@ - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.1.0 woff @@ -506,22 +513,22 @@ false - - - + + + src/main/resources true - - src/main/java - - **/*.xml - **/*.json - **/*.ftl - - - - + + src/main/java + + **/*.xml + **/*.json + **/*.ftl + + + + @@ -536,14 +543,14 @@ dev jeecg-boot-nacos:8848 - - - - DEFAULT_GROUP - - - - + + + + DEFAULT_GROUP + + + + @@ -554,14 +561,14 @@ test jeecg-boot-nacos:8848 - - - - DEFAULT_GROUP - - - - + + + + DEFAULT_GROUP + + + + @@ -572,14 +579,14 @@ prod jeecg-boot-nacos:8848 - - - - DEFAULT_GROUP - - - - + + + + DEFAULT_GROUP + + + +