From 7e8773c06d9391c94b7a0111b63d17cf5bdb6d8e Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 17 九月 2025 14:43:55 +0800
Subject: [PATCH] 发起请假审批

---
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java                            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java                      |  175 +++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java                             |   28 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java               |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java                 |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java              |   25 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java     |   10 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java |   59 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java                |    2 
 ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml                       |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java                      |   15 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java      |   23 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java          |   22 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java                    |   16 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java         |  156 +++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java                              |  103 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java                |   21 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java                 |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java      |   45 +++
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java                        |    7 
 20 files changed, 749 insertions(+), 9 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
index cc9bf2d..60f51a2 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
@@ -1,8 +1,30 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.TDept;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.dto.AddLeaveDTO;
+import com.ruoyi.system.dto.SetApprovalDTO;
+import com.ruoyi.system.model.OaApprovalApplications;
+import com.ruoyi.system.model.OaApprovalFlowNode;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.utils.ApprovalTypeEnum;
+import com.ruoyi.system.utils.UUIDUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.Date;
 
 /**
  * <p>
@@ -13,8 +35,43 @@
  * @since 2025-09-15
  */
 @RestController
+@Api("审批-发起审批")
 @RequestMapping("/oa-approval-applications")
 public class OaApprovalApplicationsController {
-
+    @Resource
+    private OaApprovalService approvalService;
+    @Resource
+    private TokenService tokenService;
+    @Resource
+    private OaApprovalApplicationsService approvalApplicationsService;
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private OaApprovalApplicationAttendanceService approvalApplicationAttendanceService;
+    @Resource
+    private TDeptService deptService;
+    @Log(title = "审批-发起请假", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "发起请假")
+    @PostMapping(value = "/setApproval")
+    public R setDept(@RequestBody AddLeaveDTO dto) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        String code = "qj"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
+        oaApprovalApplications.setApplicationCode(code);
+        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.LEAVE_APPLICATION.getId());
+        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
+        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
+        TDept dept = deptService.getById(sysUser.getDeptId());
+        oaApprovalApplications.setApplicantName(sysUser.getNickName());
+        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
+        oaApprovalApplications.setDeptName(dept.getDeptName());
+        oaApprovalApplications.setApplicationDate(LocalDate.now());
+        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
+        oaApprovalApplications.setApprovalStatus(1);
+        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
+//        oaApprovalApplications.setCurrentFlowNodeId();
+        approvalApplicationsService.save(oaApprovalApplications);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java
index 25826b7..d3b950d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java
@@ -1,8 +1,10 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.system.dto.SetApprovalDTO;
 import com.ruoyi.system.dto.SetDeptDTO;
 import com.ruoyi.system.model.OaApproval;
@@ -35,11 +37,11 @@
     private OaApprovalFlowNodeService oaApprovalFlowNodeService;
 
     /**
-     * 获取部门树列表
+     * 审批流程设计列表
      */
     @ApiOperation("审批流程设计列表")
-    @PostMapping("/pageList")
-    public R<List<OaApprovalFlowNode>> pageList(@RequestBody ApprovalListQuery query) {
+    @PostMapping("list")
+    public R<List<OaApprovalFlowNode>> list(@RequestBody ApprovalListQuery query) {
         return R.ok( oaApprovalFlowNodeService.pageList(query));
     }
     @ApiOperation(value = "启用禁用")
@@ -58,6 +60,8 @@
         oaApprovalFlowNodeService.updateById(approval);
         return R.ok();
     }
+    @Log(title = "审批流程-设置审批人", businessType = BusinessType.UPDATE)
+
     @ApiOperation(value = "设置审批人")
     @PostMapping(value = "/setApproval")
     public R setDept(@RequestBody SetApprovalDTO dto) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
index 4ec73e1..3f36a01 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
@@ -1,8 +1,35 @@
 package com.ruoyi.web.controller.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.TDept;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.dto.SetDeptDTO;
+import com.ruoyi.system.model.OaApproval;
+import com.ruoyi.system.model.OaNotifationUser;
+import com.ruoyi.system.model.OaNotification;
+import com.ruoyi.system.query.ApprovalListQuery;
+import com.ruoyi.system.query.NotificationListQuery;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.vo.system.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.sql.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -13,8 +40,133 @@
  * @since 2025-09-15
  */
 @RestController
