Jelajahi Sumber

新增采购信息

shenzx 3 bulan lalu
induk
melakukan
c825e5a23a
37 mengubah file dengan 852 tambahan dan 28 penghapusan
  1. 10 6
      ruoyi-admin/pom.xml
  2. 2 2
      ruoyi-admin/src/main/resources/application-prod.yml
  3. 9 2
      ruoyi-admin/src/main/resources/application.yml
  4. 2 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  5. 1 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
  6. 6 0
      ruoyi-service/pom.xml
  7. 115 0
      ruoyi-service/src/main/java/com/ruoyi/web/controller/CgInfoController.java
  8. 83 0
      ruoyi-service/src/main/java/com/ruoyi/web/controller/FileController.java
  9. 120 0
      ruoyi-service/src/main/java/com/ruoyi/web/controller/FileInfoController.java
  10. 52 3
      ruoyi-service/src/main/java/com/ruoyi/web/controller/HdInfoController.java
  11. 6 0
      ruoyi-service/src/main/java/com/ruoyi/web/controller/ZdInfoController.java
  12. 81 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/CgInfo.java
  13. 58 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/FileInfo.java
  14. 4 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/HdInfo.java
  15. 3 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/HdZd.java
  16. 12 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/dto/HdUserDTO.java
  17. 12 0
      ruoyi-service/src/main/java/com/ruoyi/web/domain/dto/HdWqdDTO.java
  18. 19 0
      ruoyi-service/src/main/java/com/ruoyi/web/exception/ErrorMessageException.java
  19. 20 0
      ruoyi-service/src/main/java/com/ruoyi/web/handler/ErrorMessageExceptionHandler.java
  20. 16 0
      ruoyi-service/src/main/java/com/ruoyi/web/mapper/CgInfoMapper.java
  21. 16 0
      ruoyi-service/src/main/java/com/ruoyi/web/mapper/FileInfoMapper.java
  22. 4 3
      ruoyi-service/src/main/java/com/ruoyi/web/mapper/HdInfoMapper.java
  23. 14 0
      ruoyi-service/src/main/java/com/ruoyi/web/service/ICgInfoService.java
  24. 14 0
      ruoyi-service/src/main/java/com/ruoyi/web/service/IFileInfoService.java
  25. 5 2
      ruoyi-service/src/main/java/com/ruoyi/web/service/IHdInfoService.java
  26. 3 0
      ruoyi-service/src/main/java/com/ruoyi/web/service/IZdInfoService.java
  27. 18 0
      ruoyi-service/src/main/java/com/ruoyi/web/service/impl/CgInfoServiceImpl.java
  28. 18 0
      ruoyi-service/src/main/java/com/ruoyi/web/service/impl/FileInfoServiceImpl.java
  29. 10 2
      ruoyi-service/src/main/java/com/ruoyi/web/service/impl/HdInfoServiceImpl.java
  30. 20 2
      ruoyi-service/src/main/java/com/ruoyi/web/service/impl/ZdInfoServiceImpl.java
  31. 37 0
      ruoyi-service/src/main/resources/mapper/cg/CgInfoMapper.xml
  32. 33 0
      ruoyi-service/src/main/resources/mapper/file/FileInfoMapper.xml
  33. 9 4
      ruoyi-service/src/main/resources/mapper/hd/HdInfoMapper.xml
  34. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  35. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  36. 6 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  37. 10 0
      ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 10 - 6
ruoyi-admin/pom.xml

@@ -44,12 +44,6 @@
             <scope>runtime</scope>
         </dependency>
 
-        <!-- 核心模块-->
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-framework</artifactId>
-        </dependency>
-
         <!-- 定时任务-->
         <dependency>
             <groupId>com.ruoyi</groupId>
@@ -67,6 +61,16 @@
             <artifactId>ruoyi-service</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 2
ruoyi-admin/src/main/resources/application-prod.yml

@@ -6,14 +6,14 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:postgresql://82.156.81.16:16804/badminton?currentSchema=badminton&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
+                url: jdbc:postgresql://postgis:5432/badminton?currentSchema=badminton&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
                 username: postgres
                 password: Tjch@123
             # 从库数据源
             system:
                 # 从数据源开关/默认关闭
                 enabled: true
