package com.ruoyi.web.controller.api;
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;
/**
*
* 通知表 前端控制器
*
*
* @author WuGuanFengYue
* @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> 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 notificationIds = Arrays.asList(ids.split(","));
// 删除后 将已发送的消息通知一并删除
oaNotificationService.removeBatchByIds(notificationIds);
oaNotifationUserService.remove(new LambdaQueryWrapper()
.in(OaNotifationUser::getNotificationId,notificationIds));
return R.ok();
}
@Log(title = "消息通知-新增消息", businessType = BusinessType.INSERT)
@ApiOperation(value = "新增消息")
@PostMapping(value = "/add")
public R add( @RequestBody OaNotification dto) {
oaNotificationService.save(dto);
ArrayList 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 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 detail(String id) {
NotificationDetailVO notificationDetailVO = new NotificationDetailVO();
OaNotification oaNotification = oaNotificationService.getById(id);
BeanUtils.copyProperties(oaNotification, notificationDetailVO);
StringBuilder deptName = new StringBuilder();
List tDepts = deptService.list();
List sysUsers = sysUserService.selectAllList();
List notifationUsers = oaNotifationUserService.lambdaQuery().eq(OaNotifationUser::getNotificationId, id)
.list();
Map deptMap = tDepts.stream().collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
Map 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 notificationUserVOS = new ArrayList<>();
List userIds = notifationUsers.stream().map(e -> e.getUserId().longValue()).collect(Collectors.toList());
if (!userIds.isEmpty()){
Map> deptUserList = sysUsers.stream().filter(e -> userIds.contains(e.getUserId()))
.collect(Collectors.groupingBy(SysUser::getDeptId));
// 遍历这个map
for (Map.Entry> entry : deptUserList.entrySet()) {
List 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 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();
}
}