Quellcode durchsuchen

优化消息代码

zhangchen vor 5 Tagen
Ursprung
Commit
822c3b7d42

+ 50 - 6
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerNoticeController.java

@@ -92,15 +92,59 @@ public class LawyerNoticeController {
         
         return lawyerNoticeService.hasUnreadNotice(receiverId);
     }
+    /**
+     * 标记通知为已读
+     * <p>
+     * 根据通知ID将指定通知标记为已读状态
+     * </p>
+     * <p>
+     * 处理流程:
+     * 1. 参数校验:通知ID必须大于0且不能为null
+     * 2. 调用Service层方法执行更新操作
+     * 3. 根据更新结果返回相应的响应
+     * </p>
+     *
+     * @param id 通知ID,必须大于0且不能为null
+     * @return 统一响应结果,true表示已读成功,false表示已读失败
+     * @author system
+     * @since 2025-01-XX
+     */
     @GetMapping("/readNoticeById")
     @ApiOperation("通知已读")
     @ApiOperationSupport(order = 4)
-    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query")})
-    public R<Boolean> readNoticeById(Integer id) {
-        log.info("LifeNoticeController.readNoticeById?receiverId={}", id);
-        if (lawyerNoticeService.readNoticeById(id) > 0) {
-            return R.success("已读成功");
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "通知ID(主键id)", dataType = "Integer", paramType = "query", required = true)
+    })
+    public R<Boolean> readNoticeById(@RequestParam(value = "id", required = true) Integer id) {
+        log.info("标记通知为已读请求开始,id={}", id);
+
+        // 参数校验
+        if (id == null || id <= 0) {
+            log.warn("标记通知为已读请求失败:通知ID为空或无效,id={}", id);
+            return R.fail("通知ID不能为空且必须大于0");
+        }
+
+        try {
+            // 调用Service层方法执行更新
+            int affectedRows = lawyerNoticeService.readNoticeById(id);
+
+            // 根据更新结果返回响应
+            if (affectedRows > 0) {
+                log.info("标记通知为已读请求成功,id={},受影响记录数={}", id, affectedRows);
+                return R.success("已读成功");
+            } else {
+                log.warn("标记通知为已读请求失败,id={},受影响记录数={},可能是通知不存在或已被删除", id, affectedRows);
+                return R.fail("已读失败,通知不存在或已被删除");
+            }
+        } catch (IllegalArgumentException e) {
+            log.warn("标记通知为已读请求参数校验失败,id={},错误信息:{}", id, e.getMessage());
+            return R.fail(e.getMessage());
+        } catch (RuntimeException e) {
+            log.error("标记通知为已读请求异常,id={},异常信息:{}", id, e.getMessage(), e);
+            return R.fail("标记通知为已读失败:" + e.getMessage());
+        } catch (Exception e) {
+            log.error("标记通知为已读请求未知异常,id={},异常信息:{}", id, e.getMessage(), e);
+            return R.fail("标记通知为已读失败,请稍后重试");
         }
-        return R.fail("已读失败");
     }
 }

+ 13 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerNoticeService.java

@@ -32,7 +32,19 @@ public interface LawyerNoticeService extends IService<LifeNotice> {
      */
     R<Boolean> hasUnreadNotice(String receiverId);
 
+    /**
+     * 根据通知ID标记通知为已读
+     * <p>
+     * 将指定ID的通知标记为已读状态(isRead = 1)
+     * </p>
+     *
+     * @param id 通知ID,必须大于0且不能为null
+     * @return 受影响的记录数,>0表示更新成功,0表示未找到匹配的记录或更新失败
+     * @throws IllegalArgumentException 当通知ID无效时抛出
+     * @throws RuntimeException        当更新操作异常时抛出
+     * @author system
+     * @since 2025-01-XX
+     */
     int readNoticeById(Integer id);
 
-
 }

+ 120 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerNoticeServiceImpl.java

@@ -60,6 +60,11 @@ public class LawyerNoticeServiceImpl extends ServiceImpl<LifeNoticeMapper, LifeN
     private static final Integer IS_READ_UNREAD = 0;
 
     /**
+     * 已读标识:1-已读
+     */
+    private static final Integer IS_READ_READ = 1;
+
+    /**
      * 发送者ID分隔符
      */
     private static final String SENDER_ID_SEPARATOR = "_";
@@ -349,11 +354,124 @@ public class LawyerNoticeServiceImpl extends ServiceImpl<LifeNoticeMapper, LifeN
         return R.data(hasUnread);
     }
 
