From dae4696224e5ce0bdf09e955952b451470c6de08 Mon Sep 17 00:00:00 2001 From: ziin Date: Thu, 26 Mar 2026 10:56:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(host-info):=20=E6=B7=BB=E5=8A=A0=E4=B8=BB?= =?UTF-8?q?=E6=92=ADAI=E6=93=8D=E4=BD=9C=E7=8A=B6=E6=80=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 `/update_ai_operation` 接口,支持根据主播ID和租户ID更新AI操作状态 - 添加请求参数校验和幂等性检查逻辑 - 删除旧日志文件并添加新日志文件 --- .../controller/HostInfoController.java | 9 +++++ .../host/HostAiOperationUpdateRequest.java | 23 +++++++++++ .../service/HostInfoService.java | 8 ++-- .../service/impl/HostInfoServiceImpl.java | 40 ++++++++++++++++++- 4 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/yupi/springbootinit/model/dto/host/HostAiOperationUpdateRequest.java diff --git a/src/main/java/com/yupi/springbootinit/controller/HostInfoController.java b/src/main/java/com/yupi/springbootinit/controller/HostInfoController.java index 36c18ce..b590021 100644 --- a/src/main/java/com/yupi/springbootinit/controller/HostInfoController.java +++ b/src/main/java/com/yupi/springbootinit/controller/HostInfoController.java @@ -3,6 +3,7 @@ package com.yupi.springbootinit.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yupi.springbootinit.common.BaseResponse; import com.yupi.springbootinit.common.ResultUtils; +import com.yupi.springbootinit.model.dto.host.HostAiOperationUpdateRequest; import com.yupi.springbootinit.model.dto.host.HostInfoDTO; import com.yupi.springbootinit.model.dto.host.ServerLiveHostDetailDTO; import com.yupi.springbootinit.model.entity.NewHosts; @@ -58,6 +59,14 @@ public class HostInfoController { } + @PostMapping("/update_ai_operation") + public BaseResponse updateAiOperation(@RequestBody HostAiOperationUpdateRequest request) { + String hostsId = request == null ? null : request.getHostsId(); + Long tenantId = request == null ? null : request.getTenantId(); + log.info("更新主播AI操作状态,hostsId: {}, tenantId: {}", hostsId, tenantId); + return ResultUtils.success(hostInfoService.updateAiOperation(request)); + } + /** * 根据主播ID和租户ID查询直播明细 * @param detailDTO 查询条件(包含hostsId和tenantId) diff --git a/src/main/java/com/yupi/springbootinit/model/dto/host/HostAiOperationUpdateRequest.java b/src/main/java/com/yupi/springbootinit/model/dto/host/HostAiOperationUpdateRequest.java new file mode 100644 index 0000000..5770197 --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/model/dto/host/HostAiOperationUpdateRequest.java @@ -0,0 +1,23 @@ +package com.yupi.springbootinit.model.dto.host; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 主播 AI 操作状态更新请求 + */ +@Data +@ApiModel("主播 AI 操作状态更新请求") +public class HostAiOperationUpdateRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主播ID", required = true, example = "host123") + private String hostsId; + + @ApiModelProperty(value = "租户ID", required = true, example = "1001") + private Long tenantId; +} diff --git a/src/main/java/com/yupi/springbootinit/service/HostInfoService.java b/src/main/java/com/yupi/springbootinit/service/HostInfoService.java index 480a982..92b9eee 100644 --- a/src/main/java/com/yupi/springbootinit/service/HostInfoService.java +++ b/src/main/java/com/yupi/springbootinit/service/HostInfoService.java @@ -3,14 +3,10 @@ package com.yupi.springbootinit.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.yupi.springbootinit.model.dto.host.HistoryDataDTO; +import com.yupi.springbootinit.model.dto.host.HostAiOperationUpdateRequest; import com.yupi.springbootinit.model.dto.host.HostInfoDTO; import com.yupi.springbootinit.model.entity.NewHosts; import com.yupi.springbootinit.model.vo.hosts.NewHostsVO; -import com.yupi.springbootinit.model.vo.hosts.SevenDaysData; - -import java.util.List; -import java.util.concurrent.CompletableFuture; /* * @author: ziin @@ -21,4 +17,6 @@ public interface HostInfoService extends IService { Page getConditionHosts(HostInfoDTO hostInfoDTO); + boolean updateAiOperation(HostAiOperationUpdateRequest request); + } diff --git a/src/main/java/com/yupi/springbootinit/service/impl/HostInfoServiceImpl.java b/src/main/java/com/yupi/springbootinit/service/impl/HostInfoServiceImpl.java index ce22f42..ed0a7b7 100644 --- a/src/main/java/com/yupi/springbootinit/service/impl/HostInfoServiceImpl.java +++ b/src/main/java/com/yupi/springbootinit/service/impl/HostInfoServiceImpl.java @@ -1,27 +1,34 @@ package com.yupi.springbootinit.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yupi.springbootinit.common.ErrorCode; +import com.yupi.springbootinit.exception.BusinessException; import com.yupi.springbootinit.mapper.NewHostsMapper; +import com.yupi.springbootinit.model.dto.host.HostAiOperationUpdateRequest; import com.yupi.springbootinit.model.dto.host.HostInfoDTO; import com.yupi.springbootinit.model.entity.NewHosts; import com.yupi.springbootinit.model.vo.hosts.NewHostsVO; import com.yupi.springbootinit.service.HostInfoService; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; /* * @author: ziin * @date: 2025/6/10 19:04 */ @Service -@Slf4j @Transactional(rollbackFor = Exception.class) public class HostInfoServiceImpl extends ServiceImpl implements HostInfoService { + private static final byte AI_OPERATION_ENABLED = 1; + private static final byte NOT_DELETED = 0; + @Resource private NewHostsMapper newHostsMapper; @@ -31,5 +38,34 @@ public class HostInfoServiceImpl extends ServiceImpl i return newHostsMapper.selectPageByCondition(page, hostInfoDTO); } + @Override + public boolean updateAiOperation(HostAiOperationUpdateRequest request) { + validateAiOperationUpdateRequest(request); + List matchedHosts = lambdaQuery() + .eq(NewHosts::getHostsId, request.getHostsId()) + .eq(NewHosts::getTenantId, request.getTenantId()) + .eq(NewHosts::getDeleted, NOT_DELETED) + .list(); + if (matchedHosts.isEmpty()) { + return false; + } + boolean allAiOperationEnabled = matchedHosts.stream() + .allMatch(host -> Objects.equals(host.getAiOperation(), AI_OPERATION_ENABLED)); + if (allAiOperationEnabled) { + return true; + } + return lambdaUpdate() + .eq(NewHosts::getHostsId, request.getHostsId()) + .eq(NewHosts::getTenantId, request.getTenantId()) + .eq(NewHosts::getDeleted, NOT_DELETED) + .set(NewHosts::getAiOperation, AI_OPERATION_ENABLED) + .update(); + } + + private void validateAiOperationUpdateRequest(HostAiOperationUpdateRequest request) { + if (request == null || StrUtil.isBlank(request.getHostsId()) || request.getTenantId() == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "hostsId和tenantId不能为空"); + } + } }