Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,9 @@ public List<Model> listModelForSelection(Condition.ModelCondition condition) {
}

@GetMapping("/model/list")
public List<ModelDB> listModel(Condition.ModelCondition condition) {
return modelService.listByConditionWithPermission(condition, true);
public List<ModelDB> listModel(Condition.ModelCondition condition,
@RequestParam(required = false, defaultValue = "false") Boolean includePrice) {
return modelService.listModelDBsWithPermissionAndPrice(condition, true, includePrice);
}

@GetMapping("/model/page")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,10 @@ public EndpointDetails getEndpointDetails(Condition.EndpointDetailsCondition con
endpoint.setModels(models);
Class<? extends IPriceInfo> priceType = IPriceInfo.EndpointPriceInfoType.fetchType(endpoint.getEndpoint());
if(priceType != null) {
Map<String, PriceDetails> priceDetails;
if(CollectionUtils.isNotEmpty(models)) {
priceDetails = channelService.getPriceInfo(models.stream()
.map(model -> modelService.fetchTerminalModelName(model.getModelName()))
.collect(Collectors.toList()), priceType);
endpoint.getModels().forEach(model -> {
String terminal = modelService.fetchTerminalModelName(model.getModelName());
model.setPriceDetails(priceDetails.get(terminal));
});
enrichModelsWithPriceInfo(models, priceType);
} else {
priceDetails = channelService.getPriceInfo(Lists.newArrayList(endpoint.getEndpoint()), priceType);
Map<String, PriceDetails> priceDetails = channelService.getPriceInfo(Lists.newArrayList(endpoint.getEndpoint()), priceType);
endpoint.setPriceDetails(priceDetails.get(endpoint.getEndpoint()));
}
}
Expand Down Expand Up @@ -302,6 +295,21 @@ private String fetchEndpoint(String entityType, String entityCode) {
}
}

public void enrichModelsWithPriceInfo(List<Model> models, Class<? extends IPriceInfo> priceType) {
if (CollectionUtils.isEmpty(models) || priceType == null) {
return;
}

Map<String, PriceDetails> priceDetails = channelService.getPriceInfo(models.stream()
.map(model -> modelService.fetchTerminalModelName(model.getModelName()))
.collect(Collectors.toList()), priceType);

models.forEach(model -> {
String terminal = modelService.fetchTerminalModelName(model.getModelName());
model.setPriceDetails(priceDetails.get(terminal));
});
}

@Data
@NoArgsConstructor
@AllArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import com.ke.bella.openapi.metadata.MetaDataOps;
import com.ke.bella.openapi.metadata.Model;
import com.ke.bella.openapi.metadata.ModelDetails;
import com.ke.bella.openapi.metadata.PriceDetails;
import com.ke.bella.openapi.protocol.IPriceInfo;
import com.ke.bella.openapi.tables.pojos.ChannelDB;
import com.ke.bella.openapi.tables.pojos.EndpointDB;
import com.ke.bella.openapi.tables.pojos.ModelAuthorizerRelDB;
Expand All @@ -28,11 +30,16 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import com.fasterxml.jackson.annotation.JsonInclude;

import javax.annotation.PostConstruct;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand All @@ -52,6 +59,7 @@
/**
* Author: Stan Sai Date: 2024/8/2 11:31 description:
*/
@Slf4j
@Component
public class ModelService {
@Autowired
Expand Down Expand Up @@ -377,6 +385,80 @@ public List<ModelDB> listByConditionWithPermission(Condition.ModelCondition cond
return listByCondition(condition);
}

public List<ModelDB> listModelDBsWithPermissionAndPrice(Condition.ModelCondition condition, boolean apikeyFirst, boolean includePrice) {

List<ModelDB> modelDBs = listByConditionWithPermission(condition, apikeyFirst);

if (!includePrice || modelDBs.isEmpty()) {
return modelDBs;
}

List<ModelDBWithPrice> modelDBsWithPrice = modelDBs.stream()
.map(ModelDBWithPrice::new)
.collect(Collectors.toList());

enrichModelDBsWithPriceInfo(modelDBsWithPrice);

return new ArrayList<ModelDB>(modelDBsWithPrice);
}

private Model convertModelDBToModel(ModelDB db) {
Model model = new Model();
model.setModelName(db.getModelName());
model.setDocumentUrl(db.getDocumentUrl());
model.setVisibility(db.getVisibility());
model.setOwnerType(db.getOwnerType());
model.setOwnerCode(db.getOwnerCode());
model.setOwnerName(db.getOwnerName());
model.setStatus(db.getStatus());
model.setProperties(db.getProperties());
model.setFeatures(db.getFeatures());
model.setLinkedTo(db.getLinkedTo());
return model;
}

private String getPrimaryEndpoint(String modelName) {
List<String> endpoints = getAllEndpoints(modelName);
return CollectionUtils.isNotEmpty(endpoints) ? endpoints.get(0) : null;
}

private void enrichModelDBsWithPriceInfo(List<ModelDBWithPrice> modelDBsWithPrice) {
try {
Map<String, List<ModelDBWithPrice>> modelsByEndpoint = groupModelDBsByEndpoint(modelDBsWithPrice);

modelsByEndpoint.forEach((endpoint, modelsOfSameEndpoint) -> {
List<Model> models = modelsOfSameEndpoint.stream()
.map(this::convertModelDBToModel)
.collect(Collectors.toList());

Class<? extends IPriceInfo> priceType = IPriceInfo.EndpointPriceInfoType.fetchType(endpoint);
if (priceType != null) {
endpointService.enrichModelsWithPriceInfo(models, priceType);

for (int i = 0; i < models.size(); i++) {
modelsOfSameEndpoint.get(i).setPriceDetails(models.get(i).getPriceDetails());
}
}
});
} catch (Exception e) {
// 价格信息获取失败不影响基础模型信息返回,保持priceDetails为null
log.warn("Failed to enrich models with price info: {}", e.getMessage());
}
}

private Map<String, List<ModelDBWithPrice>> groupModelDBsByEndpoint(List<ModelDBWithPrice> modelDBs) {
Map<String, List<ModelDBWithPrice>> modelsByEndpoint = new HashMap<>();

for (ModelDBWithPrice modelDB : modelDBs) {
String primaryEndpoint = getPrimaryEndpoint(modelDB.getModelName());
if (primaryEndpoint != null) {
modelsByEndpoint.computeIfAbsent(primaryEndpoint, k -> new ArrayList<>()).add(modelDB);
}
}

return modelsByEndpoint;
}

public Page<ModelDB> pageByConditionWithPermission(Condition.ModelCondition condition, boolean apikeyFirst) {
apikeyService.fillPermissionCode(condition, apikeyFirst);
if(!fillModelNames(condition)) {
Expand Down Expand Up @@ -404,4 +486,16 @@ private boolean fillModelNames(Condition.ModelCondition condition) {
condition.setIncludeLinkedTo(true);
return CollectionUtils.isNotEmpty(modelNames);
}

@Setter
@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class ModelDBWithPrice extends ModelDB {

private PriceDetails priceDetails;

public ModelDBWithPrice(ModelDB modelDB) {
super(modelDB);
}
}
}