-                url: jdbc:postgresql://82.156.81.16:16804/badminton?currentSchema=ry&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
+                url: jdbc:postgresql://postgis:5432/badminton?currentSchema=ry&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
                 username: postgres
                 password: Tjch@123
             # 初始连接数

+ 9 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -7,7 +7,8 @@ ruoyi:
   # 版权年份
   copyrightYear: 2025
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: D:/ruoyi/uploadPath
+#  profile: D:/.doc/file/ruoyi
+  profile: /file
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
@@ -68,7 +69,7 @@ spring:
   # redis 配置
   redis:
     # 地址
-    host: 82.156.81.16
+    host: redis
     # 端口,默认为6379
     port: 6379
     # 数据库索引
@@ -127,3 +128,9 @@ xss:
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"

+ 2 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,9 +111,9 @@ public class SecurityConfig
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                requests.antMatchers("/login", "/register", "/captchaImage","/actuator/**").permitAll()
                     // 静态资源,可匿名访问
-                    .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
+                    .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/file/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                     // 除上面外的所有请求全部需要鉴权认证
                     .anyRequest().authenticated();

+ 1 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java

@@ -9,6 +9,7 @@ import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.MissingPathVariableException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 import com.ruoyi.common.constant.HttpStatus;

+ 6 - 0
ruoyi-service/pom.xml

@@ -29,6 +29,12 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 115 - 0
ruoyi-service/src/main/java/com/ruoyi/web/controller/CgInfoController.java

@@ -0,0 +1,115 @@
+package com.ruoyi.web.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.domain.CgInfo;
+import com.ruoyi.web.service.ICgInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 采购信息Controller
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@RestController
+@RequestMapping("/cg/info")
+public class CgInfoController extends BaseController
+{
+    private ICgInfoService cgInfoService;
+    @Autowired
+    public void setCgInfoService(ICgInfoService cgInfoService) {
+        this.cgInfoService = cgInfoService;
+    }
+
+    /**
+     * 查询采购信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CgInfo cgInfo)
+    {
+        startPage();
+        QueryWrapper<CgInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(cgInfo);
+        List<CgInfo> cgInfoList = cgInfoService.list(queryWrapper);
+        return getDataTable(cgInfoList);
+    }
+
+    /**
+     * 导出采购信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:export')")
+    @Log(title = "采购信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CgInfo cgInfo)
+    {
+        QueryWrapper<CgInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(cgInfo);
+        List<CgInfo> list = cgInfoService.list(queryWrapper);
+        ExcelUtil<CgInfo> util = new ExcelUtil<>(CgInfo.class);
+        util.exportExcel(response, list, "采购信息数据");
+    }
+
+    /**
+     * 获取采购信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(cgInfoService.getById(id));
+    }
+
+    /**
+     * 新增采购信息
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:add')")
+    @Log(title = "采购信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CgInfo cgInfo)
+    {
+        cgInfoService.save(cgInfo);
+        return success(cgInfo);
+    }
+
+    /**
+     * 修改采购信息
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:edit')")
+    @Log(title = "采购信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CgInfo cgInfo)
+    {
+        cgInfoService.updateById(cgInfo);
+        return success(cgInfo);
+    }
+
+    /**
+     * 删除采购信息
+     */
+    @PreAuthorize("@ss.hasPermi('cg:info:remove')")
+    @Log(title = "采购信息", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(cgInfoService.removeByIds(Arrays.asList(ids)));
+    }
+}

+ 83 - 0
ruoyi-service/src/main/java/com/ruoyi/web/controller/FileController.java

