Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-12-24 17:20:47 +08:00
15 changed files with 185 additions and 54 deletions

View File

@@ -1,2 +1,3 @@
ALTER TABLE simulation_demand ADD demandSource varchar(12) NULL COMMENT '需求来源:自建、同步';
ALTER TABLE simulation_demand ADD contentHash varchar(64) NULL COMMENT 'hash值同步待办时判断是否需要更新';
ALTER TABLE simulation_demand ADD contentHash varchar(64) NULL COMMENT 'hash值同步待办时判断是否需要更新';
ALTER TABLE simulation_demand MODIFY COLUMN demandSource varchar(16) DEFAULT 'DM';

View File

@@ -1,2 +1,3 @@
ALTER TABLE simulation_node ADD projectId INT NULL COMMENT '利元亨项目id';
ALTER TABLE simulation_node ADD projectSource varchar(16) NULL COMMENT '项目来源:自建、同步';
ALTER TABLE simulation_node ADD projectSource varchar(16) NULL COMMENT '项目来源:自建、同步';
ALTER TABLE simulation_node MODIFY COLUMN projectSource varchar(16) DEFAULT 'DM';

View File

@@ -95,4 +95,17 @@ public class FlowableClientFeignClientImpl implements IFlowableFeignClient {
}
return SdmResponse.success();
}
@Override
public SdmResponse retryFailedNode(String processInstanceId, String failNodeId) {
SdmResponse response;
try {
response = flowableFeignClient.retryFailedNode(processInstanceId, failNodeId);
log.info("重试当前失败节点:"+ response);
return response;
} catch (Exception e) {
log.error("重试当前失败节点失败", e);
return SdmResponse.failed("重试当前失败节点失败");
}
}
}

View File

@@ -36,4 +36,7 @@ public interface IFlowableFeignClient {
@PostMapping("/process/asyncCallback")
SdmResponse asyncCallback(@RequestBody AsyncCallbackRequest request);
@PostMapping("/process/retryFailedNode")
SdmResponse retryFailedNode(@RequestParam String processInstanceId, @RequestParam String failNodeId);
}

View File

@@ -687,6 +687,16 @@ public class ExcelUtil {
for (int i = 0; i < 8; i++) {
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, i, i));
}
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 21, 21));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 22, 22));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 23, 23));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 29, 29));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 30, 30));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 31, 31));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 32, 32));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 33, 33));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 34, 34));
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 35, 35));
}
}
}

View File

@@ -16,4 +16,10 @@ public class SimulationParameterItem {
@Schema(description = "描述")
private String description;
@Schema(description = "创建人")
private Long creatorId;
@Schema(description = "创建时间")
private String createTime;
}

View File

