无关风月
昨天 7e8773c06d9391c94b7a0111b63d17cf5bdb6d8e
发起请假审批
10个文件已修改
10个文件已添加
758 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
}
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) {
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();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDTO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddNotificationDTO.java
New file
@@ -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 {
}
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);
}
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;
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")
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;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
New file
@@ -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;
}
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);
}
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;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java
New file
@@ -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;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/utils/UUIDUtil.java
New file
@@ -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();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDeptUserDetailVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationDetailVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserDetailVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationUserVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
New file
@@ -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;
}
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>