@@ -0,0 +1,83 @@
+package com.ruoyi.web.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.web.domain.FileInfo;
+import com.ruoyi.web.service.IFileInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Cleanup;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("file")
+@Api(tags = "附件相关")
+public class FileController extends BaseController {
+
+    private IFileInfoService fileInfoService;
+    @Autowired
+    public void setFileInfoService(IFileInfoService fileInfoService) {
+        this.fileInfoService = fileInfoService;
+    }
+
+    @PostMapping("upload")
+    @ApiOperation("文件上传")
+    public AjaxResult upload(@RequestParam("file") MultipartFile file) throws Exception {
+        String md5 = getMd5(file);
+
+        QueryWrapper<FileInfo> qw = new QueryWrapper<>();
+        qw.lambda().eq(FileInfo::getMd5,md5);
+        FileInfo fileInfo = fileInfoService.getOne(qw);
+
+        if (Objects.nonNull(fileInfo)) return success(fileInfo);
+
+        fileInfo = new FileInfo();
+        fileInfo.setName(file.getOriginalFilename());
+        fileInfo.setType(file.getContentType());
+        fileInfo.setSize(file.getSize());
+        fileInfo.setMd5(md5);
+
+        String filePath = RuoYiConfig.getUploadPath();
+        String fileName = FileUploadUtils.upload(filePath, file);
+        fileInfo.setPath(fileName);
+
+        fileInfoService.save(fileInfo);
+        return success(fileInfo);
+    }
+
+    private String getMd5(MultipartFile file) {
+        try {
+            @Cleanup
+            InputStream inputStream = file.getInputStream();
+            return DigestUtils.md5DigestAsHex(inputStream);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation("文件下载")
+    public void download(@PathVariable Long id, HttpServletResponse response) throws Exception {
+        FileInfo fileInfo = fileInfoService.getById(id);
+        String path = fileInfo.getPath();
+
+        String localPath = RuoYiConfig.getProfile();
+        String downloadPath = localPath + FileUtils.stripPrefix(path);
+        response.setContentType(fileInfo.getType());
+        FileUtils.writeBytes(downloadPath, response.getOutputStream());
+    }
+
+}

+ 120 - 0
ruoyi-service/src/main/java/com/ruoyi/web/controller/FileInfoController.java

@@ -0,0 +1,120 @@
+package com.ruoyi.web.controller;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.Cleanup;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.domain.FileInfo;
+import com.ruoyi.web.service.IFileInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件信息Controller
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@RestController
+@RequestMapping("/file/info")
+public class FileInfoController extends BaseController
+{
+    private IFileInfoService fileInfoService;
+    @Autowired
+    public void setFileInfoService(IFileInfoService fileInfoService) {
+        this.fileInfoService = fileInfoService;
+    }
+
+    /**
+     * 查询文件信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FileInfo fileInfo)
+    {
+        startPage();
+        QueryWrapper<FileInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(fileInfo);
+        List<FileInfo> fileInfoList = fileInfoService.list(queryWrapper);
+        return getDataTable(fileInfoList);
+    }
+
+    /**
+     * 导出文件信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:export')")
+    @Log(title = "文件信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, FileInfo fileInfo)
+    {
+        QueryWrapper<FileInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(fileInfo);
+        List<FileInfo> list = fileInfoService.list(queryWrapper);
+        ExcelUtil<FileInfo> util = new ExcelUtil<>(FileInfo.class);
+        util.exportExcel(response, list, "文件信息数据");
+    }
+
+    /**
+     * 获取文件信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(fileInfoService.getById(id));
+    }
+
+    /**
+     * 新增文件信息
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:add')")
+    @Log(title = "文件信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FileInfo fileInfo)
+    {
+        fileInfoService.save(fileInfo);
+        return success(fileInfo);
+    }
+
+    /**
+     * 修改文件信息
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:edit')")
+    @Log(title = "文件信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FileInfo fileInfo)
+    {
+        fileInfoService.updateById(fileInfo);
+        return success(fileInfo);
+    }
+
+    /**
+     * 删除文件信息
+     */
+    @PreAuthorize("@ss.hasPermi('file:info:remove')")
+    @Log(title = "文件信息", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fileInfoService.removeByIds(Arrays.asList(ids)));
+    }
+}

+ 52 - 3
ruoyi-service/src/main/java/com/ruoyi/web/controller/HdInfoController.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.domain.*;
+import com.ruoyi.web.exception.ErrorMessageException;
 import com.ruoyi.web.service.*;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,12 +45,47 @@ public class HdInfoController extends BaseController
         this.hdQdService = hdQdService;
     }
 
+    private IHdZdService hdZdService;
+    @Autowired
+    public void setHdZdService(IHdZdService hdZdService) {
+        this.hdZdService = hdZdService;
+    }
+
     private HdInfo getHdInfo(Date date){
         QueryWrapper<HdInfo> qw = new QueryWrapper<>();
         qw.lambda().eq(HdInfo::getHdrq,date);
         return hdInfoService.getOne(qw);
     }
 
