fix[project]: 仿真策划导入外部表单,对导入的用户信息做转换

This commit is contained in:
2026-03-20 14:21:12 +08:00
parent 81423b9837
commit 580f60be0d
2 changed files with 77 additions and 6 deletions

View File

@@ -4,7 +4,9 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.req.project.SimulationPerformance;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.utils.SystemOperate;
import com.sdm.project.model.po.ExportExternalForm;
import com.sdm.project.model.po.NodeAllBase;
@@ -18,8 +20,11 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@Component
@@ -190,7 +195,7 @@ public class ExportOperate {
* @param columnFile 指标字段配置文件路径
* @return 解析结果响应
*/
private SdmResponse executeExternalFormPythonScript(String jsonOutputFile, String excelFile, String columnFile) {
private SdmResponse executeExternalFormPythonScript(String jsonOutputFile, String excelFile, String columnFile,Map<String, CIDUserResp> usernameToUserMap) {
// 构建Python执行命令
String shellPath = scriptPath + File.separator + PYTHON_INPUT_SCRIPT_NAME;
String pythonCmd = String.format("%s%s %s %s %s %s",
@@ -213,7 +218,7 @@ public class ExportOperate {
}
// 读取并解析JSON结果文件
return parseExternalFormScriptOutput(jsonOutputFile);
return parseExternalFormScriptOutput(jsonOutputFile,usernameToUserMap);
} catch (Exception e) {
log.error("执行Python脚本异常", e);
return SdmResponse.failed(ERROR_SCRIPT_EXECUTE + "" + e.getMessage());
@@ -252,7 +257,7 @@ public class ExportOperate {
* @param jsonFile JSON文件路径
* @return 解析结果响应
*/
private SdmResponse parseExternalFormScriptOutput(String jsonFile) {
private SdmResponse parseExternalFormScriptOutput(String jsonFile,Map<String, CIDUserResp> usernameToUserMap) {
// 使用try-with-resources自动关闭流无需手动close
try (InputStream inputStream = new FileInputStream(jsonFile)) {
byte[] jsonContents = inputStream.readAllBytes();
@@ -260,6 +265,60 @@ public class ExportOperate {
log.info("读取JSON结果文件成功内容长度{}", externalFormJsonString.length());
ExportExternalForm exportExternalForm = JSON.parseObject(externalFormJsonString, ExportExternalForm.class);
log.info("解析出的项目树为:{}", exportExternalForm);
if (ObjectUtils.isNotEmpty(exportExternalForm) && CollectionUtils.isNotEmpty(exportExternalForm.getNodes())) {
// 前端导入的文件中的用户信息是工号需要转成userId
List<NodeAllBase> nodeList = exportExternalForm.getNodes();
// 过滤出任务
List<NodeAllBase> taskList = nodeList.stream().filter(node -> NodeTypeEnum.TASK.getValue().equals(node.getNodeType())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(taskList)) {
for (NodeAllBase task : taskList) {
// 仿真负责人
List<CIDUserResp> pMemberList = task.getPMemberList();
if (CollectionUtils.isNotEmpty(pMemberList)) {
List<CIDUserResp> newPMemberList = new ArrayList<>();
for (CIDUserResp cidUserResp : pMemberList) {
CIDUserResp user = usernameToUserMap.get(cidUserResp.getJobNumber());
if (user == null) {
log.info("{}对应的用户不存在", cidUserResp.getJobNumber());
continue;
}
newPMemberList.add(user);
}
task.setPMemberList(newPMemberList);
}
// 执行人
List<CIDUserResp> eMemberList = task.getEMemberList();
if (CollectionUtils.isNotEmpty(eMemberList)) {
List<CIDUserResp> newEMemberList = new ArrayList<>();
for (CIDUserResp cidUserResp : eMemberList) {
CIDUserResp user = usernameToUserMap.get(cidUserResp.getJobNumber());
if (user == null) {
log.info("{}对应的用户不存在", cidUserResp.getJobNumber());
continue;
}
newEMemberList.add(user);
}
task.setEMemberList(newEMemberList);
}
// 3D负责人
List<CIDUserResp> tMemberList = task.getTMemberList();
if (CollectionUtils.isNotEmpty(tMemberList)) {
List<CIDUserResp> newTMemberList = new ArrayList<>();
for (CIDUserResp cidUserResp : tMemberList) {
CIDUserResp user = usernameToUserMap.get(cidUserResp.getJobNumber());
if (user == null) {
log.info("{}对应的用户不存在", cidUserResp.getJobNumber());
continue;
}
newTMemberList.add(user);
}
task.setTMemberList(newTMemberList);
}
}
}
}
SdmResponse response = SdmResponse.success();
response.setData(exportExternalForm);
return response;
@@ -401,7 +460,7 @@ public class ExportOperate {
* @param columns 外部表单字段JSON字符串
* @return 解析结果响应
*/
public SdmResponse parseSimulationExternalForm(MultipartFile externalFormFile, String columns) {
public SdmResponse parseSimulationExternalForm(MultipartFile externalFormFile, String columns, Map<String, CIDUserResp> usernameToUserMap) {
// 1. 参数校验
if (externalFormFile == null || externalFormFile.isEmpty()) {
log.warn("解析外部表单文件失败:文件为空");
@@ -433,7 +492,7 @@ public class ExportOperate {
}
// 5. 执行Python脚本解析文件
response = executeExternalFormPythonScript(externalFormJsonFileName, externalmanceFileName, columnFileName);
response = executeExternalFormPythonScript(externalFormJsonFileName, externalmanceFileName, columnFileName,usernameToUserMap);
} catch (Exception e) {
log.error("解析外部表单文件发生异常", e);
response = SdmResponse.failed(ERROR_PARSE_FILE + "" + e.getMessage());

View File

@@ -5132,8 +5132,20 @@ public class TaskServiceImpl implements ITaskService {
@Override
public SdmResponse importSimulationExternalForm(MultipartFile file, String columns) {
Long tenantId = ThreadLocalContext.getTenantId();
// 将利元亨的用户工号与userId映射
Map<String, CIDUserResp> usernameToUserMap = new HashMap<>();
UserListReq userListReq = new UserListReq();
userListReq.setTenantId(tenantId);
userListReq.setCurrent(1);
userListReq.setSize(9999);
SdmResponse<PageDataResp<List<CIDUserResp>>> pageDataRespSdmResponse = sysUserFeignClient.listUser(userListReq);
if (pageDataRespSdmResponse.isSuccess() && pageDataRespSdmResponse.getData().getData() != null) {
List<CIDUserResp> userList = pageDataRespSdmResponse.getData().getData();
usernameToUserMap = userList.stream().collect(Collectors.toMap(CIDUserResp::getUsername, Function.identity()));
}
// 通过脚本解析导入的指标excel文件
return exportOperate.parseSimulationExternalForm(file,columns);
return exportOperate.parseSimulationExternalForm(file,columns,usernameToUserMap);
}