From 278acc870c1dfc506fcdf88e0949d868c5faeaf5 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 20 Nov 2025 15:20:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E5=92=8C?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E8=BF=9D=E8=A7=84=E5=AE=A1=E6=89=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/message/OfficialNoticeTypeEnum.java | 10 + .../RoomViolationRestController.java | 39 ++++ .../UserViolationRestController.java | 40 ++++ .../query/ViolationRecordPageQryExe.java | 55 ++++++ .../room/RoomViolationAdjustCmdExe.java | 177 ++++++++++++++++++ .../room/RoomViolationWarningCmdExe.java | 129 +++++++++++++ .../user/UserViolationAdjustCmdExe.java | 169 +++++++++++++++++ .../user/UserViolationWarningCmdExe.java | 132 +++++++++++++ .../violation/ViolationRecordConvertor.java | 56 ++++++ .../enums/violation/OperationTypeEnum.java | 50 +++++ .../app/enums/violation/TargetTypeEnum.java | 50 +++++ .../enums/violation/ViolationTypeEnum.java | 82 ++++++++ .../violation/RoomViolationServiceImpl.java | 43 +++++ .../violation/UserViolationServiceImpl.java | 43 +++++ .../violation/ViolationHandleResultCO.java | 49 +++++ .../violation/ViolationRecordCO.java | 106 +++++++++++ .../cmd/violation/RoomViolationHandleCmd.java | 49 +++++ .../cmd/violation/UserViolationHandleCmd.java | 49 +++++ .../ViolationRecordPageQueryCmd.java | 41 ++++ .../violation/RoomViolationService.java | 32 ++++ .../violation/UserViolationService.java | 32 ++++ .../violation/ViolationRecordGateway.java | 67 +++++++ .../domain/violation/ViolationRecord.java | 96 ++++++++++ .../rds/dao/violation/ViolationRecordDAO.java | 16 ++ .../violation/ViolationRecordEntity.java | 95 ++++++++++ .../violation/ViolationRecordGatewayImpl.java | 125 +++++++++++++ 26 files changed, 1832 insertions(+) create mode 100644 rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/RoomViolationRestController.java create mode 100644 rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/UserViolationRestController.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/query/ViolationRecordPageQryExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationAdjustCmdExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationWarningCmdExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationAdjustCmdExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationWarningCmdExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/violation/ViolationRecordConvertor.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/OperationTypeEnum.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/TargetTypeEnum.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/ViolationTypeEnum.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/RoomViolationServiceImpl.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/UserViolationServiceImpl.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationHandleResultCO.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationRecordCO.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/RoomViolationHandleCmd.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/UserViolationHandleCmd.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/ViolationRecordPageQueryCmd.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/RoomViolationService.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/UserViolationService.java create mode 100644 rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/violation/ViolationRecordGateway.java create mode 100644 rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/violation/ViolationRecord.java create mode 100644 rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/violation/ViolationRecordDAO.java create mode 100644 rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/violation/ViolationRecordEntity.java create mode 100644 rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/violation/ViolationRecordGatewayImpl.java diff --git a/rc-service/rc-inner-api/external-inner/external-inner-model/src/main/java/com/red/circle/external/inner/model/enums/message/OfficialNoticeTypeEnum.java b/rc-service/rc-inner-api/external-inner/external-inner-model/src/main/java/com/red/circle/external/inner/model/enums/message/OfficialNoticeTypeEnum.java index 67981364..b28eb701 100644 --- a/rc-service/rc-inner-api/external-inner/external-inner-model/src/main/java/com/red/circle/external/inner/model/enums/message/OfficialNoticeTypeEnum.java +++ b/rc-service/rc-inner-api/external-inner/external-inner-model/src/main/java/com/red/circle/external/inner/model/enums/message/OfficialNoticeTypeEnum.java @@ -212,6 +212,16 @@ public enum OfficialNoticeTypeEnum { */ RECEIVE_PROP_COUPON, + /** + * 违规警告 + */ + VIOLATION_WARNING, + + /** + * 违规调整 + */ + VIOLATION_ADJUST, + ; diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/RoomViolationRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/RoomViolationRestController.java new file mode 100644 index 00000000..d9718c2a --- /dev/null +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/RoomViolationRestController.java @@ -0,0 +1,39 @@ +package com.red.circle.other.adapter.app.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.web.controller.BaseController; +import com.red.circle.other.app.dto.cmd.violation.RoomViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.service.violation.RoomViolationService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + * 房间违规处理控制器 + */ +@RestController +@RequestMapping("/room-violation") +@RequiredArgsConstructor +public class RoomViolationRestController extends BaseController { + + private final RoomViolationService roomViolationService; + + /** + * 处理房间违规 + */ + @PostMapping("/handle") + public ViolationHandleResultCO handle(@Valid @RequestBody RoomViolationHandleCmd cmd) { + return roomViolationService.handle(cmd); + } + + /** + * 分页查询违规记录 + */ + @PostMapping("/page-query") + public PageResult pageQuery(@Valid @RequestBody ViolationRecordPageQueryCmd cmd) { + return roomViolationService.pageQuery(cmd); + } +} diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/UserViolationRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/UserViolationRestController.java new file mode 100644 index 00000000..2dbe91cf --- /dev/null +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/violation/UserViolationRestController.java @@ -0,0 +1,40 @@ +package com.red.circle.other.adapter.app.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.web.controller.BaseController; +import com.red.circle.other.app.dto.cmd.violation.UserViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.service.violation.UserViolationService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + + +/** + * 用户违规处理控制器 + */ +@RestController +@RequestMapping("/user-violation") +@RequiredArgsConstructor +public class UserViolationRestController extends BaseController { + + private final UserViolationService userViolationService; + + /** + * 处理用户违规 + */ + @PostMapping("/handle") + public ViolationHandleResultCO handle(@Valid @RequestBody UserViolationHandleCmd cmd) { + return userViolationService.handle(cmd); + } + + /** + * 分页查询违规记录 + */ + @PostMapping("/page-query") + public PageResult pageQuery(@Valid @RequestBody ViolationRecordPageQueryCmd cmd) { + return userViolationService.pageQuery(cmd); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/query/ViolationRecordPageQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/query/ViolationRecordPageQryExe.java new file mode 100644 index 00000000..86c83144 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/query/ViolationRecordPageQryExe.java @@ -0,0 +1,55 @@ +package com.red.circle.other.app.command.violation.query; + +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.convertor.violation.ViolationRecordConvertor; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 违规记录分页查询执行器 + */ +@Component +@RequiredArgsConstructor +public class ViolationRecordPageQryExe { + + private final ViolationRecordGateway violationRecordGateway; + private final AdministratorAuthService administratorAuthService; + private final ViolationRecordConvertor violationRecordConvertor; + + public PageResult execute(ViolationRecordPageQueryCmd cmd) { + // 验证管理员权限 + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + administratorAuthService.existsAuth(cmd.requiredReqUserId(), "VIOLATION_QUERY")); + + // 分页查询 + PageResult pageResult = violationRecordGateway.pageQuery( + cmd.getTargetType(), + cmd.getTargetId(), + cmd.getViolationType(), + cmd.getOperationType(), + cmd.getOperatorId(), + cmd.getCurrent().intValue(), + cmd.getSize().intValue() + ); + + // 转换为 CO + List records = violationRecordConvertor.toCOList(pageResult.getRecords().stream().toList()); + + PageResult coPageResult = new PageResult<>(); + coPageResult.setRecords(records); + coPageResult.setTotal(pageResult.getTotal()); + coPageResult.setCurrent(pageResult.getCurrent()); + coPageResult.setSize(pageResult.getSize()); + + return coPageResult; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationAdjustCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationAdjustCmdExe.java new file mode 100644 index 00000000..b56fc39c --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationAdjustCmdExe.java @@ -0,0 +1,177 @@ +package com.red.circle.other.app.command.violation.room; + +import com.alibaba.fastjson.JSON; +import com.red.circle.external.inner.endpoint.message.OfficialNoticeClient; +import com.red.circle.external.inner.model.cmd.message.notice.official.NoticeExtTemplateCustomizeCmd; +import com.red.circle.external.inner.model.enums.message.OfficialNoticeTypeEnum; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.dto.cmd.violation.RoomViolationHandleCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import com.red.circle.other.app.enums.violation.TargetTypeEnum; +import com.red.circle.other.app.enums.violation.ViolationTypeEnum; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.cache.service.other.EnumConfigCacheService; +import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile; +import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; +import com.red.circle.other.inner.asserts.RoomErrorCode; +import com.red.circle.other.inner.enums.config.EnumConfigKey; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 房间违规调整命令执行器 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RoomViolationAdjustCmdExe { + + private final ViolationRecordGateway violationRecordGateway; + private final RoomProfileManagerService roomProfileManagerService; + private final AdministratorAuthService administratorAuthService; + private final OfficialNoticeClient officialNoticeClient; + private final UserProfileGateway userProfileGateway; + private final EnumConfigCacheService enumConfigCacheService; + + // 默认内容配置 + private static final String DEFAULT_ROOM_NOTICE = "Welcome to my room"; + private static final String DEFAULT_THEME = "default"; + + public ViolationHandleResultCO execute(RoomViolationHandleCmd cmd) { + ViolationTypeEnum violationTypeEnum = ViolationTypeEnum.getByCode(cmd.getViolationType()); + ResponseAssert.notNull(CommonErrorCode.DATA_ERROR, violationTypeEnum); + + // 1. 验证管理员权限 + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + administratorAuthService.existsAuth(cmd.requiredReqUserId(), violationTypeEnum.name())); + + // 2. 查询房间信息 + RoomProfile roomProfile = roomProfileManagerService.getProfileById(Long.valueOf(cmd.getRoomId())); + ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, roomProfile); + + // 3. 获取原始内容 + String originalContent = getOriginalContent(roomProfile, violationTypeEnum); + + // 4. 调整违规内容 + String adjustedContent = adjustViolationContent(roomProfile, violationTypeEnum); + + UserProfile userProfile = userProfileGateway.getByUserId(cmd.getReqUserId()); + + // 5. 保存违规记录 + ViolationRecord record = ViolationRecord.builder() + .targetType(TargetTypeEnum.ROOM.getCode()) + .targetId(cmd.getRoomId()) + .violationType(cmd.getViolationType()) + .operationType(OperationTypeEnum.ADJUST.getCode()) + .description(cmd.getDescription()) + .screenshotUrls(JSON.toJSONString(cmd.getScreenshotUrls())) + .originalContent(originalContent) + .adjustedContent(adjustedContent) + .operatorId(userProfile.getId()) + .operatorName(userProfile.getUserNickname()) + .build(); + + Long recordId = violationRecordGateway.save(record); + + // 6. 发送调整通知 + sendAdjustNotification(roomProfile.getUserId(), violationTypeEnum, adjustedContent); + + return ViolationHandleResultCO.builder() + .recordId(recordId) + .success(true) + .message("调整成功") + .originalContent(originalContent) + .adjustedContent(adjustedContent) + .build(); + } + + /** + * 获取原始内容 + */ + private String getOriginalContent(RoomProfile roomProfile, ViolationTypeEnum violationType) { + return switch (violationType) { + case ROOM_NICKNAME -> roomProfile.getRoomName(); + case ROOM_COVER -> roomProfile.getRoomCover(); + case ROOM_NOTICE -> roomProfile.getRoomDesc(); + case ROOM_THEME -> ""; + default -> null; + }; + } + + /** + * 调整违规内容 + */ + private String adjustViolationContent(RoomProfile roomProfile, ViolationTypeEnum violationType) { + String adjustedContent; + + switch (violationType) { + case ROOM_NICKNAME -> { + adjustedContent = roomProfile.getRoomAccount() + "&" + roomProfile.getId(); + RoomProfile updateProfile = new RoomProfile(); + updateProfile.setId(roomProfile.getId()); + updateProfile.setRoomName(adjustedContent); + roomProfileManagerService.updateSelectiveProfile(updateProfile); + } + case ROOM_COVER -> { + adjustedContent = enumConfigCacheService.getValue(EnumConfigKey.DEFAULT_ROOM_COVER, roomProfile.getSysOrigin()); + roomProfileManagerService.updateRoomCoverByUserId(roomProfile.getUserId(), adjustedContent); + } + case ROOM_NOTICE -> { + adjustedContent = DEFAULT_ROOM_NOTICE; + roomProfileManagerService.updateRoomDescByIds(java.util.Collections.singletonList(roomProfile.getId()), adjustedContent); + } + case ROOM_THEME -> { + adjustedContent = DEFAULT_THEME; + RoomProfile updateProfile = new RoomProfile(); + updateProfile.setId(roomProfile.getId()); +// updateProfile.setTheme(adjustedContent); + roomProfileManagerService.updateSelectiveProfile(updateProfile); + } + default -> adjustedContent = null; + } + + return adjustedContent; + } + + /** + * 发送调整通知 + */ + private void sendAdjustNotification(Long userId, ViolationTypeEnum violationType, String adjustedContent) { + String content = getAdjustNotificationContent(violationType, adjustedContent); + + Map titleMap = new HashMap<>(); + titleMap.put("type", "violation_adjust"); + titleMap.put("violationType", violationType.getCode()); + + officialNoticeClient.send( + NoticeExtTemplateCustomizeCmd.builder() + .toAccount(userId) + .noticeType(OfficialNoticeTypeEnum.VIOLATION_ADJUST) + .content(content) + .title(com.alibaba.fastjson.JSON.toJSONString(titleMap)) + .build()); + } + + /** + * 获取调整通知内容 + */ + private String getAdjustNotificationContent(ViolationTypeEnum violationType, String adjustedContent) { + return switch (violationType) { + case ROOM_NICKNAME -> String.format("Your room name has been changed to '%s' due to violation of rules.", adjustedContent); + case ROOM_COVER -> "Your room profile picture has been changed to the default image due to violation of rules."; + case ROOM_NOTICE -> String.format("Your room notice has been changed to '%s' due to violation of regulations.", adjustedContent); + case ROOM_THEME -> "Your room theme has been changed to the default theme due to violation of rules."; + default -> "Your room information has been adjusted due to violation of rules."; + }; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationWarningCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationWarningCmdExe.java new file mode 100644 index 00000000..fcc84750 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/room/RoomViolationWarningCmdExe.java @@ -0,0 +1,129 @@ +package com.red.circle.other.app.command.violation.room; + +import com.alibaba.fastjson.JSON; +import com.red.circle.external.inner.endpoint.message.OfficialNoticeClient; +import com.red.circle.external.inner.model.cmd.message.notice.official.NoticeExtTemplateCustomizeCmd; +import com.red.circle.external.inner.model.enums.message.OfficialNoticeTypeEnum; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.dto.cmd.violation.RoomViolationHandleCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import com.red.circle.other.app.enums.violation.TargetTypeEnum; +import com.red.circle.other.app.enums.violation.ViolationTypeEnum; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile; +import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; +import com.red.circle.other.inner.asserts.RoomErrorCode; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 房间违规警告命令执行器 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RoomViolationWarningCmdExe { + + private final ViolationRecordGateway violationRecordGateway; + private final RoomProfileManagerService roomProfileManagerService; + private final AdministratorAuthService administratorAuthService; + private final OfficialNoticeClient officialNoticeClient; + private final UserProfileGateway userProfileGateway; + + public ViolationHandleResultCO execute(RoomViolationHandleCmd cmd) { + ViolationTypeEnum violationTypeEnum = ViolationTypeEnum.getByCode(cmd.getViolationType()); + ResponseAssert.notNull(CommonErrorCode.DATA_ERROR, violationTypeEnum); + + // 1. 验证管理员权限 + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + administratorAuthService.existsAuth(cmd.requiredReqUserId(), violationTypeEnum.name())); + + // 2. 查询房间信息 + RoomProfile roomProfile = roomProfileManagerService.getProfileById(Long.valueOf(cmd.getRoomId())); + ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, roomProfile); + + // 3. 获取原始内容 + String originalContent = getOriginalContent(roomProfile, violationTypeEnum); + + UserProfile userProfile = userProfileGateway.getByUserId(cmd.getReqUserId()); + + // 4. 保存违规记录 + ViolationRecord record = ViolationRecord.builder() + .targetType(TargetTypeEnum.ROOM.getCode()) + .targetId(cmd.getRoomId()) + .violationType(cmd.getViolationType()) + .operationType(OperationTypeEnum.WARNING.getCode()) + .description(cmd.getDescription()) + .screenshotUrls(JSON.toJSONString(cmd.getScreenshotUrls())) + .originalContent(originalContent) + .operatorId(userProfile.getId()) + .operatorName(userProfile.getUserNickname()) + .build(); + + Long recordId = violationRecordGateway.save(record); + + // 5. 发送警告消息 + sendWarningMessage(roomProfile.getUserId(), violationTypeEnum); + + return ViolationHandleResultCO.builder() + .recordId(recordId) + .success(true) + .message("警告发送成功") + .build(); + } + + /** + * 获取原始内容 + */ + private String getOriginalContent(RoomProfile roomProfile, ViolationTypeEnum violationType) { + return switch (violationType) { + case ROOM_NICKNAME -> roomProfile.getRoomName(); + case ROOM_COVER -> roomProfile.getRoomCover(); + case ROOM_NOTICE -> roomProfile.getRoomDesc(); + case ROOM_THEME -> ""; + default -> null; + }; + } + + /** + * 发送警告消息 + */ + private void sendWarningMessage(Long userId, ViolationTypeEnum violationType) { + String content = getWarningContent(violationType); + + Map titleMap = new HashMap<>(); + titleMap.put("type", "violation_warning"); + titleMap.put("violationType", violationType.getCode()); + + officialNoticeClient.send( + NoticeExtTemplateCustomizeCmd.builder() + .toAccount(userId) + .noticeType(OfficialNoticeTypeEnum.VIOLATION_WARNING) + .content(content) + .title(JSON.toJSONString(titleMap)) + .build()); + } + + /** + * 获取警告内容 + */ + private String getWarningContent(ViolationTypeEnum violationType) { + return switch (violationType) { + case ROOM_NICKNAME -> "Your room name is in violation of the rules. Please correct the current room name immediately."; + case ROOM_COVER -> "Your room profile picture violates the rules. Please change your current room profile picture immediately."; + case ROOM_NOTICE -> "Your room notice is in violation of regulations. Please rectify it immediately."; + case ROOM_THEME -> "Your room theme violates the rules. Please rectify it immediately."; + default -> "Your room information is in violation of the rules. Please correct it immediately."; + }; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationAdjustCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationAdjustCmdExe.java new file mode 100644 index 00000000..8a370ae1 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationAdjustCmdExe.java @@ -0,0 +1,169 @@ +package com.red.circle.other.app.command.violation.user; + +import com.alibaba.fastjson.JSON; +import com.red.circle.external.inner.endpoint.message.OfficialNoticeClient; +import com.red.circle.external.inner.model.cmd.message.notice.official.NoticeExtTemplateCustomizeCmd; +import com.red.circle.external.inner.model.enums.message.OfficialNoticeTypeEnum; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.cmd.violation.UserViolationHandleCmd; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import com.red.circle.other.app.enums.violation.TargetTypeEnum; +import com.red.circle.other.app.enums.violation.ViolationTypeEnum; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.cache.service.other.EnumConfigCacheService; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; +import com.red.circle.other.inner.asserts.user.UserErrorCode; +import com.red.circle.other.inner.enums.config.EnumConfigKey; +import com.red.circle.other.inner.enums.sys.appmanager.ManagerApprovalType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +/** + * 用户违规调整命令执行器 + * + * @author Claude + * @date 2025-01-15 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class UserViolationAdjustCmdExe { + + private final UserProfileGateway userProfileGateway; + private final ViolationRecordGateway violationRecordGateway; + private final AdministratorAuthService administratorAuthService; + private final OfficialNoticeClient officialNoticeClient; + private final EnumConfigCacheService enumConfigCacheService; + + @Transactional(rollbackFor = Exception.class) + public ViolationHandleResultCO execute(UserViolationHandleCmd cmd) { + // 1. 权限验证 + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + administratorAuthService.existsAuth(cmd.requiredReqUserId(), ManagerApprovalType.USER_AVATAR.name())); + + // 2. 查询用户信息 + UserProfile userProfile = userProfileGateway.getByUserId(cmd.getUserId()); + ResponseAssert.notNull(UserErrorCode.USER_INFO_NOT_FOUND, userProfile); + + // 3. 验证违规类型 + ViolationTypeEnum violationType = ViolationTypeEnum.getByCode(cmd.getViolationType()); + ResponseAssert.notNull(CommonErrorCode.DATA_ERROR, violationType); + ResponseAssert.isTrue(CommonErrorCode.DATA_ERROR, violationType.matchTargetType(TargetTypeEnum.USER)); + + // 4. 获取原始内容 + String originalContent = getOriginalContent(userProfile, violationType); + + // 5. 调整内容 + String adjustedContent = adjustContent(userProfile, violationType, cmd.getUserId()); + + // 6. 更新用户信息 + updateUserProfile(userProfile, violationType, adjustedContent); + + // 7. 保存违规记录 + String bizNo = "violation_user_" + cmd.getUserId() + "_" + System.currentTimeMillis(); + + UserProfile reqUser = userProfileGateway.getByUserId(cmd.getUserId()); + ViolationRecord record = buildViolationRecord(cmd, reqUser, bizNo, originalContent, adjustedContent); + Long recordId = violationRecordGateway.save(record); + + // 8. 发送通知消息 + sendAdjustMessage(cmd.getUserId(), violationType); + + log.info("用户违规调整完成, userId={}, violationType={}, original={}, adjusted={}", + cmd.getUserId(), violationType.getDesc(), originalContent, adjustedContent); + + return ViolationHandleResultCO.builder() + .recordId(recordId) + .bizNo(bizNo) + .success(true) + .originalContent(originalContent) + .adjustedContent(adjustedContent) + .message("调整已完成") + .build(); + } + + private String getOriginalContent(UserProfile userProfile, ViolationTypeEnum violationType) { + switch (violationType) { + case USER_NICKNAME: + return userProfile.getUserNickname(); + case USER_AVATAR: + return userProfile.getUserAvatar(); + default: + return null; + } + } + + private String adjustContent(UserProfile userProfile, ViolationTypeEnum violationType, Long userId) { + switch (violationType) { + case USER_NICKNAME: + return "用户" + userProfile.getAccount(); + case USER_AVATAR: + return enumConfigCacheService.getValue(EnumConfigKey.DEFAULT_USER_AVATAR, userProfile.getOriginSys()); + default: + return null; + } + } + + private void updateUserProfile(UserProfile userProfile, ViolationTypeEnum violationType, String adjustedContent) { + switch (violationType) { + case USER_NICKNAME: + userProfile.setUserNickname(adjustedContent); + break; + case USER_AVATAR: + userProfile.setUserAvatar(adjustedContent); + break; + } + userProfileGateway.updateSelectiveById(userProfile); + } + + private void sendAdjustMessage(Long userId, ViolationTypeEnum violationType) { + String content = buildAdjustContent(violationType); + officialNoticeClient.send( + NoticeExtTemplateCustomizeCmd.builder() + .toAccount(userId) + .noticeType(OfficialNoticeTypeEnum.VIOLATION_ADJUST) + .content(content) + .title("System") + .build()); + } + + private String buildAdjustContent(ViolationTypeEnum violationType) { + switch (violationType) { + case USER_NICKNAME: + return "Your username has been adjusted due to rule violations. Please update your username as soon as possible."; + case USER_AVATAR: + return "Your profile picture has been adjusted due to rule violations. Please update your profile picture as soon as possible."; + default: + return "Your information has been adjusted due to rule violations. Please update it as soon as possible."; + } + } + + private ViolationRecord buildViolationRecord(UserViolationHandleCmd cmd, UserProfile reqUser, + String bizNo, String originalContent, String adjustedContent) { + ViolationRecord record = new ViolationRecord(); + record.setBizNo(bizNo); + record.setTargetType(TargetTypeEnum.USER.getCode()); + record.setTargetId(String.valueOf(cmd.getUserId())); + record.setViolationType(cmd.getViolationType()); + record.setOperationType(OperationTypeEnum.ADJUST.getCode()); + record.setDescription(cmd.getDescription()); + record.setScreenshotUrls(cmd.getScreenshotUrls() != null ? JSON.toJSONString(cmd.getScreenshotUrls()) : null); + record.setOriginalContent(originalContent); + record.setAdjustedContent(adjustedContent); + record.setOperatorId(reqUser.getId()); + record.setOperatorName(reqUser.getUserNickname()); + record.setStatus(1); + record.setCreateTime(LocalDateTime.now()); + record.setUpdateTime(LocalDateTime.now()); + return record; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationWarningCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationWarningCmdExe.java new file mode 100644 index 00000000..6ccedaf4 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/violation/user/UserViolationWarningCmdExe.java @@ -0,0 +1,132 @@ +package com.red.circle.other.app.command.violation.user; + +import com.alibaba.fastjson.JSON; +import com.red.circle.external.inner.endpoint.message.OfficialNoticeClient; +import com.red.circle.external.inner.model.cmd.message.notice.official.NoticeExtTemplateCustomizeCmd; +import com.red.circle.external.inner.model.enums.message.OfficialNoticeTypeEnum; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.cmd.violation.UserViolationHandleCmd; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import com.red.circle.other.app.enums.violation.TargetTypeEnum; +import com.red.circle.other.app.enums.violation.ViolationTypeEnum; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; +import com.red.circle.other.inner.asserts.user.UserErrorCode; +import com.red.circle.other.inner.enums.sys.appmanager.ManagerApprovalType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +/** + * 用户违规警告命令执行器 + * + * @author Claude + * @date 2025-01-15 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class UserViolationWarningCmdExe { + + private final UserProfileGateway userProfileGateway; + private final ViolationRecordGateway violationRecordGateway; + private final AdministratorAuthService administratorAuthService; + private final OfficialNoticeClient officialNoticeClient; + + @Transactional(rollbackFor = Exception.class) + public ViolationHandleResultCO execute(UserViolationHandleCmd cmd) { + // 1. 权限验证 + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + administratorAuthService.existsAuth(cmd.requiredReqUserId(), ManagerApprovalType.USER_NICKNAME.name())); + + // 2. 查询用户信息 + UserProfile userProfile = userProfileGateway.getByUserId(cmd.getUserId()); + ResponseAssert.notNull(UserErrorCode.USER_INFO_NOT_FOUND, userProfile); + + // 3. 验证违规类型 + ViolationTypeEnum violationType = ViolationTypeEnum.getByCode(cmd.getViolationType()); + ResponseAssert.notNull(CommonErrorCode.DATA_ERROR, violationType); + ResponseAssert.isTrue(CommonErrorCode.DATA_ERROR, violationType.matchTargetType(TargetTypeEnum.USER)); + + // 4. 获取原始内容 + String originalContent = getOriginalContent(userProfile, violationType); + + // 5. 保存违规记录 + String bizNo = "violation_user_" + cmd.getUserId() + "_" + System.currentTimeMillis(); + UserProfile reqUser = userProfileGateway.getByUserId(cmd.getReqUserId()); + ViolationRecord record = buildViolationRecord(cmd, reqUser, bizNo, originalContent, null); + Long recordId = violationRecordGateway.save(record); + + // 6. 发送警告消息 + sendWarningMessage(cmd.getUserId(), violationType); + + return ViolationHandleResultCO.builder() + .recordId(recordId) + .bizNo(bizNo) + .success(true) + .originalContent(originalContent) + .message("警告已发送") + .build(); + } + + private String getOriginalContent(UserProfile userProfile, ViolationTypeEnum violationType) { + switch (violationType) { + case USER_NICKNAME: + return userProfile.getUserNickname(); + case USER_AVATAR: + return userProfile.getUserAvatar(); + default: + return null; + } + } + + private void sendWarningMessage(Long userId, ViolationTypeEnum violationType) { + String content = buildWarningContent(violationType); + officialNoticeClient.send( + NoticeExtTemplateCustomizeCmd.builder() + .toAccount(userId) + .noticeType(OfficialNoticeTypeEnum.VIOLATION_WARNING) + .content(content) + .title("System") + .build()); + } + + private String buildWarningContent(ViolationTypeEnum violationType) { + switch (violationType) { + case USER_NICKNAME: + return "Your username is in violation of the rules. Please correct the current username immediately."; + case USER_AVATAR: + return "Your user profile picture is in violation of the rules. Please correct your current user profile picture immediately."; + default: + return "Your information violates the rules. Please correct it immediately."; + } + } + + private ViolationRecord buildViolationRecord(UserViolationHandleCmd cmd, UserProfile reqUser, + String bizNo, String originalContent, String adjustedContent) { + ViolationRecord record = new ViolationRecord(); + record.setBizNo(bizNo); + record.setTargetType(TargetTypeEnum.USER.getCode()); + record.setTargetId(String.valueOf(cmd.getUserId())); + record.setViolationType(cmd.getViolationType()); + record.setOperationType(OperationTypeEnum.WARNING.getCode()); + record.setDescription(cmd.getDescription()); + record.setScreenshotUrls(cmd.getScreenshotUrls() != null ? JSON.toJSONString(cmd.getScreenshotUrls()) : null); + record.setOriginalContent(originalContent); + record.setAdjustedContent(adjustedContent); + record.setOperatorId(reqUser.getId()); + record.setOperatorName(reqUser.getUserNickname()); + record.setStatus(1); + record.setCreateTime(LocalDateTime.now()); + record.setUpdateTime(LocalDateTime.now()); + return record; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/violation/ViolationRecordConvertor.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/violation/ViolationRecordConvertor.java new file mode 100644 index 00000000..86daaf93 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/violation/ViolationRecordConvertor.java @@ -0,0 +1,56 @@ +package com.red.circle.other.app.convertor.violation; + +import com.alibaba.fastjson.JSON; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.domain.violation.ViolationRecord; +import org.mapstruct.Mapper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 违规记录转换器 + */ +@Mapper(componentModel = "spring") +public interface ViolationRecordConvertor { + + /** + * 领域对象转客户端对象 + */ + default ViolationRecordCO toCO(ViolationRecord record) { + if (record == null) { + return null; + } + + ViolationRecordCO co = new ViolationRecordCO(); + co.setId(record.getId()); + co.setBizNo(record.getBizNo()); + co.setTargetType(record.getTargetType()); + co.setTargetId(record.getTargetId()); + co.setViolationType(record.getViolationType()); + co.setOperationType(record.getOperationType()); + co.setDescription(record.getDescription()); + // 将 JSON 字符串转换为 List + co.setScreenshotUrls(record.getScreenshotUrls() != null ? + JSON.parseArray(record.getScreenshotUrls(), String.class) : null); + co.setOriginalContent(record.getOriginalContent()); + co.setAdjustedContent(record.getAdjustedContent()); + co.setOperatorId(record.getOperatorId()); + co.setOperatorName(record.getOperatorName()); + co.setCreateTime(record.getCreateTime()); + + return co; + } + + /** + * 批量转换 + */ + default List toCOList(List records) { + if (records == null) { + return null; + } + return records.stream() + .map(this::toCO) + .collect(Collectors.toList()); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/OperationTypeEnum.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/OperationTypeEnum.java new file mode 100644 index 00000000..5cf2aba8 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/OperationTypeEnum.java @@ -0,0 +1,50 @@ +package com.red.circle.other.app.enums.violation; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 违规操作类型枚举 + * + * @author Claude + * @date 2025-01-15 + */ +@Getter +@AllArgsConstructor +public enum OperationTypeEnum { + + /** + * 警告 + */ + WARNING(1, "警告"), + + /** + * 调整 + */ + ADJUST(2, "调整"); + + /** + * 类型编码 + */ + private final Integer code; + + /** + * 类型描述 + */ + private final String desc; + + /** + * 根据编码获取枚举 + */ + public static OperationTypeEnum getByCode(Integer code) { + if (code == null) { + return null; + } + return Arrays.stream(values()) + .filter(e -> e.getCode().equals(code)) + .findFirst() + .orElse(null); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/TargetTypeEnum.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/TargetTypeEnum.java new file mode 100644 index 00000000..17901bc5 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/TargetTypeEnum.java @@ -0,0 +1,50 @@ +package com.red.circle.other.app.enums.violation; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 违规目标类型枚举 + * + * @author Claude + * @date 2025-01-15 + */ +@Getter +@AllArgsConstructor +public enum TargetTypeEnum { + + /** + * 用户 + */ + USER(1, "用户"), + + /** + * 房间 + */ + ROOM(2, "房间"); + + /** + * 类型编码 + */ + private final Integer code; + + /** + * 类型描述 + */ + private final String desc; + + /** + * 根据编码获取枚举 + */ + public static TargetTypeEnum getByCode(Integer code) { + if (code == null) { + return null; + } + return Arrays.stream(values()) + .filter(e -> e.getCode().equals(code)) + .findFirst() + .orElse(null); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/ViolationTypeEnum.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/ViolationTypeEnum.java new file mode 100644 index 00000000..ac5aad3a --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/enums/violation/ViolationTypeEnum.java @@ -0,0 +1,82 @@ +package com.red.circle.other.app.enums.violation; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 违规类型枚举 + * + * @author Claude + * @date 2025-01-15 + */ +@Getter +@AllArgsConstructor +public enum ViolationTypeEnum { + + /** + * 用户名 + */ + USER_NICKNAME(1, "用户名", TargetTypeEnum.USER), + + /** + * 用户头像 + */ + USER_AVATAR(2, "用户头像", TargetTypeEnum.USER), + + /** + * 房间名称 + */ + ROOM_NICKNAME(3, "房间名称", TargetTypeEnum.ROOM), + + /** + * 房间头像 + */ + ROOM_COVER(4, "房间头像", TargetTypeEnum.ROOM), + + /** + * 房间公告 + */ + ROOM_NOTICE(5, "房间公告", TargetTypeEnum.ROOM), + + /** + * 房间主题 + */ + ROOM_THEME(6, "房间主题", TargetTypeEnum.ROOM); + + /** + * 类型编码 + */ + private final Integer code; + + /** + * 类型描述 + */ + private final String desc; + + /** + * 所属目标类型 + */ + private final TargetTypeEnum targetType; + + /** + * 根据编码获取枚举 + */ + public static ViolationTypeEnum getByCode(Integer code) { + if (code == null) { + return null; + } + return Arrays.stream(values()) + .filter(e -> e.getCode().equals(code)) + .findFirst() + .orElse(null); + } + + /** + * 验证违规类型是否匹配目标类型 + */ + public boolean matchTargetType(TargetTypeEnum targetType) { + return this.targetType == targetType; + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/RoomViolationServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/RoomViolationServiceImpl.java new file mode 100644 index 00000000..0f712b5e --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/RoomViolationServiceImpl.java @@ -0,0 +1,43 @@ +package com.red.circle.other.app.service.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.command.violation.query.ViolationRecordPageQryExe; +import com.red.circle.other.app.command.violation.room.RoomViolationAdjustCmdExe; +import com.red.circle.other.app.command.violation.room.RoomViolationWarningCmdExe; +import com.red.circle.other.app.dto.cmd.violation.RoomViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * 房间违规服务实现 + */ +@Service +@RequiredArgsConstructor +public class RoomViolationServiceImpl implements RoomViolationService { + + private final RoomViolationWarningCmdExe roomViolationWarningCmdExe; + private final RoomViolationAdjustCmdExe roomViolationAdjustCmdExe; + private final ViolationRecordPageQryExe violationRecordPageQryExe; + + @Override + @Transactional(rollbackFor = Exception.class) + public ViolationHandleResultCO handle(RoomViolationHandleCmd cmd) { + if (Objects.equals(cmd.getOperationType(), OperationTypeEnum.WARNING.getCode())) { + return roomViolationWarningCmdExe.execute(cmd); + } else { + return roomViolationAdjustCmdExe.execute(cmd); + } + } + + @Override + public PageResult pageQuery(ViolationRecordPageQueryCmd cmd) { + return violationRecordPageQryExe.execute(cmd); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/UserViolationServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/UserViolationServiceImpl.java new file mode 100644 index 00000000..35c970e0 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/violation/UserViolationServiceImpl.java @@ -0,0 +1,43 @@ +package com.red.circle.other.app.service.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.command.violation.query.ViolationRecordPageQryExe; +import com.red.circle.other.app.command.violation.user.UserViolationAdjustCmdExe; +import com.red.circle.other.app.command.violation.user.UserViolationWarningCmdExe; +import com.red.circle.other.app.dto.cmd.violation.UserViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.enums.violation.OperationTypeEnum; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * 用户违规服务实现 + */ +@Service +@RequiredArgsConstructor +public class UserViolationServiceImpl implements UserViolationService { + + private final UserViolationWarningCmdExe userViolationWarningCmdExe; + private final UserViolationAdjustCmdExe userViolationAdjustCmdExe; + private final ViolationRecordPageQryExe violationRecordPageQryExe; + + @Override + @Transactional(rollbackFor = Exception.class) + public ViolationHandleResultCO handle(UserViolationHandleCmd cmd) { + if (Objects.equals(cmd.getOperationType(), OperationTypeEnum.WARNING.getCode())) { + return userViolationWarningCmdExe.execute(cmd); + } else { + return userViolationAdjustCmdExe.execute(cmd); + } + } + + @Override + public PageResult pageQuery(ViolationRecordPageQueryCmd cmd) { + return violationRecordPageQryExe.execute(cmd); + } +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationHandleResultCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationHandleResultCO.java new file mode 100644 index 00000000..4602e01a --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationHandleResultCO.java @@ -0,0 +1,49 @@ +package com.red.circle.other.app.dto.clientobject.violation; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 违规处理结果客户端对象 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ViolationHandleResultCO { + + /** + * 记录ID + */ + private Long recordId; + + /** + * 业务单号 + */ + private String bizNo; + + /** + * 处理消息 + */ + private String message; + + /** + * 是否成功 + */ + private Boolean success; + + /** + * 原始内容 + */ + private String originalContent; + + /** + * 调整后内容 + */ + private String adjustedContent; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationRecordCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationRecordCO.java new file mode 100644 index 00000000..adc41dca --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/violation/ViolationRecordCO.java @@ -0,0 +1,106 @@ +package com.red.circle.other.app.dto.clientobject.violation; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 违规记录客户端对象 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +public class ViolationRecordCO { + + /** + * 记录ID + */ + private Long id; + + /** + * 业务单号 + */ + private String bizNo; + + /** + * 目标类型:1-用户 2-房间 + */ + private Integer targetType; + + /** + * 目标类型描述 + */ + private String targetTypeDesc; + + /** + * 目标ID + */ + private String targetId; + + /** + * 违规类型 + */ + private Integer violationType; + + /** + * 违规类型描述 + */ + private String violationTypeDesc; + + /** + * 操作类型:1-警告 2-调整 + */ + private Integer operationType; + + /** + * 操作类型描述 + */ + private String operationTypeDesc; + + /** + * 问题描述 + */ + private String description; + + /** + * 截图地址列表 + */ + private List screenshotUrls; + + /** + * 原始内容 + */ + private String originalContent; + + /** + * 调整后内容 + */ + private String adjustedContent; + + /** + * 操作管理员ID + */ + private Long operatorId; + + /** + * 操作管理员名称 + */ + private String operatorName; + + /** + * 状态 + */ + private Integer status; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/RoomViolationHandleCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/RoomViolationHandleCmd.java new file mode 100644 index 00000000..417ac4e6 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/RoomViolationHandleCmd.java @@ -0,0 +1,49 @@ +package com.red.circle.other.app.dto.cmd.violation; + +import com.red.circle.common.business.dto.cmd.AppExtCommand; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 房间违规处理命令 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RoomViolationHandleCmd extends AppExtCommand { + + /** + * 房间ID + */ + @NotBlank(message = "房间ID不能为空") + private String roomId; + + /** + * 违规类型:3-房间名 4-房间头像 5-房间公告 6-房间主题 + */ + @NotNull(message = "违规类型不能为空") + private Integer violationType; + + /** + * 操作类型:1-警告 2-调整 + */ + @NotNull(message = "操作类型不能为空") + private Integer operationType; + + /** + * 问题描述 + */ + @NotBlank(message = "问题描述不能为空") + private String description; + + /** + * 截图URL列表 + */ + private List screenshotUrls; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/UserViolationHandleCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/UserViolationHandleCmd.java new file mode 100644 index 00000000..c0a46b52 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/UserViolationHandleCmd.java @@ -0,0 +1,49 @@ +package com.red.circle.other.app.dto.cmd.violation; + +import com.red.circle.common.business.dto.cmd.AppExtCommand; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 用户违规处理命令 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UserViolationHandleCmd extends AppExtCommand { + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空") + private Long userId; + + /** + * 违规类型:1-用户名 2-用户头像 + */ + @NotNull(message = "违规类型不能为空") + private Integer violationType; + + /** + * 操作类型:1-警告 2-调整 + */ + @NotNull(message = "操作类型不能为空") + private Integer operationType; + + /** + * 问题描述 + */ + @NotBlank(message = "问题描述不能为空") + private String description; + + /** + * 截图URL列表 + */ + private List screenshotUrls; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/ViolationRecordPageQueryCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/ViolationRecordPageQueryCmd.java new file mode 100644 index 00000000..004eab44 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/violation/ViolationRecordPageQueryCmd.java @@ -0,0 +1,41 @@ +package com.red.circle.other.app.dto.cmd.violation; + +import com.red.circle.common.business.dto.PageQueryCmd; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 违规记录分页查询命令 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ViolationRecordPageQueryCmd extends PageQueryCmd { + + /** + * 目标类型:1-用户 2-房间 + */ + private Integer targetType; + + /** + * 目标ID + */ + private String targetId; + + /** + * 违规类型 + */ + private Integer violationType; + + /** + * 操作类型 + */ + private Integer operationType; + + /** + * 操作管理员ID + */ + private Long operatorId; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/RoomViolationService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/RoomViolationService.java new file mode 100644 index 00000000..fb820eaf --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/RoomViolationService.java @@ -0,0 +1,32 @@ +package com.red.circle.other.app.service.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.dto.cmd.violation.RoomViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; + +/** + * 房间违规服务接口 + * + * @author Claude + * @date 2025-01-15 + */ +public interface RoomViolationService { + + /** + * 处理房间违规 + * + * @param cmd 处理命令 + * @return 处理结果 + */ + ViolationHandleResultCO handle(RoomViolationHandleCmd cmd); + + /** + * 分页查询违规记录 + * + * @param cmd 查询命令 + * @return 分页结果 + */ + PageResult pageQuery(ViolationRecordPageQueryCmd cmd); +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/UserViolationService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/UserViolationService.java new file mode 100644 index 00000000..d714cdbd --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/violation/UserViolationService.java @@ -0,0 +1,32 @@ +package com.red.circle.other.app.service.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.dto.clientobject.violation.ViolationHandleResultCO; +import com.red.circle.other.app.dto.clientobject.violation.ViolationRecordCO; +import com.red.circle.other.app.dto.cmd.violation.UserViolationHandleCmd; +import com.red.circle.other.app.dto.cmd.violation.ViolationRecordPageQueryCmd; + +/** + * 用户违规服务接口 + * + * @author Claude + * @date 2025-01-15 + */ +public interface UserViolationService { + + /** + * 处理用户违规 + * + * @param cmd 处理命令 + * @return 处理结果 + */ + ViolationHandleResultCO handle(UserViolationHandleCmd cmd); + + /** + * 分页查询违规记录 + * + * @param cmd 查询命令 + * @return 分页结果 + */ + PageResult pageQuery(ViolationRecordPageQueryCmd cmd); +} diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/violation/ViolationRecordGateway.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/violation/ViolationRecordGateway.java new file mode 100644 index 00000000..47486fd0 --- /dev/null +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/gateway/violation/ViolationRecordGateway.java @@ -0,0 +1,67 @@ +package com.red.circle.other.domain.gateway.violation; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.domain.violation.ViolationRecord; + +import java.util.List; + +/** + * 违规记录领域网关 + * + * @author Claude + * @date 2025-01-15 + */ +public interface ViolationRecordGateway { + + /** + * 保存违规记录 + * + * @param record 违规记录 + * @return 记录ID + */ + Long save(ViolationRecord record); + + /** + * 根据业务单号查询 + * + * @param bizNo 业务单号 + * @return 违规记录 + */ +// ViolationRecord getByBizNo(String bizNo); + + /** + * 根据ID查询 + * + * @param id 记录ID + * @return 违规记录 + */ +// ViolationRecord getById(Long id); + + /** + * 分页查询 + * + * @param targetType 目标类型 + * @param targetId 目标ID + * @param violationType 违规类型 + * @param operationType 操作类型 + * @param operatorId 操作人ID + * @param pageNum 页码 + * @param pageSize 每页数量 + * @return 记录列表 + */ + PageResult pageQuery(Integer targetType, String targetId, Integer violationType, + Integer operationType, Long operatorId, Integer pageNum, Integer pageSize); + + /** + * 统计总数 + * + * @param targetType 目标类型 + * @param targetId 目标ID + * @param violationType 违规类型 + * @param operationType 操作类型 + * @param operatorId 操作人ID + * @return 总数 + */ +// Long count(Integer targetType, String targetId, Integer violationType, +// Integer operationType, Long operatorId); +} diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/violation/ViolationRecord.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/violation/ViolationRecord.java new file mode 100644 index 00000000..b7133268 --- /dev/null +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/violation/ViolationRecord.java @@ -0,0 +1,96 @@ +package com.red.circle.other.domain.violation; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 违规记录领域对象 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ViolationRecord { + + /** + * 主键ID + */ + private Long id; + + /** + * 业务单号 + */ + private String bizNo; + + /** + * 目标类型:1-用户 2-房间 + */ + private Integer targetType; + + /** + * 目标ID + */ + private String targetId; + + /** + * 违规类型 + */ + private Integer violationType; + + /** + * 操作类型:1-警告 2-调整 + */ + private Integer operationType; + + /** + * 问题描述 + */ + private String description; + + /** + * 截图地址(JSON数组) + */ + private String screenshotUrls; + + /** + * 原始内容 + */ + private String originalContent; + + /** + * 调整后内容 + */ + private String adjustedContent; + + /** + * 操作管理员ID + */ + private Long operatorId; + + /** + * 操作管理员名称 + */ + private String operatorName; + + /** + * 状态 + */ + private Integer status; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/violation/ViolationRecordDAO.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/violation/ViolationRecordDAO.java new file mode 100644 index 00000000..8c401fac --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/violation/ViolationRecordDAO.java @@ -0,0 +1,16 @@ +package com.red.circle.other.infra.database.rds.dao.violation; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.red.circle.framework.mybatis.dao.BaseDAO; +import com.red.circle.other.infra.database.rds.entity.violation.ViolationRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 违规记录Mapper + * + * @author Claude + * @date 2025-01-15 + */ +@Mapper +public interface ViolationRecordDAO extends BaseDAO { +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/violation/ViolationRecordEntity.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/violation/ViolationRecordEntity.java new file mode 100644 index 00000000..959fde10 --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/violation/ViolationRecordEntity.java @@ -0,0 +1,95 @@ +package com.red.circle.other.infra.database.rds.entity.violation; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 违规处理记录表 + * + * @author Claude + * @date 2025-01-15 + */ +@Data +@TableName("t_violation_record") +public class ViolationRecordEntity { + + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 业务单号(幂等) + */ + private String bizNo; + + /** + * 目标类型:1-用户 2-房间 + */ + private Integer targetType; + + /** + * 目标ID(用户ID或房间ID) + */ + private String targetId; + + /** + * 违规类型:1-用户名 2-用户头像 3-房间名 4-房间头像 5-房间公告 6-房间主题 + */ + private Integer violationType; + + /** + * 操作类型:1-警告 2-调整 + */ + private Integer operationType; + + /** + * 问题描述 + */ + private String description; + + /** + * 截图地址(JSON数组) + */ + private String screenshotUrls; + + /** + * 原始内容 + */ + private String originalContent; + + /** + * 调整后内容 + */ + private String adjustedContent; + + /** + * 操作管理员ID + */ + private Long operatorId; + + /** + * 操作管理员名称 + */ + private String operatorName; + + /** + * 状态:1-已处理 + */ + private Integer status; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/violation/ViolationRecordGatewayImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/violation/ViolationRecordGatewayImpl.java new file mode 100644 index 00000000..cf978abc --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/violation/ViolationRecordGatewayImpl.java @@ -0,0 +1,125 @@ +package com.red.circle.other.infra.gateway.violation; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.domain.gateway.violation.ViolationRecordGateway; +import com.red.circle.other.domain.violation.ViolationRecord; +import com.red.circle.other.infra.database.rds.dao.violation.ViolationRecordDAO; +import com.red.circle.other.infra.database.rds.entity.violation.ViolationRecordEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 违规记录网关实现 + */ +@Component +@RequiredArgsConstructor +public class ViolationRecordGatewayImpl implements ViolationRecordGateway { + + private final ViolationRecordDAO violationRecordDAO; + + @Override + public Long save(ViolationRecord record) { + ViolationRecordEntity entity = toEntity(record); + entity.setBizNo(generateBizNo(record)); + entity.setCreateTime(LocalDateTime.now()); + entity.setUpdateTime(LocalDateTime.now()); + violationRecordDAO.insert(entity); + return entity.getId(); + } + + @Override + public PageResult pageQuery(Integer targetType, String targetId, Integer violationType, + Integer operationType, Long operatorId, Integer pageNum, Integer pageSize) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (targetType != null) { + wrapper.eq(ViolationRecordEntity::getTargetType, targetType); + } + if (targetId != null) { + wrapper.eq(ViolationRecordEntity::getTargetId, targetId); + } + if (violationType != null) { + wrapper.eq(ViolationRecordEntity::getViolationType, violationType); + } + if (operationType != null) { + wrapper.eq(ViolationRecordEntity::getOperationType, operationType); + } + + wrapper.orderByDesc(ViolationRecordEntity::getCreateTime); + + IPage page = new Page<>(pageNum, pageSize); + IPage result = violationRecordDAO.selectPage(page, wrapper); + + List records = result.getRecords().stream() + .map(this::toDomain) + .collect(Collectors.toList()); + + PageResult pageResult = new PageResult<>(); + pageResult.setRecords(records); + pageResult.setTotal(page.getTotal()); + pageResult.setCurrent(page.getCurrent()); + pageResult.setSize(page.getSize()); + + return pageResult; + } + + /** + * 生成业务单号 + */ + private String generateBizNo(ViolationRecord record) { + return String.format("violation_%d_%s_%s", + record.getTargetType(), + record.getTargetId(), + IdUtil.getSnowflakeNextIdStr()); + } + + /** + * 领域对象转实体 + */ + private ViolationRecordEntity toEntity(ViolationRecord record) { + ViolationRecordEntity entity = new ViolationRecordEntity(); + entity.setTargetType(record.getTargetType()); + entity.setTargetId(record.getTargetId()); + entity.setViolationType(record.getViolationType()); + entity.setOperationType(record.getOperationType()); + entity.setDescription(record.getDescription()); + entity.setScreenshotUrls(record.getScreenshotUrls() != null ? + JSON.toJSONString(record.getScreenshotUrls()) : null); + entity.setOriginalContent(record.getOriginalContent()); + entity.setAdjustedContent(record.getAdjustedContent()); + entity.setOperatorId(record.getOperatorId()); + entity.setOperatorName(record.getOperatorName()); + entity.setStatus(1); + return entity; + } + + /** + * 实体转领域对象 + */ + private ViolationRecord toDomain(ViolationRecordEntity entity) { + return ViolationRecord.builder() + .id(entity.getId()) + .bizNo(entity.getBizNo()) + .targetType(entity.getTargetType()) + .targetId(entity.getTargetId()) + .violationType(entity.getViolationType()) + .operationType(entity.getOperationType()) + .description(entity.getDescription()) + .screenshotUrls(entity.getScreenshotUrls()) + .originalContent(entity.getOriginalContent()) + .adjustedContent(entity.getAdjustedContent()) + .operatorId(entity.getOperatorId()) + .operatorName(entity.getOperatorName()) + .createTime(entity.getCreateTime()) + .build(); + } +}