| | |
| | | public class AiParamServiceImpl extends ServiceImpl<AiParamMapper, AiParam> implements AiParamService { |
| | | |
| | | @Override |
| | | public AiParam getActiveParam() { |
| | | public AiParam getActiveParam(Long tenantId) { |
| | | ensureTenantId(tenantId); |
| | | AiParam aiParam = this.getOne(new LambdaQueryWrapper<AiParam>() |
| | | .eq(AiParam::getTenantId, tenantId) |
| | | .eq(AiParam::getStatus, StatusType.ENABLE.val) |
| | | .eq(AiParam::getDeleted, 0) |
| | | .last("limit 1")); |
| | | if (aiParam == null) { |
| | | throw new CoolException("未找到启用中的 AI 参数配置"); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void validateBeforeSave(AiParam aiParam) { |
| | | public void validateBeforeSave(AiParam aiParam, Long tenantId) { |
| | | ensureTenantId(tenantId); |
| | | aiParam.setTenantId(tenantId); |
| | | fillDefaults(aiParam); |
| | | ensureBaseFields(aiParam); |
| | | ensureSingleActive(aiParam, null); |
| | | ensureSingleActive(tenantId, null, aiParam.getStatus()); |
| | | } |
| | | |
| | | @Override |
| | | public void validateBeforeUpdate(AiParam aiParam) { |
| | | public void validateBeforeUpdate(AiParam aiParam, Long tenantId) { |
| | | ensureTenantId(tenantId); |
| | | fillDefaults(aiParam); |
| | | if (aiParam.getId() == null) { |
| | | throw new CoolException("AI 参数 ID 不能为空"); |
| | | } |
| | | AiParam current = requireOwnedRecord(aiParam.getId(), tenantId); |
| | | aiParam.setTenantId(current.getTenantId()); |
| | | ensureBaseFields(aiParam); |
| | | ensureSingleActive(aiParam, aiParam.getId()); |
| | | ensureSingleActive(tenantId, aiParam.getId(), aiParam.getStatus()); |
| | | } |
| | | |
| | | private void ensureBaseFields(AiParam aiParam) { |
| | |
| | | } |
| | | } |
| | | |
| | | private void ensureSingleActive(AiParam aiParam, Long selfId) { |
| | | if (aiParam.getStatus() == null || aiParam.getStatus() != StatusType.ENABLE.val) { |
| | | private void ensureSingleActive(Long tenantId, Long selfId, Integer status) { |
| | | if (status == null || status != StatusType.ENABLE.val) { |
| | | return; |
| | | } |
| | | LambdaQueryWrapper<AiParam> wrapper = new LambdaQueryWrapper<AiParam>() |
| | | .eq(AiParam::getStatus, StatusType.ENABLE.val); |
| | | .eq(AiParam::getTenantId, tenantId) |
| | | .eq(AiParam::getStatus, StatusType.ENABLE.val) |
| | | .eq(AiParam::getDeleted, 0); |
| | | if (selfId != null) { |
| | | wrapper.ne(AiParam::getId, selfId); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | private AiParam requireOwnedRecord(Long id, Long tenantId) { |
| | | AiParam aiParam = this.getOne(new LambdaQueryWrapper<AiParam>() |
| | | .eq(AiParam::getId, id) |
| | | .eq(AiParam::getTenantId, tenantId) |
| | | .eq(AiParam::getDeleted, 0) |
| | | .last("limit 1")); |
| | | if (aiParam == null) { |
| | | throw new CoolException("AI 参数不存在或无权访问"); |
| | | } |
| | | return aiParam; |
| | | } |
| | | |
| | | private void ensureTenantId(Long tenantId) { |
| | | if (tenantId == null) { |
| | | throw new CoolException("当前租户不存在"); |
| | | } |
| | | } |
| | | |
| | | private void fillDefaults(AiParam aiParam) { |
| | | if (!StringUtils.hasText(aiParam.getProviderType())) { |
| | | aiParam.setProviderType(AiDefaults.PROVIDER_OPENAI_COMPATIBLE); |