@@ -15,6 +15,7 @@ import com.sdm.common.entity.enums.SimulationParameterDataTypeEnum;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.feign.impl.system.ApproveFeignClientImpl;
import com.sdm.common.service.UserNameCacheService;
import com.sdm.common.utils.DateUtils;
import com.sdm.data.dao.SimulationParameterLibraryMapper;
import com.sdm.data.model.bo.ApprovalParamContentsModel;
import com.sdm.data.model.entity.FileMetadataInfo;
@@ -35,6 +36,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@@ -98,7 +100,21 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl<Simulatio
@Transactional(rollbackFor = Exception.class)
public SdmResponse addLibraryCategoryObject(SimulationParameterLibraryCategoryObjectReq req) {
try {
SdmResponse<Long> integerSdmResponse = dataFileService.uploadSimulationParamFile(req.getFile());
// 添加创建人和创建时间
String originalJson = new String(req.getFile().getBytes(), StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(originalJson);
List<Map<String, Object>> parameterJsonValueFromJsonNode = parseJsonArray(jsonNode);
if (!CollectionUtils.isEmpty(parameterJsonValueFromJsonNode)) {
parameterJsonValueFromJsonNode.forEach(map -> {
map.put("creatorId", ThreadLocalContext.getUserId());
map.put("createTime", DateUtils.format(new Date(), DateUtils.PATTERN_DEFAULT));
});
}
String content = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parameterJsonValueFromJsonNode);
MultipartFile file = new MockMultipartFile(req.getFileName(), req.getFile().getOriginalFilename(), req.getFile().getContentType(), content.getBytes(StandardCharsets.UTF_8));
SdmResponse<Long> integerSdmResponse = dataFileService.uploadSimulationParamFile(file);
Long fileId = integerSdmResponse.getData();
SimulationParameterLibraryCategoryObject simulationParameterLibraryCategoryObject = new SimulationParameterLibraryCategoryObject();
@@ -321,7 +337,21 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl<Simulatio
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(minioInputStream);
List<Map<String, Object>> parameterJsonValueFromJsonNode = parseJsonArray(jsonNode);
if (!CollectionUtils.isEmpty(parameterJsonValueFromJsonNode)) {
// 将 List<Long> userIds 转成set
Set<Long> userIdsSet = new HashSet<>();
for (Map<String, Object> map : parameterJsonValueFromJsonNode) {
userIdsSet.add((Long) map.get("creatorId"));
}
Map<Long, String> longStringMap = userNameCacheService.batchGetUserNames(userIdsSet);
for (Map<String, Object> map : parameterJsonValueFromJsonNode) {
map.put("creator", longStringMap.get((Long) map.get("creatorId")));
simulationParameterLibraryCategoryObjectResp.setCreateTime(simulationParameterLibraryCategoryObject.getCreateTime());
}
}
simulationParameterLibraryCategoryObjectResp.setParameterJsonValue(parameterJsonValueFromJsonNode);
} else {
// 兜底操作可能是清库了或者数据被删除了删除掉参数对象的json文件信息
simulationParameterLibraryCategoryObject.setFileId(null);
@@ -453,6 +483,13 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl<Simulatio
if (fileMetadataInfo == null) {
return SdmResponse.failed("文件元数据不存在");
}
// 给页面上新增的对象参数添加创建人和时间
req.getParameterList().forEach(item -> {
if (item.getCreatorId() == null) {
item.setCreatorId(ThreadLocalContext.getUserId());
item.setCreateTime(DateUtils.format(new Date(), DateUtils.PATTERN_DEFAULT));
}
});
// 将参数列表直接转换为JSON
ObjectMapper objectMapper = new ObjectMapper();

View File

@@ -365,11 +365,11 @@ public class LyricIntegrateService {
public SdmResponse pushFreeLinkMsg(FreelinkAndDingdingInformReq req){
SdmResponse response = SdmResponse.success();
String token = getHKCloudToken(req.getJobNo());
// String token = getHKCloudToken(req.getJobNo());
if (token == null || token.isEmpty()) {
return SdmResponse.failed("获取海葵云token失败");
}
// if (token == null || token.isEmpty()) {
// return SdmResponse.failed("获取海葵云token失败");
// }
FreeLinkMsg freeLinkMsg = req.getFreeLinkMsg();
List<NameValuePair> params = new ArrayList<>();
@@ -383,7 +383,7 @@ public class LyricIntegrateService {
String getProcessDataUrl=FREELINK_URL+FREELINK_PUSH_MSG_SUFFIX;
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Content-Type","application/x-www-form-urlencoded");
headerMap.put("authorization", token);
// headerMap.put("authorization", token);
try {
String result = HttpUtil.httpPostForm(getProcessDataUrl, headerMap, params);

View File

@@ -19,7 +19,7 @@ spring:
appKey : e9eb516aa02a43a29e227a0d901ec5f1
appSecret : 9fac43db08634aaf8a9fe5fb9468de9d
# 海葵云url
HK_CLOUD_URL : https://v15.lyh.haikuidcloud.com
HK_CLOUD_URL : https://v15.lyh.haikuicloud.com
# 1. 海葵云获取用户token url后缀
HK_USER_TOKEN_URL_SUFFIX: /merchant/openapi/user/login/jobNo
# 2. 海葵云获取单个用户信息url后缀

View File

@@ -1,10 +1,12 @@
package com.sdm.pbs.controller;
import com.sdm.common.common.SdmResponse;
import com.sdm.outbridge.entity.*;
import com.sdm.outbridge.mode.FreelinkAndDingdingInformReq;
import com.sdm.outbridge.mode.GetProcessDataReq;
import com.sdm.outbridge.mode.HkUploadFileReq;
import com.sdm.outbridge.service.lyric.LyricIntegrateService;
import com.sdm.outbridge.service.lyric.*;
import com.sdm.pbs.service.TestService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
@@ -17,13 +19,30 @@ import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/sec")
@RequestMapping
@Tag(name = "测试外部模块系统交互", description = "测试外部模块系统交互")
public class TestSecondDbController {
/*利元亨现场对接接口方法*/
@Autowired
private LyricIntegrateService lyricIntegrateService;
@Autowired
private LyricVMainPlanDMService lyricVMainPlanDMService;
@Autowired
private LyricVPdtDmService lyricVPdtDmService;
@Autowired
private LyricVProductionLineToDmService lyricVProductionLineToDmService;
@Autowired
private LyricVProjectBatchToDmService lyricVProjectBatchToDmService;
@Autowired
private LyricVProjectToDmService lyricVProjectToDmService;
@Autowired
private LyricVTodoInfoService lyricVTodoInfoService;
@Autowired
private TestService testService;
// mock
@@ -83,48 +102,57 @@ public class TestSecondDbController {
}
// /*现场查询视图的方法mock */
// @GetMapping("/getTodoInfoDm") no usages
// @Operation(summary = "查询代办")
// public SdmResponse<List<LyricVTodoEmulationInfoDM>> getTodoInfoDm() {
// // 查询从数据源
// List<LyricVTodoEmulationInfoDM> todoInfoList = lyricVTodoInfoService.lambdaQuery().last(lastSql: "limit 2").list();
// return SdmResponse.success(todoInfoList);
// }
//
// @GetMapping("/getPdtDm") no usages
// @Operation(summary = "查询项目Pdt")
// public SdmResponse<List<LyricVPdtToDM>> getPdtDm() {
// // 查询从数据源
// List<LyricVPdtToDM> lyricVPdtToDMList = LyricVPdtDmService.lambdaQuery().last(lastSql: "limit 2").list();
// return SdmResponse.success(lyricVPdtToDMList);
// }
//
// @GetMapping("/getMain") no usages
// @Operation(summary = "查询主计划")
// public SdmResponse<List<LyricVMainPlanDM>> getMain() {
// // 查询从数据源
// List<LyricVMainPlanDM> mainPlanDMSList = lyricVMainPlanDMService.lambdaQuery().last(lastSql: "limit 2").list();
// return SdmResponse.success(mainPlanDMSList);
// }
//
// @GetMapping("/getProductLine") no usages
// @Operation(summary = "查询产线信息")
// public SdmResponse<List<LyricVProductionLineToDM>> getProductLine() {
// // 查询从数据源
// List<LyricVProductionLineToDM> productionLineToDMList = lyricVProductionLineToDmService
// .lambdaQuery().last(lastSql: "limit 2").list();
// return SdmResponse.success(productionLineToDMList);
// }
//
// @GetMapping("/getProjectInfo") no usages
// @Operation(summary = "查询项目信息")
// public SdmResponse<List<LyricVProjectToDM>> getProjectInfo() {
// // 查询从数据源
// List<LyricVProjectToDM> projectToDmList = LyricVProjectToDmService
// .lambdaQuery().last(lastSql: "limit 3").list();
// return SdmResponse.success(projectToDmList);
// }
/*现场查询视图的方法mock */
@GetMapping("/getTodoInfoDm")
@Operation(summary = "查询代办")
public SdmResponse<List<LyricVTodoEmulationInfoDM>> getTodoInfoDm() {
// 查询从数据源
List<LyricVTodoEmulationInfoDM> todoInfoList = lyricVTodoInfoService.lambdaQuery().last( "limit 2").list();
return SdmResponse.success(todoInfoList);
}
@GetMapping("/getPdtDm")
@Operation(summary = "查询项目Pdt")
public SdmResponse<List<LyricVPdtToDM>> getPdtDm() {
// 查询从数据源
List<LyricVPdtToDM> lyricVPdtToDMList =lyricVPdtDmService.lambdaQuery().last( "limit 2").list();
return SdmResponse.success(lyricVPdtToDMList);
}
@GetMapping("/getMain")
@Operation(summary = "查询主计划")
public SdmResponse<List<LyricVMainPlanDM>> getMain() {
// 查询从数据源
List<LyricVMainPlanDM> mainPlanDMSList = lyricVMainPlanDMService.lambdaQuery().last("limit 2").list();
return SdmResponse.success(mainPlanDMSList);
}
@GetMapping("/getProductLine")
@Operation(summary = "查询产线信息")
public SdmResponse<List<LyricVProductionLineToDM>> getProductLine() {
// 查询从数据源
List<LyricVProductionLineToDM> productionLineToDMList = lyricVProductionLineToDmService
.lambdaQuery().last( "limit 2").list();
return SdmResponse.success(productionLineToDMList);
}
@GetMapping("/getProjectBatch")
@Operation(summary = "查询批次信息")
public SdmResponse<List<LyricVProjectBatchToDM>> getProjectBatch() {
// 查询从数据源
List<LyricVProjectBatchToDM> list = lyricVProjectBatchToDmService
.lambdaQuery().last("limit 2").list();
return SdmResponse.success(list);
}
@GetMapping("/getProjectInfo")
@Operation(summary = "查询项目信息")
public SdmResponse<List<LyricVProjectToDM>> getProjectInfo() {
// 查询从数据源
List<LyricVProjectToDM> projectToDmList =
lyricVProjectToDmService.lambdaQuery().last("limit 3").list();
return SdmResponse.success(projectToDmList);
}

View File

@@ -138,4 +138,15 @@ security:
paths:
- /pbs/jobFileCallback
- /pbs/netTest
- /pbs/adapterSubmitHpcJob
- /pbs/adapterSubmitHpcJob
- /getHkUserInfo
- /uploadHkFile
- /getProcessData
- /pushFreeLinkMsg
- /queryTodoAttachments
- /getTodoInfoDm
- /getPdtDm
- /getMain
- /getProductLine
- /getProjectBatch
- /getProjectInfo

View File

@@ -257,6 +257,16 @@ public class SimulationRunController implements ISimulationRunFeignClient {
public SdmResponse<FlowInfoDto> listFlowNodes(@RequestBody SpdmTaskRunReq req) {
return runService.listFlowNodes(req);
}
/**
* 任务执行 重试失败节点
*/
@SysLog("任务执行 重试失败节点")
@PostMapping("/retryFailedNode")
public SdmResponse retryFailedNode(@RequestParam String processInstanceId, @RequestParam String failNodeId) {
return runService.retryFailedNode(processInstanceId, failNodeId);
}
/**
* 流程关联报告
*

View File

@@ -99,4 +99,8 @@ public class SpdmNodeDetailVo extends BaseEntity {
*/
private String currentPhase;
private Integer projectId;
private String projectSource;
}

View File

@@ -79,6 +79,8 @@ public interface ISimulationRunService extends IService<SimulationRun> {
SdmResponse<FlowInfoDto> listFlowNodes(SpdmTaskRunReq req);
SdmResponse retryFailedNode(String processInstanceId, String failNodeId);
SdmResponse flowRelateReport(SpdmReportReq req);
SdmResponse<List<SimulationBaseQuantities>> listQuantities();

View File

@@ -1504,6 +1504,11 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
return SdmResponse.success();
}
@Override
public SdmResponse retryFailedNode(String processInstanceId, String failNodeId) {
return flowableFeignClient.retryFailedNode(processInstanceId, failNodeId);
}
@Override
public SdmResponse flowRelateReport(SpdmReportReq req) {
generateReport(req,null);