提交 c2502aff authored 作者: songchuancai's avatar songchuancai

优化代码

上级 7cc43e06
package com.hisense.dataservice.bo;
import com.hisense.dataservice.dto.DataApiModelSubscribeDto;
import com.hisense.dataservice.dto.SubscribeApiResultDto;
import com.hisense.dataservice.entity.DataApiModel;
import com.hisense.dataservice.library.model.Result;
import com.hisense.dataservice.service.impl.DataApiCommonServiceImpl;
import com.hisense.dataservice.util.SpringBeanUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
/**
* @author : scc
* @date : 2023/03/29
**/
@Data
@Slf4j
public class SubscribeDataApiTask implements Callable<Result<SubscribeApiResultDto>> {
private DataApiModelSubscribeDto application;
private DataApiModel dataApiModel;
private String environment;
private Integer subscribeSystemId;
private String subscribeSystemName;
private String user;
public SubscribeDataApiTask(DataApiModelSubscribeDto application, DataApiModel dataApiModel, String environment, Integer subscribeSystemId, String user, String subscribeSystemName) {
this.application = application;
this.dataApiModel = dataApiModel;
this.environment = environment;
this.subscribeSystemId = subscribeSystemId;
this.subscribeSystemName = subscribeSystemName;
this.user = user;
}
@Override
public Result<SubscribeApiResultDto> call() throws Exception {
Result<SubscribeApiResultDto> result = new Result<>(Result.OK,"",null);
long time1 = System.currentTimeMillis();
DataApiCommonServiceImpl applicationService = SpringBeanUtil.getBean(DataApiCommonServiceImpl.class);
SubscribeApiResultDto subscribeApiResultDto = applicationService.doSubscribe(environment, application, dataApiModel, subscribeSystemId, user,subscribeSystemName);
result.setData(subscribeApiResultDto);
long time2 = System.currentTimeMillis();
log.info(String.format("订阅完成,系统=%s,api=%s,订阅线程%S处理时间(ms)=%s",subscribeSystemName,dataApiModel.getName(),Thread.currentThread().getName(),(time2-time1)));
return result;
}
}
\ No newline at end of file
...@@ -58,11 +58,13 @@ public class MyApplicationController extends BaseController{ ...@@ -58,11 +58,13 @@ public class MyApplicationController extends BaseController{
@ApiOperation(value = "数据服务管理-服务详情") @ApiOperation(value = "数据服务管理-服务详情")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "environment", value = "环境", required = true), @ApiImplicitParam(name = "environment", value = "环境", required = true),
@ApiImplicitParam(name = "subscribeId", value = "订阅ID", required = true) @ApiImplicitParam(name = "subscribeId", value = "订阅ID", required = true),
@ApiImplicitParam(name = "systemId", value = "系统ID", required = true)
}) })
@GetMapping("/{environment}/{subscribeId}") @GetMapping("/{environment}/{subscribeId}/{systemId}")
public Result<DataApiModelSubscribeDetailVo> getApiModelDetail(@PathVariable String environment, public Result<DataApiModelSubscribeDetailVo> getApiModelDetail(@PathVariable String environment,
@PathVariable Long subscribeId) { @PathVariable Long subscribeId,
return myApplicationService.queryApiModelDetail(environment, subscribeId); @PathVariable Integer systemId) {
return myApplicationService.queryApiModelDetail(environment, subscribeId,systemId);
} }
} }
...@@ -26,8 +26,8 @@ public class DataApiModelSubscribeDto { ...@@ -26,8 +26,8 @@ public class DataApiModelSubscribeDto {
@ApiModelProperty(value = "行数据范围", required = true) @ApiModelProperty(value = "行数据范围", required = true)
private List<LineDataRangeFilter> lineDataRangeConfig; private List<LineDataRangeFilter> lineDataRangeConfig;
@ApiModelProperty(value = "订阅系统ID", required = false) @ApiModelProperty(value = "订阅系统IDs", required = true)
private Integer subscribeSystemId; private List<Integer> subscribeSystemIds;
@ApiModelProperty(value = "网络环境", required = true) @ApiModelProperty(value = "网络环境", required = true)
private String networkEnv; private String networkEnv;
...@@ -37,4 +37,7 @@ public class DataApiModelSubscribeDto { ...@@ -37,4 +37,7 @@ public class DataApiModelSubscribeDto {
@ApiModelProperty(value = "订阅服务描述", required = true) @ApiModelProperty(value = "订阅服务描述", required = true)
private String desc; private String desc;
@ApiModelProperty(value = "订阅服务负责人", required = true)
private String subSystemLeader;
} }
package com.hisense.dataservice.dto;
import lombok.Data;
/**
* @author : scc
* @date : 2023/03/29
**/
@Data
public class SubscribeApiResultDto {
private String environment;
private Integer subscribeSystemId; // 订阅系统ID
private StringBuilder errorMsg;
private String subscribeSystemName; // 订阅系统名成
private boolean subResult; // 订阅结果
}
...@@ -27,10 +27,10 @@ public interface DataApiApplicationRepository extends JpaRepository<DataApiAppli ...@@ -27,10 +27,10 @@ public interface DataApiApplicationRepository extends JpaRepository<DataApiAppli
"where p.system =:systemId and pr.dataModelId=:apiId ") "where p.system =:systemId and pr.dataModelId=:apiId ")
List<DataApiApplication> findSubscribedApiBySystem(@Param("systemId") Integer systemId, @Param("apiId") Long apiId, @Param("status") Integer status); List<DataApiApplication> findSubscribedApiBySystem(@Param("systemId") Integer systemId, @Param("apiId") Long apiId, @Param("status") Integer status);
// @Query("select p from DataApiApplication p JOIN DataApiProcessRecord pr " + @Query("select p from DataApiApplication p JOIN DataApiProcessRecord pr " +
// "on pr.id = p.processRecordId and pr.processType='sub' and p.userKey is not null " + "on pr.id = p.processRecordId and pr.processType='sub' and p.userKey is not null " +
// "where p.system =:systemId and p.environment=:env") "where p.system =:systemId and p.environment=:env")
// List<PublishApplication> findSubscribedBySystemUserKeyNotNull(@Param("systemId") Integer systemId, @Param("type") Integer type, @Param("env") Integer env); List<PublishApplication> findSubscribedBySystemUserKeyNotNull(@Param("systemId") Integer systemId, @Param("env") Integer env);
// //
// @Query("select p from DataApiApplication p JOIN DataApiProcessRecord pr " + // @Query("select p from DataApiApplication p JOIN DataApiProcessRecord pr " +
// "on pr.id = p.processRecordId and pr.processType='sub' and p.appId is not null " + // "on pr.id = p.processRecordId and pr.processType='sub' and p.appId is not null " +
......
...@@ -5,7 +5,9 @@ import com.hisense.dataservice.enums.ModelConfigType; ...@@ -5,7 +5,9 @@ import com.hisense.dataservice.enums.ModelConfigType;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
/** /**
* @author : scc * @author : scc
...@@ -15,4 +17,5 @@ import java.util.Optional; ...@@ -15,4 +17,5 @@ import java.util.Optional;
public interface DataApiModelConfigRepository extends JpaRepository<DataApiModelConfig,Long> { public interface DataApiModelConfigRepository extends JpaRepository<DataApiModelConfig,Long> {
Optional<DataApiModelConfig> findByTypeIdAndType(Long typeId, ModelConfigType type); Optional<DataApiModelConfig> findByTypeIdAndType(Long typeId, ModelConfigType type);
List<DataApiModelConfig> findByTypeIdInAndType(Set<Long> typeIds, ModelConfigType type);
} }
...@@ -42,4 +42,5 @@ public interface DataApiModelRepository extends JpaRepository<DataApiModel,Long> ...@@ -42,4 +42,5 @@ public interface DataApiModelRepository extends JpaRepository<DataApiModel,Long>
@Query(value = "select a.user_id, a.cn from ldap_user_info a where a.user_id in (:userIds)", nativeQuery = true) @Query(value = "select a.user_id, a.cn from ldap_user_info a where a.user_id in (:userIds)", nativeQuery = true)
List<Map<String,String>> getUserInfoByUserIds(@Param("userIds") Set<String> userIds); List<Map<String,String>> getUserInfoByUserIds(@Param("userIds") Set<String> userIds);
List<DataApiModel> findAllByIdIn(Set<Long> ids);
} }
...@@ -3,5 +3,10 @@ package com.hisense.dataservice.repository; ...@@ -3,5 +3,10 @@ package com.hisense.dataservice.repository;
import com.hisense.dataservice.entity.DataItem; import com.hisense.dataservice.entity.DataItem;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Set;
public interface DataItemRepository extends JpaRepository<DataItem, Integer> { public interface DataItemRepository extends JpaRepository<DataItem, Integer> {
List<DataItem> findAllByIdIn(Set<Integer> ids);
} }
...@@ -13,5 +13,5 @@ import com.hisense.dataservice.vo.MyApplicationVo; ...@@ -13,5 +13,5 @@ import com.hisense.dataservice.vo.MyApplicationVo;
public interface MyApplicationService extends BaseService{ public interface MyApplicationService extends BaseService{
Result<PageData<MyApplicationVo>> querySubscribeList(String environment, Integer status, Integer systemId, PageLink pageLink); Result<PageData<MyApplicationVo>> querySubscribeList(String environment, Integer status, Integer systemId, PageLink pageLink);
Result<DataApiModelSubscribeDetailVo> queryApiModelDetail(String environment, Long subscribeId); Result<DataApiModelSubscribeDetailVo> queryApiModelDetail(String environment, Long subscribeId,Integer systemId);
} }
...@@ -7,6 +7,7 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy ...@@ -7,6 +7,7 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hisense.dataservice.bo.*; import com.hisense.dataservice.bo.*;
import com.hisense.dataservice.dto.DataApiModelSubscribeDto; import com.hisense.dataservice.dto.DataApiModelSubscribeDto;
import com.hisense.dataservice.dto.SubscribeApiResultDto;
import com.hisense.dataservice.dto.WorkFlowDto; import com.hisense.dataservice.dto.WorkFlowDto;
import com.hisense.dataservice.entity.*; import com.hisense.dataservice.entity.*;
import com.hisense.dataservice.enums.*; import com.hisense.dataservice.enums.*;
...@@ -17,22 +18,27 @@ import com.hisense.dataservice.repository.*; ...@@ -17,22 +18,27 @@ import com.hisense.dataservice.repository.*;
import com.hisense.dataservice.service.DataApiCommonService; import com.hisense.dataservice.service.DataApiCommonService;
import com.hisense.dataservice.service.WorkFlowService; import com.hisense.dataservice.service.WorkFlowService;
import com.hisense.dataservice.util.FileUtil; import com.hisense.dataservice.util.FileUtil;
import com.hisense.dataservice.util.SpringBeanUtil;
import com.hisense.dataservice.util.ThreadPoolManagerUtil; import com.hisense.dataservice.util.ThreadPoolManagerUtil;
import com.hisense.dataservice.vo.LdapUserInfoVo; import com.hisense.dataservice.vo.LdapUserInfoVo;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.transaction.TransactionRolledbackException; import javax.transaction.TransactionRolledbackException;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
...@@ -83,6 +89,7 @@ public class DataApiCommonServiceImpl implements DataApiCommonService { ...@@ -83,6 +89,7 @@ public class DataApiCommonServiceImpl implements DataApiCommonService {
private Integer queryDataTotalPerThread = 2000; private Integer queryDataTotalPerThread = 2000;
private ThreadPoolManagerUtil batchQueryDataThreadPool = new ThreadPoolManagerUtil("batchQueryDataThread"); private ThreadPoolManagerUtil batchQueryDataThreadPool = new ThreadPoolManagerUtil("batchQueryDataThread");
private ThreadPoolManagerUtil subscribeApiTaskThreadPool = new ThreadPoolManagerUtil("subscribeApiTaskThreadPool");
@Autowired @Autowired
private ElasticsearchUtils elasticsearchUtils; private ElasticsearchUtils elasticsearchUtils;
...@@ -484,188 +491,189 @@ public class DataApiCommonServiceImpl implements DataApiCommonService { ...@@ -484,188 +491,189 @@ public class DataApiCommonServiceImpl implements DataApiCommonService {
} }
// 订阅数据api // 订阅数据api
@Transactional // @Transactional
public Result<Long> subscribeDataApi(DataApiModelSubscribeDto dataApiModelSubscribeDto, HttpServletRequest request) { // public Result<Long> subscribeDataApi(DataApiModelSubscribeDto dataApiModelSubscribeDto, HttpServletRequest request) {
//
Long modelId = dataApiModelSubscribeDto.getModelId(); // Long modelId = dataApiModelSubscribeDto.getModelId();
Integer subscribeSystemId = dataApiModelSubscribeDto.getSubscribeSystemId(); // Integer subscribeSystemId = dataApiModelSubscribeDto.getSubscribeSystemId();
//
String user = ""; // TODO SecurityUtils.getLoginUser().getLoginName() // String user = ""; // TODO SecurityUtils.getLoginUser().getLoginName()
//
// 获取订阅系统名称 // // 获取订阅系统名称
DataItem systemItem = dataItemRepository.getOne(subscribeSystemId); // DataItem systemItem = dataItemRepository.getOne(subscribeSystemId);
String subscribeSystemName = systemItem == null ? subscribeSystemId + "" : systemItem.getItemName(); // String subscribeSystemName = systemItem == null ? subscribeSystemId + "" : systemItem.getItemName();
//
// 校验订阅参数 // // 校验订阅参数
Result<DataApiModel> checkSubscribeApiParamsResult = checkSubscribeApiParams(dataApiModelSubscribeDto,user, subscribeSystemName); // Result<DataApiModel> checkSubscribeApiParamsResult = checkSubscribeApiParams(dataApiModelSubscribeDto,user, subscribeSystemName);
if(checkSubscribeApiParamsResult.getCode().equals(Result.FAIL)){ // if(checkSubscribeApiParamsResult.getCode().equals(Result.FAIL)){
return failure(checkSubscribeApiParamsResult.getMsg()); // return failure(checkSubscribeApiParamsResult.getMsg());
} // }
DataApiModel dataApiModel = checkSubscribeApiParamsResult.getData(); // DataApiModel dataApiModel = checkSubscribeApiParamsResult.getData();
//
// 获取数据源 // // 获取数据源
Long dataSourceId = dataApiModel.getDataSourceId(); // Long dataSourceId = dataApiModel.getDataSourceId();
Optional<DataApiDataSource> dataApiDataSourceOptional = dataApiDataSourceRepository.findById(dataSourceId); // Optional<DataApiDataSource> dataApiDataSourceOptional = dataApiDataSourceRepository.findById(dataSourceId);
if (!dataApiDataSourceOptional.isPresent()) { // if (!dataApiDataSourceOptional.isPresent()) {
return failure("订阅数据服务的数据源不存在"); // return failure("订阅数据服务的数据源不存在");
} // }
DataApiDataSource dataApiDataSource = dataApiDataSourceOptional.get(); // DataApiDataSource dataApiDataSource = dataApiDataSourceOptional.get();
//
// 保存行列过滤条件 // // 保存行列过滤条件
List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig(); // List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig();
List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig(); // List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig();
List<TableJoinRelationConfig> tableJoinRelationConfig = dataApiModel.getTableJoinRelationConfig(); // List<TableJoinRelationConfig> tableJoinRelationConfig = dataApiModel.getTableJoinRelationConfig();
DataApiModelConfig subscribeDataApiModelConfig = new DataApiModelConfig(); // DataApiModelConfig subscribeDataApiModelConfig = new DataApiModelConfig();
subscribeDataApiModelConfig.setLineDataRangeConfig(subLineDataRangeConfig); // subscribeDataApiModelConfig.setLineDataRangeConfig(subLineDataRangeConfig);
subscribeDataApiModelConfig.setColumnDataRangeConfig(subscribeColumnDataRangeConfig); // subscribeDataApiModelConfig.setColumnDataRangeConfig(subscribeColumnDataRangeConfig);
subscribeDataApiModelConfig.setType(ModelConfigType.SUBSCRIBE); // subscribeDataApiModelConfig.setType(ModelConfigType.SUBSCRIBE);
String fullSql = subscribeDataApiModelConfig.generateAndSetFullSql(tableJoinRelationConfig, dataApiDataSource.getType()); // String fullSql = subscribeDataApiModelConfig.generateAndSetFullSql(tableJoinRelationConfig, dataApiDataSource.getType());
log.info("生成的完整sql: {}", fullSql); // log.info("生成的完整sql: {}", fullSql);
if (StringUtils.isEmpty(fullSql)) { // if (StringUtils.isEmpty(fullSql)) {
return failure("未能成功生成sql语句"); // return failure("未能成功生成sql语句");
} // }
dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig); // dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig);
//
// 保存订阅信息 // // 保存订阅信息
Map<String, String> subSystemProjectAndTenantAdminNameMap = dataApiModelRepository.findSystemProjectAndTenantAdminNameBySystemId(dataApiModelSubscribeDto.getSubscribeSystemId()); // Map<String, String> subSystemProjectAndTenantAdminNameMap = dataApiModelRepository.findSystemProjectAndTenantAdminNameBySystemId(dataApiModelSubscribeDto.getSubscribeSystemId());
String subSystemLeader = subSystemProjectAndTenantAdminNameMap.get("projectAdminName"); //// String subSystemLeader = subSystemProjectAndTenantAdminNameMap.get("projectAdminName");
DataApiSubscribeConfig subscribeConfig = new DataApiSubscribeConfig(); // DataApiSubscribeConfig subscribeConfig = new DataApiSubscribeConfig();
subscribeConfig.setSubscribeSystemId(dataApiModelSubscribeDto.getSubscribeSystemId()); // subscribeConfig.setSubscribeSystemId(dataApiModelSubscribeDto.getSubscribeSystemId());
subscribeConfig.setDataApiModelId(modelId); // subscribeConfig.setDataApiModelId(modelId);
subscribeConfig.setSystemEnv(SystemEnv.valueOf(dataApiModelSubscribeDto.getSystemEnv())); // subscribeConfig.setSystemEnv(SystemEnv.valueOf(dataApiModelSubscribeDto.getSystemEnv()));
subscribeConfig.setNetworkEnv(NetworkEnv.valueOf(dataApiModelSubscribeDto.getNetworkEnv())); // subscribeConfig.setNetworkEnv(NetworkEnv.valueOf(dataApiModelSubscribeDto.getNetworkEnv()));
subscribeConfig.setCreatedTime(new Date()); // subscribeConfig.setCreatedTime(new Date());
subscribeConfig.setSubDesc(dataApiModelSubscribeDto.getDesc()); // subscribeConfig.setSubDesc(dataApiModelSubscribeDto.getDesc());
subscribeConfig.setHashStr(UUID.randomUUID().toString()); // subscribeConfig.setHashStr(UUID.randomUUID().toString());
subscribeConfig.setSubSystemLeader(subSystemLeader); // subscribeConfig.setSubSystemLeader(dataApiModelSubscribeDto.getSubSystemLeader());
subscribeConfig.setCreator(user); // subscribeConfig.setCreator(user);
subscribeConfig = dataApiSubscribeRepository.saveAndFlush(subscribeConfig); // subscribeConfig = dataApiSubscribeRepository.saveAndFlush(subscribeConfig);
//
// 更新行列配置的typeId // // 更新行列配置的typeId
subscribeDataApiModelConfig.setTypeId(subscribeConfig.getId()); // subscribeDataApiModelConfig.setTypeId(subscribeConfig.getId());
dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig); // dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig);
//
// 创建流程处理 // // 创建流程处理
DataApiProcessRecord pr = new DataApiProcessRecord(); // DataApiProcessRecord pr = new DataApiProcessRecord();
pr.setCreatedTime(new Date()); // pr.setCreatedTime(new Date());
pr.setCreator(user); // pr.setCreator(user);
pr.setStatus(1); // pr.setStatus(1);
pr.setDataModelId(dataApiModel.getId()); // pr.setDataModelId(dataApiModel.getId());
pr.setProcessType("sub"); // pr.setProcessType("sub");
pr = dataApiProcessRecordRepository.saveAndFlush(pr); // pr = dataApiProcessRecordRepository.saveAndFlush(pr);
//
// 获取鉴权信息 // // 获取鉴权信息
String userKey = ""; // String userKey = "";
String appId = ""; // String appId = "";
String appKey = ""; // String appKey = "";
//
//查询订阅记录 // //查询订阅记录
List<DataApiApplication> subscribedDataApis // List<DataApiApplication> subscribedDataApis
= dataApiApplicationRepository.findSubscribedApiBySystem(subscribeSystemId,dataApiModel.getId(),2); // = dataApiApplicationRepository.findSubscribedApiBySystem(subscribeSystemId,dataApiModel.getId(),2);
if(!CollectionUtils.isEmpty(subscribedDataApis)){ // if(!CollectionUtils.isEmpty(subscribedDataApis)){
// 之前订阅过则用之前的认证信息 // // 之前订阅过则用之前的认证信息
userKey = subscribedDataApis.get(0).getUserKey(); // userKey = subscribedDataApis.get(0).getUserKey();
appId = subscribedDataApis.get(0).getAppId(); // appId = subscribedDataApis.get(0).getAppId();
appKey = subscribedDataApis.get(0).getAppKey(); // appKey = subscribedDataApis.get(0).getAppKey();
}else{ // }else{
// 之前没有订阅过 TODO 需要从3scale或者apisix中进行创建或者获取 //// List<DataApiApplication> subscribedDataApis = dataApiApplicationRepository.findSubscribedBySystemUserKeyNotNull(subscribeSystemId,Integer.valueOf(environment));
userKey = UUID.randomUUID().toString().replace("-","").substring(0,16); // // 之前没有订阅过 TODO 需要从3scale或者apisix中进行创建或者获取
// userKey = UUID.randomUUID().toString().replace("-","").substring(0,16);
} //
// }
//
// 创建数据服务发布应用信息 //
DataApiApplication app = new DataApiApplication(); // // 创建数据服务发布应用信息
app.setSystem(subscribeSystemId); // DataApiApplication app = new DataApiApplication();
app.setDataModelSubConfigId(subscribeConfig.getId()); // app.setSystem(subscribeSystemId);
app.setAppId(appId); // app.setDataModelSubConfigId(subscribeConfig.getId());
app.setAppKey(appKey); // app.setAppId(appId);
app.setUserKey(userKey); // app.setAppKey(appKey);
app.setProcessRecordId(pr.getId()); // app.setUserKey(userKey);
app.setCreator(user); // app.setProcessRecordId(pr.getId());
app = dataApiApplicationRepository.saveAndFlush(app); // app.setCreator(user);
// app = dataApiApplicationRepository.saveAndFlush(app);
// 开始订阅审批流程 //
Result<String> startProcessResult = startProcess(user, subscribeSystemName, dataApiModel); // // 开始订阅审批流程
if(startProcessResult.getCode().equals(Result.FAIL)){ // Result<String> startProcessResult = startProcess(user, subscribeSystemName, dataApiModel);
// 回滚事务 // if(startProcessResult.getCode().equals(Result.FAIL)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // // 回滚事务
return failure(startProcessResult.getMsg()); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} // return failure(startProcessResult.getMsg());
// }
// 更新订阅审批流程实例ID //
String processInstID = startProcessResult.getData(); // // 更新订阅审批流程实例ID
pr.setProcessInstID(processInstID); // String processInstID = startProcessResult.getData();
dataApiProcessRecordRepository.saveAndFlush(pr); // pr.setProcessInstID(processInstID);
// dataApiProcessRecordRepository.saveAndFlush(pr);
return success(subscribeConfig.getId()); //
} // return success(subscribeConfig.getId());
// }
// 检查订阅api的参数 // 检查订阅api的参数
private Result<DataApiModel> checkSubscribeApiParams(DataApiModelSubscribeDto dataApiModelSubscribeDto, String user, String subscribeSystemName){ // private Result<DataApiModel> checkSubscribeApiParams(DataApiModelSubscribeDto dataApiModelSubscribeDto, String user, String subscribeSystemName){
Long modelId = dataApiModelSubscribeDto.getModelId(); // Long modelId = dataApiModelSubscribeDto.getModelId();
Integer subscribeSystemId = dataApiModelSubscribeDto.getSubscribeSystemId(); // Integer subscribeSystemId = dataApiModelSubscribeDto.getSubscribeSystemId();
//
if (modelId == null || subscribeSystemId == null) { // if (modelId == null || subscribeSystemId == null) {
return failure("请选择需要订阅的API"); // return failure("请选择需要订阅的API");
}
if (subscribeSystemId == null) {
return failure("订阅系统ID为空");
}
Optional<DataApiModel> dataApiModelOptional = dataApiModelRepository.findById(modelId);
if (!dataApiModelOptional.isPresent()) {
return failure(String.format("订阅的API【%d】不存在!", modelId));
}
DataApiModel dataApiModel = dataApiModelOptional.get();
if (new Integer("0").equals(dataApiModel.getStatus())) {
return failure(String.format("API【%d】未发布!", modelId));
}
if (subscribeSystemId.equals(dataApiModel.getPublishSystemId())) {
return failure(String.format("不可为系统{},订阅自己系统发布的API", subscribeSystemId));
}
log.info(String.format("订阅系统=%s,订阅api=%s", subscribeSystemName, dataApiModel.getName()));
// 是否订阅过 根据当前登陆人、订阅系统、api判断是否有过订阅
Optional<DataApiSubscribeConfig> dataApiSubscribeConfigOptional = dataApiSubscribeRepository.findBySubscribeSystemIdAndDataApiModelIdAndCreatorAndDeletedIsFalse(subscribeSystemId, modelId, user);
if (dataApiSubscribeConfigOptional.isPresent()) {
return failure(String.format("您已经为系统【%s】订阅过API【%s】,不能重复订阅!", subscribeSystemName, dataApiModel.getName()));
}
// 是否正在等待审批
// List<DataApiApplication> apps =
// dataApiApplicationRepository.findSubscribedApiBySystem(subscribeSystemId,dataApiModel.getId(),1);
// if(!CollectionUtils.isEmpty(apps)) {
// log.info(String.format("%s正在为系统【%s】申请订阅API【%s】,等待审批!",apps.get(0).getCreator(),subscribeSystemName,dataApiModel.getName()));
// return false;
// } // }
// if (subscribeSystemId == null) {
// 获取发布时数据api行列配置 // return failure("订阅系统ID为空");
Optional<DataApiModelConfig> publishDataApiModelConfigOptional = dataApiModelConfigRepository.findByTypeIdAndType(modelId, ModelConfigType.PUBLISH); // }
if (!publishDataApiModelConfigOptional.isPresent()) { //
return failure("数据服务行列配置为空"); // Optional<DataApiModel> dataApiModelOptional = dataApiModelRepository.findById(modelId);
} // if (!dataApiModelOptional.isPresent()) {
DataApiModelConfig publishDataApiModelConfig = publishDataApiModelConfigOptional.get(); // return failure(String.format("订阅的API【%d】不存在!", modelId));
// }
// 检查列条件 // DataApiModel dataApiModel = dataApiModelOptional.get();
List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig(); // if (new Integer("0").equals(dataApiModel.getStatus())) {
List<ColumnDataRangeFilter> publishColumnDataRangeConfig = publishDataApiModelConfig.getColumnDataRangeConfig(); // return failure(String.format("API【%d】未发布!", modelId));
Boolean checkColumnResult = checkColumnCondition(publishColumnDataRangeConfig, subscribeColumnDataRangeConfig); // }
if (!checkColumnResult) { //
return failure(String.format("订阅的列条件不在数据API服务定义范围内, pubColumnConfig: {}, subColumnConfig: {}",publishColumnDataRangeConfig, subscribeColumnDataRangeConfig)); // if (subscribeSystemId.equals(dataApiModel.getPublishSystemId())) {
} // return failure(String.format("不可为系统{},订阅自己系统发布的API", subscribeSystemId));
// }
// 检查行条件 //
List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig(); // log.info(String.format("订阅系统=%s,订阅api=%s", subscribeSystemName, dataApiModel.getName()));
List<LineDataRangeFilter> pubLineDataRangeConfig = publishDataApiModelConfig.getLineDataRangeConfig(); //
Boolean checkLineResult = checkLineCondition(pubLineDataRangeConfig, subLineDataRangeConfig); // // 是否订阅过 根据当前登陆人、订阅系统、api判断是否有过订阅
if (!checkLineResult) { // Optional<DataApiSubscribeConfig> dataApiSubscribeConfigOptional = dataApiSubscribeRepository.findBySubscribeSystemIdAndDataApiModelIdAndCreatorAndDeletedIsFalse(subscribeSystemId, modelId, user);
return failure(String.format("订阅的行条件不在数据API服务定义范围内, pubLineConfig: {}, subLineConfig: {}",publishColumnDataRangeConfig, subLineDataRangeConfig)); // if (dataApiSubscribeConfigOptional.isPresent()) {
} // return failure(String.format("您已经为系统【%s】订阅过API【%s】,不能重复订阅!", subscribeSystemName, dataApiModel.getName()));
return success(dataApiModel); // }
} //
// // 是否正在等待审批
//// List<DataApiApplication> apps =
//// dataApiApplicationRepository.findSubscribedApiBySystem(subscribeSystemId,dataApiModel.getId(),1);
//// if(!CollectionUtils.isEmpty(apps)) {
//// log.info(String.format("%s正在为系统【%s】申请订阅API【%s】,等待审批!",apps.get(0).getCreator(),subscribeSystemName,dataApiModel.getName()));
//// return false;
//// }
//
// // 获取发布时数据api行列配置
// Optional<DataApiModelConfig> publishDataApiModelConfigOptional = dataApiModelConfigRepository.findByTypeIdAndType(modelId, ModelConfigType.PUBLISH);
// if (!publishDataApiModelConfigOptional.isPresent()) {
// return failure("数据服务行列配置为空");
// }
// DataApiModelConfig publishDataApiModelConfig = publishDataApiModelConfigOptional.get();
//
// // 检查列条件
// List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig();
// List<ColumnDataRangeFilter> publishColumnDataRangeConfig = publishDataApiModelConfig.getColumnDataRangeConfig();
// Boolean checkColumnResult = checkColumnCondition(publishColumnDataRangeConfig, subscribeColumnDataRangeConfig);
// if (!checkColumnResult) {
// return failure(String.format("订阅的列条件不在数据API服务定义范围内, pubColumnConfig: {}, subColumnConfig: {}",publishColumnDataRangeConfig, subscribeColumnDataRangeConfig));
// }
//
// // 检查行条件
// List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig();
// List<LineDataRangeFilter> pubLineDataRangeConfig = publishDataApiModelConfig.getLineDataRangeConfig();
// Boolean checkLineResult = checkLineCondition(pubLineDataRangeConfig, subLineDataRangeConfig);
// if (!checkLineResult) {
// return failure(String.format("订阅的行条件不在数据API服务定义范围内, pubLineConfig: {}, subLineConfig: {}",publishColumnDataRangeConfig, subLineDataRangeConfig));
// }
// return success(dataApiModel);
// }
// 开始审批流程 // 开始审批流程
private Result<String> startProcess(String user, String subscribeSystemName, DataApiModel dataApiModel){ private Result<String> startProcess(String user, String subscribeSystemName, DataApiModel dataApiModel){
Integer publishSystemId = dataApiModel.getPublishSystemId().intValue(); Integer publishSystemId = dataApiModel.getPublishSystemId().intValue();
...@@ -1005,4 +1013,397 @@ public class DataApiCommonServiceImpl implements DataApiCommonService { ...@@ -1005,4 +1013,397 @@ public class DataApiCommonServiceImpl implements DataApiCommonService {
return true; return true;
} }
public Result<List<Object>> subscribeDataApiLatest(List<DataApiModelSubscribeDto> applications, String environment) {
// 将RequestAttributes对象设置为子线程共享
try {
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);
} catch (Exception e) {
log.error("getRequestAttributes exception:", e);
}
String user = ""; // TODO SecurityUtils.getLoginUser().getLoginName()
log.info(String.format("开始订阅,环境=%s,入参=%s", environment, applications));
List<Future<Result<JSONObject>>> subResList = new ArrayList<>();
// 获取订阅的所有api信息
Set<Long> dataModelIds = applications.stream().map(DataApiModelSubscribeDto::getModelId).collect(Collectors.toSet());
List<DataApiModel> dataApiModelsForSub = dataApiModelRepository.findAllByIdIn(dataModelIds);
Map<Long, DataApiModel> dataApiModelIdToSelfMap = dataApiModelsForSub.stream().collect(Collectors.toMap(DataApiModel::getId, Function.identity(), (k1, k2) -> k2));
// 获取所有订阅的api对应的行列配置信息
List<DataApiModelConfig> dataApiModelConfigList = dataApiModelConfigRepository.findByTypeIdInAndType(dataModelIds, ModelConfigType.PUBLISH);
Map<Long, DataApiModelConfig> dataApiModelConfigToSelfMap = dataApiModelConfigList.stream().collect(Collectors.toMap(DataApiModelConfig::getTypeId, Function.identity(), (k1, k2) -> k2));
Set<Integer> subscribeSystemIdListForQuery = new HashSet<>();
applications.forEach(item->{
subscribeSystemIdListForQuery.addAll(item.getSubscribeSystemIds());
});
List<DataItem> dataItemList = dataItemRepository.findAllByIdIn(subscribeSystemIdListForQuery);
Map<Integer, DataItem> dataItemIdToSelfMap = dataItemList.stream().collect(Collectors.toMap(DataItem::getId, Function.identity(), (k1, k2) -> k2));
// 校验订阅参数
List<String> failMessage = checkSubscribeApiParamsLatest(applications, dataApiModelIdToSelfMap, dataApiModelConfigToSelfMap,dataItemIdToSelfMap);
if (CollectionUtils.isEmpty(failMessage)) {
return failure(StringUtil.join(failMessage.toArray(), ";"));
}
DataApiModel dataApiModel;
List<Integer> subscribeSystemIds;
List<Future<Result<SubscribeApiResultDto>>> subscribeApiTaskFutureList = new ArrayList<>();
Future<Result<SubscribeApiResultDto>> subscribeApiTask;
DataItem dataItem;
for (DataApiModelSubscribeDto application : applications) {
dataApiModel = dataApiModelIdToSelfMap.get(application.getModelId());
log.info("开始处理api=%s的订阅", dataApiModel.getName());
subscribeSystemIds = application.getSubscribeSystemIds();
for (Integer subscribeSystemId : subscribeSystemIds) {
dataItem = dataItemIdToSelfMap.get(subscribeSystemId);
SubscribeDataApiTask subscribeDataApiTask = new SubscribeDataApiTask(application,dataApiModel, environment, subscribeSystemId, user, dataItem.getItemName());
subscribeApiTask = subscribeApiTaskThreadPool.getThreadPool().submit(subscribeDataApiTask);
subscribeApiTaskFutureList.add(subscribeApiTask);
}
}
return subscribeResultHandle(subscribeApiTaskFutureList);
}
public Result<List<Object>> subscribeDataApiLatest2(DataApiModelSubscribeDto application, String environment) {
String user = ""; // TODO SecurityUtils.getLoginUser().getLoginName()
log.info(String.format("开始订阅,环境=%s,入参=%s", environment, application));
Set<Integer> subscribeSystemIdListForQuery = new HashSet<>();
subscribeSystemIdListForQuery.addAll(application.getSubscribeSystemIds());
List<DataItem> dataItemList = dataItemRepository.findAllByIdIn(subscribeSystemIdListForQuery);
Map<Integer, DataItem> dataItemIdToSelfMap = dataItemList.stream().collect(Collectors.toMap(DataItem::getId, Function.identity(), (k1, k2) -> k2));
// 校验订阅参数
Result<DataApiModel> checkResult = checkSubscribeApiParamsLatest2(application,dataItemIdToSelfMap);
if(checkResult.getCode().equals(Result.FAIL)){
return failure(checkResult.getMsg());
}
DataApiModel dataApiModel = checkResult.getData();
List<Integer> subscribeSystemIds;
List<Future<Result<SubscribeApiResultDto>>> subscribeApiTaskFutureList = new ArrayList<>();
Future<Result<SubscribeApiResultDto>> subscribeApiTask;
DataItem dataItem;
log.info("开始处理api=%s的订阅", dataApiModel.getName());
subscribeSystemIds = application.getSubscribeSystemIds();
for (Integer subscribeSystemId : subscribeSystemIds) {
dataItem = dataItemIdToSelfMap.get(subscribeSystemId);
SubscribeDataApiTask subscribeDataApiTask = new SubscribeDataApiTask(application,dataApiModel, environment, subscribeSystemId, user, dataItem.getItemName());
subscribeApiTask = subscribeApiTaskThreadPool.getThreadPool().submit(subscribeDataApiTask);
subscribeApiTaskFutureList.add(subscribeApiTask);
}
return subscribeResultHandle(subscribeApiTaskFutureList);
}
@Transactional
public SubscribeApiResultDto doSubscribe(String environment, DataApiModelSubscribeDto dataApiModelSubscribeDto, DataApiModel dataApiModel, Integer subscribeSystemId, String user, String subscribeSystemName) {
SubscribeApiResultDto subscribeApiResultDto = new SubscribeApiResultDto();
subscribeApiResultDto.setEnvironment(environment);
subscribeApiResultDto.setSubscribeSystemId(subscribeSystemId);
subscribeApiResultDto.setSubscribeSystemName(subscribeSystemName);
subscribeApiResultDto.setSubResult(false);
StringBuilder resultBuilder = new StringBuilder();
Long modelId = dataApiModel.getId();
// 获取数据源
Long dataSourceId = dataApiModel.getDataSourceId();
Optional<DataApiDataSource> dataApiDataSourceOptional = dataApiDataSourceRepository.findById(dataSourceId);
if (!dataApiDataSourceOptional.isPresent()) {
resultBuilder.append(String.format("订阅数据服务:【%s】的数据源:【】 不存在", dataApiModel.getName(), dataSourceId));
subscribeApiResultDto.setErrorMsg(resultBuilder);
return subscribeApiResultDto;
}
DataApiDataSource dataApiDataSource = dataApiDataSourceOptional.get();
// 保存行列过滤条件
List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig();
List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig();
List<TableJoinRelationConfig> tableJoinRelationConfig = dataApiModel.getTableJoinRelationConfig();
DataApiModelConfig subscribeDataApiModelConfig = new DataApiModelConfig();
subscribeDataApiModelConfig.setLineDataRangeConfig(subLineDataRangeConfig);
subscribeDataApiModelConfig.setColumnDataRangeConfig(subscribeColumnDataRangeConfig);
subscribeDataApiModelConfig.setType(ModelConfigType.SUBSCRIBE);
String fullSql = subscribeDataApiModelConfig.generateAndSetFullSql(tableJoinRelationConfig, dataApiDataSource.getType());
log.info("生成的完整sql: {}", fullSql);
if (StringUtils.isEmpty(fullSql)) {
resultBuilder.append(String.format("API:【%s】,订阅系统:【%s】未能成功生成sql语句", dataApiModel.getName(), subscribeSystemName));
subscribeApiResultDto.setErrorMsg(resultBuilder);
return subscribeApiResultDto;
}
dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig);
// 保存订阅信息
DataApiSubscribeConfig subscribeConfig = new DataApiSubscribeConfig();
subscribeConfig.setSubscribeSystemId(subscribeSystemId);
subscribeConfig.setDataApiModelId(modelId);
subscribeConfig.setSystemEnv(SystemEnv.valueOf(dataApiModelSubscribeDto.getSystemEnv()));
subscribeConfig.setNetworkEnv(NetworkEnv.valueOf(dataApiModelSubscribeDto.getNetworkEnv()));
subscribeConfig.setCreatedTime(new Date());
subscribeConfig.setSubDesc(dataApiModelSubscribeDto.getDesc());
subscribeConfig.setHashStr(UUID.randomUUID().toString());
subscribeConfig.setSubSystemLeader(dataApiModelSubscribeDto.getSubSystemLeader());
subscribeConfig.setCreator(user);
subscribeConfig = dataApiSubscribeRepository.saveAndFlush(subscribeConfig);
// 更新行列配置的typeId
subscribeDataApiModelConfig.setTypeId(subscribeConfig.getId());
dataApiModelConfigRepository.saveAndFlush(subscribeDataApiModelConfig);
// 创建流程处理
DataApiProcessRecord pr = new DataApiProcessRecord();
pr.setCreatedTime(new Date());
pr.setCreator(user);
pr.setStatus(1);
pr.setDataModelId(dataApiModel.getId());
pr.setProcessType("sub");
pr = dataApiProcessRecordRepository.saveAndFlush(pr);
// 获取鉴权信息
String userKey = "";
String appId = "";
String appKey = "";
//查询订阅记录
List<DataApiApplication> subscribedDataApis
= dataApiApplicationRepository.findSubscribedApiBySystem(subscribeSystemId,dataApiModel.getId(),2);
if(!CollectionUtils.isEmpty(subscribedDataApis)){
// 之前订阅过则用之前的认证信息
userKey = subscribedDataApis.get(0).getUserKey();
appId = subscribedDataApis.get(0).getAppId();
appKey = subscribedDataApis.get(0).getAppKey();
}else{
// List<DataApiApplication> subscribedDataApis = dataApiApplicationRepository.findSubscribedBySystemUserKeyNotNull(subscribeSystemId,Integer.valueOf(environment));
// 之前没有订阅过 TODO 需要从3scale或者apisix中进行创建或者获取
userKey = UUID.randomUUID().toString().replace("-","").substring(0,16);
}
// 创建数据服务发布应用信息
DataApiApplication app = new DataApiApplication();
app.setSystem(subscribeSystemId);
app.setDataModelSubConfigId(subscribeConfig.getId());
app.setAppId(appId);
app.setAppKey(appKey);
app.setUserKey(userKey);
app.setProcessRecordId(pr.getId());
app.setCreator(user);
app = dataApiApplicationRepository.saveAndFlush(app);
// 开始订阅审批流程
Result<String> startProcessResult = startProcess(user, subscribeSystemName, dataApiModel);
if(startProcessResult.getCode().equals(Result.FAIL)){
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
resultBuilder.append(String.format("API:【%s】,订阅系统:【%s】,流程处理失败:", dataApiModel.getName(), subscribeSystemName) + startProcessResult.getMsg());
subscribeApiResultDto.setErrorMsg(resultBuilder);
return subscribeApiResultDto;
}
// 更新订阅审批流程实例ID
String processInstID = startProcessResult.getData();
pr.setProcessInstID(processInstID);
dataApiProcessRecordRepository.saveAndFlush(pr);
subscribeApiResultDto.setSubResult(true);
return subscribeApiResultDto;
}
// 检查订阅api的参数
private Result<DataApiModel> checkSubscribeApiParamsLatest2(DataApiModelSubscribeDto dataApiModelSubscribeDto,Map<Integer,DataItem> dataItemIdToSelfMap){
Long modelId = dataApiModelSubscribeDto.getModelId();
List<Integer> subscribeSystemIds = dataApiModelSubscribeDto.getSubscribeSystemIds();
if (modelId == null) {
return failure("请选择需要订阅的API");
}
if (CollectionUtils.isEmpty(subscribeSystemIds)) {
return failure("订阅系统ID为空");
}
DataApiModel dataApiModel = dataApiModelRepository.getOne(modelId);
if (null == dataApiModel) {
return failure(String.format("订阅的API【%d】不存在!", modelId));
}
if (new Integer("0").equals(dataApiModel.getStatus())) {
return failure(String.format("API【%d】未发布!", modelId));
}
if (subscribeSystemIds.contains(dataApiModel.getPublishSystemId())) {
return failure(String.format("不可为系统【%s】,订阅自己系统发布的API", dataApiModel.getPublishSystemName()));
}
for (Integer subscribeSystemId : subscribeSystemIds) {
if(null == dataItemIdToSelfMap.get(subscribeSystemId)){
return failure(String.format("针对API:【%s】的订阅,订阅系统:【%d】不存在",dataApiModel.getName(), subscribeSystemId));
}
}
// 获取发布时数据api行列配置
Optional<DataApiModelConfig> publishDataApiModelConfigOptional = dataApiModelConfigRepository.findByTypeIdAndType(modelId, ModelConfigType.PUBLISH);
if (!publishDataApiModelConfigOptional.isPresent()) {
return failure(String.format("API【%d】服务行列配置为空", modelId));
}
DataApiModelConfig publishDataApiModelConfig = publishDataApiModelConfigOptional.get();
// 检查列条件
List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig();
List<ColumnDataRangeFilter> publishColumnDataRangeConfig = publishDataApiModelConfig.getColumnDataRangeConfig();
Boolean checkColumnResult = checkColumnCondition(publishColumnDataRangeConfig, subscribeColumnDataRangeConfig);
if (!checkColumnResult) {
return failure(String.format("API:【%d】,订阅的列条件不在数据API服务定义范围内, pubColumnConfig: {}, subColumnConfig: {}", modelId, publishColumnDataRangeConfig, subscribeColumnDataRangeConfig));
}
// 检查行条件
List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig();
List<LineDataRangeFilter> pubLineDataRangeConfig = publishDataApiModelConfig.getLineDataRangeConfig();
Boolean checkLineResult = checkLineCondition(pubLineDataRangeConfig, subLineDataRangeConfig);
if (!checkLineResult) {
return failure(String.format("API:【%d】,订阅的行条件不在数据API服务定义范围内, pubLineConfig: {}, subLineConfig: {}", modelId, publishColumnDataRangeConfig, subLineDataRangeConfig));
}
return success(dataApiModel);
}
private List<String> checkSubscribeApiParamsLatest(List<DataApiModelSubscribeDto> dataApiModelSubscribeDtoList,Map<Long, DataApiModel> dataApiModelIdToSelfMap,Map<Long, DataApiModelConfig> dataApiModelConfigToSelfMap,Map<Integer, DataItem> dataItemIdToSelfMap){
List<String> results = new ArrayList<>();
Long modelId;
DataApiModel dataApiModel;
DataApiModelConfig publishDataApiModelConfig;
for (DataApiModelSubscribeDto dataApiModelSubscribeDto : dataApiModelSubscribeDtoList) {
modelId = dataApiModelSubscribeDto.getModelId();
List<Integer> subscribeSystemIds = dataApiModelSubscribeDto.getSubscribeSystemIds();
if (modelId == null) {
results.add("请选择需要订阅的API");
continue;
}
if (CollectionUtils.isEmpty(subscribeSystemIds)) {
results.add("订阅系统ID为空");
continue;
}
dataApiModel = dataApiModelIdToSelfMap.get(modelId);
if (null == dataApiModel) {
results.add(String.format("订阅的API【%d】不存在!", modelId));
continue;
}
if (new Integer("0").equals(dataApiModel.getStatus())) {
results.add(String.format("API【%d】未发布!", modelId));
continue;
}
if (subscribeSystemIds.contains(dataApiModel.getPublishSystemId())) {
results.add(String.format("不可为系统【%s】,订阅自己系统发布的API", dataApiModel.getPublishSystemName()));
continue;
}
for (Integer subscribeSystemId : subscribeSystemIds) {
if(null == dataItemIdToSelfMap.get(subscribeSystemId)){
results.add(String.format("针对API:【%s】的订阅,订阅系统:【%d】不存在",dataApiModel.getName(), subscribeSystemId));
continue;
}
}
// 获取发布时数据api行列配置
publishDataApiModelConfig = dataApiModelConfigToSelfMap.get(modelId);
if (publishDataApiModelConfig == null) {
results.add(String.format("API【%d】服务行列配置为空", modelId));
continue;
}
// 检查列条件
List<ColumnDataRangeFilter> subscribeColumnDataRangeConfig = dataApiModelSubscribeDto.getColumnDataRangeConfig();
List<ColumnDataRangeFilter> publishColumnDataRangeConfig = publishDataApiModelConfig.getColumnDataRangeConfig();
Boolean checkColumnResult = checkColumnCondition(publishColumnDataRangeConfig, subscribeColumnDataRangeConfig);
if (!checkColumnResult) {
results.add(String.format("API:【%d】,订阅的列条件不在数据API服务定义范围内, pubColumnConfig: {}, subColumnConfig: {}", modelId, publishColumnDataRangeConfig, subscribeColumnDataRangeConfig));
continue;
}
// 检查行条件
List<LineDataRangeFilter> subLineDataRangeConfig = dataApiModelSubscribeDto.getLineDataRangeConfig();
List<LineDataRangeFilter> pubLineDataRangeConfig = publishDataApiModelConfig.getLineDataRangeConfig();
Boolean checkLineResult = checkLineCondition(pubLineDataRangeConfig, subLineDataRangeConfig);
if (!checkLineResult) {
results.add(String.format("API:【%d】,订阅的行条件不在数据API服务定义范围内, pubLineConfig: {}, subLineConfig: {}", modelId, publishColumnDataRangeConfig, subLineDataRangeConfig));
continue;
}
}
return results;
}
/**
* 订阅结果处理
* @param list
* @return
*/
private Result<List<Object>> subscribeResultHandle(List<Future<Result<SubscribeApiResultDto>>> list){
Result<List<Object>> result = new Result<>();
//消息返回正确结果
List<Object> messageResult = new ArrayList<>();
StringBuilder failMessageStr = new StringBuilder();
int failCount = 0;
int successCount = 0;
int startProcessCount = 0;
//确保每个线程都执行完
while(list.size()>0){
Iterator<Future<Result<SubscribeApiResultDto>>> it = list.iterator();
while(it.hasNext()){
Future<Result<SubscribeApiResultDto>> future = it.next();
if(!future.isDone()){
continue;
}else{
it.remove();
}
StringBuilder errorMsgBuffer = new StringBuilder();
try {
Result<SubscribeApiResultDto> itemResult = future.get();
SubscribeApiResultDto subResult = itemResult.getData();
errorMsgBuffer = subResult.getErrorMsg();
boolean isSubResult = subResult.isSubResult();
if (!isSubResult) {
String message = String.format((failCount+1)+"、失败原因:%s",errorMsgBuffer.toString());
failMessageStr.append(message);
failCount+=1;
}else{
successCount+=1;
startProcessCount+=1;
}
} catch (Exception e) {
log.error("订阅结果获取异常!",e);
errorMsgBuffer.append("订阅结果获取异常!"+e.getMessage());
String message = String.format((failCount+1)+"、失败原因:%s",errorMsgBuffer.toString());
failMessageStr.append(message);
failCount+=1;
}
}
}
String endMessage;
String resultCode;
String msg="";
if (startProcessCount > 0) {
msg = String.format(",%d个正在订阅审批中,%d个已成功订阅",startProcessCount,successCount-startProcessCount);
}
if (failCount == 0 && successCount > 0) {
endMessage = String.format("成功订阅%d个API%s", successCount,msg);
resultCode = Result.OK;
} else if (successCount > 0) {
endMessage = String.format("成功订阅%d个API%s, 未能订阅%d个API!%s", successCount,msg,failCount, failMessageStr.toString());
resultCode = Result.OTHER;
} else {
endMessage = String.format("失败,未能订阅%d个API!%s", failCount,failMessageStr.toString());
resultCode = Result.FAIL;
}
log.info(String.format("订阅结束,成功订阅%d个API, 订阅失败%d个API",successCount,failCount));
result.setAlert(1);
result.setCode(resultCode);
result.setMsg(endMessage);
result.setData(messageResult);
return result;
}
} }
...@@ -69,11 +69,11 @@ public class MyApplicationServiceImpl implements MyApplicationService { ...@@ -69,11 +69,11 @@ public class MyApplicationServiceImpl implements MyApplicationService {
} }
@Override @Override
public Result<DataApiModelSubscribeDetailVo> queryApiModelDetail(String environment, Long subscribeId) { public Result<DataApiModelSubscribeDetailVo> queryApiModelDetail(String environment, Long subscribeId,Integer systemId) {
DataApiModelSubscribeDetailVo subscribeDetailVo = new DataApiModelSubscribeDetailVo(); DataApiModelSubscribeDetailVo subscribeDetailVo = new DataApiModelSubscribeDetailVo();
subscribeDetailVo.setSubscribeId(subscribeId); subscribeDetailVo.setSubscribeId(subscribeId);
// 获取订阅信息 // 获取订阅信息
Optional<DataApiSubscribeConfig> dataApiSubscribeConfigOptional = dataApiSubscribeRepository.findByIdAndSystemEnv(subscribeId, SystemEnv.valueOf(environment)); Optional<DataApiSubscribeConfig> dataApiSubscribeConfigOptional = dataApiSubscribeRepository.findByIdAndSystemEnvAndSubscribeSystemId(subscribeId, SystemEnv.valueOf(environment), systemId);
if(!dataApiSubscribeConfigOptional.isPresent()){ if(!dataApiSubscribeConfigOptional.isPresent()){
return failure("未查询到订阅信息"); return failure("未查询到订阅信息");
} }
......
package com.hisense.dataservice.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/***
* 根据一个bean的id获取配置文件中相应的bean
*/
public static Object getBean(String beanId) throws BeansException {
if (applicationContext.containsBean(beanId)) {
applicationContext.getBean(beanId);
}
return null;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringBeanUtil.applicationContext == null) {
SpringBeanUtil.applicationContext = applicationContext;
}
}
/***
* 根据一个bean的类型获取配置文件中相应的bean
*/
public static <T> T getBean(Class<T> requiredType) throws BeansException {
return applicationContext.getBean(requiredType);
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*/
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static ApplicationContext getApplicationContext() {
return SpringBeanUtil.applicationContext;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论