From 3b7760051e0552725e892432d8e2a007c9074677 Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Wed, 3 Jun 2026 17:47:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E6=9C=AC=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8plus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../admin/model/entity/MiniContentAudit.java | 4 +- .../model/entity/MiniContentAuditTask.java | 18 ++++++++- .../admin/model/form/AuditConfigForm.java | 2 +- .../admin/service/AuditExecutorService.java | 4 +- .../admin/service/ContentAuditService.java | 4 +- .../impl/AuditExecutorServiceImpl.java | 18 ++++----- .../service/impl/ContentAuditServiceImpl.java | 4 +- .../common/util/AliyunContentAuditUtil.java | 37 ++++++++++++++++--- .../model/entity/MiniContentAuditAppeal.java | 4 ++ .../boot/mini/model/entity/MiniReport.java | 4 ++ .../service/impl/UserPostServiceImpl.java | 20 +++++----- src/main/resources/application-dev.yml | 5 ++- 13 files changed, 89 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index afc607c..d91fd35 100644 --- a/pom.xml +++ b/pom.xml @@ -73,7 +73,7 @@ 1.5.13 - 2.20.0 + 3.3.3 2.0.56 diff --git a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java index 2061d1a..468b2ed 100644 --- a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java +++ b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java @@ -33,8 +33,8 @@ public class MiniContentAudit implements Serializable { private String moduleCode; @TableField("biz_id") - @Schema(description = "业务数据ID(日记ID或评论ID)") - private String bizId; + @Schema(description = "业务数据主键ID(日记ID或评论ID)") + private Long bizId; @TableField("audit_type") @Schema(description = "审核类型(从config快照)") diff --git a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java index 503e822..d3e98c9 100644 --- a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java +++ b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java @@ -49,9 +49,25 @@ public class MiniContentAuditTask implements Serializable { private String status; @TableField("risk_level") - @Schema(description = "风险等级: none无 / medium中 / high高") + @Schema(description = "机审风险等级: none无 / medium中 / high高") private String riskLevel; + @TableField("label") + @Schema(description = "机审标签") + private String label; + + @TableField("confidence") + @Schema(description = "机审信任度") + private Integer confidence; + + @TableField("description") + @Schema(description = "机审描述") + private String description; + + @TableField("request_id") + @Schema(description = "机审请求ID") + private String requestId; + @TableField("machine_result") @Schema(description = "机审结果JSON") private String machineResult; diff --git a/src/main/java/com/youlai/boot/admin/model/form/AuditConfigForm.java b/src/main/java/com/youlai/boot/admin/model/form/AuditConfigForm.java index b3e9758..c3e8b0b 100644 --- a/src/main/java/com/youlai/boot/admin/model/form/AuditConfigForm.java +++ b/src/main/java/com/youlai/boot/admin/model/form/AuditConfigForm.java @@ -22,7 +22,7 @@ public class AuditConfigForm { @Schema(description = "审核类型: machine / manual / mixed") private String auditType; - @Schema(description = "机器审核风险策略: none / medium / high") + @Schema(description = "机器审核风险策略: 机审风险策略:auto--none转passed,medium转failed, high转failed;normal--none转passed,medium转to_manual, high转failed;cautious--none转passed,medium转to_manual, high转to_manual;") private String riskStrategy; } diff --git a/src/main/java/com/youlai/boot/admin/service/AuditExecutorService.java b/src/main/java/com/youlai/boot/admin/service/AuditExecutorService.java index 28ab9e7..36cef67 100644 --- a/src/main/java/com/youlai/boot/admin/service/AuditExecutorService.java +++ b/src/main/java/com/youlai/boot/admin/service/AuditExecutorService.java @@ -11,10 +11,10 @@ public interface AuditExecutorService { * * @param moduleCode 业务模块: animal_note / adoption_diary / user_post / *_comment / user_avatar / user_nickname / user_introduction * @param bizId 业务数据ID - * @param content 待审核内容 {text, images[], video} + * @param content 待审核内容 {text[], images[], video[]} * @return {status: "passed"|"failed"|"manual_review", auditId: Long},配置关闭或无配置时返回null */ - Map executeAudit(String moduleCode, String bizId, AuditContentDTO content); + Map executeAudit(String moduleCode, Long bizId, AuditContentDTO content); /** * 轮询所有待处理的视频审核异步结果,更新任务和汇总状态 diff --git a/src/main/java/com/youlai/boot/admin/service/ContentAuditService.java b/src/main/java/com/youlai/boot/admin/service/ContentAuditService.java index 6fc78d9..93fc67a 100644 --- a/src/main/java/com/youlai/boot/admin/service/ContentAuditService.java +++ b/src/main/java/com/youlai/boot/admin/service/ContentAuditService.java @@ -5,10 +5,10 @@ import com.youlai.boot.admin.model.entity.MiniContentAudit; public interface ContentAuditService extends IService { - MiniContentAudit createAudit(String moduleCode, String bizId, String auditType); + MiniContentAudit createAudit(String moduleCode, Long bizId, String auditType); void updateAuditStatus(Long auditId, String status, String finalResult); - MiniContentAudit getByModuleAndBizId(String moduleCode, String bizId); + MiniContentAudit getByModuleAndBizId(String moduleCode, Long bizId); } diff --git a/src/main/java/com/youlai/boot/admin/service/impl/AuditExecutorServiceImpl.java b/src/main/java/com/youlai/boot/admin/service/impl/AuditExecutorServiceImpl.java index 6dfe641..074c005 100644 --- a/src/main/java/com/youlai/boot/admin/service/impl/AuditExecutorServiceImpl.java +++ b/src/main/java/com/youlai/boot/admin/service/impl/AuditExecutorServiceImpl.java @@ -2,10 +2,7 @@ package com.youlai.boot.admin.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.aliyun.green20220302.models.ImageModerationResponse; -import com.aliyun.green20220302.models.TextModerationResponse; -import com.aliyun.green20220302.models.VideoModerationResponse; -import com.aliyun.green20220302.models.VideoModerationResultResponse; +import com.aliyun.green20220302.models.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.youlai.boot.admin.constant.AuditConstants; import com.youlai.boot.admin.model.dto.AuditContentDTO; @@ -46,7 +43,7 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { * @return {status, auditId};配置关闭或无配置时返回 null,调用方以此判断是否跳过审核 */ @Override - public Map executeAudit(String moduleCode, String bizId, AuditContentDTO content) { + public Map executeAudit(String moduleCode, Long bizId, AuditContentDTO content) { // 1) 查询对应模块的审核配置 MiniContentAuditConfig config = findAuditConfig(moduleCode); if (config == null || isAuditDisabled(config)) { @@ -124,7 +121,7 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { switch (contentType) { case "text" -> { - TextModerationResponse r = aliyunContentAuditUtil.textModeration(contentValue); + TextModerationPlusResponse r = aliyunContentAuditUtil.textModerationPlus(contentValue); String riskLevel = extractRiskLevelFromResponse(r); contentAuditTaskService.updateTaskMachineResult( task.getId(), JSON.toJSONString(r), riskLevel, null, null); @@ -192,7 +189,7 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { * 文本审核(同步)。 */ private void handleTextAudit(MiniContentAuditTask task, String textContent, String strictness) { - TextModerationResponse response = aliyunContentAuditUtil.textModeration(textContent); + TextModerationPlusResponse response = aliyunContentAuditUtil.textModerationPlus(textContent); String riskLevel = extractRiskLevelFromResponse(response); String machineResultJson = JSON.toJSONString(response); applyAuditResultToTask(task, riskLevel, machineResultJson, strictness); @@ -248,6 +245,9 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { */ private void applyAuditResultToTask(MiniContentAuditTask task, String riskLevel, String machineResultJson, String strictness) { if (riskLevel == null) { + log.warn("机审riskLevel为null, 转人工处理, taskId={}", task.getId()); + contentAuditTaskService.updateTaskMachineResult( + task.getId(), machineResultJson, null, null, AuditConstants.TASK_TO_MANUAL); return; } @@ -255,7 +255,7 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { String result = applyStrategy(riskLevel, strictness); // 2. result 决定任务最终状态 - String taskStatus = AuditConstants.TASK_SUCCESS.equals(result) + String taskStatus = AuditConstants.RESULT_PASSED.equals(result) ? AuditConstants.TASK_SUCCESS : AuditConstants.TASK_TO_MANUAL; // 回填任务表:machine_result(JSON) / risk_level / result / status @@ -522,7 +522,7 @@ public class AuditExecutorServiceImpl implements AuditExecutorService { } String result = applyStrategy(riskLevel, strictness); - String taskStatus = AuditConstants.TASK_SUCCESS.equals(result) + String taskStatus = AuditConstants.RESULT_PASSED.equals(result) ? AuditConstants.TASK_SUCCESS : AuditConstants.TASK_TO_MANUAL; contentAuditTaskService.updateTaskMachineResult( diff --git a/src/main/java/com/youlai/boot/admin/service/impl/ContentAuditServiceImpl.java b/src/main/java/com/youlai/boot/admin/service/impl/ContentAuditServiceImpl.java index 25d7de4..3a2175f 100644 --- a/src/main/java/com/youlai/boot/admin/service/impl/ContentAuditServiceImpl.java +++ b/src/main/java/com/youlai/boot/admin/service/impl/ContentAuditServiceImpl.java @@ -16,7 +16,7 @@ import java.util.Date; public class ContentAuditServiceImpl extends ServiceImpl implements ContentAuditService { @Override - public MiniContentAudit createAudit(String moduleCode, String bizId, String auditType) { + public MiniContentAudit createAudit(String moduleCode, Long bizId, String auditType) { MiniContentAudit entity = new MiniContentAudit(); entity.setUuid(IdUtil.fastSimpleUUID()); entity.setModuleCode(moduleCode); @@ -43,7 +43,7 @@ public class ContentAuditServiceImpl extends ServiceImpl() .eq(MiniContentAudit::getModuleCode, moduleCode) .eq(MiniContentAudit::getBizId, bizId)); diff --git a/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java b/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java index 48ce635..f0606a4 100644 --- a/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java +++ b/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java @@ -100,29 +100,55 @@ public class AliyunContentAuditUtil { } // ===================== 文本审核 ===================== + // public TextModerationResponse textModeration(String content) { return executeWithFailover(client -> { JSONObject params = new JSONObject(); params.put("content", content); TextModerationRequest request = new TextModerationRequest() - .setService("commentDetection") + .setService("comment_detection") .setServiceParameters(params.toJSONString()); return client.textModeration(request); }); } + // ===================== 文本审核Plus ===================== + //nickname_detection_pro 用户昵称检测_专业版(用户昵称) ;ugc_moderation_byllm_pro UGC场景文本审核大模型服务_专业版(个人简介 / 作品内容) ; + //comment_detection_pro 公聊评论内容检测_专业版(评论); ugc_moderation_byllm UGC场景文本审核大模型服务 (作品标题) + public TextModerationPlusResponse textModerationPlus(String content) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); +// params.put("content", content); + + JSONArray arr = new JSONArray(); + arr.add("狗日的"); + arr.add(content); + params.put("content", arr); + + TextModerationPlusRequest textModerationPlusRequest = new TextModerationPlusRequest () + .setService("ugc_moderation_byllm_pro") + .setServiceParameters(params.toJSONString()); + + return client.textModerationPlus(textModerationPlusRequest); + }); + } + // ===================== 图片审核 ===================== + // 头像图片检测:profilePhotoCheck (头像) ; AI生成图片鉴别_含隐式标识版:aigcDetectorFull(AI生成图片) ; + // 大小模型融合图片审核服务:postlmageCheckByVL (用户上传的图片) ; OSS基线检测(OSS普惠版专用):oss_baselineCheck + // 通用图片审核大模型服务:baselineCheckByVL(用户作品);图片万物识别:generalRecognition ;营销素材检测:advertisingCheck public ImageModerationResponse imageModeration(String imageUrl) { return executeWithFailover(client -> { JSONObject params = new JSONObject(); - JSONArray arr = new JSONArray(); - arr.add(imageUrl); - params.put("images", arr); +// JSONArray arr = new JSONArray(); +// arr.add(imageUrl); +// params.put("images", arr); + params.put("imageUrl", imageUrl); ImageModerationRequest request = new ImageModerationRequest() - .setService("imageDetection") + .setService("oss_baselineCheck") .setServiceParameters(params.toJSONString()); return client.imageModeration(request); @@ -130,6 +156,7 @@ public class AliyunContentAuditUtil { } // ===================== 视频审核(异步) ===================== + //视频文件检测:videoDetection ; AI生成视频判定:videoAigcDetector ; 视频文件检测_大模型版:videoDetectionByVL public VideoModerationResponse videoModeration(String videoUrl) { return executeWithFailover(client -> { JSONObject params = new JSONObject(); diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java index 56af536..7ddcf0e 100644 --- a/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java @@ -36,6 +36,10 @@ public class MiniContentAuditAppeal implements Serializable { @Schema(description = "申诉人用户ID") private Long userId; + @TableField("evidence") + @Schema(description = "证据") + private String evidence; + @TableField("reason") @Schema(description = "申诉原因") private String reason; diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java index f88bfe1..1ac8918 100644 --- a/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java @@ -44,6 +44,10 @@ public class MiniReport implements Serializable { @Schema(description = "举报原因:违法违规,侵权冒犯,垃圾虚假,违规操作,其他") private String reasonCategory; + @TableField("evidence") + @Schema(description = "证据") + private String evidence; + @TableField("description") @Schema(description = "举报补充描述") private String description; diff --git a/src/main/java/com/youlai/boot/mini/service/impl/UserPostServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/UserPostServiceImpl.java index 7344c03..af7ffd1 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/UserPostServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/UserPostServiceImpl.java @@ -224,19 +224,19 @@ public class UserPostServiceImpl extends ServiceImpl auditResult = auditExecutorService.executeAudit("user_post", postUuid, auditContent); + Map auditResult = auditExecutorService.executeAudit("user_post", postId, auditContent); if (auditResult != null) { - log.info("用户作品审核任务已创建, postUuid={}, auditResult={}", postUuid, auditResult); + log.info("用户作品审核任务已创建, postId={}, auditResult={}", postId, auditResult); } } catch (Exception e) { - log.error("创建用户作品审核任务失败, 降级为人工审核, postUuid={}", postUuid, e); - createManualReviewFallback(postUuid, formData); + log.error("创建用户作品审核任务失败, 降级为人工审核, postId={}", postId, e); + createManualReviewFallback(postId, formData); } - return postUuid; + return post.getUuid(); } /** @@ -275,12 +275,12 @@ public class UserPostServiceImpl extends ServiceImpl