|
|
@@ -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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|