Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package com.sdm.data.model.resp;
|
package com.sdm.common.entity.resp.data;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
@@ -2,7 +2,9 @@ package com.sdm.common.feign.impl.data;
|
|||||||
|
|
||||||
import com.sdm.common.common.SdmResponse;
|
import com.sdm.common.common.SdmResponse;
|
||||||
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
||||||
|
import com.sdm.common.entity.resp.PageDataResp;
|
||||||
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
||||||
|
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
|
||||||
import com.sdm.common.feign.inter.data.IDataAnalysisFeignClient;
|
import com.sdm.common.feign.inter.data.IDataAnalysisFeignClient;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -17,8 +19,8 @@ public class DataAnalysisFeignClientImpl implements IDataAnalysisFeignClient {
|
|||||||
IDataAnalysisFeignClient dataAnalysisFeignClient;
|
IDataAnalysisFeignClient dataAnalysisFeignClient;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SdmResponse getSimulationTaskFile(GetSimulationTaskFileReq getSimulationTaskFileReq) {
|
public SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getSimulationTaskFile(GetSimulationTaskFileReq getSimulationTaskFileReq) {
|
||||||
SdmResponse response;
|
SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> response;
|
||||||
try {
|
try {
|
||||||
response = dataAnalysisFeignClient.getSimulationTaskFile(getSimulationTaskFileReq);
|
response = dataAnalysisFeignClient.getSimulationTaskFile(getSimulationTaskFileReq);
|
||||||
log.info("查询文件夹列表响应:"+ response);
|
log.info("查询文件夹列表响应:"+ response);
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.sdm.common.feign.impl.project;
|
||||||
|
|
||||||
|
import com.sdm.common.common.SdmResponse;
|
||||||
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
|
import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
|
||||||
|
import com.sdm.common.feign.inter.project.ISimulationRunFeignClient;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class SimulationRunFeignClientImpl implements ISimulationRunFeignClient {
|
||||||
|
@Autowired
|
||||||
|
ISimulationRunFeignClient simulationRunFeignClient;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SdmResponse deliverableApproveCallback(LaunchApproveReq req) {
|
||||||
|
SdmResponse response;
|
||||||
|
try {
|
||||||
|
response = simulationRunFeignClient.deliverableApproveCallback(req);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("交付物审批回调失败", e);
|
||||||
|
return SdmResponse.failed("交付物审批回调失败");
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,16 @@ package com.sdm.common.feign.inter.data;
|
|||||||
|
|
||||||
import com.sdm.common.common.SdmResponse;
|
import com.sdm.common.common.SdmResponse;
|
||||||
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
||||||
|
import com.sdm.common.entity.resp.PageDataResp;
|
||||||
|
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@FeignClient(name = "data",contextId = "dataAnalysisFeignClient")
|
@FeignClient(name = "data",contextId = "dataAnalysisFeignClient")
|
||||||
public interface IDataAnalysisFeignClient {
|
public interface IDataAnalysisFeignClient {
|
||||||
@PostMapping("/dataAnalysis/getSimulationTaskFile")
|
@PostMapping("/dataAnalysis/getSimulationTaskFile")
|
||||||
public SdmResponse getSimulationTaskFile(@RequestBody GetSimulationTaskFileReq getSimulationTaskFileReq);
|
public SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getSimulationTaskFile(@RequestBody GetSimulationTaskFileReq getSimulationTaskFileReq);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@FeignClient(name = "project")
|
@FeignClient(name = "project",contextId = "nodeFeignClient")
|
||||||
public interface ISimulationNodeFeignClient {
|
public interface ISimulationNodeFeignClient {
|
||||||
/**
|
/**
|
||||||
* 根据节点类型获取所有节点
|
* 根据节点类型获取所有节点
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.sdm.common.feign.inter.project;
|
||||||
|
|
||||||
|
import com.sdm.common.common.SdmResponse;
|
||||||
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
|
||||||
|
@FeignClient(name = "project",contextId = "runFeignClient")
|
||||||
|
public interface ISimulationRunFeignClient {
|
||||||
|
|
||||||
|
@PostMapping("/run/deliverableApproveCallback")
|
||||||
|
SdmResponse deliverableApproveCallback(@RequestBody LaunchApproveReq req);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ import com.sdm.data.model.entity.FileMetadataInfo;
|
|||||||
import com.sdm.data.model.entity.FileStorage;
|
import com.sdm.data.model.entity.FileStorage;
|
||||||
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
|
||||||
import com.sdm.data.model.req.QueryBigFileReq;
|
import com.sdm.data.model.req.QueryBigFileReq;
|
||||||
import com.sdm.data.model.resp.SimulationTaskResultCurveResp;
|
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
|
||||||
import com.sdm.data.service.DataStorageAnalysis;
|
import com.sdm.data.service.DataStorageAnalysis;
|
||||||
import com.sdm.data.service.IDataAnalysisService;
|
import com.sdm.data.service.IDataAnalysisService;
|
||||||
import com.sdm.data.service.IFileMetadataInfoService;
|
import com.sdm.data.service.IFileMetadataInfoService;
|
||||||
|
|||||||
@@ -350,11 +350,11 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
|||||||
fileInfo.setUploadTaskId(req.getUploadTaskId());
|
fileInfo.setUploadTaskId(req.getUploadTaskId());
|
||||||
fileInfo.setTemplateId(req.getTemplateId());
|
fileInfo.setTemplateId(req.getTemplateId());
|
||||||
fileInfo.setTemplateName(req.getTemplateName());
|
fileInfo.setTemplateName(req.getTemplateName());
|
||||||
// 知识库和交付物的文件需要审核
|
// 知识库和交付物的文件需要审核(12月2需求澄清:不在上传这一步审核)
|
||||||
// 1 知识库文件夹 2 交付物属于项目文件夹
|
// 1 知识库文件夹 2 交付物属于项目文件夹
|
||||||
boolean isknowledge = Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
|
boolean isknowledge = Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
|
||||||
boolean isDeliverable = Objects.equals(DirTypeEnum.PROJECT_NODE_DIR.getValue(), dirMetadataInfo.getDirType());
|
// boolean isDeliverable = Objects.equals(DirTypeEnum.PROJECT_NODE_DIR.getValue(), dirMetadataInfo.getDirType());
|
||||||
if (isknowledge || isDeliverable) {
|
if (isknowledge) {
|
||||||
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
|
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
|
||||||
fileInfo.setApproveType(ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode());
|
fileInfo.setApproveType(ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode());
|
||||||
}
|
}
|
||||||
@@ -2282,26 +2282,18 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
|||||||
boolean isKnowledge = dirMetadataInfo != null &&
|
boolean isKnowledge = dirMetadataInfo != null &&
|
||||||
Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
|
Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
|
||||||
|
|
||||||
boolean isDeliverable = dirMetadataInfo != null &&
|
if (isKnowledge) {
|
||||||
Objects.equals(DirTypeEnum.PROJECT_NODE_DIR.getValue(), dirMetadataInfo.getDirType());
|
|
||||||
|
|
||||||
if (isKnowledge || isDeliverable) {
|
|
||||||
// 构建审批内容
|
// 构建审批内容
|
||||||
String approveContents = "";
|
String approveContents = "";
|
||||||
if (isKnowledge) {
|
approveContents = getApproveContents(
|
||||||
approveContents = getApproveContents(
|
succBusinessIds,"知识库文件批量新增", NumberConstants.ONE,succFileMetadataInfos,null );
|
||||||
succBusinessIds,"知识库文件批量新增", NumberConstants.ONE,succFileMetadataInfos,null );
|
|
||||||
} else {
|
|
||||||
approveContents = getApproveContents(
|
|
||||||
succBusinessIds,"交付物文件批量新增", NumberConstants.ONE,succFileMetadataInfos,null );
|
|
||||||
}
|
|
||||||
// 发起审批
|
// 发起审批
|
||||||
Pair<Boolean, String> approvePair = launchFileDataApprove(
|
Pair<Boolean, String> approvePair = launchFileDataApprove(
|
||||||
firstFile.getTemplateId(),
|
firstFile.getTemplateId(),
|
||||||
firstFile.getTemplateName(),
|
firstFile.getTemplateName(),
|
||||||
approveContents,
|
approveContents,
|
||||||
NumberConstants.ONE,
|
NumberConstants.ONE,
|
||||||
isKnowledge ? ApproveTypeEnum.KNOWLEDGE_APPROVE : ApproveTypeEnum.DELIVERABLE_APPROVE
|
ApproveTypeEnum.KNOWLEDGE_APPROVE
|
||||||
);
|
);
|
||||||
// 审批创建失败:抛出异常
|
// 审批创建失败:抛出异常
|
||||||
if (!approvePair.getLeft() || org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
|
if (!approvePair.getLeft() || org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
|
||||||
@@ -2314,8 +2306,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
|||||||
// 3. 批量更新文件状态(上传完成)
|
// 3. 批量更新文件状态(上传完成)
|
||||||
FileMetadataInfo updateEntity = new FileMetadataInfo();
|
FileMetadataInfo updateEntity = new FileMetadataInfo();
|
||||||
updateEntity.setUploadStatus(NumberConstants.ONE_STR);
|
updateEntity.setUploadStatus(NumberConstants.ONE_STR);
|
||||||
// 知识库文件 & 交付物文件:关联审批流ID
|
// 知识库文件:关联审批流ID
|
||||||
if ((isKnowledge || isDeliverable) && org.apache.commons.lang3.StringUtils.isNotBlank(cidFlowId)) {
|
if ((isKnowledge) && org.apache.commons.lang3.StringUtils.isNotBlank(cidFlowId)) {
|
||||||
updateEntity.setCidFlowId(cidFlowId);
|
updateEntity.setCidFlowId(cidFlowId);
|
||||||
}
|
}
|
||||||
// 执行更新
|
// 执行更新
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ import com.sdm.common.entity.req.data.CreateDirReq;
|
|||||||
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
|
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
|
||||||
import com.sdm.common.entity.req.data.QueryDirReq;
|
import com.sdm.common.entity.req.data.QueryDirReq;
|
||||||
import com.sdm.common.entity.req.data.UploadFilesReq;
|
import com.sdm.common.entity.req.data.UploadFilesReq;
|
||||||
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
import com.sdm.common.entity.resp.PageDataResp;
|
import com.sdm.common.entity.resp.PageDataResp;
|
||||||
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
||||||
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
||||||
|
import com.sdm.common.feign.inter.project.ISimulationRunFeignClient;
|
||||||
import com.sdm.project.model.entity.SimulationRun;
|
import com.sdm.project.model.entity.SimulationRun;
|
||||||
import com.sdm.project.model.entity.SimulationRunKeyResult;
|
import com.sdm.project.model.entity.SimulationRunKeyResult;
|
||||||
import com.sdm.project.model.req.*;
|
import com.sdm.project.model.req.*;
|
||||||
@@ -32,7 +34,7 @@ import java.util.List;
|
|||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(value = "/run")
|
@RequestMapping(value = "/run")
|
||||||
@Tag(name = "仿真任务策划管理", description = "仿真任务策划管理管理相关接口")
|
@Tag(name = "仿真任务策划管理", description = "仿真任务策划管理管理相关接口")
|
||||||
public class SimulationRunController {
|
public class SimulationRunController implements ISimulationRunFeignClient {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ISimulationRunService runService;
|
private ISimulationRunService runService;
|
||||||
@@ -138,6 +140,26 @@ public class SimulationRunController {
|
|||||||
return runService.batchAddSimulationKeyResult(req);
|
return runService.batchAddSimulationKeyResult(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交交付物审批
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/deliverableApprove")
|
||||||
|
public SdmResponse deliverableApprove(@RequestBody DeliverableApproveReq req) {
|
||||||
|
return runService.deliverableApprove(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 交付物审批回调
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/deliverableApproveCallback")
|
||||||
|
public SdmResponse deliverableApproveCallback(@RequestBody LaunchApproveReq req) {
|
||||||
|
return runService.deliverableApproveCallback(req);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 算例关键结果查询
|
* 算例关键结果查询
|
||||||
*
|
*
|
||||||
@@ -154,7 +176,7 @@ public class SimulationRunController {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@PostMapping(value = "/queryKeyResultAndTaskInfo")
|
@PostMapping(value = "/queryKeyResultAndTaskInfo")
|
||||||
public SdmResponse<KeyResultAndTaskInfoResp> queryKeyResultAndTaskInfo(@RequestBody KeyResultReq req) {
|
public SdmResponse<PageDataResp<List<KeyResultAndTaskInfoResp>>> queryKeyResultAndTaskInfo(@RequestBody KeyResultReq req) {
|
||||||
return runService.queryKeyResultAndTaskInfo(req);
|
return runService.queryKeyResultAndTaskInfo(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.sdm.project.model.bo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/* 交付物审批流程,传递给电子流平台内容变化的数据 */
|
||||||
|
@Data
|
||||||
|
public class ApprovalDeliverableContentsModel {
|
||||||
|
/**
|
||||||
|
* 任务uuid
|
||||||
|
*/
|
||||||
|
private String taskId;
|
||||||
|
/**
|
||||||
|
* 难度系数
|
||||||
|
*/
|
||||||
|
private Float difficult;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -195,5 +195,8 @@ public class SimulationTask implements Serializable {
|
|||||||
@TableField("tag10")
|
@TableField("tag10")
|
||||||
private String tag10;
|
private String tag10;
|
||||||
|
|
||||||
|
@TableField("cidFlowId")
|
||||||
|
private String cidFlowId;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,4 +157,6 @@ public class ProjectNodePo extends NodeAllBase {
|
|||||||
private String tag9;
|
private String tag9;
|
||||||
@JsonProperty(value = "tag10")
|
@JsonProperty(value = "tag10")
|
||||||
private String tag10;
|
private String tag10;
|
||||||
|
|
||||||
|
private Long imageFileId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,4 +181,6 @@ public class TaskNodePo extends NodeAllBase {
|
|||||||
@JsonProperty(value = "tag10")
|
@JsonProperty(value = "tag10")
|
||||||
private String tag10;
|
private String tag10;
|
||||||
|
|
||||||
|
private Long imageFileId;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.sdm.project.model.req;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class DeliverableApproveReq {
|
||||||
|
|
||||||
|
@Schema(description = "任务uuid")
|
||||||
|
private String taskId;
|
||||||
|
|
||||||
|
@Schema(description = "难度系数")
|
||||||
|
private Float difficult;
|
||||||
|
|
||||||
|
@Schema(description = "交付物审批模板id")
|
||||||
|
private String templateId;
|
||||||
|
|
||||||
|
@Schema(description = "交付物审批模板名称")
|
||||||
|
private String templateName;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.sdm.project.model.resp;
|
package com.sdm.project.model.resp;
|
||||||
|
|
||||||
|
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
|
||||||
import com.sdm.project.model.entity.SimulationTask;
|
import com.sdm.project.model.entity.SimulationTask;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -52,4 +53,7 @@ public class KeyResultAndTaskInfoResp {
|
|||||||
@Schema(description = "任务信息")
|
@Schema(description = "任务信息")
|
||||||
private SimulationTask simulationTask;
|
private SimulationTask simulationTask;
|
||||||
|
|
||||||
|
@Schema(description = "文件信息")
|
||||||
|
private SimulationTaskResultCurveResp fileInfo;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,4 +94,9 @@ public class SpdmNodeDetailVo extends BaseEntity {
|
|||||||
|
|
||||||
private String exeStatus;
|
private String exeStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前阶段
|
||||||
|
*/
|
||||||
|
private String currentPhase;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.sdm.common.entity.req.data.CreateDirReq;
|
|||||||
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
|
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
|
||||||
import com.sdm.common.entity.req.data.QueryDirReq;
|
import com.sdm.common.entity.req.data.QueryDirReq;
|
||||||
import com.sdm.common.entity.req.data.UploadFilesReq;
|
import com.sdm.common.entity.req.data.UploadFilesReq;
|
||||||
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
import com.sdm.common.entity.resp.PageDataResp;
|
import com.sdm.common.entity.resp.PageDataResp;
|
||||||
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
||||||
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
||||||
@@ -51,9 +52,13 @@ public interface ISimulationRunService extends IService<SimulationRun> {
|
|||||||
|
|
||||||
SdmResponse<List<BatchAddFileInfoResp>> batchAddSimulationKeyResult(KeyResultReq req);
|
SdmResponse<List<BatchAddFileInfoResp>> batchAddSimulationKeyResult(KeyResultReq req);
|
||||||
|
|
||||||
|
SdmResponse deliverableApprove(DeliverableApproveReq req);
|
||||||
|
|
||||||
|
SdmResponse deliverableApproveCallback(LaunchApproveReq req);
|
||||||
|
|
||||||
SdmResponse<PageDataResp<List<SimulationRunKeyResult>>> listSimulationKeyResult(KeyResultReq req);
|
SdmResponse<PageDataResp<List<SimulationRunKeyResult>>> listSimulationKeyResult(KeyResultReq req);
|
||||||
|
|
||||||
SdmResponse<KeyResultAndTaskInfoResp> queryKeyResultAndTaskInfo(KeyResultReq req);
|
SdmResponse<PageDataResp<List<KeyResultAndTaskInfoResp>>> queryKeyResultAndTaskInfo(KeyResultReq req);
|
||||||
|
|
||||||
SdmResponse deleteSimulationKeyResult(KeyResultReq req);
|
SdmResponse deleteSimulationKeyResult(KeyResultReq req);
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.sql.Wrapper;
|
import java.sql.Wrapper;
|
||||||
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -606,6 +607,68 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
|
|||||||
}
|
}
|
||||||
SpdmNodeDetailVo spdmNodeDetailVo = new SpdmNodeDetailVo();
|
SpdmNodeDetailVo spdmNodeDetailVo = new SpdmNodeDetailVo();
|
||||||
BeanUtils.copyProperties(projectNode, spdmNodeDetailVo);
|
BeanUtils.copyProperties(projectNode, spdmNodeDetailVo);
|
||||||
|
// 设置当前阶段
|
||||||
|
String uuid = spdmNodeDetailVo.getUuid();
|
||||||
|
List<SimulationNode> phaseNodeList = this.lambdaQuery().eq(SimulationNode::getParentId, uuid).eq(SimulationNode::getNodeType, NodeTypeEnum.PHASE.getValue()).list();
|
||||||
|
if (CollectionUtils.isEmpty(phaseNodeList)) {
|
||||||
|
return SdmResponse.success(spdmNodeDetailVo);
|
||||||
|
}
|
||||||
|
phaseNodeList = phaseNodeList.stream().filter(phaseNode -> StringUtils.isNotBlank(phaseNode.getBeginTime()) && StringUtils.isNotBlank(phaseNode.getEndTime())).toList();
|
||||||
|
if (CollectionUtils.isEmpty(phaseNodeList)) {
|
||||||
|
return SdmResponse.success(spdmNodeDetailVo);
|
||||||
|
}
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
phaseNodeList = phaseNodeList.stream().sorted(Comparator.comparingLong(phaseNode -> {
|
||||||
|
try {
|
||||||
|
return sdf.parse(phaseNode.getBeginTime()).getTime();
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
})).toList();
|
||||||
|
Long currentTime = System.currentTimeMillis();
|
||||||
|
SimulationNode currentPhaseNode = null;
|
||||||
|
for (SimulationNode simulationNode : phaseNodeList) {
|
||||||
|
try {
|
||||||
|
if (currentTime >= sdf.parse(simulationNode.getBeginTime()).getTime() && currentTime <= sdf.parse(simulationNode.getEndTime()).getTime()) {
|
||||||
|
currentPhaseNode = simulationNode;
|
||||||
|
}
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ObjectUtils.isNotEmpty(currentPhaseNode)) {
|
||||||
|
spdmNodeDetailVo.setCurrentPhase(currentPhaseNode.getNodeName());
|
||||||
|
return SdmResponse.success(spdmNodeDetailVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始时间比当前时间小的里面的最大的一个
|
||||||
|
List<SimulationNode> bigPhaseNodeList = phaseNodeList.stream().filter(phaseNode -> {
|
||||||
|
try {
|
||||||
|
return currentTime <= sdf.parse(phaseNode.getBeginTime()).getTime();
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}).toList();
|
||||||
|
if (CollectionUtils.isEmpty(bigPhaseNodeList)) {
|
||||||
|
SimulationNode simulationNode = phaseNodeList.stream().max(Comparator.comparingLong(phaseNode -> {
|
||||||
|
try {
|
||||||
|
return sdf.parse(phaseNode.getBeginTime()).getTime();
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
})).get();
|
||||||
|
spdmNodeDetailVo.setCurrentPhase(simulationNode.getNodeName());
|
||||||
|
return SdmResponse.success(spdmNodeDetailVo);
|
||||||
|
}
|
||||||
|
SimulationNode simulationNode = phaseNodeList.stream().min(Comparator.comparingLong(phaseNode -> {
|
||||||
|
try {
|
||||||
|
return sdf.parse(phaseNode.getBeginTime()).getTime();
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
})).get();
|
||||||
|
spdmNodeDetailVo.setCurrentPhase(simulationNode.getNodeName());
|
||||||
return SdmResponse.success(spdmNodeDetailVo);
|
return SdmResponse.success(spdmNodeDetailVo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import com.github.pagehelper.PageHelper;
|
|||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.sdm.common.common.SdmResponse;
|
import com.sdm.common.common.SdmResponse;
|
||||||
import com.sdm.common.common.ThreadLocalContext;
|
import com.sdm.common.common.ThreadLocalContext;
|
||||||
|
import com.sdm.common.entity.constants.NumberConstants;
|
||||||
|
import com.sdm.common.entity.enums.ApproveTypeEnum;
|
||||||
import com.sdm.common.entity.enums.DirTypeEnum;
|
import com.sdm.common.entity.enums.DirTypeEnum;
|
||||||
import com.sdm.common.entity.enums.NodeTypeEnum;
|
import com.sdm.common.entity.enums.NodeTypeEnum;
|
||||||
import com.sdm.common.entity.flowable.dto.FlowElementDTO;
|
import com.sdm.common.entity.flowable.dto.FlowElementDTO;
|
||||||
@@ -17,17 +19,21 @@ import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
|
|||||||
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
|
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
|
||||||
import com.sdm.common.entity.req.capability.FlowNodeDto;
|
import com.sdm.common.entity.req.capability.FlowNodeDto;
|
||||||
import com.sdm.common.entity.req.data.*;
|
import com.sdm.common.entity.req.data.*;
|
||||||
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
import com.sdm.common.entity.req.system.UserQueryReq;
|
import com.sdm.common.entity.req.system.UserQueryReq;
|
||||||
import com.sdm.common.entity.resp.PageDataResp;
|
import com.sdm.common.entity.resp.PageDataResp;
|
||||||
import com.sdm.common.entity.resp.capability.FlowTemplateResp;
|
import com.sdm.common.entity.resp.capability.FlowTemplateResp;
|
||||||
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
|
||||||
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
|
||||||
|
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
|
||||||
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
|
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
|
||||||
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
|
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
|
||||||
import com.sdm.common.entity.resp.system.CIDUserResp;
|
import com.sdm.common.entity.resp.system.CIDUserResp;
|
||||||
import com.sdm.common.feign.impl.capability.SimulationFlowFeignClientImpl;
|
import com.sdm.common.feign.impl.capability.SimulationFlowFeignClientImpl;
|
||||||
|
import com.sdm.common.feign.impl.data.DataAnalysisFeignClientImpl;
|
||||||
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
|
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
|
||||||
import com.sdm.common.feign.impl.flowable.FlowableClientFeignClientImpl;
|
import com.sdm.common.feign.impl.flowable.FlowableClientFeignClientImpl;
|
||||||
|
import com.sdm.common.feign.impl.system.ApproveFeignClientImpl;
|
||||||
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
|
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
|
||||||
import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient;
|
import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient;
|
||||||
import com.sdm.common.feign.inter.data.IDataFeignClient;
|
import com.sdm.common.feign.inter.data.IDataFeignClient;
|
||||||
@@ -37,8 +43,10 @@ import com.sdm.common.utils.RandomUtil;
|
|||||||
import com.sdm.project.common.KeyResultTypeEnum;
|
import com.sdm.project.common.KeyResultTypeEnum;
|
||||||
import com.sdm.project.common.MemberTypeEnum;
|
import com.sdm.project.common.MemberTypeEnum;
|
||||||
import com.sdm.project.common.RunPerformanceStatusEnum;
|
import com.sdm.project.common.RunPerformanceStatusEnum;
|
||||||
|
import com.sdm.project.common.TaskExeStatusEnum;
|
||||||
import com.sdm.project.dao.SimulationProjectMapper;
|
import com.sdm.project.dao.SimulationProjectMapper;
|
||||||
import com.sdm.project.dao.SimulationRunMapper;
|
import com.sdm.project.dao.SimulationRunMapper;
|
||||||
|
import com.sdm.project.model.bo.ApprovalDeliverableContentsModel;
|
||||||
import com.sdm.project.model.bo.TaskNode;
|
import com.sdm.project.model.bo.TaskNode;
|
||||||
import com.sdm.project.model.bo.TaskNodeTag;
|
import com.sdm.project.model.bo.TaskNodeTag;
|
||||||
import com.sdm.project.model.entity.*;
|
import com.sdm.project.model.entity.*;
|
||||||
@@ -111,6 +119,12 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
@Autowired
|
@Autowired
|
||||||
private SimulationFlowFeignClientImpl flowFeignClient;
|
private SimulationFlowFeignClientImpl flowFeignClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApproveFeignClientImpl approveFeignClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DataAnalysisFeignClientImpl analysisFeignClient;
|
||||||
|
|
||||||
private static final String TEMP_REPORT_PATH = "/opt/report/";
|
private static final String TEMP_REPORT_PATH = "/opt/report/";
|
||||||
|
|
||||||
private int getCurrentNodeDepth(NodeAllBase eachNode) {
|
private int getCurrentNodeDepth(NodeAllBase eachNode) {
|
||||||
@@ -781,6 +795,73 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
return SdmResponse.success(new ArrayList<>());
|
return SdmResponse.success(new ArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SdmResponse deliverableApprove(DeliverableApproveReq req) {
|
||||||
|
SimulationTask simulationTask = simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, req.getTaskId()).one();
|
||||||
|
if (simulationTask != null) {
|
||||||
|
ApprovalDeliverableContentsModel contentsModel = new ApprovalDeliverableContentsModel();
|
||||||
|
contentsModel.setTaskId(req.getTaskId());
|
||||||
|
contentsModel.setDifficult(req.getDifficult());
|
||||||
|
// 发起审批
|
||||||
|
String cidFlowId = launchParamApprove(req.getTemplateId(),req.getTemplateName(), JSONObject.toJSONString(contentsModel),1);
|
||||||
|
if (StringUtils.isEmpty(cidFlowId)) {
|
||||||
|
return SdmResponse.failed("发起评审失败");
|
||||||
|
}
|
||||||
|
simulationTask.setCidFlowId(cidFlowId);
|
||||||
|
simulationTaskService.updateById(simulationTask);
|
||||||
|
return SdmResponse.success(cidFlowId);
|
||||||
|
}
|
||||||
|
return SdmResponse.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SdmResponse deliverableApproveCallback(LaunchApproveReq req) {
|
||||||
|
SdmResponse response = SdmResponse.success();
|
||||||
|
int approveStatus = req.approveStatus;
|
||||||
|
String approveContent = req.approveContents;
|
||||||
|
JSONObject contentObj = JSONObject.parseObject(approveContent);
|
||||||
|
if(contentObj != null && contentObj.containsKey("taskId"))
|
||||||
|
{
|
||||||
|
String taskId = contentObj.getString("taskId");
|
||||||
|
Float difficult = contentObj.getFloat("difficult");
|
||||||
|
SimulationTask simulationTask = simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, taskId).one();
|
||||||
|
if(simulationTask != null)
|
||||||
|
{
|
||||||
|
// 审批通过 部署流程 保存部署流程部署id和流程定义id
|
||||||
|
if (NumberConstants.TWO == approveStatus) {
|
||||||
|
simulationTask.setDifficult(difficult);
|
||||||
|
simulationTask.setProgress(100);
|
||||||
|
simulationTask.setExeStatus(TaskExeStatusEnum.CLOSED.getCode());
|
||||||
|
simulationTaskService.updateById(simulationTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String launchParamApprove(String templateId, String templateName,String approveContents,int approveAction) {
|
||||||
|
LaunchApproveReq req = new LaunchApproveReq();
|
||||||
|
req.templateId = templateId;
|
||||||
|
req.templateName = templateName;
|
||||||
|
req.approveContents = approveContents;
|
||||||
|
req.approveAction = approveAction;
|
||||||
|
req.approveStatus = 1;
|
||||||
|
req.approveType = ApproveTypeEnum.DELIVERABLE_APPROVE.getCode();
|
||||||
|
req.approveTitle = "交付物评审";
|
||||||
|
req.tenantId = ThreadLocalContext.getTenantId();
|
||||||
|
req.userId = ThreadLocalContext.getUserId();
|
||||||
|
req.creator = ThreadLocalContext.getUserId();
|
||||||
|
SdmResponse response = approveFeignClient.launchApproval(req);
|
||||||
|
if(response.isSuccess()){
|
||||||
|
// 成功
|
||||||
|
String cidFlowId = Optional.ofNullable(response.getData())
|
||||||
|
.map(Object::toString)
|
||||||
|
.orElse("");
|
||||||
|
return cidFlowId;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SdmResponse<PageDataResp<List<SimulationRunKeyResult>>> listSimulationKeyResult(KeyResultReq req) {
|
public SdmResponse<PageDataResp<List<SimulationRunKeyResult>>> listSimulationKeyResult(KeyResultReq req) {
|
||||||
PageHelper.startPage(req.getCurrent(), req.getSize());
|
PageHelper.startPage(req.getCurrent(), req.getSize());
|
||||||
@@ -791,17 +872,30 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SdmResponse<KeyResultAndTaskInfoResp> queryKeyResultAndTaskInfo(KeyResultReq req) {
|
public SdmResponse<PageDataResp<List<KeyResultAndTaskInfoResp>>> queryKeyResultAndTaskInfo(KeyResultReq req) {
|
||||||
KeyResultAndTaskInfoResp keyResultAndTaskInfoResp = new KeyResultAndTaskInfoResp();
|
List<KeyResultAndTaskInfoResp> respList = new ArrayList<>();
|
||||||
SimulationRunKeyResult simulationRunKeyResult = simulationKeyResultService.lambdaQuery().eq(SimulationRunKeyResult::getFileId, req.getFileId()).one();
|
|
||||||
if (simulationRunKeyResult != null) {
|
GetSimulationTaskFileReq taskFileReq = new GetSimulationTaskFileReq();
|
||||||
BeanUtils.copyProperties(simulationRunKeyResult, keyResultAndTaskInfoResp);
|
taskFileReq.setUuid(req.getTaskId());
|
||||||
SimulationRun simulationRun = this.lambdaQuery().eq(SimulationRun::getUuid, simulationRunKeyResult.getRunId()).one();
|
taskFileReq.setFileBizType(req.getFileType());
|
||||||
if (simulationRun != null) {
|
taskFileReq.setCurrent(req.getCurrent());
|
||||||
keyResultAndTaskInfoResp.setSimulationTask(simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, simulationRun.getTaskId()).one());
|
taskFileReq.setSize(req.getSize());
|
||||||
|
SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> sdmResponse = analysisFeignClient.getSimulationTaskFile(taskFileReq);
|
||||||
|
|
||||||
|
if (sdmResponse.getData() != null && sdmResponse.getData().getData() != null) {
|
||||||
|
List<SimulationTaskResultCurveResp> resultCurveResps = sdmResponse.getData().getData();
|
||||||
|
for (SimulationTaskResultCurveResp resultCurveResp : resultCurveResps) {
|
||||||
|
KeyResultAndTaskInfoResp keyResultAndTaskInfoResp = new KeyResultAndTaskInfoResp();
|
||||||
|
keyResultAndTaskInfoResp.setFileInfo(resultCurveResp);
|
||||||
|
SimulationRunKeyResult simulationRunKeyResult = simulationKeyResultService.lambdaQuery().eq(SimulationRunKeyResult::getFileId, resultCurveResp.getId()).one();
|
||||||
|
if (simulationRunKeyResult != null) {
|
||||||
|
BeanUtils.copyProperties(simulationRunKeyResult, keyResultAndTaskInfoResp);
|
||||||
|
}
|
||||||
|
respList.add(keyResultAndTaskInfoResp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SdmResponse.success(keyResultAndTaskInfoResp);
|
PageInfo<KeyResultAndTaskInfoResp> page = new PageInfo<>(respList);
|
||||||
|
return PageUtils.getJsonObjectSdmResponse(respList, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class SimulationTaskServiceImpl extends ServiceImpl<SimulationTaskMapper,
|
|||||||
wrapper.set(SimulationTask::getTaskName, req.getNodeName());
|
wrapper.set(SimulationTask::getTaskName, req.getNodeName());
|
||||||
}
|
}
|
||||||
wrapper.set(SimulationTask::getCreator, ThreadLocalContext.getUserId());
|
wrapper.set(SimulationTask::getCreator, ThreadLocalContext.getUserId());
|
||||||
wrapper.set(SimulationTask::getCreateTime, DateUtil.now());
|
wrapper.set(SimulationTask::getUpdateTime, DateUtil.now());
|
||||||
return this.update(wrapper);
|
return this.update(wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.sdm.common.common.SdmResponse;
|
|||||||
import com.sdm.common.entity.enums.ApproveTypeEnum;
|
import com.sdm.common.entity.enums.ApproveTypeEnum;
|
||||||
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||||
import com.sdm.common.feign.inter.data.IDataFeignClient;
|
import com.sdm.common.feign.inter.data.IDataFeignClient;
|
||||||
|
import com.sdm.common.feign.inter.project.ISimulationRunFeignClient;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@ import org.springframework.stereotype.Component;
|
|||||||
public class TaskDeliverableStrategy extends ApproveAbstractNoticeStrategy {
|
public class TaskDeliverableStrategy extends ApproveAbstractNoticeStrategy {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IDataFeignClient dataFeignClient;
|
private ISimulationRunFeignClient runFeignClient;
|
||||||
// 这个回调场景值和 LaunchApproveReq 类里的 approveType 对应
|
// 这个回调场景值和 LaunchApproveReq 类里的 approveType 对应
|
||||||
// 审批类型 0.http回调的,replyUrl必须传递,相当于是跨系统的,调用的时候可以不传,replyUrl必须传递 ;1:仿真地图审批(spdm内部feign) 2:知识库审批(spdm内部feign) 4:交付物审批(spdm内部feign)
|
// 审批类型 0.http回调的,replyUrl必须传递,相当于是跨系统的,调用的时候可以不传,replyUrl必须传递 ;1:仿真地图审批(spdm内部feign) 2:知识库审批(spdm内部feign) 4:交付物审批(spdm内部feign)
|
||||||
@Override
|
@Override
|
||||||
@@ -21,7 +22,7 @@ public class TaskDeliverableStrategy extends ApproveAbstractNoticeStrategy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SdmResponse noticeResult(LaunchApproveReq req) {
|
public SdmResponse noticeResult(LaunchApproveReq req) {
|
||||||
return dataFeignClient.approveDataFile(req);
|
return runFeignClient.deliverableApproveCallback(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user