|
|
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachmentSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
|
|
|
@@ -20,12 +21,22 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport.IotRdDailyReportMapper;
|
|
|
import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
|
|
|
import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
|
|
|
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
|
|
|
import cn.iocoder.yudao.module.supplier.enums.common.SupplierAuditStatusEnum;
|
|
|
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
|
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
|
|
|
import cn.iocoder.yudao.module.system.service.dept.DeptService;
|
|
|
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
|
|
|
+import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
|
|
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
@@ -36,12 +47,14 @@ import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.CountDownLatch;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
|
|
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_NOT_EXISTS;
|
|
|
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
|
|
|
|
|
|
/**
|
|
|
* 瑞都日报 Service 实现类
|
|
|
@@ -64,6 +77,18 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
|
|
|
private DictDataService dictDataService;
|
|
|
@Resource
|
|
|
private DeptService deptService;
|
|
|
+ @Resource
|
|
|
+ private AdminUserService adminUserService;
|
|
|
+ @Resource
|
|
|
+ private RoleService roleService;
|
|
|
+ @Resource
|
|
|
+ private UserRoleMapper userRoleMapper;
|
|
|
+ @Resource
|
|
|
+ private AdminUserApi adminUserApi;
|
|
|
+ @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
|
|
|
+ private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
|
|
|
+ @Resource
|
|
|
+ private PmsMessage pmsMessage;
|
|
|
|
|
|
@Override
|
|
|
public Long createIotRdDailyReport(IotRdDailyReportSaveReqVO createReqVO) {
|
|
|
@@ -75,9 +100,9 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void updateIotRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
|
|
|
+ public IotRdDailyReportDO updateIotRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
|
|
|
// 校验存在
|
|
|
- validateIotRdDailyReportExists(updateReqVO.getId());
|
|
|
+ IotRdDailyReportDO dailyReport = validateIotRdDailyReportExists(updateReqVO.getId());
|
|
|
// 如果 endTime = 24:00 转换成 23:59:59 否则会引发异常 Parse [2025-11-22 24:00] with format [yyyy-MM-dd HH:mm] error!
|
|
|
String endTime = updateReqVO.getEndTime();
|
|
|
if (StrUtil.isNotBlank(endTime)) {
|
|
|
@@ -127,6 +152,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
|
|
|
"type", AttachmentTypeEnum.EXTERNAL_RENTAL.getCode()
|
|
|
));
|
|
|
}
|
|
|
+ updateObj.setReportName(dailyReport.getReportName());
|
|
|
+ return updateObj;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -674,9 +701,84 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
|
|
|
if (CollUtil.isEmpty(reports)) {
|
|
|
throw exception(IOT_RD_DAILY_REPORT_NOT_EXISTS);
|
|
|
}
|
|
|
+ // 需要发送提醒消息的日报对象
|
|
|
+ List<IotRdDailyReportDO> tobeSendMsgReports = new ArrayList<>();
|
|
|
reports.forEach(report -> {
|
|
|
- updateIotRdDailyReport(report);
|
|
|
+ IotRdDailyReportDO updatedReport = updateIotRdDailyReport(report);
|
|
|
+ // 标识当前任务井是 普通井 或 平台井主井 关联的任务审批人发送提醒消息
|
|
|
+ if (1 == updatedReport.getPlatformWell() || 0 == updatedReport.getPlatformWell()) {
|
|
|
+ tobeSendMsgReports.add(updatedReport);
|
|
|
+ }
|
|
|
});
|
|
|
+ // 考虑到平台井的情况 只向有审批权限的人发送一次 钉钉提醒及站内信
|
|
|
+ // 任务为平台井时 只向主井的任务的 填报人所属部门或上级项目部下 有审批权限的人 发送消息提醒
|
|
|
+ if (CollUtil.isNotEmpty(tobeSendMsgReports)) {
|
|
|
+ Set<Long> deptIds = new HashSet<>();
|
|
|
+ IotRdDailyReportDO tobeSendMsgReport = tobeSendMsgReports.get(0);
|
|
|
+ Long deptId = tobeSendMsgReport.getDeptId();
|
|
|
+ DeptDO dept = deptService.getDept(deptId);
|
|
|
+ if (ObjUtil.isNotEmpty(dept)) {
|
|
|
+ deptIds.add(dept.getId());
|
|
|
+ String type = dept.getType();
|
|
|
+ // 类型(公司级1 项目部2 队伍3)
|
|
|
+ // 如果当前部门是 队伍 查找上级 项目部
|
|
|
+ if ("3".equals(type)) {
|
|
|
+ DeptDO projectDept = deptService.getDept(dept.getParentId());
|
|
|
+ if (ObjUtil.isNotEmpty(projectDept)) {
|
|
|
+ deptIds.add(projectDept.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 查找当前部门及项目下有审批权限的人员 role 项目部日报审批RD
|
|
|
+ List<AdminUserDO> receivedMsgUsers = adminUserService.getUserListByDeptIds(deptIds);
|
|
|
+ //
|
|
|
+ if (CollUtil.isNotEmpty(receivedMsgUsers)) {
|
|
|
+ Set<Long> userIds = new HashSet<>();
|
|
|
+ receivedMsgUsers.forEach(user -> {
|
|
|
+ userIds.add(user.getId());
|
|
|
+ });
|
|
|
+ RoleDO role = roleService.getRoleByCode("项目部日报审批RD");
|
|
|
+ if (ObjUtil.isNotEmpty(role)) {
|
|
|
+ Set<Long> roleIds = new HashSet<>();
|
|
|
+ roleIds.add(role.getId());
|
|
|
+ List<UserRoleDO> userRoles = userRoleMapper.selectListByRoleIds(roleIds);
|
|
|
+ if (CollUtil.isNotEmpty(userRoles)) {
|
|
|
+ // 提取有审批角色的所有用户ID(去重+空值过滤)
|
|
|
+ Set<Long> roleUserIds = userRoles.stream()
|
|
|
+ .map(UserRoleDO::getUserId)
|
|
|
+ .filter(Objects::nonNull) // 过滤空userId
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 计算两个集合的交集,得到最终目标用户ID
|
|
|
+ Set<Long> targetUserIds = userIds.stream()
|
|
|
+ .filter(roleUserIds::contains)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 异步发送 站内信 钉钉消息
|
|
|
+ if (CollUtil.isNotEmpty(targetUserIds)) {
|
|
|
+ Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(targetUserIds);
|
|
|
+ // 给多个用户发送 相同 的 提醒消息
|
|
|
+ if (CollUtil.isNotEmpty(users)) {
|
|
|
+ CountDownLatch latch = new CountDownLatch(users.size());
|
|
|
+ users.forEach((userId, user) -> {
|
|
|
+ pmsThreadPoolTaskExecutor.execute(() -> {
|
|
|
+ try {
|
|
|
+ String mobile = user.getMobile();
|
|
|
+ if (StrUtil.isNotBlank(mobile) && StrUtil.isNotBlank(tobeSendMsgReport.getReportName())) {
|
|
|
+ pmsMessage.sendMessage(tobeSendMsgReport.getId(), tobeSendMsgReport.getReportName(), PmsConstants.DAILY_REPORT_APPROVAL,
|
|
|
+ userId, mobile);
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ latch.countDown();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|