From 98d23d2bff330b6d1b30dde59f4e828ad255b2bb Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 09 五月 2026 09:21:30 +0800
Subject: [PATCH] feat(approve): 添加日志报表功能模块

---
 src/main/java/com/ruoyi/approve/bean/dto/LogReportDto.java             |   22 +++
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java       |    8 
 src/main/java/com/ruoyi/approve/mapper/LogReportMapper.java            |   23 +++
 src/main/java/com/ruoyi/approve/controller/LogReportController.java    |   63 +++++++++
 src/main/java/com/ruoyi/approve/pojo/LogReport.java                    |   84 ++++++++++++
 src/main/java/com/ruoyi/approve/service/impl/LogReportServiceImpl.java |  107 +++++++++++++++
 src/main/resources/mapper/approve/LogReportMapper.xml                  |   58 ++++++++
 src/main/java/com/ruoyi/approve/service/LogReportService.java          |   26 +++
 8 files changed, 385 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/bean/dto/LogReportDto.java b/src/main/java/com/ruoyi/approve/bean/dto/LogReportDto.java
new file mode 100644
index 0000000..6d0f8ed
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/bean/dto/LogReportDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.approve.bean.dto;
+
+import com.ruoyi.approve.pojo.LogReport;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LogReportDto extends LogReport {
+    @Schema(description = "鎶勯�佷汉鍚嶇О")
+    private String ccUserName;
+
+    @Schema(description = "鎶勯�佷汉ids")
+    private List<Long> ccUserIds;
+
+    private String createUserName;
+
+
+    private String  startTime;
+    private String  endTime;
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/LogReportController.java b/src/main/java/com/ruoyi/approve/controller/LogReportController.java
new file mode 100644
index 0000000..8d04b47
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/controller/LogReportController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.approve.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.bean.dto.LogReportDto;
+import com.ruoyi.approve.service.LogReportService;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鏃ュ織琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-08 01:51:13
+ */
+@RestController
+@RequestMapping("/sysLogReport")
+@Tag(name = "鏃ュ織绠$悊")
+@AllArgsConstructor
+public class LogReportController {
+
+    private final LogReportService logReportService;
+
+    @GetMapping("/listPage")
+    @Operation(summary = "鍒嗛〉鏌ヨ鏃ュ織鍒楄〃")
+    public R listPage(Page page, LogReportDto sysLogReport) {
+        IPage<LogReportDto> logReportDtoIPage =logReportService.listPage(page, sysLogReport);
+        return R.ok(logReportDtoIPage);
+    }
+
+    @PostMapping("/add")
+    @Operation(summary = "娣诲姞鏃ュ織")
+    public R add(@RequestBody LogReportDto sysLogReport) {
+        return logReportService.add(sysLogReport) ? R.ok() : R.fail();
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "鏇存柊鏃ュ織")
+    public R update( @RequestBody LogReportDto sysLogReport) {
+        return logReportService.updateSysLogReportDto(sysLogReport) ? R.ok() : R.fail();
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎鏃ュ織")
+    public R delete(@RequestBody List<Long> ids) {
+        return logReportService.removeBatchByIds(ids) ? R.ok() : R.fail();
+    }
+
+    @Operation(summary = "鎺ㄩ�佹棩蹇椾俊鎭埌鐢ㄦ埛")
+    @PostMapping("/pushLogReport")
+    public void pushLogReport(@RequestBody LogReportDto sysLogReportDto) {
+        logReportService.pushLogReport(sysLogReportDto) ;
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/LogReportMapper.java b/src/main/java/com/ruoyi/approve/mapper/LogReportMapper.java
new file mode 100644
index 0000000..7b00753
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/mapper/LogReportMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.approve.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.bean.dto.LogReportDto;
+import com.ruoyi.approve.pojo.LogReport;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏃ュ織琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-08 01:51:13
+ */
+@Mapper
+public interface LogReportMapper extends BaseMapper<LogReport> {
+
+    IPage<LogReportDto> listPage(Page page, @Param("ew") LogReportDto sysLogReport, @Param("userId") Long userId);
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/LogReport.java b/src/main/java/com/ruoyi/approve/pojo/LogReport.java
new file mode 100644
index 0000000..45fff38
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/pojo/LogReport.java
@@ -0,0 +1,84 @@
+package com.ruoyi.approve.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏃ュ織琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-08 01:51:13
+ */
+@Getter
+@Setter
+@ToString
+@TableName("log_report")
+@ApiModel(value = "SysLogReport瀵硅薄", description = "鏃ュ織琛�")
+public class LogReport implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @Schema(description = "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 鏃ュ織鏍囬
+     */
+    @Schema(description = "鏃ュ織鏍囬")
+    private String title;
+    /**
+     * 鎶ュ憡绫诲瀷锛氭棩鎶ワ紝鍛ㄦ姤锛屾湀鎶�
+     */
+    @Schema(description = "鎶ュ憡绫诲瀷锛氭棩鎶ワ紝鍛ㄦ姤锛屾湀鎶�")
+    private String reportType;
+    /**
+     * 鏃ュ織绫诲瀷锛歸ork/project/problem/other
+     */
+    @Schema(description = "鏃ュ織绫诲瀷锛歸ork/project/problem/other")
+    private String logType;
+    /**
+     * 鏃ュ織鍐呭
+     */
+    @Schema(description = "鏃ュ織鍐呭")
+    private String content;
+    /**
+     * 鎺ㄩ�佺姸鎬侊細0鏈帹閫� 1宸叉帹閫� 2鎺ㄩ�佸け璐�
+     */
+    @Schema(description = "鎺ㄩ�佺姸鎬侊細0鏈帹閫� 1宸叉帹閫� 2鎺ㄩ�佸け璐�")
+    private Integer pushStatus;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer deptId;
+
+    @Schema(description = "鎶勯�佷汉")
+    private String ccUsers;
+}
diff --git a/src/main/java/com/ruoyi/approve/service/LogReportService.java b/src/main/java/com/ruoyi/approve/service/LogReportService.java
new file mode 100644
index 0000000..3a1d23f
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/LogReportService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.approve.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.approve.bean.dto.LogReportDto;
+import com.ruoyi.approve.pojo.LogReport;
+
+/**
+ * <p>
+ * 鏃ュ織琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-08 01:51:13
+ */
+public interface LogReportService extends IService<LogReport> {
+
+    IPage<LogReportDto> listPage(Page page, LogReportDto sysLogReport);
+
+    Boolean add(LogReportDto sysLogReport);
+
+    Boolean updateSysLogReportDto(LogReportDto sysLogReport);
+
+    void pushLogReport(LogReportDto sysLogReportDto);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/LogReportServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/LogReportServiceImpl.java
new file mode 100644
index 0000000..aea0e0b
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/impl/LogReportServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.approve.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.approve.bean.dto.LogReportDto;
+import com.ruoyi.approve.mapper.LogReportMapper;
+import com.ruoyi.approve.pojo.LogReport;
+import com.ruoyi.approve.service.LogReportService;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏃ュ織琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-08 01:51:13
+ */
+@Service
+@RequiredArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class LogReportServiceImpl extends ServiceImpl<LogReportMapper, LogReport> implements LogReportService {
+
+    private final LogReportMapper sysLogReportMapper;
+    private final ISysNoticeService sysNoticeService;
+    private final SysUserMapper sysUserMapper;
+
+    @Override
+    public IPage<LogReportDto> listPage(Page page, LogReportDto sysLogReport) {
+        Long userId = SecurityUtils.getUserId();
+        IPage<LogReportDto> logReportDtoIPage = sysLogReportMapper.listPage(page, sysLogReport, userId);
+        logReportDtoIPage.getRecords().forEach(sysLogReportDto -> {
+            String ccUsers = sysLogReportDto.getCcUsers();
+            if (StringUtils.isBlank(ccUsers)) {
+                return;
+            }
+            List<Long> userIdList = Arrays.stream(ccUsers.split(","))
+                    .filter(StringUtils::isNotBlank)  // 杩囨护绌哄瓧绗︿覆
+                    .map(String::trim)                 // 鍘婚櫎绌烘牸
+                    .map(Long::parseLong)              // 杞崲涓� Long
+                    .collect(Collectors.toList());     // 鏀堕泦涓� List
+            sysLogReportDto.setCcUserIds(userIdList);
+            if (!userIdList.isEmpty()) {
+                List<SysUser> users = sysUserMapper.selectUsersByIds(userIdList);
+                String userNames = users.stream()
+                        .filter(Objects::nonNull)
+                        .map(SysUser::getNickName)
+                        .filter(StringUtils::isNotBlank)
+                        .collect(Collectors.joining(","));
+
+                // 濡傛灉鎵�鏈夌敤鎴烽兘娌℃湁鏄电О锛岃缃负绌哄瓧绗︿覆
+                sysLogReportDto.setCcUserName(StringUtils.isNotBlank(userNames) ? userNames : "");
+            } else {
+                sysLogReportDto.setCcUserName("");
+            }
+        });
+        return logReportDtoIPage;
+    }
+
+    @Override
+    public Boolean add(LogReportDto sysLogReport) {
+        String collect = sysLogReport.getCcUserIds().stream()
+                .map(String::valueOf)           // Long 鈫� String
+                .collect(Collectors.joining(","));// 鎷兼帴涓� "1,2,3"
+        sysLogReport.setCcUsers(collect);
+        sysLogReport.setPushStatus(1);
+        this.save(sysLogReport);
+        if (ObjectUtils.isNotEmpty(sysLogReport.getCcUserIds())) {
+            pushLogReport(sysLogReport);
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean updateSysLogReportDto(LogReportDto sysLogReport) {
+        String collect = sysLogReport.getCcUserIds().stream()
+                .map(String::valueOf)           // Long 鈫� String
+                .collect(Collectors.joining(","));// 鎷兼帴涓� "1,2,3"
+        sysLogReport.setCcUsers(collect);
+        sysLogReport.setPushStatus(1);
+        if (ObjectUtils.isNotEmpty(sysLogReport.getCcUserIds())) {
+            pushLogReport(sysLogReport);
+        }
+        return this.updateById(sysLogReport);
+    }
+
+    @Override
+    public void pushLogReport(LogReportDto sysLogReportDto) {
+        LogReport byId = this.getById(sysLogReportDto.getId());
+        sysNoticeService.simpleNoticeByUser(byId.getTitle(), byId.getContent(), sysLogReportDto.getCcUserIds(), "/collaborativeApproval/journal");
+
+    }
+}
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
index 5507b3f..a3ed052 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -1,15 +1,11 @@
 package com.ruoyi.project.system.mapper;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.collaborativeApproval.pojo.MeetingMinutes;
+import com.ruoyi.project.system.domain.SysUser;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
-import com.ruoyi.project.system.domain.SysUser;
-import org.springframework.beans.PropertyValues;
+import java.util.List;
 
 /**
  * 鐢ㄦ埛琛� 鏁版嵁灞�
diff --git a/src/main/resources/mapper/approve/LogReportMapper.xml b/src/main/resources/mapper/approve/LogReportMapper.xml
new file mode 100644
index 0000000..be38f89
--- /dev/null
+++ b/src/main/resources/mapper/approve/LogReportMapper.xml
@@ -0,0 +1,58 @@
+<?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.approve.mapper.LogReportMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.LogReport">
+        <id column="id" property="id" />
+        <result column="title" property="title" />
+        <result column="report_type" property="reportType" />
+        <result column="log_type" property="logType" />
+        <result column="content" property="content" />
+        <result column="push_status" property="pushStatus" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="dept_id" property="deptId" />
+    </resultMap>
+    <select id="listPage" resultType="com.ruoyi.approve.bean.dto.LogReportDto">
+        select
+        slr.*,
+        su.nick_name as create_user_name
+        from
+        log_report slr
+        left join sys_user su on slr.create_user = su.user_id
+        <where>
+            <if test="ew.title != null and ew.title != ''">
+                and slr.title like concat('%', #{ew.title}, '%')
+            </if>
+            <if test="ew.logType != null and ew.logType != ''">
+                and slr.log_type = #{ew.logType}
+            </if>
+            <if test="ew.reportType != null and ew.reportType != ''">
+                and slr.report_type = #{ew.reportType}
+            </if>
+            <if test="ew.pushStatus != null and ew.pushStatus != ''">
+                and slr.push_status = #{ew.pushStatus}
+            </if>
+            <if test="ew.createUser != null and ew.createUser != ''">
+                and slr.create_user = #{ew.createUser}
+            </if>
+            <if test="ew.startTime != null and ew.endTime !=''">
+                and slr.create_time between #{ew.startTime} and #{ew.endTime}
+            </if>
+
+            <if test="ew.ccUserIds != null">
+                and (
+                slr.create_user = #{userId}
+                or (
+                slr.cc_users is not null
+                and slr.cc_users != ''
+                and find_in_set(#{userId}, slr.cc_users)
+                )
+                )
+            </if>
+        </where>
+        order by slr.create_time desc
+    </select>
+
+</mapper>

--
Gitblit v1.9.3