+    @GetMapping("/user/wqd/{id}")
+    @ApiOperation("未签到用户列表")
+    public AjaxResult hdWqd(@PathVariable Long id){
+        return success(hdInfoService.hdWqd(id));
+    }
+
+    @PostMapping("/user/bq")
+    @ApiOperation("帮签")
+    public AjaxResult bq(@RequestBody HdQd hdQd){
+        hdQd.setQdsj(DateUtils.getNowDate());
+        hdQdService.save(hdQd);
+        return success();
+    }
+
+    @PostMapping("/user/bqq")
+    @ApiOperation("帮取签")
+    public AjaxResult bqq(@RequestBody HdQd hdQd){
+        QueryWrapper<HdQd> qw = new QueryWrapper<>();
+        qw.lambda().eq(HdQd::getFid,hdQd.getFid()).eq(HdQd::getUserId,hdQd.getUserId());
+        hdQdService.remove(qw);
+        return success();
+    }
+
+    @GetMapping("/user/{id}")
+    @ApiOperation("活动参与人员")
+    public AjaxResult hdUser(@PathVariable Long id){
+        return success(hdInfoService.hdUser(id));
+    }
+
     @GetMapping("/user/grls")
     @ApiOperation("个人历史")
     public AjaxResult grls(){
@@ -57,12 +93,14 @@ public class HdInfoController extends BaseController
         hqQW.lambda().eq(HdQd::getUserId,SecurityUtils.getUserId());
         Set<Long> hdIdSet = hdQdService.list(hqQW).stream().map(HdQd::getFid).collect(Collectors.toSet());
         if (hdIdSet.isEmpty()) return success(Collections.emptyList());
-        return success(hdInfoService.listByIds(hdIdSet));
+        QueryWrapper<HdInfo> qw = new QueryWrapper<>();
+        qw.lambda().in(HdInfo::getId,hdIdSet).orderByDesc(HdInfo::getHdrq);
+        return success(hdInfoService.list(qw));
     }
 
     @GetMapping("/user/verify")
     @ApiOperation("校验是否签到")
-    public AjaxResult verify(String date) {
+    public AjaxResult verifyQd(String date) {
         Date hdrq = DateUtils.getNowDate();
         if(StringUtils.isNotEmpty(date)) hdrq = DateUtils.parseDate(date);
         HdInfo hdInfo = getHdInfo(hdrq);
@@ -85,6 +123,7 @@ public class HdInfoController extends BaseController
             hdInfo.setHdrq(hdrq);
             hdInfoService.save(hdInfo);
         }
+        if (getJszt(hdInfo.getId())) throw new ErrorMessageException("账单已结算,禁止签到");
         HdQd hdQd = new HdQd();
         hdQd.setFid(hdInfo.getId());
         hdQd.setUserId(SecurityUtils.getUserId());
@@ -99,6 +138,7 @@ public class HdInfoController extends BaseController
         Date hdrq = DateUtils.getNowDate();
         if(StringUtils.isNotEmpty(date)) hdrq = DateUtils.parseDate(date);
         HdInfo hdInfo = getHdInfo(hdrq);
+        if (getJszt(hdInfo.getId())) throw new ErrorMessageException("账单已结算,禁止取消签到");
         QueryWrapper<HdQd> qw = new QueryWrapper<>();
         qw.lambda().eq(HdQd::getUserId,SecurityUtils.getUserId()).eq(HdQd::getFid,hdInfo.getId());
         hdQdService.remove(qw);
@@ -138,7 +178,16 @@ public class HdInfoController extends BaseController
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
-        return success(hdInfoService.getById(id));
+        HdInfo hdInfo = hdInfoService.getById(id);
+        hdInfo.setJszt(getJszt(hdInfo.getId()));
+        return success(hdInfo);
+    }
+
+    private boolean getJszt(Long id){
+        QueryWrapper<HdZd> qw = new QueryWrapper<>();
+        qw.lambda().eq(HdZd::getHdId,id);
+        HdZd hdZd = hdZdService.getOne(qw);
+        return !Objects.isNull(hdZd);
     }
 
     /**

+ 6 - 0
ruoyi-service/src/main/java/com/ruoyi/web/controller/ZdInfoController.java

@@ -58,6 +58,12 @@ public class ZdInfoController extends BaseController
         return success();
     }
 
+    @GetMapping("/grzd/hd/{id}")
+    @ApiOperation("个人账单活动列表")
+    public AjaxResult grzdHd(@PathVariable Long id){
+        return success(zdInfoService.grzdHd(id));
+    }
+
     @PutMapping("/zfzt/{id}")
     @ApiOperation("更新支付状态")
     public AjaxResult updateZfzt(@PathVariable Long id){

+ 81 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/CgInfo.java

@@ -0,0 +1,81 @@
+package com.ruoyi.web.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import lombok.Data;
+
+/**
+ * 采购信息对象 cg_info
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName(value ="cg_info")
+@Data
+public class CgInfo extends BaseEntity implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @ApiModelProperty("主键")
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    @ApiModelProperty("订单号")
+    private String ddh;
+
+    /** 品牌 */
+    @Excel(name = "品牌")
+    @ApiModelProperty("品牌")
+    private String pp;
+
+    /** 型号 */
+    @Excel(name = "型号")
+    @ApiModelProperty("型号")
+    private String xh;
+
+    /** 桶数 */
+    @Excel(name = "桶数")
+    @ApiModelProperty("桶数")
+    private String ts;
+
+    /** 每桶个数 */
+    @Excel(name = "每桶个数")
+    @ApiModelProperty("每桶个数")
+    private String mtgs;
+
+    /** 价格 */
+    @Excel(name = "价格")
+    @ApiModelProperty("价格")
+    private BigDecimal jg;
+
+    /** 采购时间 */
+    @Excel(name = "采购时间")
+    @ApiModelProperty("采购时间")
+    private Date cgsj;
+
+    /** 商品图片 */
+    @Excel(name = "商品图片")
+    @ApiModelProperty("商品图片")
+    private String fileSptp;
+
+    /** 订单截图 */
+    @Excel(name = "订单截图")
+    @ApiModelProperty("订单截图")
+    private String fileDdjt;
+
+}