+@Api("消息通知")
 @RequestMapping("/oa-notification")
 public class OaNotificationController {
+    @Resource
+    private OaNotificationService oaNotificationService;
+    @Resource
+    private OaNotifationUserService oaNotifationUserService;
+    @Resource
+    private TDeptService deptService;
+    @Resource
+    private ISysUserService sysUserService;
 
+    /**
+     * 获取部门树列表
+     */
+    @ApiOperation("消息通知分页列表")
+    @PostMapping("/pageList")
+    public R<PageInfo<NotificationVO>> pageList(@RequestBody NotificationListQuery query) {
+        return R.ok(oaNotificationService.pageList(query));
+    }
+
+    @ApiOperation(value = "删除消息通知")
+    @Log(title = "删除消息通知", businessType = BusinessType.DELETE)
+
+    @DeleteMapping(value = "/delete")
+    public R delete(@RequestParam String ids) {
+        List<String> notificationIds = Arrays.asList(ids.split(","));
+        // 删除后 将已发送的消息通知一并删除
+        oaNotificationService.removeBatchByIds(notificationIds);
+        oaNotifationUserService.remove(new LambdaQueryWrapper<OaNotifationUser>()
+                .in(OaNotifationUser::getNotificationId,notificationIds));
+        return R.ok();
+    }
+    @Log(title = "消息通知-新增消息", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增消息")
+    @PostMapping(value = "/add")
+    public R<Boolean> add( @RequestBody OaNotification dto) {
+        oaNotificationService.save(dto);
+        ArrayList<OaNotifationUser> oaNotifationUsers = new ArrayList<>();
+        // 发送消息通知
+        if (dto.getType()){
+            // 指定人员发送
+            Arrays.asList(dto.getUserIds().split(","))
+                    .forEach(userId -> {
+                        OaNotifationUser oaNotifationUser = new OaNotifationUser();
+                        oaNotifationUser.setUserId(Integer.parseInt(userId));
+                        oaNotifationUser.setNotificationId(dto.getId());
+                        oaNotifationUsers.add(oaNotifationUser);
+                    });
+        }else{
+            // 所有人发送
+            List<SysUser> sysUsers = sysUserService.selectAllList();
+            sysUsers.forEach(sysUser -> {
+                OaNotifationUser oaNotifationUser = new OaNotifationUser();
+                oaNotifationUser.setUserId(sysUser.getUserId().intValue());
+                oaNotifationUser.setNotificationId(dto.getId());
+                oaNotifationUsers.add(oaNotifationUser);
+            });
+        }
+        oaNotifationUserService.saveBatch(oaNotifationUsers);
+        return R.ok();
+    }
+    @ApiOperation(value = "消息通知详情")
+    @GetMapping(value = "/detail")
+    public R<NotificationDetailVO> detail(String id) {
+        NotificationDetailVO notificationDetailVO = new NotificationDetailVO();
+        OaNotification oaNotification = oaNotificationService.getById(id);
+        BeanUtils.copyProperties(oaNotification, notificationDetailVO);
+        StringBuilder deptName = new StringBuilder();
+        List<TDept> tDepts = deptService.list();
+        List<SysUser> sysUsers = sysUserService.selectAllList();
+        List<OaNotifationUser> notifationUsers = oaNotifationUserService.lambdaQuery().eq(OaNotifationUser::getNotificationId, id)
+                .list();
+        Map<Integer, String> deptMap = tDepts.stream().collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
+        Map<Long, SysUser> userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, e->e));
+        if (oaNotification.getType()){
+            for (String deptId : oaNotification.getDeptIds().split(",")) {
+                String orDefault = deptMap.getOrDefault(Integer.parseInt(deptId), "");
+                deptName.append(orDefault).append(",");
+            }
+            notificationDetailVO.setDeptName(deptName.substring(0,deptName.length()-1));
+            List<NotificationDeptUserDetailVO> notificationUserVOS = new ArrayList<>();
+            List<Long> userIds = notifationUsers.stream().map(e -> e.getUserId().longValue()).collect(Collectors.toList());
+            if (!userIds.isEmpty()){
+                Map<String, List<SysUser>> deptUserList = sysUsers.stream().filter(e -> userIds.contains(e.getUserId()))
+                        .collect(Collectors.groupingBy(SysUser::getDeptId));
+                // 遍历这个map
+                for (Map.Entry<String, List<SysUser>> entry : deptUserList.entrySet()) {
+                    List<SysUser> users = entry.getValue();
+                    String deptId = entry.getKey();
+                    NotificationDeptUserDetailVO notificationDeptUserDetailVO = new NotificationDeptUserDetailVO();
+                    notificationDeptUserDetailVO.setDeptName(deptMap.getOrDefault(Integer.parseInt(deptId), ""));
+                    notificationDeptUserDetailVO.setUsers(users);
+                    // 查询部门下的员工数是否和users一致
+                    long count = sysUsers.stream().filter(e -> e.getDeptId().equals(deptId)).count();
+                    if (count==users.size()){
+                        notificationDeptUserDetailVO.setIsAll(true);
+                    }else{
+                        notificationDeptUserDetailVO.setIsAll(false);
+                    }
+                    notificationUserVOS.add(notificationDeptUserDetailVO);
+                }
+            }
+            notificationDetailVO.setNotificationDeptUserDetailVOList(notificationUserVOS);
+
+        }else{
+
+            notificationDetailVO.setDeptName("全部人员");
+        }
+        List<NotificationUserDetailVO> notificationUserDetailVOS = new ArrayList<>();
+
+        for (OaNotifationUser notifationUser : notifationUsers) {
+            NotificationUserDetailVO notificationUserDetailVO = new NotificationUserDetailVO();
+            BeanUtils.copyProperties(notifationUser, notificationUserDetailVO);
+            SysUser sysUser = userMap.get(notifationUser.getUserId().longValue());
+            if (sysUser==null){
+                continue;
+            }
+            notificationUserDetailVO.setDeptName(deptMap.getOrDefault(Integer.parseInt(sysUser.getDeptId()), ""));
+            notificationUserDetailVO.setNickName(sysUser.getNickName());
+            notificationUserDetailVO.setPhonenumber(sysUser.getPhonenumber());
+            notificationUserDetailVO.setPosition(sysUser.getPosition());
+            notificationUserDetailVOS.add(notificationUserDetailVO);
+        }
+
+        notificationDetailVO.setNotificationUserDetailVOS(notificationUserDetailVOS);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java
new file mode 100644
index 0000000..d600dde
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "发起请假申请记录DTO")
+public class AddLeaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
+    private Double duration;
+    @ApiModelProperty(value = "事由/原因/说明")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java
new file mode 100644
index 0000000..bfdfddb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.dto;
+
+import com.ruoyi.common.core.domain.entity.TDept;
+import com.ruoyi.system.model.OaNotification;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "新增编辑消息通知DTO")
+public class AddNotificationDTO extends OaNotification {
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
index b4410f2..d50c11c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
@@ -1,7 +1,13 @@
 package com.ruoyi.system.mapper;
 
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.OaNotification;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.query.NotificationListQuery;
+import com.ruoyi.system.vo.system.NotificationVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,6 @@
  */
 public interface OaNotificationMapper extends BaseMapper<OaNotification> {
 
+    List<NotificationVO> pageList(@Param("query")NotificationListQuery query, @Param("pageInfo")PageInfo<NotificationVO> pageInfo);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java
index 10fb53d..8292ad7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java
@@ -36,7 +36,7 @@
     @TableField("approval_name")
     private String approvalName;
 
-    @ApiModelProperty(value = "审批类型 1-请假申请,2-外出申请,3-出差申请,4-销假申请,5-采购申请,6-资产入库,7-物品领用,8-借用归还,9-资产处置,10-资产表更,11-报销申请,12-款项申请,13-进度款支付,14-内部联系单,15-广告制作申请")
+    @ApiModelProperty(value = "审批类型 1-请假申请,2-外出申请,3-出差申请,4-销假申请,5-采购申请,6-资产入库,7-物品领用,8-物品借用,9-借用归还,10-资产处置,11-资产表更,12-报销申请,13-款项申请,14-合同文件,15-进度款支付,16-内部联系单,17-广告制作申请")
     @TableField("approval_category")
     private Boolean approvalCategory;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
index 80c258b..8510900 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
@@ -67,7 +67,7 @@
 
     @ApiModelProperty(value = "审批状态 0-草稿,1-待审批,2-审批通过,3-审批拒绝 ,4-已撤回")
     @TableField("approval_status")
-    private Boolean approvalStatus;
+    private Integer approvalStatus;
 
     @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
     @TableField("attachment_url")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
index 937d503..f5db75a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
@@ -64,5 +64,10 @@
     @TableField("disabled")
     private Boolean disabled;
 
-
+    @ApiModelProperty(value = "通知部门ids 逗号拼接")
+    @TableField("dept_ids")
+    private String deptIds;
+    @ApiModelProperty(value = "指定人员ids 逗号拼接")
+    @TableField(exist = false)
+    private String userIds;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
new file mode 100644
index 0000000..948f083
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "消息通知分页列表query")
+public class NotificationListQuery extends BasePage {
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+    @ApiModelProperty(value = "部门ids 前端忽略")
+    private List<Integer> deptIds;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
index 7bf2dc8..30e62a8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
@@ -1,7 +1,10 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.OaNotification;
+import com.ruoyi.system.query.NotificationListQuery;
+import com.ruoyi.system.vo.system.NotificationVO;
 
 /**
  * <p>
@@ -13,4 +16,6 @@
  */
 public interface OaNotificationService extends IService<OaNotification> {
 
+    PageInfo<NotificationVO> pageList(NotificationListQuery query);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
index 77d6ed2..e581beb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
@@ -1,10 +1,22 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.system.mapper.OaNotificationMapper;
+import com.ruoyi.system.mapper.TDeptMapper;
 import com.ruoyi.system.model.OaNotification;
+import com.ruoyi.system.query.NotificationListQuery;
 import com.ruoyi.system.service.OaNotificationService;
+import com.ruoyi.system.vo.system.NotificationVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +29,37 @@
 @Service
 public class OaNotificationServiceImpl extends ServiceImpl<OaNotificationMapper, OaNotification> implements OaNotificationService {
 
+    @Autowired
+    private TDeptMapper deptMapper;
+    @Override
+    public PageInfo<NotificationVO> pageList(NotificationListQuery query) {
+        List<TDept> tDepts = deptMapper.selectList(null);
+        Map<Integer, String> deptMap = tDepts.stream().collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
+        if (StringUtils.hasLength(query.getDeptName())){
+            List<Integer> deptIds = deptMapper.selectList(new LambdaQueryWrapper<TDept>().like(TDept::getDeptName, query.getDeptName()))
+                    .stream().map(TDept::getId).collect(Collectors.toList());
+            if (deptIds.isEmpty()){
+                return new PageInfo<>();
+            }
+            query.setDeptIds(deptIds);
+        }
+        PageInfo<NotificationVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<NotificationVO> list = this.baseMapper.pageList(query,pageInfo);
+        for (NotificationVO notificationVO : list) {
+            StringBuilder deptName = new StringBuilder();
+            if (notificationVO.getType()){
+                for (String deptId : notificationVO.getDeptIds().split(",")) {
+                    String orDefault = deptMap.getOrDefault(Integer.parseInt(deptId), "");
+                    deptName.append(orDefault).append(",");
+                }
+                notificationVO.setDeptName(deptName.substring(0,deptName.length()-1));
+            }else{
+                notificationVO.setDeptName("全部人员");
+
+            }
+
+        }
+        pageInfo.setRecords(list);
+        return null;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java
new file mode 100644
index 0000000..c3cc586
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java
@@ -0,0 +1,175 @@
+package com.ruoyi.system.utils;
+
+/**
+ * 审批类型枚举
+ *
+ * @author YourName
+ * @since 2025-09-17
+ */
+public enum ApprovalTypeEnum {
+    
+    /**
+     * 请假申请
+     */
+    LEAVE_APPLICATION(1, "请假申请"),
+    
+    /**
+     * 外出申请
+     */
+    OUT_APPLICATION(2, "外出申请"),
+    
+    /**
+     * 出差申请
+     */
+    BUSINESS_TRIP_APPLICATION(3, "出差申请"),
+    
+    /**
+     * 销假申请
+     */
+    LEAVE_CANCELLATION_APPLICATION(4, "销假申请"),
+    
+    /**
+     * 采购申请
+     */
+    PURCHASE_APPLICATION(5, "采购申请"),
+    
+    /**
+     * 资产入库
+     */
+    ASSET_STORAGE(6, "资产入库"),
+    
+    /**
+     * 物品领用
+     */
+    ITEM_RECEIVE(7, "物品领用"),
+    
+    /**
+     * 物品借用
+     */
+    ITEM_BORROW(8, "物品借用"),
+    
+    /**
+     * 借用归还
+     */
+    BORROW_RETURN(9, "借用归还"),
+    
+    /**
+     * 资产处置
+     */
+    ASSET_DISPOSAL(10, "资产处置"),
+    
+    /**
+     * 资产变更
+     */
+    ASSET_CHANGE(11, "资产变更"),
+    
+    /**
+     * 报销申请
+     */
+    REIMBURSEMENT_APPLICATION(12, "报销申请"),
+    
+    /**
+     * 款项申请
+     */
+    PAYMENT_APPLICATION(13, "款项申请"),
+    
+    /**
+     * 合同文件
+     */
+    CONTRACT_DOCUMENT(14, "合同文件"),
+    
+    /**
+     * 进度款支付
+     */
+    PROGRESS_PAYMENT(15, "进度款支付"),
+    
+    /**
+     * 内部联系单
+     */
+    INTERNAL_CONTACT_FORM(16, "内部联系单"),
+    
+    /**
+     * 广告制作申请
+     */
+    ADVERTISEMENT_APPLICATION(17, "广告制作申请");
+
+    private final Integer id;
+    private final String name;
+
+    /**
+     * 构造方法
+     *
+     * @param id   审批类型ID
+     * @param name 审批类型名称
+     */
+    ApprovalTypeEnum(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    /**
+     * 获取审批类型ID
+     *
+     * @return 审批类型ID
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * 获取审批类型名称
+     *
+     * @return 审批类型名称
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * 根据ID获取审批类型枚举
+     *
+     * @param id 审批类型ID
+     * @return 对应的审批类型枚举,如果未找到返回null
+     */
+    public static ApprovalTypeEnum getById(Integer id) {
+        if (id == null) {
+            return null;
+        }
+        
+        for (ApprovalTypeEnum type : values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据名称获取审批类型枚举
+     *
+     * @param name 审批类型名称
+     * @return 对应的审批类型枚举,如果未找到返回null
+     */
+    public static ApprovalTypeEnum getByName(String name) {
+        if (name == null || name.isEmpty()) {
+            return null;
+        }
+        
+        for (ApprovalTypeEnum type : values()) {
+            if (type.name.equals(name)) {
+                return type;
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * 判断给定ID是否为有效的审批类型
+     *
+     * @param id 审批类型ID
+     * @return 是否有效
+     */
+    public static boolean isValidId(Integer id) {
+        return getById(id) != null;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java
new file mode 100644
index 0000000..e9e3c62
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java
@@ -0,0 +1,103 @@
+package com.ruoyi.system.utils;
+
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 定义生成随机码的工具类
+ */
+public class UUIDUtil {
+
+    private int i = 1;
+
+
+    /**
+     * 定义生成原生的UUID随机码
+     *
+     * @return
+     */
+    public static String getNativeUUID() {
+        return UUID.randomUUID().toString();
+    }
+
+
+    /**
+     * 生成32位随机码
+     *
+     * @return
+     */
+    public static String getRandomCode() {
+        return UUIDUtil.getNativeUUID().replaceAll("-", "");
+    }
+
+
+    /**
+     * 获取给定长度的随机码
+     *
+     * @param num
+     * @return
+     * @throws Exception
+     */
+    public static String getRandomCode(Integer num) throws Exception {
+        String str = null;
+        if (0 < num) {
+            if (num % 32 > 0) {
+                Integer s = num / 32;
+                Integer l = num % 32;
+                StringBuffer sb = new StringBuffer();
+                for (int i = 0; i < s; i++) {
+                    sb.append(UUIDUtil.getRandomCode());
+                }
+                sb.append(UUIDUtil.getRandomCode().substring(0, l));
+                str = sb.toString();
+            } else if (num % 32 == 0) {
+                Integer s = num / 32;
+                StringBuffer sb = new StringBuffer();
+                for (int i = 0; i < s; i++) {
+                    sb.append(UUIDUtil.getRandomCode());
+                }
+                str = sb.toString();
+            } else {
+                str = UUIDUtil.getRandomCode().substring(0, num);
+            }
+        } else {
+            throw new Exception("参数只能大于0");
+        }
+        return str;
+    }
+
+
+    /**
+     * 获取根据当前时间的字符串数据
+     *
+     * @return
+     */
+    public synchronized static String getTimeStr() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmssS");
+        return simpleDateFormat.format(new Date());
+    }
+
+
+    /**
+     * @Description: 获取数字随机码
+     * @Author pzb
+     * @Date 2021/8/11 16:52
+     * @Param
+     * @Return
+     * @Exception
+     */
+    public static String getNumberRandom(Integer num) {
+        if (null == num) {
+            num = 32;
+        }
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < num; i++) {
+            sb.append(Double.valueOf(Math.random() * 10).intValue());
+        }
+        return sb.toString();
+    }
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java
new file mode 100644
index 0000000..98c28c5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.vo.system;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.system.model.OaNotifationUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "通知对象返回VO")
+public class NotificationDeptUserDetailVO {
+
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "人员列表")
+    private List<SysUser> users;
+    @ApiModelProperty(value = "是否全部 ")
+    private Boolean isAll;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java
new file mode 100644
index 0000000..1b30980
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.vo.system;
+
+import com.ruoyi.system.model.OaNotification;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "消息通知分页返回VO")
+public class NotificationDetailVO extends OaNotification {
+
+    @ApiModelProperty(value = "通知部门")
+    private String deptName;
+
+    @ApiModelProperty(value = "通知对象列表")
+    private List<NotificationUserDetailVO> notificationUserDetailVOS;
+
+    @ApiModelProperty(value = "部门-人员列表")
+    private List<NotificationDeptUserDetailVO> notificationDeptUserDetailVOList;
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java
new file mode 100644
index 0000000..c280777
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.vo.system;
+
+import com.ruoyi.system.model.OaNotifationUser;
+import com.ruoyi.system.model.OaNotification;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "通知对象返回VO")
+public class NotificationUserDetailVO extends OaNotifationUser {
+
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+    @ApiModelProperty(value = "姓名")
+    private String nickName;
+    @ApiModelProperty(value = "电话")
+    private String phonenumber;
+    @ApiModelProperty(value = "职位")
+    private String position;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java
new file mode 100644
index 0000000..f40d58b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.vo.system;
+
+import com.ruoyi.system.model.OaNotifationUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "部门-用户列表返回VO")
+public class NotificationUserVO  {
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+    @ApiModelProperty(value = "姓名")
+    private String nickName;
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+    @ApiModelProperty(value = "部门id")
+    private Integer deptId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
new file mode 100644
index 0000000..6fa1952
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.vo.system;
+
+import com.ruoyi.system.model.OaApproval;
+import com.ruoyi.system.model.OaNotification;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "消息通知分页返回VO")
+public class NotificationVO extends OaNotification {
+
+    @ApiModelProperty(value = "通知部门")
+    private String deptName;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
index 814196c..3caab6c 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
@@ -19,5 +19,21 @@
     <sql id="Base_Column_List">
         id, title, content, type, create_time, create_by, update_time, update_by, disabled
     </sql>
+    <select id="pageList" resultType="com.ruoyi.system.vo.system.NotificationVO">
+        select * from oa_notification
+        where 1=1
+        <if test="query.title != null and query.title != ''">
+            and title like concat('%',#{query.title},'%')
+        </if>
+        <if test="deptIds != null and deptIds.size() > 0">
+            AND (
+            <foreach collection="deptIds" item="deptId" separator=" OR ">
+                FIND_IN_SET(#{deptId}, dept_ids)
+            </foreach>
+            )
+        </if>
+        AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        order by  create_time desc
+    </select>
 
 </mapper>

--
Gitblit v1.7.1