From ec636469d6a40c75239f96a2c951fa1b945caea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Wed, 29 Apr 2026 15:49:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BE=E6=89=8B=E5=85=8D=E8=B4=A3=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality/pojo/entity/RaiseHandRecord.java | 12 +- .../desk/quality/pojo/vo/RaiseHandVO.java | 7 + .../impl/BsTowerReportServiceImpl.java | 2 + .../controller/RaiseHandController.java | 168 ++++++++++++++++-- 4 files changed, 171 insertions(+), 18 deletions(-) diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java index b295238e..318f08a5 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java @@ -5,12 +5,15 @@ package org.springblade.desk.quality.pojo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.util.Date; @TableName("QA_WORK_RAISE_HAND_RECORD") @@ -53,5 +56,12 @@ public class RaiseHandRecord extends BaseEntity { @TableField(exist = false) @Schema(description = "节点名称") private String pointName; - + @Schema(description = "审批时间") + @JsonFormat (pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private Date reviewTime; + @Schema(description = "下一节点审批人ID") + private String nextUserId; + @Schema(description = "下一节点审批人名称") + private String nextUserName; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java index 42ab5d03..1d647cff 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java @@ -3,6 +3,7 @@ */ package org.springblade.desk.quality.pojo.vo; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -40,4 +41,10 @@ public class RaiseHandVO extends RaiseHand { private List all = new ArrayList<>(); + @TableField(exist = false) + @Schema(description = "下一节点审批人ID") + private String nextUserId; + @TableField(exist = false) + @Schema(description = "下一节点审批人名称") + private String nextUserName; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java index 01f02fed..e2cfc111 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java @@ -32,6 +32,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.desk.common.constant.BizTypeConstant; import org.springblade.desk.common.feign.IMesNotifyMessageClient; import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; import org.springblade.desk.energy.excel.BsTowerReportExcel; @@ -215,6 +216,7 @@ public class BsTowerReportServiceImpl extends BaseServiceImpl 1 && one.getStatus() < 4) { + createNextNodeRecord(one, addOne.getNextUserId()); + } + return R.status(true); } + private void createNextNodeRecord(RaiseHand raiseHand, String nextUserId) { + // 校验下一节点审批人 + if (StrUtil.isEmpty(nextUserId)) { + throw new RuntimeException("请选择下一节点审批人"); + } + + // 获取下一节点审批人信息 + User nextApprover; + try { + nextApprover = userClient.userInfoById(Long.parseLong(nextUserId)).getData(); + } catch (Exception e) { + log.error("获取下一节点审批人失败", e); + throw new RuntimeException("下一节点审批人获取失败"); + } + + if (BeanUtil.isEmpty(nextApprover)) { + throw new RuntimeException("下一节点审批人获取失败"); + } + + // 创建下一节点记录 + RaiseHandRecord nextNode = new RaiseHandRecord(); + nextNode.setHandId(raiseHand.getId()); + nextNode.setCurrentStatus(raiseHand.getStatus()); + nextNode.setNextUserId(nextApprover.getId().toString()); + nextNode.setNextUserName(nextApprover.getRealName()); + nextNode.setCreateTime(new Date()); + recordService.save(nextNode); + + // 给下一个节点审批人推送消息 + pushNotificationToNextApprover(raiseHand, nextApprover); + } + + private void pushNotificationToNextApprover(RaiseHand raiseHand, User nextApprover) { + try { + // 构建审批节点名称 + String nodeName = getApprovalNodeName(raiseHand.getStatus() + 1); + + // 构建通知标题 + String title = String.format("举手免责审批提醒 - %s", + StringUtils.isNotBlank(raiseHand.getNotes()) ? raiseHand.getNotes() : "待审批"); + + // 构建通知内容 + String content = String.format( + "您有一条新的举手免责审批待处理:\n" + + "- 问题描述:%s\n" + + "- 申请人:%s\n" + + "- 岗位:%s\n" + + "- 当前节点:%s\n" + + "- 申请时间:%s\n" + + "请及时登录系统进行处理。", + StringUtils.defaultIfBlank(raiseHand.getNotes(), "无"), + StringUtils.defaultIfBlank(raiseHand.getReportUserName(), "未知"), + StringUtils.defaultIfBlank(raiseHand.getPostName(), "未知"), + nodeName, + raiseHand.getCreateTime() != null ? DateUtil.format(raiseHand.getCreateTime(), "yyyy-MM-dd HH:mm:ss") : "未知" + ); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveUserId(nextApprover.getId()) + .bizType(BizTypeConstant.CRAFT_TASK_REDEPLOY) + .build(); + + // 调用Feign客户端保存通知消息 + R result = mesNotifyMessageClient.save(notifyMessage); + + if (result != null && result.isSuccess()) { + log.info("成功发送举手免责审批提醒,审批人: {}, 审批人姓名: {}, 举手ID: {}", + nextApprover.getId(), nextApprover.getRealName(), raiseHand.getId()); + } else { + log.error("发送举手免责审批提醒失败,审批人: {}, 错误信息: {}", + nextApprover.getId(), result != null ? result.getMsg() : "返回结果为空"); + } + + } catch (Exception e) { + log.error("处理举手免责审批提醒时发生异常,举手ID: {}", raiseHand.getId(), e); + throw new RuntimeException("发送举手免责审批提醒失败"); + } + } + + /** + * 根据状态获取审批节点名称 + * @param status 审批状态 + * @return 节点名称 + */ + private String getApprovalNodeName(Integer status) { + if (status == null) { + return "未知节点"; + } + switch (status) { + case 1: + return "工艺管理员审批"; + case 2: + return "质量管理员审批"; + case 3: + return "主管业务领导审批"; + case 4: + return "审批完成"; + default: + return "未知节点"; + } + } @PostMapping("/save") @ApiOperationSupport(order = 30) @@ -288,20 +421,21 @@ public class RaiseHandController extends BladeController { @Transactional public R save(@Valid @RequestBody RaiseHand addOne) { - addOne.setId(null); + addOne.setId(null); service.save(addOne); - if(1 == addOne.getStatus()){ - RaiseHandRecord record = new RaiseHandRecord(); - record.setHandId(addOne.getId()); - record.setNotes(""); - record.setIsSuccess("1"); - record.setCurrentStatus(0); - record.setCreateTime(new Date()); - record.setReviewUserId(AuthUtil.getUser().getUserId()); - record.setReviewUserName(AuthUtil.getUser().getNickName()); - recordService.save(record); - } - + // TODO: 2026/4/29 前端未传该字段,框架自动填充 + //if(1 == addOne.getStatus()){ + RaiseHandRecord record = new RaiseHandRecord(); + record.setHandId(addOne.getId()); + record.setNotes(""); + record.setIsSuccess("1"); + record.setCurrentStatus(0); + record.setCreateTime(new Date()); + record.setReviewUserId(AuthUtil.getUser().getUserId()); + record.setReviewUserName(AuthUtil.getUser().getNickName()); + recordService.save(record); + //} + createNextNodeRecord(addOne, addOne.getProcessUserId().toString()); return R.status(true); }