+ 58 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/FileInfo.java

@@ -0,0 +1,58 @@
+package com.ruoyi.web.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 文件信息对象 file_info
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName(value ="file_info")
+@Data
+public class FileInfo extends BaseEntity implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @ApiModelProperty("主键")
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 文件名称 */
+    @Excel(name = "文件名称")
+    @ApiModelProperty("文件名称")
+    private String name;
+
+    /** 文件类型 */
+    @Excel(name = "文件类型")
+    @ApiModelProperty("文件类型")
+    private String type;
+
+    /** 文件大小 */
+    @Excel(name = "文件大小")
+    @ApiModelProperty("文件大小")
+    private Long size;
+
+    /** md5校验 */
+    @Excel(name = "md5校验")
+    @ApiModelProperty("md5校验")
+    private String md5;
+
+    /** 文件路径 */
+    @Excel(name = "文件路径")
+    @ApiModelProperty("文件路径")
+    private String path;
+
+}

+ 4 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/HdInfo.java

@@ -50,4 +50,8 @@ public class HdInfo extends BaseEntity implements Serializable {
     @ApiModelProperty("总费用")
     private BigDecimal totalCost;
 
+    @TableField(exist = false)
+    @ApiModelProperty("结算状态")
+    private boolean jszt;
+
 }

+ 3 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/HdZd.java