+    /**
+     * 根据通知ID标记通知为已读
+     * <p>
+     * 处理流程:
+     * 1. 参数校验:通知ID必须大于0且不能为null
+     * 2. 构建更新条件:根据ID匹配通知记录
+     * 3. 执行更新:将isRead字段设置为1(已读)
+     * 4. 返回更新结果:返回受影响的记录数
+     * </p>
+     * <p>
+     * 注意事项:
+     * - 如果通知不存在或ID无效,更新操作将不会影响任何记录,返回0
+     * - 如果通知已经是已读状态,更新操作仍然会执行但不会改变状态
+     * </p>
+     *
+     * @param id 通知ID,必须大于0且不能为null
+     * @return 受影响的记录数,>0表示更新成功,0表示未找到匹配的记录或更新失败
+     * @throws IllegalArgumentException 当通知ID无效时抛出
+     * @throws RuntimeException        当更新操作异常时抛出
+     * @author system
+     * @since 2025-01-XX
+     */
     @Override
     public int readNoticeById(Integer id) {
+        log.info("标记通知为已读开始,id={}", id);
+
+        // 参数校验
+        validateNoticeId(id);
+
+        try {
+            // 构建更新条件
+            LambdaUpdateWrapper<LifeNotice> updateWrapper = buildUpdateWrapper(id);
+
+            // 执行更新操作
+            int affectedRows = executeUpdate(updateWrapper);
+
+            // 记录更新结果
+            logUpdateResult(id, affectedRows);
+
+            return affectedRows;
+        } catch (IllegalArgumentException e) {
+            log.warn("标记通知为已读参数校验失败,id={},错误信息:{}", id, e.getMessage());
+            throw e;
+        } catch (RuntimeException e) {
+            log.error("标记通知为已读异常,id={},异常信息:{}", id, e.getMessage(), e);
+            throw new RuntimeException("标记通知为已读失败:" + e.getMessage(), e);
+        } catch (Exception e) {
+            log.error("标记通知为已读未知异常,id={},异常信息:{}", id, e.getMessage(), e);
+            throw new RuntimeException("标记通知为已读失败,请稍后重试", e);
+        }
+    }
+
+    /**
+     * 校验通知ID
+     * <p>
+     * 检查通知ID是否为空或无效
+     * </p>
+     *
+     * @param id 通知ID
+     * @throws IllegalArgumentException 当通知ID为空或无效时抛出
+     */
+    private void validateNoticeId(Integer id) {
+        if (id == null) {
+            log.warn("标记通知为已读参数校验失败:通知ID为null");
+            throw new IllegalArgumentException("通知ID不能为空");
+        }
+
+        if (id <= 0) {
+            log.warn("标记通知为已读参数校验失败:通知ID无效,id={}", id);
+            throw new IllegalArgumentException("通知ID必须大于0");
+        }
+    }
+
+    /**
+     * 构建更新条件包装器
+     * <p>
+     * 根据通知ID构建更新条件,将isRead字段设置为已读状态
+     * </p>
+     *
+     * @param id 通知ID
+     * @return 更新条件包装器
+     */
+    private LambdaUpdateWrapper<LifeNotice> buildUpdateWrapper(Integer id) {
         LambdaUpdateWrapper<LifeNotice> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(LifeNotice::getId, id);
-        wrapper.set(LifeNotice::getIsRead, 1);
-        return lifeNoticeMapper.update(null, wrapper);
+        wrapper.set(LifeNotice::getIsRead, IS_READ_READ);
+
+        log.debug("构建更新条件成功,id={}, isRead={}", id, IS_READ_READ);
+        return wrapper;
+    }
+
+    /**
+     * 执行更新操作
+     * <p>
+     * 调用Mapper执行更新操作,将通知标记为已读
+     * </p>
+     *
+     * @param updateWrapper 更新条件包装器
+     * @return 受影响的记录数
+     */
+    private int executeUpdate(LambdaUpdateWrapper<LifeNotice> updateWrapper) {
+        return lifeNoticeMapper.update(null, updateWrapper);
+    }
+
+    /**
+     * 记录更新结果日志
+     * <p>
+     * 根据更新结果记录相应级别的日志
+     * </p>
+     *
+     * @param id          通知ID
+     * @param affectedRows 受影响的记录数
+     */
+    private void logUpdateResult(Integer id, int affectedRows) {
+        if (affectedRows > 0) {
+            log.info("标记通知为已读成功,id={},受影响记录数={}", id, affectedRows);
+        } else {
+            log.warn("标记通知为已读未找到匹配记录,id={},受影响记录数={},可能是通知不存在或已被删除", id, affectedRows);
+        }
     }
 }