This commit is contained in:
yangyang01000846
2025-12-25 23:03:21 +08:00
13 changed files with 392 additions and 31 deletions

View File

@@ -345,7 +345,7 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl<Simulatio
}
Map<Long, String> longStringMap = userNameCacheService.batchGetUserNames(userIdsSet);
for (Map<String, Object> map : parameterJsonValueFromJsonNode) {
map.put("creator", longStringMap.get((Long) map.get("creatorId")));
map.put("createName", longStringMap.get((Long) map.get("creatorId")));
simulationParameterLibraryCategoryObjectResp.setCreateTime(simulationParameterLibraryCategoryObject.getCreateTime());
}
}

View File

@@ -1696,7 +1696,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
log.error("同步CID项目{}时,创建文件夹失败,原因为:{}",req.getProjectId() + " " + req.getProjectName(),response.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
resp.setCode(String.valueOf(ResultCode.FAILED.getCode()));
resp.setMessage(ResultCode.FAILED.getMessage());
resp.setMessage(response.getMessage());
return resp;
}
}catch (Exception ex) {

View File

@@ -1617,48 +1617,65 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
experimentResult.setExpDesc(req.getExpDesc());
}
List<Long> deleteFileIds = new ArrayList<>();
// 传了新的图片文件
if (ObjectUtils.isNotEmpty(req.getAddImageInfo())) {
req.getAddFileInfoList().add(req.getAddImageInfo());
}
if (CollectionUtils.size(req.getAddFileInfoList()) > 0) {
UploadFilesReq filesReq = new UploadFilesReq();
BeanUtils.copyProperties(req, filesReq);
filesReq.setUuid(req.getTaskId());
filesReq.setSourceFiles(req.getAddFileInfoList().stream().map(i -> new UploadFilesReq(i.getFileName(), i.getFileSize(), i.getFileType())).toList());
// 批量存储文件信息,返回数据供第二步分片上传使用
SdmResponse<List<BatchAddFileInfoResp>> sdmResponse = dataFeignClient.batchAddFileInfo(filesReq);
if (sdmResponse.isSuccess() && CollectionUtils.isNotEmpty(sdmResponse.getData())) {
List<BatchAddFileInfoResp> batchAddFileInfoResps = sdmResponse.getData();
if (CollectionUtils.size(req.getAddFileInfoList()) > 0 || CollectionUtils.size(req.getDeleteFileIds()) > 0) {
SdmResponse<List<BatchAddFileInfoResp>> batchAddResponse = SdmResponse.success();
// 之前上传的附件文件id
List<Long> oldFileIds = new ArrayList<>();
if (StringUtils.isNotBlank(experimentResult.getFileId())) {
oldFileIds = new ArrayList<>(Arrays.stream(experimentResult.getFileId().split(",")).mapToLong(Long::parseLong).boxed().toList());
}
// 先处理删除的文件
if (CollectionUtils.size(req.getDeleteFileIds()) > 0) {
Set<Long> deleteSet = new HashSet<>(req.getDeleteFileIds());
// 删掉前端删除的附件文件
oldFileIds.removeIf(deleteSet::contains);
deleteFileIds.addAll(req.getDeleteFileIds());
}
// 再处理新增的文件
if (CollectionUtils.size(req.getAddFileInfoList()) > 0) {
UploadFilesReq filesReq = new UploadFilesReq();
BeanUtils.copyProperties(req, filesReq);
filesReq.setUuid(req.getTaskId());
filesReq.setSourceFiles(req.getAddFileInfoList().stream().map(i -> new UploadFilesReq(i.getFileName(), i.getFileSize(), i.getFileType())).toList());
// 批量存储文件信息,返回数据供第二步分片上传使用
batchAddResponse = dataFeignClient.batchAddFileInfo(filesReq);
if (!batchAddResponse.isSuccess()) {
return batchAddResponse;
}
List<BatchAddFileInfoResp> batchAddFileInfoResps = batchAddResponse.getData();
// 传了新的图片文件 默认删除以前的
if (ObjectUtils.isNotEmpty(req.getAddImageInfo())) {
batchAddFileInfoResps.stream().filter(i -> StringUtils.equals(i.getSourceFileName(), req.getAddImageInfo().getFileName())).findFirst().ifPresent(i -> {
deleteFileIds.add(experimentResult.getImageId());
experimentResult.setImageId(i.getBusinessId());
});
}
// 过滤掉图片文件剩下的是附件文件
List<Long> addFileIds = batchAddFileInfoResps.stream().filter(i -> !Objects.equals(i.getBusinessId(), experimentResult.getImageId())).map(BatchAddFileInfoResp::getBusinessId).collect(Collectors.toList());
List<Long> oldFileIds = new ArrayList<>(Arrays.stream(experimentResult.getFileId().split(",")).mapToLong(Long::parseLong).boxed().toList());
if (CollectionUtils.isNotEmpty(req.getDeleteFileIds()) && CollectionUtils.isNotEmpty(oldFileIds)) {
Set<Long> deleteSet = new HashSet<>(req.getDeleteFileIds());
oldFileIds.removeIf(deleteSet::contains);
deleteFileIds.addAll(req.getDeleteFileIds());
}
// 加上新增的附件文件
oldFileIds.addAll(addFileIds);
String fileIds = oldFileIds.stream().map(String::valueOf).collect(Collectors.joining(","));
experimentResult.setFileId(fileIds);
simulationExpResultService.updateById(experimentResult);
// 删除文件
if (CollectionUtils.isNotEmpty(deleteFileIds)) {
for (Long deleteFileId : deleteFileIds) {
DelFileReq delFileReq = new DelFileReq();
delFileReq.setDelFileId(deleteFileId);
SdmResponse response = dataFeignClient.delFile(delFileReq);
if (!response.isSuccess()) {
return response;
}
}
String fileIds = oldFileIds.stream().map(String::valueOf).collect(Collectors.joining(","));
experimentResult.setFileId(fileIds);
simulationExpResultService.updateById(experimentResult);
// 删除文件
if (CollectionUtils.isNotEmpty(deleteFileIds)) {
for (Long deleteFileId : deleteFileIds) {
DelFileReq delFileReq = new DelFileReq();
delFileReq.setDelFileId(deleteFileId);
SdmResponse response = dataFeignClient.delFile(delFileReq);
if (!response.isSuccess()) {
return response;
}
}
}
return sdmResponse;
return batchAddResponse;
}
simulationExpResultService.updateById(experimentResult);
return SdmResponse.success();

View File

@@ -1440,7 +1440,7 @@ public class TaskServiceImpl implements ITaskService {
log.error("同步CID项目{}时,创建文件夹失败,原因为:{}", req.getProjectId() + " " + req.getProjectName(), response.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
resp.setCode(String.valueOf(ResultCode.FAILED.getCode()));
resp.setMessage(ResultCode.FAILED.getMessage());
resp.setMessage(response.getMessage());
return resp;
}
// 更新文件权限

View File

@@ -1,26 +1,53 @@
package com.sdm.system.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.feign.inter.system.ISysConfigFeignClient;
import com.sdm.common.entity.bo.DataDictionary;
import com.sdm.common.log.utils.JavaTimeModule;
import com.sdm.system.model.bo.DictionaryClass;
import com.sdm.system.model.bo.FormConfigure;
import com.sdm.system.model.entity.SysDataDictionary;
import com.sdm.system.model.entity.SysDictionaryClass;
import com.sdm.system.model.entity.SysFormConfigure;
import com.sdm.system.model.req.system.FormConfigureReq;
import com.sdm.system.model.resp.SimuDictionaryResp;
import com.sdm.system.service.IDataDictionaryService;
import com.sdm.system.service.IDictionaryClassService;
import com.sdm.system.service.IFormConfigureService;
import com.sdm.system.service.ISimulationSystemConfigService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/systemData")
@Slf4j
public class SimulationSystemConfigController implements ISysConfigFeignClient {
@Autowired
private ISimulationSystemConfigService service;
@Autowired
private IFormConfigureService formConfigureService;
@Autowired
private IDictionaryClassService dictionaryClassService;
@Autowired
private IDataDictionaryService dataDictionaryService;
@PostMapping(value = "/addDictionaryData")
@ResponseBody
SdmResponse addDictionaryData(@RequestBody DataDictionary dict)
@@ -154,5 +181,133 @@ public class SimulationSystemConfigController implements ISysConfigFeignClient {
return service.listFormConfigure(req);
}
@GetMapping("/exportSysFormConfigure")
public void exportSysFormConfigure(HttpServletResponse response) throws IOException {
// 导出为JSON文件
List<SysFormConfigure> sysFormConfigureList = formConfigureService.lambdaQuery().eq(SysFormConfigure::getTenantId, ThreadLocalContext.getTenantId()).list();
// List<SysFormConfigure> sysFormConfigureList = formConfigureService.list();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=form_configure_" + System.currentTimeMillis() + ".json");
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.writerWithDefaultPrettyPrinter().writeValue(response.getWriter(), sysFormConfigureList);
}
/**
* 通过JSON文件导入表单数据
*/
@PostMapping("/uploadSysFormConfigure")
public SdmResponse uploadSysFormConfigure(@RequestParam("file") MultipartFile file) {
try {
String jsonContent = new String(file.getBytes(), StandardCharsets.UTF_8);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 解析JSON
List<SysFormConfigure> sysFormConfigureList = mapper.readValue(jsonContent, new TypeReference<List<SysFormConfigure>>() {});
if (sysFormConfigureList == null || sysFormConfigureList.isEmpty()) {
return SdmResponse.failed("JSON数据为空");
}
log.info("开始导入sysFormConfigureList数据共 {} 条", sysFormConfigureList.size());
// 清空原有数据
formConfigureService.lambdaUpdate().eq(SysFormConfigure::getTenantId, ThreadLocalContext.getTenantId()).remove();
// formConfigureService.remove(Wrappers.emptyWrapper());
// 批量插入
formConfigureService.saveBatch(sysFormConfigureList);
return SdmResponse.success();
} catch (Exception e) {
return SdmResponse.failed("导入失败: " + e.getMessage());
}
}
@GetMapping("/exportSysDictionaryClass")
public void exportSysDictionaryClass(HttpServletResponse response) throws IOException {
// 导出为JSON文件
List<SysDictionaryClass> sysDictionaryClassList = dictionaryClassService.lambdaQuery().eq(SysDictionaryClass::getTenantId, String.valueOf(ThreadLocalContext.getTenantId())).list();
// List<SysDictionaryClass> sysDictionaryClassList = dictionaryClassService.list();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=dictionary_class_" + System.currentTimeMillis() + ".json");
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.writerWithDefaultPrettyPrinter().writeValue(response.getWriter(), sysDictionaryClassList);
}
/**
* 通过JSON文件导入表单数据
*/
@PostMapping("/uploadSysDictionaryClass")
public SdmResponse uploadSysDictionaryClass(@RequestParam("file") MultipartFile file) {
try {
String jsonContent = new String(file.getBytes(), StandardCharsets.UTF_8);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 解析JSON
List<SysDictionaryClass> sysDictionaryClassList = mapper.readValue(jsonContent, new TypeReference<List<SysDictionaryClass>>() {});
if (sysDictionaryClassList == null || sysDictionaryClassList.isEmpty()) {
return SdmResponse.failed("JSON数据为空");
}
log.info("开始导入sysDictionaryClassList数据共 {} 条", sysDictionaryClassList.size());
// 清空原有数据
dictionaryClassService.lambdaUpdate().eq(SysDictionaryClass::getTenantId, String.valueOf(ThreadLocalContext.getTenantId())).remove();
// dictionaryClassService.remove(Wrappers.emptyWrapper());
// 批量插入
dictionaryClassService.saveBatch(sysDictionaryClassList);
return SdmResponse.success();
} catch (Exception e) {
return SdmResponse.failed("导入失败: " + e.getMessage());
}
}
@GetMapping("/exportSysDataDictionary")
public void exportSysDataDictionary(HttpServletResponse response) throws IOException {
// 导出为JSON文件
List<SysDataDictionary> sysDataDictionaryList = dataDictionaryService.lambdaQuery().eq(SysDataDictionary::getTenantId, ThreadLocalContext.getTenantId()).list();
// List<SysDataDictionary> sysDataDictionaryList = dataDictionaryService.list();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=data_dictionary_" + System.currentTimeMillis() + ".json");
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.writerWithDefaultPrettyPrinter().writeValue(response.getWriter(), sysDataDictionaryList);
}
/**
* 通过JSON文件导入表单数据
*/
@PostMapping("/uploadSysDataDictionary")
public SdmResponse uploadSysDataDictionary(@RequestParam("file") MultipartFile file) {
try {
String jsonContent = new String(file.getBytes(), StandardCharsets.UTF_8);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 解析JSON
List<SysDataDictionary> sysDataDictionaryList = mapper.readValue(jsonContent, new TypeReference<List<SysDataDictionary>>() {});
if (sysDataDictionaryList == null || sysDataDictionaryList.isEmpty()) {
return SdmResponse.failed("JSON数据为空");
}
log.info("开始导入sysDataDictionaryList数据共 {} 条", sysDataDictionaryList.size());
// 清空原有数据
dataDictionaryService.lambdaUpdate().eq(SysDataDictionary::getTenantId, ThreadLocalContext.getTenantId()).remove();
// dataDictionaryService.remove(Wrappers.emptyWrapper());
// 批量插入
dataDictionaryService.saveBatch(sysDataDictionaryList);
return SdmResponse.success();
} catch (Exception e) {
return SdmResponse.failed("导入失败: " + e.getMessage());
}
}
}

View File

@@ -0,0 +1,8 @@
package com.sdm.system.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sdm.system.model.entity.SysDataDictionary;
public interface DataDictionaryMapper extends BaseMapper<SysDataDictionary> {
}

View File

@@ -0,0 +1,8 @@
package com.sdm.system.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sdm.system.model.entity.SysDictionaryClass;
public interface DictionaryClassMapper extends BaseMapper<SysDictionaryClass> {
}

View File

@@ -0,0 +1,74 @@
package com.sdm.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("simulation_data_dictionary")
@ApiModel(value="SysDataDictionary对象", description="")
public class SysDataDictionary implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "表单ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@Schema(description = "字典ID")
private String uuid;
@Schema(description = "字典名称")
@TableField("dictName")
private String dictName;
@Schema(description = "字典值")
@TableField("dictValue")
private String dictValue;
@Schema(description = "字典值类型")
@TableField("valueType")
private String valueType;
@Schema(description = "字典别名")
@TableField("aliasName")
private String aliasName;
@Schema(description = "排序序号")
@TableField("dictOrder")
private Integer dictOrder;
@Schema(description = "字典分类名称")
@TableField("dictClass")
private String dictClass;
@Schema(description = "字典分类类型")
@TableField("classType")
private String classType;
@Schema(description = "描述信息")
@TableField("comment")
private String comment;
@Schema(description = "所属租户ID")
@TableField("tenantId")
private Long tenantId;
@Schema(description = "创建人")
@TableField("creator")
private Long creator;
}

View File

@@ -0,0 +1,59 @@
package com.sdm.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("simulation_dictionary_class")
@ApiModel(value="SysDictionaryClass对象", description="")
public class SysDictionaryClass implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "字典ID")
@TableId(value = "uuid")
private String uuid;
@Schema(description = "分类名称")
@TableField("className")
private String className;
@Schema(description = "分类类别")
@TableField("classType")
private String classType;
@Schema(description = "分类标题")
@TableField("titleName")
private String titleName;
@Schema(description = "所属租户ID")
@TableField("tenantId")
private String tenantId;
@Schema(description = "描述信息")
@TableField("comment")
private String comment;
@Schema(description = "创建人")
@TableField("creator")
private Long creator;
@Schema(description = "创建时间")
@TableField("createTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,8 @@
package com.sdm.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.system.model.entity.SysDataDictionary;
public interface IDataDictionaryService extends IService<SysDataDictionary> {
}

View File

@@ -0,0 +1,8 @@
package com.sdm.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.system.model.entity.SysDictionaryClass;
public interface IDictionaryClassService extends IService<SysDictionaryClass> {
}

View File

@@ -0,0 +1,12 @@
package com.sdm.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.system.dao.DataDictionaryMapper;
import com.sdm.system.model.entity.SysDataDictionary;
import com.sdm.system.service.IDataDictionaryService;
import org.springframework.stereotype.Service;
@Service
public class IDataDictionaryServiceImpl extends ServiceImpl<DataDictionaryMapper, SysDataDictionary> implements IDataDictionaryService {
}

View File

@@ -0,0 +1,12 @@
package com.sdm.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.system.dao.DictionaryClassMapper;
import com.sdm.system.model.entity.SysDictionaryClass;
import com.sdm.system.service.IDictionaryClassService;
import org.springframework.stereotype.Service;
@Service
public class IDictionaryClassServiceImpl extends ServiceImpl<DictionaryClassMapper, SysDictionaryClass> implements IDictionaryClassService {
}