@@ -24,6 +24,9 @@ public class HdZd implements Serializable {
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
     /** hd_info表主键 */
     @ApiModelProperty("hd_info表主键")
     private Long hdId;

+ 12 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/dto/HdUserDTO.java

@@ -0,0 +1,12 @@
+package com.ruoyi.web.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class HdUserDTO {
+
+    private String userId;
+
+    private String nickName;
+
+}

+ 12 - 0
ruoyi-service/src/main/java/com/ruoyi/web/domain/dto/HdWqdDTO.java

@@ -0,0 +1,12 @@
+package com.ruoyi.web.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class HdWqdDTO {
+
+    private Long userId;
+
+    private String nickName;
+
+}

+ 19 - 0
ruoyi-service/src/main/java/com/ruoyi/web/exception/ErrorMessageException.java

@@ -0,0 +1,19 @@
+package com.ruoyi.web.exception;
+
+import lombok.Getter;
+
+@Getter
+public class ErrorMessageException extends RuntimeException {
+
+    private final int code;
+
+    public ErrorMessageException(String message) {
+        super(message);
+        this.code = 500;
+    }
+
+    public ErrorMessageException(String message, int code) {
+        super(message);
+        this.code = code;
+    }
+}

+ 20 - 0
ruoyi-service/src/main/java/com/ruoyi/web/handler/ErrorMessageExceptionHandler.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.handler;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.exception.ErrorMessageException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ControllerAdvice
+@Slf4j
+public class ErrorMessageExceptionHandler {
+
+    @ExceptionHandler(value = ErrorMessageException.class)
+    @ResponseBody
+    public AjaxResult handlerErrorMessageException(ErrorMessageException e) {
+        return AjaxResult.error(e.getCode(),e.getMessage());
+    }
+
+}

+ 16 - 0
ruoyi-service/src/main/java/com/ruoyi/web/mapper/CgInfoMapper.java

@@ -0,0 +1,16 @@
+package com.ruoyi.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.domain.CgInfo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 采购信息Mapper接口
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@Repository
+public interface CgInfoMapper extends BaseMapper<CgInfo> {
+
+}

+ 16 - 0
ruoyi-service/src/main/java/com/ruoyi/web/mapper/FileInfoMapper.java

@@ -0,0 +1,16 @@
+package com.ruoyi.web.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.domain.FileInfo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 文件信息Mapper接口
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@Repository
+public interface FileInfoMapper extends BaseMapper<FileInfo> {
+
+}

+ 4 - 3
ruoyi-service/src/main/java/com/ruoyi/web/mapper/HdInfoMapper.java

@@ -1,9 +1,9 @@
 package com.ruoyi.web.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.web.domain.GrzdVO;
 import com.ruoyi.web.domain.HdInfo;
-import org.apache.ibatis.annotations.Param;
+import com.ruoyi.web.domain.dto.HdUserDTO;
+import com.ruoyi.web.domain.dto.HdWqdDTO;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -17,6 +17,7 @@ import java.util.List;
 @Repository
 public interface HdInfoMapper extends BaseMapper<HdInfo> {
 
-    List<GrzdVO> grzd(@Param("ny") String ny,@Param("userId") Long userId);
+    List<HdUserDTO> hdUser(Long id);
 
+    List<HdWqdDTO> hdWqd(Long id);
 }

+ 14 - 0
ruoyi-service/src/main/java/com/ruoyi/web/service/ICgInfoService.java

@@ -0,0 +1,14 @@
+package com.ruoyi.web.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.domain.CgInfo;
+
+/**
+ * 采购信息Service接口
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+public interface ICgInfoService extends IService<CgInfo> {
+
+}

+ 14 - 0
ruoyi-service/src/main/java/com/ruoyi/web/service/IFileInfoService.java

@@ -0,0 +1,14 @@
+package com.ruoyi.web.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.domain.FileInfo;
+
+/**
+ * 文件信息Service接口
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+public interface IFileInfoService extends IService<FileInfo> {
+
+}

+ 5 - 2
ruoyi-service/src/main/java/com/ruoyi/web/service/IHdInfoService.java

@@ -1,8 +1,9 @@
 package com.ruoyi.web.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.web.domain.GrzdVO;
 import com.ruoyi.web.domain.HdInfo;
+import com.ruoyi.web.domain.dto.HdUserDTO;
+import com.ruoyi.web.domain.dto.HdWqdDTO;
 
 import java.util.List;
 
@@ -14,5 +15,7 @@ import java.util.List;
  */
 public interface IHdInfoService extends IService<HdInfo> {
 
-    List<GrzdVO> grzd(String ny);
+    List<HdUserDTO> hdUser(Long id);
+
+    List<HdWqdDTO> hdWqd(Long id);
 }

+ 3 - 0
ruoyi-service/src/main/java/com/ruoyi/web/service/IZdInfoService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.web.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.domain.HdInfo;
 import com.ruoyi.web.domain.ZdInfo;
 import com.ruoyi.web.domain.ZdUser;
 import com.ruoyi.web.domain.dto.GrzdDTO;
@@ -23,4 +24,6 @@ public interface IZdInfoService extends IService<ZdInfo> {
 
     void updateDealId(ZdUser zdUser);
 
+    List<HdInfo> grzdHd(Long id);
+
 }

+ 18 - 0
ruoyi-service/src/main/java/com/ruoyi/web/service/impl/CgInfoServiceImpl.java

@@ -0,0 +1,18 @@
+package com.ruoyi.web.service.impl;
+
+import org.springframework.stereotype.Service;
+import com.ruoyi.web.mapper.CgInfoMapper;
+import com.ruoyi.web.domain.CgInfo;
+import com.ruoyi.web.service.ICgInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 采购信息Service业务层处理
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@Service
+public class CgInfoServiceImpl extends ServiceImpl<CgInfoMapper, CgInfo> implements ICgInfoService {
+
+}

+ 18 - 0
ruoyi-service/src/main/java/com/ruoyi/web/service/impl/FileInfoServiceImpl.java

@@ -0,0 +1,18 @@
+package com.ruoyi.web.service.impl;
+
+import org.springframework.stereotype.Service;
+import com.ruoyi.web.mapper.FileInfoMapper;
+import com.ruoyi.web.domain.FileInfo;
+import com.ruoyi.web.service.IFileInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 文件信息Service业务层处理
+ * 
+ * @author shenzx
+ * @date 2025-09-26
+ */
+@Service
+public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements IFileInfoService {
+
+}

+ 10 - 2
ruoyi-service/src/main/java/com/ruoyi/web/service/impl/HdInfoServiceImpl.java

@@ -2,12 +2,15 @@ package com.ruoyi.web.service.impl;
 
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.web.domain.GrzdVO;
+import com.ruoyi.web.domain.dto.HdUserDTO;
+import com.ruoyi.web.domain.dto.HdWqdDTO;
 import org.springframework.stereotype.Service;
 import com.ruoyi.web.mapper.HdInfoMapper;
 import com.ruoyi.web.domain.HdInfo;
 import com.ruoyi.web.service.IHdInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -20,7 +23,12 @@ import java.util.List;
 public class HdInfoServiceImpl extends ServiceImpl<HdInfoMapper, HdInfo> implements IHdInfoService {
 
     @Override
-    public List<GrzdVO> grzd(String ny) {
-        return this.baseMapper.grzd(ny,SecurityUtils.getUserId());
+    public List<HdUserDTO> hdUser(Long id) {
+        return this.baseMapper.hdUser(id);
+    }
+
+    @Override
+    public List<HdWqdDTO> hdWqd(Long id) {
+        return this.baseMapper.hdWqd(id);
     }
 }

+ 20 - 2
ruoyi-service/src/main/java/com/ruoyi/web/service/impl/ZdInfoServiceImpl.java

@@ -49,6 +49,12 @@ public class ZdInfoServiceImpl extends ServiceImpl<ZdInfoMapper, ZdInfo> impleme
         this.dealInfoService = dealInfoService;
     }
 
+    private IHdInfoService hdInfoService;
+    @Autowired
+    public void setHdInfoService(IHdInfoService hdInfoService) {
+        this.hdInfoService = hdInfoService;
+    }
+
     @Override
     public void gen() {
         List<HdZdDTO> list = this.baseMapper.selectHdZdList();
@@ -95,8 +101,10 @@ public class ZdInfoServiceImpl extends ServiceImpl<ZdInfoMapper, ZdInfo> impleme
 
         Set<Long> zdIdSet = zdUserList.stream().map(ZdUser::getZdId).collect(Collectors.toSet());
         if (zdIdSet.isEmpty()) return Collections.emptyList();
-        List<ZdInfo> zdInfoList = this.listByIds(zdIdSet);
-        List<GrzdDTO> grzdDTOList = new ArrayList<>();
+        QueryWrapper<ZdInfo> ziQW = new QueryWrapper<>();
+        ziQW.lambda().in(ZdInfo::getId,zdIdSet).orderByDesc(ZdInfo::getZdrq).orderByDesc(ZdInfo::getId);
+        List<ZdInfo> zdInfoList = this.list(ziQW);
+        List<GrzdDTO> grzdDTOList = new LinkedList<>();
         zdInfoList.forEach(v->{
             Long zdId = v.getId();
             GrzdDTO grzdDTO = new GrzdDTO();
@@ -129,4 +137,14 @@ public class ZdInfoServiceImpl extends ServiceImpl<ZdInfoMapper, ZdInfo> impleme
         zdUser.setDealId(dto.getDealId());
         zdUserService.updateById(zdUser);
     }
+
+    @Override
+    public List<HdInfo> grzdHd(Long id) {
+        QueryWrapper<HdZd> hzQW = new QueryWrapper<>();
+        hzQW.lambda().eq(HdZd::getZdId,id);
+        List<HdZd> hdZdList = hdZdService.list(hzQW);
+        if (hdZdList.isEmpty()) return Collections.emptyList();
+        Set<Long> hdIdSet = hdZdList.stream().map(HdZd::getHdId).collect(Collectors.toSet());
+        return hdInfoService.listByIds(hdIdSet);
+    }
 }

+ 37 - 0
ruoyi-service/src/main/resources/mapper/cg/CgInfoMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.mapper.CgInfoMapper">
+    
+    <resultMap type="CgInfo" id="CgInfoResult">
+        <result property="id"    column="id"    />
+        <result property="ddh"    column="ddh"    />
+        <result property="pp"    column="pp"    />
+        <result property="xh"    column="xh"    />
+        <result property="ts"    column="ts"    />
+        <result property="mtgs"    column="mtgs"    />
+        <result property="jg"    column="jg"    />
+        <result property="fileDdjt"    column="file_ddjt"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,
+        ddh,
+        pp,
+        xh,
+        ts,
+        mtgs,
+        jg,
+        file_ddjt,
+        create_by,
+        create_time,
+        update_by,
+        update_time
+    </sql>
+
+</mapper>

+ 33 - 0
ruoyi-service/src/main/resources/mapper/file/FileInfoMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.mapper.FileInfoMapper">
+    
+    <resultMap type="FileInfo" id="FileInfoResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="type"    column="type"    />
+        <result property="size"    column="size"    />
+        <result property="md5"    column="md5"    />
+        <result property="path"    column="path"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,
+        name,
+        type,
+        size,
+        md5,
+        path,
+        create_by,
+        create_time,
+        update_by,
+        update_time
+    </sql>
+
+</mapper>

+ 9 - 4
ruoyi-service/src/main/resources/mapper/hd/HdInfoMapper.xml

@@ -30,12 +30,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update_time
     </sql>
 
-    <select id="grzd" resultMap="grzdResultMap">
-        select * from v_his_zd
+    <select id="hdUser" resultType="HdUserDTO">
+        select hq.user_id,nick_name from hd_qd hq
+        left join ry.sys_user su on hq.user_id = su.user_id
         <where>
-            and user_id = #{userId}
-            <if test="ny != null and ny != ''"> and ny = #{ny} </if>
+            and fid = #{id}
         </where>
+        order by qdsj
+    </select>
+
+    <select id="hdWqd" resultType="HdWqdDTO">
+        select user_id,nick_name from ry.sys_user where user_id not in (1,2) and user_id not in (select user_id from hd_qd where fid = #{id})
     </select>
 
 </mapper>

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -11,6 +11,8 @@ import com.ruoyi.common.core.domain.entity.SysUser;
  */
 public interface SysUserMapper
 {
+    List<SysUser> selectUserListByIds(@Param("idList") List<Long> idList);
+
     /**
      * 根据条件分页查询用户列表
      * 

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -10,6 +10,8 @@ import com.ruoyi.common.core.domain.entity.SysUser;
  */
 public interface ISysUserService
 {
+    public List<SysUser> selectUserListByIds(List<Long> idList);
+
     /**
      * 根据条件分页查询用户列表
      * 

+ 6 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.validation.Validator;
@@ -69,6 +70,11 @@ public class SysUserServiceImpl implements ISysUserService
     @Autowired
     protected Validator validator;
 
+    @Override
+    public List<SysUser> selectUserListByIds(List<Long> idList) {
+        return userMapper.selectUserListByIds(idList);
+    }
+
     /**
      * 根据条件分页查询用户列表
      * 

+ 10 - 0
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -56,6 +56,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		    left join sys_user_role ur on u.user_id = ur.user_id
 		    left join sys_role r on r.role_id = ur.role_id
     </sql>
+
+	<select id="selectUserListByIds" resultMap="SysUserResult">
+		<include refid="selectUserVo" />
+		<where>
+			and u.user_id in
+			<foreach item="item" collection="idList" open="(" separator="," close=")">
+				#{item}
+			</foreach>
+		</where>
+	</select>
     
     <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u