diff --git a/1-sql/2026-04-08/sys_user_relation.sql b/1-sql/2026-04-08/sys_user_relation.sql new file mode 100644 index 00000000..918b6b88 --- /dev/null +++ b/1-sql/2026-04-08/sys_user_relation.sql @@ -0,0 +1,14 @@ +-- spdm_baseline.sys_user_relation definition + +CREATE TABLE `sys_user_relation` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `user_id` bigint NOT NULL COMMENT '主动方用户ID', + `related_user_id` bigint NOT NULL COMMENT '被动方用户ID', + `relation_type` smallint NOT NULL DEFAULT '1' COMMENT '关系类型: 1-负责人与下属', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_relation` (`user_id`,`related_user_id`,`relation_type`), + KEY `idx_user_id` (`user_id`), + KEY `idx_related_user_id` (`related_user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户关系表'; \ No newline at end of file diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 04fe123a..c6081ca7 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -216,6 +216,10 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { @Value("${minioMerge.wait:55}") private Long minioMergerWait; + // &forceUpdatedCache=true + @Value("#{'${kkfile.forceUpdatedCache.type:.dat}'.split(',')}") + private List forceUpdatedCacheTypes; + @Autowired private IWsPushToolFeignClient wsPushToolFeignClient; @@ -3679,7 +3683,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { String objectKey = fileMetadataInfo.getObjectKey(); String minioPresignedUrl = minioService.getMinioPresignedUrl(objectKey,fileMetadataInfo.getBucketName()); String encodeKKFileViewURL = buildUrlWithTime(minioPresignedUrl, DateUtil.now()); - KKFileViewURLFromMinioResp kkFileViewURLFromMinioResp = new KKFileViewURLFromMinioResp(minioPresignedUrl, encodeKKFileViewURL); + String encodeKKFileViewNewURL = handleForceUpdatedCacheUrl(objectKey, encodeKKFileViewURL); + + KKFileViewURLFromMinioResp kkFileViewURLFromMinioResp = new KKFileViewURLFromMinioResp(minioPresignedUrl, encodeKKFileViewNewURL); // kkFileView已经二次开发,需要拼接 &lastModified=2025-10-13%2016:12:12 // 记录预览日志 @@ -4038,12 +4044,87 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { poolInfos.add(poolInfo); } - + + // poolInfos需要再根据 simulationPoolName+simulationPoolVersion 获取版本simulationPoolVersion最新的 + if (CollectionUtils.isNotEmpty(poolInfos)) { + // 按 simulationPoolName 分组,每组保留版本号最大的记录 + Map latestPoolMap = new LinkedHashMap<>(); + for (PoolInfo poolInfo : poolInfos) { + String poolName = poolInfo.getSimulationPoolName(); + if (poolName == null || poolName.isEmpty()) { + continue; + } + + PoolInfo existingPool = latestPoolMap.get(poolName); + if (existingPool == null) { + // 首次出现该池名称,直接放入 + latestPoolMap.put(poolName, poolInfo); + } else { + // 已存在,比较版本号,保留较大的版本 + String currentVersion = poolInfo.getSimulationPoolVersion(); + String existingVersion = existingPool.getSimulationPoolVersion(); + + // 版本号非空且当前版本更大时替换 + if (currentVersion != null && compareVersion(currentVersion, existingVersion) > 0) { + latestPoolMap.put(poolName, poolInfo); + } + } + } + + // 更新为去重后的最新版本的池信息列表 + poolInfos = new ArrayList<>(latestPoolMap.values()); + } + fileMetadataInfo.setPoolInfos(poolInfos); } } } + /** + * 比较两个版本号的大小,版本号格式为 "V7.12" + * @param version1 版本号1 + * @param version2 版本号2 + * @return 正数表示version1 > version2,0表示相等,负数表示version1 < version2 + */ + private int compareVersion(String version1, String version2) { + if (version1 == null && version2 == null) { + return 0; + } + if (version1 == null) { + return -1; + } + if (version2 == null) { + return 1; + } + + try { + // 去除前缀 "V",按 "." 分割为主版本号和次版本号 + String[] v1Parts = version1.substring(1).split("\\."); + String[] v2Parts = version2.substring(1).split("\\."); + + if (v1Parts.length != 2 || v2Parts.length != 2) { + // 如果格式不符合预期,降级为字符串比较 + return version1.compareTo(version2); + } + + // 比较主版本号 + int v1Major = Integer.parseInt(v1Parts[0]); + int v2Major = Integer.parseInt(v2Parts[0]); + if (v1Major != v2Major) { + return v1Major - v2Major; + } + + // 主版本号相同,比较次版本号 + int v1Minor = Integer.parseInt(v1Parts[1]); + int v2Minor = Integer.parseInt(v2Parts[1]); + return v1Minor - v2Minor; + } catch (Exception e) { + CoreLogger.warn("compareVersion parse error, fallback to string compare: v1={}, v2={}", version1, version2); + // 解析失败时降级为字符串比较 + return version1.compareTo(version2); + } + } + @@ -5697,4 +5778,31 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } + /** + * 根据缓存类型判断是否需要拼接强制更新参数 + * @param objectKey 缓存key + * @param enUrl 原始链接 + * 需要强制更新的缓存类型列表 + * @return 处理后的链接 + */ + private String handleForceUpdatedCacheUrl(String objectKey, String enUrl) { + // 空值安全判断:列表为空 或 objectKey为空,直接返回原链接 + if (CollectionUtils.isEmpty(forceUpdatedCacheTypes) || org.apache.commons.lang3.StringUtils.isBlank(objectKey)) { + return enUrl; + } + + // 遍历判断:objectKey是否包含列表中任意一个字符串 + boolean needForceUpdate = forceUpdatedCacheTypes.stream() + .anyMatch(cacheType -> objectKey.contains(cacheType)); + + // 满足条件则拼接参数 + if (needForceUpdate) { + return enUrl + "&forceUpdatedCache=true"; + } + + // 不满足则返回原url + return enUrl; + } + + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/YA/Service/IBosimKeyResultService.java b/project/src/main/java/com/sdm/project/YA/Service/IBosimKeyResultService.java new file mode 100644 index 00000000..be3abd54 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/IBosimKeyResultService.java @@ -0,0 +1,8 @@ +package com.sdm.project.YA.Service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.project.YA.model.SimulationKeyResult; + +public interface IBosimKeyResultService extends IService { + +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/IBosimModelService.java b/project/src/main/java/com/sdm/project/YA/Service/IBosimModelService.java new file mode 100644 index 00000000..b601c085 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/IBosimModelService.java @@ -0,0 +1,8 @@ +package com.sdm.project.YA.Service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.project.YA.model.SimulationModel; + +public interface IBosimModelService extends IService { + +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/IBosimReportService.java b/project/src/main/java/com/sdm/project/YA/Service/IBosimReportService.java new file mode 100644 index 00000000..4f270a46 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/IBosimReportService.java @@ -0,0 +1,8 @@ +package com.sdm.project.YA.Service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.project.YA.model.SimulationReport; + +public interface IBosimReportService extends IService { + +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/IBosimWorkTaskService.java b/project/src/main/java/com/sdm/project/YA/Service/IBosimWorkTaskService.java new file mode 100644 index 00000000..c520ad76 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/IBosimWorkTaskService.java @@ -0,0 +1,8 @@ +package com.sdm.project.YA.Service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.project.YA.model.SimulationWorkTask; + +public interface IBosimWorkTaskService extends IService { + +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimKeyResultServiceImpl.java b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimKeyResultServiceImpl.java new file mode 100644 index 00000000..d0649a3e --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimKeyResultServiceImpl.java @@ -0,0 +1,11 @@ +package com.sdm.project.YA.Service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.project.YA.Service.IBosimKeyResultService; +import com.sdm.project.YA.mapper.BosimKeyResultMap; +import com.sdm.project.YA.model.SimulationKeyResult; +import org.springframework.stereotype.Service; + +@Service +public class IBosimKeyResultServiceImpl extends ServiceImpl implements IBosimKeyResultService { +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimModelServiceImpl.java b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimModelServiceImpl.java new file mode 100644 index 00000000..b10500cf --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimModelServiceImpl.java @@ -0,0 +1,11 @@ +package com.sdm.project.YA.Service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.project.YA.Service.IBosimModelService; +import com.sdm.project.YA.mapper.BosimModuleMap; +import com.sdm.project.YA.model.SimulationModel; +import org.springframework.stereotype.Service; + +@Service +public class IBosimModelServiceImpl extends ServiceImpl implements IBosimModelService { +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimReportServiceImpl.java b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimReportServiceImpl.java new file mode 100644 index 00000000..bdca713e --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimReportServiceImpl.java @@ -0,0 +1,11 @@ +package com.sdm.project.YA.Service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.project.YA.Service.IBosimReportService; +import com.sdm.project.YA.mapper.BosimReportMap; +import com.sdm.project.YA.model.SimulationReport; +import org.springframework.stereotype.Service; + +@Service +public class IBosimReportServiceImpl extends ServiceImpl implements IBosimReportService { +} diff --git a/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimWorkTaskServiceImpl.java b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimWorkTaskServiceImpl.java new file mode 100644 index 00000000..aca6d213 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/Service/Impl/IBosimWorkTaskServiceImpl.java @@ -0,0 +1,11 @@ +package com.sdm.project.YA.Service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.project.YA.Service.IBosimWorkTaskService; +import com.sdm.project.YA.mapper.BosimWorkTaskMap; +import com.sdm.project.YA.model.SimulationWorkTask; +import org.springframework.stereotype.Service; + +@Service +public class IBosimWorkTaskServiceImpl extends ServiceImpl implements IBosimWorkTaskService { +} diff --git a/project/src/main/java/com/sdm/project/controller/YAModelController.java b/project/src/main/java/com/sdm/project/YA/controller/YAModelController.java similarity index 74% rename from project/src/main/java/com/sdm/project/controller/YAModelController.java rename to project/src/main/java/com/sdm/project/YA/controller/YAModelController.java index 640cd0cd..619862af 100644 --- a/project/src/main/java/com/sdm/project/controller/YAModelController.java +++ b/project/src/main/java/com/sdm/project/YA/controller/YAModelController.java @@ -1,5 +1,6 @@ -package com.sdm.project.controller; +package com.sdm.project.YA.controller; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.auth0.jwt.JWT; @@ -8,11 +9,13 @@ import com.auth0.jwt.interfaces.DecodedJWT; import com.github.pagehelper.PageInfo; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; +import com.sdm.common.entity.enums.FileBizTypeEnum; +import com.sdm.common.entity.enums.FileDictTagEnum; import com.sdm.common.entity.enums.NodeTypeEnum; import com.sdm.common.entity.req.data.GetSimulationTaskFileReq; +import com.sdm.common.entity.req.data.TagReq; import com.sdm.common.entity.req.data.UploadFilesReq; -import com.sdm.common.entity.req.system.DictTagReq; import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp; @@ -20,17 +23,21 @@ import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.feign.impl.data.DataAnalysisFeignClientImpl; import com.sdm.common.feign.inter.data.IDataFeignClient; +import com.sdm.common.utils.DateUtils; import com.sdm.common.utils.HttpUtil; import com.sdm.common.utils.SystemOperate; +import com.sdm.project.YA.Service.IBosimKeyResultService; +import com.sdm.project.YA.Service.IBosimModelService; +import com.sdm.project.YA.Service.IBosimReportService; +import com.sdm.project.YA.Service.IBosimWorkTaskService; +import com.sdm.project.YA.model.SimulationModel; +import com.sdm.project.YA.req.*; +import com.sdm.project.YA.resp.*; import com.sdm.project.common.KeyResultTypeEnum; -import com.sdm.project.dao.YAMapper.BosimModuleMap; +import com.sdm.project.YA.mapper.BosimModuleMap; import com.sdm.project.model.entity.SimulationRunKeyResult; +import com.sdm.project.YA.model.SimulationWorkTask; import com.sdm.project.model.req.KeyResultReq; -import com.sdm.project.model.req.YA.*; -import com.sdm.project.model.resp.YA.BosimKeyResultInfoRsp; -import com.sdm.project.model.resp.YA.BosimSaveNodeInfoRsp; -import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp; -import com.sdm.project.model.resp.YA.KeyResultNodeInfo; import com.sdm.project.service.INodeService; import com.sdm.project.service.ITaskService; import com.sdm.project.service.ISimulationRunService; @@ -41,6 +48,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; @@ -50,9 +59,11 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.security.PrivateKey; import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; +import java.text.SimpleDateFormat; import java.util.*; +import static com.sdm.common.service.BaseService.generateUuid; + @Slf4j @RestController @RequestMapping("/dataManager/tree/node") @@ -73,6 +84,18 @@ public class YAModelController { @Resource ISimulationRunService runService; + @Autowired + IBosimWorkTaskService bosimWorkTaskService; + + @Autowired + IBosimModelService bosimModelService; + + @Autowired + IBosimKeyResultService bosimKeyResultService; + + @Autowired + IBosimReportService bosimReportService; + @Value("${YA.frontend.frontendPrivateKey}") private String frontendPrivateKey; @@ -90,6 +113,7 @@ public class YAModelController { @Autowired BosimModuleMap moduleMap; + /** * 保存仿真模型数据 * @@ -109,7 +133,7 @@ public class YAModelController { ) ) ) - public BosimSaveNodeInfoRsp saveModelNodeInfo(@RequestHeader("Authorization") String authorization,SaveModelNodeInfoReq req) + public BosimSaveNodeInfoRsp SaveModelNodeInfo(@RequestHeader("Authorization") String authorization,SaveModelNodeInfoReq req) { if(!verifyBackEndJwt(authorization)) { BosimSaveNodeInfoRsp rsp = new BosimSaveNodeInfoRsp(); @@ -236,7 +260,7 @@ public class YAModelController { ) ) ) - public BosimSaveNodeInfoRsp saveKeyResultNodeInfo(@RequestHeader("Authorization") String authorization,SaveKeyResultNodeInfoReq req) + public BosimSaveNodeInfoRsp saveKeyResultNodeInfo(@RequestHeader("Authorization") String authorization, SaveKeyResultNodeInfoReq req) { if(!verifyBackEndJwt(authorization)) { BosimSaveNodeInfoRsp rsp = new BosimSaveNodeInfoRsp(); @@ -277,7 +301,7 @@ public class YAModelController { * @return */ @PostMapping(value = "/listKeyResultNodeInfo") - public BosimKeyResultInfoRsp listKeyResultNodeInfo(@RequestHeader("Authorization") String authorization,@RequestBody SaveKeyResultNodeInfoReq req) { + public BosimKeyResultInfoRsp listKeyResultNodeInfo(@RequestHeader("Authorization") String authorization, @RequestBody SaveKeyResultNodeInfoReq req) { if(!verifyBackEndJwt(authorization)) { BosimKeyResultInfoRsp rsp = new BosimKeyResultInfoRsp(); rsp.setCode("-200"); @@ -323,7 +347,7 @@ public class YAModelController { } @PostMapping("") - public BosimSaveNodeInfoRsp deleteModelNodeInfo(@RequestHeader("Authorization") String authorization,DeleteModelNodeInfoReq req) + public BosimSaveNodeInfoRsp deleteModelNodeInfo(@RequestHeader("Authorization") String authorization, DeleteModelNodeInfoReq req) { return null; } @@ -411,12 +435,6 @@ public class YAModelController { } - @PostMapping("saveTaskNodeInfo") - public BosimSaveProjectTaskRsp saveTaskNodeInfo(@RequestBody @Validated SaveTaskNodeInfoReq req) - { - return null; - } - @PostMapping("syncCidProject") public BosimSaveProjectTaskRsp syncCidProject(@RequestHeader("Authorization") String authorization,@RequestBody @Validated SyncCidProjectReq req) { @@ -431,7 +449,7 @@ public class YAModelController { } @PostMapping("syncCidTask") - public BosimSaveProjectTaskRsp syncCidTask(@RequestHeader("Authorization") String authorization,@RequestBody @Validated SyncCidTaskReq req) + public BosimSaveProjectTaskRsp syncCidTask(@RequestHeader("Authorization") String authorization, @RequestBody @Validated SyncCidTaskReq req) { BosimSaveProjectTaskRsp rsp = new BosimSaveProjectTaskRsp(); if(!verifyBackEndJwt(authorization)) { @@ -444,12 +462,110 @@ public class YAModelController { } - @PostMapping("SaveTaskNodeInfo") - public void saveTaskNodeInfo(@RequestHeader("Authorization") String authorization,@RequestBody SaveTaskNodeInfoReq req) + @PostMapping("saveTaskNodeInfo") + public BosimResponse saveTaskNodeInfo(@RequestHeader("Authorization") String authorization,@RequestBody SaveTaskNodeInfoReq req) { + SimulationWorkTask simulationWorkTask = new SimulationWorkTask(); + simulationWorkTask.setID(generateUuid()); + simulationWorkTask.setNumber(req.getScenario()); + simulationWorkTask.setName(req.getName()); + simulationWorkTask.setProject(req.getProject()); + simulationWorkTask.setScenario(req.getScenario()); + simulationWorkTask.setDescription(req.getDescription()); + if (StringUtils.isNotBlank(req.getStartEndDate())) { + simulationWorkTask.setStartAt(DateUtils.parse(req.getStartEndDate().split(",")[0], DateUtils.PATTERN_DATE)); + simulationWorkTask.setEndAt(DateUtils.parse(req.getStartEndDate().split(",")[1], DateUtils.PATTERN_DATE)); + } + simulationWorkTask.setEdition(generateSimpleUuid()); + simulationWorkTask.setLevelType("Edit"); + simulationWorkTask.setStatusType("Start"); + simulationWorkTask.setVersion(simulationWorkTask.getNumber()); + simulationWorkTask.setOwner(req.getFirstOwner()); + simulationWorkTask.setCreator(req.getFirstOwner()); + simulationWorkTask.setModifier(req.getFirstOwner()); + simulationWorkTask.setCreateTime(new Date()); + simulationWorkTask.setLastUpdateTime(new Date()); + + bosimWorkTaskService.save(simulationWorkTask); + + // taskId + WorkRequestData data = new WorkRequestData(); + data.setWorkRequest(List.of(simulationWorkTask.getNumber())); + return BosimResponse.success(data); } + @PostMapping(value = "/saveModelNodeInfo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation( + summary = "上传模型", + description = "仿真模型归档,支持同时上传文件和附加参数", + requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody( + description = "模型文件上传请求", + required = true, + content = @Content( + mediaType = MediaType.MULTIPART_FORM_DATA_VALUE, + schema = @Schema(implementation = SaveModelNodeInfoReq.class) + ) + ) + ) + public BosimResponse saveModelNodeInfo(@RequestHeader("Authorization") String authorization, SaveModelNodeInfoReq req) + { + adaptContext(); + UploadFilesReq fileReq = new UploadFilesReq(); + fileReq.setFileName(req.getFileName()); + fileReq.setProjectId(req.getProject()); + fileReq.setFile(req.getFile()); + fileReq.setUuid(req.getWorkTask()); + fileReq.setIsConverSameNameFile(true); + + fileReq.setFileTypeDictValue(String.valueOf(FileBizTypeEnum.MODEL_FILE.getValue())); + fileReq.setFileTypeDictClass(FileDictTagEnum.FILE_TYPE.getDictClass()); + fileReq.setDictTags(Arrays.asList(FileDictTagEnum.FILE_TYPE.getDictClassFieldName(), FileDictTagEnum.FILE_TYPE.getDictValueFieldName())); + + TagReq tagReq = new TagReq(); + tagReq.setTag1(req.getProject()); + tagReq.setTaskId(req.getWorkTask()); + fileReq.setTagReq(tagReq); + + if (fileReq.getTagReq() != null) { + fileReq.setTagReqStr(JSON.toJSONString(fileReq.getTagReq())); + } + SdmResponse uploadRespond = dataFeignClient.uploadFiles(fileReq); + if (!uploadRespond.isSuccess()) { + return BosimResponse.failed(uploadRespond.getMessage()); + } + + SimulationModel simulationModel = new SimulationModel(); + simulationModel.setID(generateUuid()); + simulationModel.setNumber(generateSimpleUuid()); + simulationModel.setName(req.getName()); + simulationModel.setProject(req.getProject()); + simulationModel.setScenario(req.getWorkTask()); + simulationModel.setWorkTask(req.getWorkTask()); + simulationModel.setDescription(req.getDescription()); + simulationModel.setFormatType(req.getFormatType()); + simulationModel.setFile(String.valueOf(uploadRespond.getData())); + + simulationModel.setEdition(generateSimpleUuid()); + simulationModel.setModelDefinition(generateSimpleUuid()); + simulationModel.setAnalysisType("CaseScenario"); + simulationModel.setLevelType("Edit"); + simulationModel.setStatusType("Start"); + simulationModel.setVersion(simulationModel.getNumber()); + simulationModel.setOwner(req.getFirstOwner()); + simulationModel.setCreator(req.getFirstOwner()); + simulationModel.setModifier(req.getFirstOwner()); + simulationModel.setCreateTime(new Date()); + simulationModel.setLastUpdateTime(new Date()); + bosimModelService.save(simulationModel); + + ModelData data = new ModelData(); + data.setModel(List.of(simulationModel.getNumber())); + return BosimResponse.success(data); + } + + + /** * 与CID集成前端token验证 * @param tokenObj @@ -570,4 +686,22 @@ public class YAModelController { return true; } + public static String generateSimpleUuid() { + // 1. 时间部分:yyyyMMddHHmmss + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String time = sdf.format(new Date()); + + // 2. 6位随机字母数字 + String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6; i++) { + int index = random.nextInt(chars.length()); + sb.append(chars.charAt(index)); + } + + // 3. 拼接最终结果 + return "SDM-" + time + sb; + } + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimKeyResultMap.java b/project/src/main/java/com/sdm/project/YA/mapper/BosimKeyResultMap.java similarity index 58% rename from project/src/main/java/com/sdm/project/dao/YAMapper/BosimKeyResultMap.java rename to project/src/main/java/com/sdm/project/YA/mapper/BosimKeyResultMap.java index ce931c18..30b70764 100644 --- a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimKeyResultMap.java +++ b/project/src/main/java/com/sdm/project/YA/mapper/BosimKeyResultMap.java @@ -1,7 +1,7 @@ -package com.sdm.project.dao.YAMapper; +package com.sdm.project.YA.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sdm.project.model.entity.YA.SimulationKeyResult; +import com.sdm.project.YA.model.SimulationKeyResult; public interface BosimKeyResultMap extends BaseMapper { } diff --git a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimModuleMap.java b/project/src/main/java/com/sdm/project/YA/mapper/BosimModuleMap.java similarity index 66% rename from project/src/main/java/com/sdm/project/dao/YAMapper/BosimModuleMap.java rename to project/src/main/java/com/sdm/project/YA/mapper/BosimModuleMap.java index 0f76fbeb..49a46003 100644 --- a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimModuleMap.java +++ b/project/src/main/java/com/sdm/project/YA/mapper/BosimModuleMap.java @@ -1,7 +1,7 @@ -package com.sdm.project.dao.YAMapper; +package com.sdm.project.YA.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sdm.project.model.entity.YA.SimulationModel; +import com.sdm.project.YA.model.SimulationModel; import org.apache.ibatis.annotations.Mapper; diff --git a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimReportMap.java b/project/src/main/java/com/sdm/project/YA/mapper/BosimReportMap.java similarity index 57% rename from project/src/main/java/com/sdm/project/dao/YAMapper/BosimReportMap.java rename to project/src/main/java/com/sdm/project/YA/mapper/BosimReportMap.java index 63dfbdfa..01046779 100644 --- a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimReportMap.java +++ b/project/src/main/java/com/sdm/project/YA/mapper/BosimReportMap.java @@ -1,7 +1,7 @@ -package com.sdm.project.dao.YAMapper; +package com.sdm.project.YA.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sdm.project.model.entity.YA.SimulationReport; +import com.sdm.project.YA.model.SimulationReport; public interface BosimReportMap extends BaseMapper { } diff --git a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimWorkTaskMap.java b/project/src/main/java/com/sdm/project/YA/mapper/BosimWorkTaskMap.java similarity index 63% rename from project/src/main/java/com/sdm/project/dao/YAMapper/BosimWorkTaskMap.java rename to project/src/main/java/com/sdm/project/YA/mapper/BosimWorkTaskMap.java index a301f5c4..16402206 100644 --- a/project/src/main/java/com/sdm/project/dao/YAMapper/BosimWorkTaskMap.java +++ b/project/src/main/java/com/sdm/project/YA/mapper/BosimWorkTaskMap.java @@ -1,9 +1,8 @@ -package com.sdm.project.dao.YAMapper; +package com.sdm.project.YA.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sdm.project.model.entity.YA.SimulationWorkTask; +import com.sdm.project.YA.model.SimulationWorkTask; import org.apache.ibatis.annotations.Mapper; -@Mapper public interface BosimWorkTaskMap extends BaseMapper { } diff --git a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationKeyResult.java b/project/src/main/java/com/sdm/project/YA/model/SimulationKeyResult.java similarity index 97% rename from project/src/main/java/com/sdm/project/model/entity/YA/SimulationKeyResult.java rename to project/src/main/java/com/sdm/project/YA/model/SimulationKeyResult.java index 5f087d54..5067d400 100644 --- a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationKeyResult.java +++ b/project/src/main/java/com/sdm/project/YA/model/SimulationKeyResult.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.entity.YA; +package com.sdm.project.YA.model; import com.baomidou.mybatisplus.annotation.TableField; @@ -7,7 +7,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; -@TableName("SimulationKeyResult") +@TableName("SimulationKeyResultYA") @Data public class SimulationKeyResult implements Serializable { diff --git a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationModel.java b/project/src/main/java/com/sdm/project/YA/model/SimulationModel.java similarity index 92% rename from project/src/main/java/com/sdm/project/model/entity/YA/SimulationModel.java rename to project/src/main/java/com/sdm/project/YA/model/SimulationModel.java index a00dbf37..02f2c242 100644 --- a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationModel.java +++ b/project/src/main/java/com/sdm/project/YA/model/SimulationModel.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.entity.YA; +package com.sdm.project.YA.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -7,7 +7,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; -@TableName("SimulationModel") +@TableName("SimulationModelYA") @Data public class SimulationModel implements Serializable { @@ -89,25 +89,25 @@ public class SimulationModel implements Serializable { * 分析类型 */ @TableField("AnalysisType") - private Byte AnalysisType; + private String AnalysisType; /** * 格式类型 */ @TableField("FormatType") - private Byte FormatType; + private String FormatType; /** * 安全等级 */ @TableField("LevelType") - private Byte LevelType; + private String LevelType; /** * 可用状态 */ @TableField("StatusType") - private Byte StatusType; + private String StatusType; /** * 修订版本 diff --git a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationReport.java b/project/src/main/java/com/sdm/project/YA/model/SimulationReport.java similarity index 95% rename from project/src/main/java/com/sdm/project/model/entity/YA/SimulationReport.java rename to project/src/main/java/com/sdm/project/YA/model/SimulationReport.java index c008604f..b5711a6b 100644 --- a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationReport.java +++ b/project/src/main/java/com/sdm/project/YA/model/SimulationReport.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.entity.YA; +package com.sdm.project.YA.model; import com.baomidou.mybatisplus.annotation.TableField; @@ -7,7 +7,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; -@TableName("SimulationReport") +@TableName("SimulationReportYA") @Data public class SimulationReport implements Serializable { diff --git a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationWorkTask.java b/project/src/main/java/com/sdm/project/YA/model/SimulationWorkTask.java similarity index 85% rename from project/src/main/java/com/sdm/project/model/entity/YA/SimulationWorkTask.java rename to project/src/main/java/com/sdm/project/YA/model/SimulationWorkTask.java index b6bac98d..6d7882be 100644 --- a/project/src/main/java/com/sdm/project/model/entity/YA/SimulationWorkTask.java +++ b/project/src/main/java/com/sdm/project/YA/model/SimulationWorkTask.java @@ -1,13 +1,20 @@ -package com.sdm.project.model.entity.YA; +package com.sdm.project.YA.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; -@TableName("SimulationWorkTask") + @Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("SimulationWorkTaskYA") +@Schema(description="仿真活动任务表") public class SimulationWorkTask implements Serializable { private static final long serialVersionUID = 1L; @@ -54,12 +61,6 @@ public class SimulationWorkTask implements Serializable { @TableField("Parent") private String Parent; - /** - * 关联仿真流程实例 - */ - @TableField("WorkProcess") - private String WorkProcess; - /** * 关联分析项 */ @@ -94,13 +95,13 @@ public class SimulationWorkTask implements Serializable { * 数据访问控制级别 */ @TableField("LevelType") - private Byte LevelType; + private String LevelType; /** * 可用状态 */ @TableField("StatusType") - private Byte StatusType; + private String StatusType; /** * 修订版本 diff --git a/project/src/main/java/com/sdm/project/model/req/YA/DeleteModelNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/DeleteModelNodeInfoReq.java similarity index 91% rename from project/src/main/java/com/sdm/project/model/req/YA/DeleteModelNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/DeleteModelNodeInfoReq.java index 5045a67e..b22a9f95 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/DeleteModelNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/DeleteModelNodeInfoReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/GetModelNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/GetModelNodeInfoReq.java similarity index 89% rename from project/src/main/java/com/sdm/project/model/req/YA/GetModelNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/GetModelNodeInfoReq.java index dea327c8..e0599bfc 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/GetModelNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/GetModelNodeInfoReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/GetTaskSimulatinFileReq.java b/project/src/main/java/com/sdm/project/YA/req/GetTaskSimulatinFileReq.java similarity index 93% rename from project/src/main/java/com/sdm/project/model/req/YA/GetTaskSimulatinFileReq.java rename to project/src/main/java/com/sdm/project/YA/req/GetTaskSimulatinFileReq.java index 36a6a131..91dd9601 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/GetTaskSimulatinFileReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/GetTaskSimulatinFileReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/ProjectTaskInfo.java b/project/src/main/java/com/sdm/project/YA/req/ProjectTaskInfo.java similarity index 86% rename from project/src/main/java/com/sdm/project/model/req/YA/ProjectTaskInfo.java rename to project/src/main/java/com/sdm/project/YA/req/ProjectTaskInfo.java index 92792b28..ff406ac0 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/ProjectTaskInfo.java +++ b/project/src/main/java/com/sdm/project/YA/req/ProjectTaskInfo.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SaveKeyResultNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/SaveKeyResultNodeInfoReq.java similarity index 97% rename from project/src/main/java/com/sdm/project/model/req/YA/SaveKeyResultNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/SaveKeyResultNodeInfoReq.java index 163e6626..5b8e5b54 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SaveKeyResultNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SaveKeyResultNodeInfoReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SaveModelNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/SaveModelNodeInfoReq.java similarity index 79% rename from project/src/main/java/com/sdm/project/model/req/YA/SaveModelNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/SaveModelNodeInfoReq.java index fe885620..a0c97291 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SaveModelNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SaveModelNodeInfoReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.v3.oas.annotations.media.Schema; @@ -32,17 +32,17 @@ public class SaveModelNodeInfoReq { @Schema(description = "主负责人") private String firstOwner; - @Schema(description = "从负责人") - private List secondOwner; + @Schema(description = "仿真活动任务") + private String workTask; - @Schema(description = "起止日期") - private String startEndData; + @Schema(description = "备注描述") + private String description; @Schema(description = "学科") private String disciplineClassification; @Schema(description = "格式") - private String format; + private String formatType; @Schema(description = "分析对象") private String item; @@ -51,5 +51,7 @@ public class SaveModelNodeInfoReq { @JSONField(serialize = false) private MultipartFile file; + @Schema(description = "文件名称") + private String fileName; } diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SaveReportNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/SaveReportNodeInfoReq.java similarity index 92% rename from project/src/main/java/com/sdm/project/model/req/YA/SaveReportNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/SaveReportNodeInfoReq.java index 9f7284f4..9bda9c0f 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SaveReportNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SaveReportNodeInfoReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.v3.oas.annotations.media.Schema; @@ -16,7 +16,7 @@ public class SaveReportNodeInfoReq { private String name; @Schema(description = "描述") - private String discription; + private String description; @Schema(description = "数据类型编号") private String code; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SaveTaskNodeInfoReq.java b/project/src/main/java/com/sdm/project/YA/req/SaveTaskNodeInfoReq.java similarity index 90% rename from project/src/main/java/com/sdm/project/model/req/YA/SaveTaskNodeInfoReq.java rename to project/src/main/java/com/sdm/project/YA/req/SaveTaskNodeInfoReq.java index 2df2d46e..4b8bcdb4 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SaveTaskNodeInfoReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SaveTaskNodeInfoReq.java @@ -1,9 +1,11 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import java.util.List; +@Data public class SaveTaskNodeInfoReq { @Schema(description = "数据类型名") @@ -43,7 +45,7 @@ public class SaveTaskNodeInfoReq { public String version; @Schema(description = "上游任务") - public String sourceWorkRequest; + public List sourceWorkRequest; } diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SyncCidProjectReq.java b/project/src/main/java/com/sdm/project/YA/req/SyncCidProjectReq.java similarity index 90% rename from project/src/main/java/com/sdm/project/model/req/YA/SyncCidProjectReq.java rename to project/src/main/java/com/sdm/project/YA/req/SyncCidProjectReq.java index 5cc390d3..097d015f 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SyncCidProjectReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SyncCidProjectReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/project/src/main/java/com/sdm/project/model/req/YA/SyncCidTaskReq.java b/project/src/main/java/com/sdm/project/YA/req/SyncCidTaskReq.java similarity index 93% rename from project/src/main/java/com/sdm/project/model/req/YA/SyncCidTaskReq.java rename to project/src/main/java/com/sdm/project/YA/req/SyncCidTaskReq.java index 4ba46377..ac3e8210 100644 --- a/project/src/main/java/com/sdm/project/model/req/YA/SyncCidTaskReq.java +++ b/project/src/main/java/com/sdm/project/YA/req/SyncCidTaskReq.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.req.YA; +package com.sdm.project.YA.req; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/project/src/main/java/com/sdm/project/model/resp/YA/BosimErrorRespond.java b/project/src/main/java/com/sdm/project/YA/resp/BosimErrorRespond.java similarity index 85% rename from project/src/main/java/com/sdm/project/model/resp/YA/BosimErrorRespond.java rename to project/src/main/java/com/sdm/project/YA/resp/BosimErrorRespond.java index 39163143..b9c46787 100644 --- a/project/src/main/java/com/sdm/project/model/resp/YA/BosimErrorRespond.java +++ b/project/src/main/java/com/sdm/project/YA/resp/BosimErrorRespond.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.resp.YA; +package com.sdm.project.YA.resp; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/project/src/main/java/com/sdm/project/model/resp/YA/BosimKeyResultInfoRsp.java b/project/src/main/java/com/sdm/project/YA/resp/BosimKeyResultInfoRsp.java similarity index 85% rename from project/src/main/java/com/sdm/project/model/resp/YA/BosimKeyResultInfoRsp.java rename to project/src/main/java/com/sdm/project/YA/resp/BosimKeyResultInfoRsp.java index 2991fea3..196f9b95 100644 --- a/project/src/main/java/com/sdm/project/model/resp/YA/BosimKeyResultInfoRsp.java +++ b/project/src/main/java/com/sdm/project/YA/resp/BosimKeyResultInfoRsp.java @@ -1,10 +1,9 @@ -package com.sdm.project.model.resp.YA; +package com.sdm.project.YA.resp; import com.sdm.common.entity.resp.PageDataResp; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.ArrayList; import java.util.List; @Data diff --git a/project/src/main/java/com/sdm/project/YA/resp/BosimResponse.java b/project/src/main/java/com/sdm/project/YA/resp/BosimResponse.java new file mode 100644 index 00000000..9b3c14ab --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/resp/BosimResponse.java @@ -0,0 +1,41 @@ +package com.sdm.project.YA.resp; + +import lombok.Data; + +@Data +public class BosimResponse { + private boolean success; + private int code; + private String message; + private T data; + + public BosimResponse() {} + + public static BosimResponse success(T data) { + BosimResponse res = new BosimResponse<>(); + res.setSuccess(true); + res.setCode(200); + res.setMessage("操作成功"); + res.setData(data); + return res; + } + + public static BosimResponse failed(T data) { + BosimResponse res = new BosimResponse<>(); + res.setSuccess(false); + res.setCode(-200); + res.setMessage("操作失败"); + res.setData(data); + return res; + } + + // getter setter + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public int getCode() { return code; } + public void setCode(int code) { this.code = code; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + public T getData() { return data; } + public void setData(T data) { this.data = data; } +} diff --git a/project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveNodeInfoRsp.java b/project/src/main/java/com/sdm/project/YA/resp/BosimSaveNodeInfoRsp.java similarity index 90% rename from project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveNodeInfoRsp.java rename to project/src/main/java/com/sdm/project/YA/resp/BosimSaveNodeInfoRsp.java index ceb54bd7..732d406f 100644 --- a/project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveNodeInfoRsp.java +++ b/project/src/main/java/com/sdm/project/YA/resp/BosimSaveNodeInfoRsp.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.resp.YA; +package com.sdm.project.YA.resp; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveProjectTaskRsp.java b/project/src/main/java/com/sdm/project/YA/resp/BosimSaveProjectTaskRsp.java similarity index 74% rename from project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveProjectTaskRsp.java rename to project/src/main/java/com/sdm/project/YA/resp/BosimSaveProjectTaskRsp.java index 598c84a3..f1c19c79 100644 --- a/project/src/main/java/com/sdm/project/model/resp/YA/BosimSaveProjectTaskRsp.java +++ b/project/src/main/java/com/sdm/project/YA/resp/BosimSaveProjectTaskRsp.java @@ -1,11 +1,8 @@ -package com.sdm.project.model.resp.YA; +package com.sdm.project.YA.resp; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.ArrayList; -import java.util.List; - @Data public class BosimSaveProjectTaskRsp { diff --git a/project/src/main/java/com/sdm/project/YA/resp/KeyResultData.java b/project/src/main/java/com/sdm/project/YA/resp/KeyResultData.java new file mode 100644 index 00000000..54700b9a --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/resp/KeyResultData.java @@ -0,0 +1,9 @@ +package com.sdm.project.YA.resp; + +import java.util.List; + +public class KeyResultData { + private List keyResult; + public List getKeyResult() { return keyResult; } + public void setKeyResult(List keyResult) { this.keyResult = keyResult; } +} diff --git a/project/src/main/java/com/sdm/project/model/resp/YA/KeyResultNodeInfo.java b/project/src/main/java/com/sdm/project/YA/resp/KeyResultNodeInfo.java similarity index 91% rename from project/src/main/java/com/sdm/project/model/resp/YA/KeyResultNodeInfo.java rename to project/src/main/java/com/sdm/project/YA/resp/KeyResultNodeInfo.java index 2d583604..8d413647 100644 --- a/project/src/main/java/com/sdm/project/model/resp/YA/KeyResultNodeInfo.java +++ b/project/src/main/java/com/sdm/project/YA/resp/KeyResultNodeInfo.java @@ -1,9 +1,7 @@ -package com.sdm.project.model.resp.YA; +package com.sdm.project.YA.resp; -import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.springframework.web.multipart.MultipartFile; @Data @Schema(description = "仿真关键结果上传参数") diff --git a/project/src/main/java/com/sdm/project/YA/resp/ModelData.java b/project/src/main/java/com/sdm/project/YA/resp/ModelData.java new file mode 100644 index 00000000..f4de0e1f --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/resp/ModelData.java @@ -0,0 +1,9 @@ +package com.sdm.project.YA.resp; + +import java.util.List; + +public class ModelData { + private List model; + public List getModel() { return model; } + public void setModel(List model) { this.model = model; } +} diff --git a/project/src/main/java/com/sdm/project/YA/resp/ReportData.java b/project/src/main/java/com/sdm/project/YA/resp/ReportData.java new file mode 100644 index 00000000..d74fba09 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/resp/ReportData.java @@ -0,0 +1,9 @@ +package com.sdm.project.YA.resp; + +import java.util.List; + +public class ReportData { + private List report; + public List getReport() { return report; } + public void setReport(List report) { this.report = report; } +} diff --git a/project/src/main/java/com/sdm/project/YA/resp/WorkRequestData.java b/project/src/main/java/com/sdm/project/YA/resp/WorkRequestData.java new file mode 100644 index 00000000..486bcb77 --- /dev/null +++ b/project/src/main/java/com/sdm/project/YA/resp/WorkRequestData.java @@ -0,0 +1,9 @@ +package com.sdm.project.YA.resp; + +import java.util.List; + +public class WorkRequestData { + private List workRequest; + public List getWorkRequest() { return workRequest; } + public void setWorkRequest(List workRequest) { this.workRequest = workRequest; } +} diff --git a/project/src/main/java/com/sdm/project/config/mybatis/MybatisPlusConfig.java b/project/src/main/java/com/sdm/project/config/mybatis/MybatisPlusConfig.java index 18490cec..505cef95 100644 --- a/project/src/main/java/com/sdm/project/config/mybatis/MybatisPlusConfig.java +++ b/project/src/main/java/com/sdm/project/config/mybatis/MybatisPlusConfig.java @@ -23,7 +23,7 @@ import java.util.Map; * @Note */ @Configuration -@MapperScan(basePackages = "com.sdm.project.dao", sqlSessionFactoryRef = "mybatisSqlSessionFactoryAdaptor") +@MapperScan(basePackages = {"com.sdm.project.dao", "com.sdm.project.YA.mapper"}, sqlSessionFactoryRef = "mybatisSqlSessionFactoryAdaptor") public class MybatisPlusConfig { diff --git a/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java b/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java index cd6c31fe..b7b9e3ba 100644 --- a/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java +++ b/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java @@ -23,4 +23,10 @@ public class GetAllUserTaskCompleteStatisticsReq { @Schema(description = "标签2") private List tag2List; + @Schema(description = "创建时间") + private List createTimeArr; + + @Schema(description = "完成时间") + private List finishTimeArr; + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java index 05358692..5b4e2e98 100644 --- a/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java +++ b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java @@ -58,4 +58,10 @@ public class GetUserGroupTaskCompleteStatisticsReq { @Schema(description = "查询学科信息") private String discipline; + + @Schema(description = "创建时间") + List createTimeArr; + + @Schema(description = "完成时间") + List finishTimeArr; } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/model/req/GetWorkstationApproveStatusReq.java b/project/src/main/java/com/sdm/project/model/req/GetWorkstationApproveStatusReq.java index 7c2dccf1..653499f4 100644 --- a/project/src/main/java/com/sdm/project/model/req/GetWorkstationApproveStatusReq.java +++ b/project/src/main/java/com/sdm/project/model/req/GetWorkstationApproveStatusReq.java @@ -44,4 +44,10 @@ public class GetWorkstationApproveStatusReq { @Schema(description = "查询学科信息") private String discipline; + + @Schema(description = "创建时间") + private String[] createTimeArr; + + @Schema(description = "完成时间") + private String[] finishTimeArr; } diff --git a/project/src/main/java/com/sdm/project/model/req/KeyResultReq.java b/project/src/main/java/com/sdm/project/model/req/KeyResultReq.java index 07321c8c..3f13e2d0 100644 --- a/project/src/main/java/com/sdm/project/model/req/KeyResultReq.java +++ b/project/src/main/java/com/sdm/project/model/req/KeyResultReq.java @@ -75,6 +75,8 @@ public class KeyResultReq extends BaseReq { @Schema(description = "是否需要覆盖同名文件") private Boolean isConverSameNameFile; + @Schema(description = "是否需要跳过同名文件") + private Boolean isSkipSameNameFile = false; // ---------------------------------------------------------------- // 很重要,用于设置标签,通过autoFillDictTags切面 ,设置dictTagIdsCache diff --git a/project/src/main/java/com/sdm/project/service/INodeService.java b/project/src/main/java/com/sdm/project/service/INodeService.java index e6dece7d..7ac928b7 100644 --- a/project/src/main/java/com/sdm/project/service/INodeService.java +++ b/project/src/main/java/com/sdm/project/service/INodeService.java @@ -10,8 +10,8 @@ import com.sdm.common.entity.resp.project.SimulationRunResp; import com.sdm.project.model.entity.SimulationNode; import com.sdm.project.model.po.ProjectNodePo; import com.sdm.project.model.req.*; -import com.sdm.project.model.req.YA.SyncCidProjectReq; -import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp; +import com.sdm.project.YA.req.SyncCidProjectReq; +import com.sdm.project.YA.resp.BosimSaveProjectTaskRsp; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; diff --git a/project/src/main/java/com/sdm/project/service/ITaskService.java b/project/src/main/java/com/sdm/project/service/ITaskService.java index 9c2301c5..b8c08037 100644 --- a/project/src/main/java/com/sdm/project/service/ITaskService.java +++ b/project/src/main/java/com/sdm/project/service/ITaskService.java @@ -5,16 +5,14 @@ import com.sdm.common.common.SdmResponse; import com.sdm.common.entity.req.export.PerformanceAnalysisExportExcelFormat; import com.sdm.common.entity.req.export.RunAnalysisExportExcelFormat; import com.sdm.common.entity.req.export.TaskAnalysisExportExcelFormat; -import com.sdm.common.entity.req.performance.PerformanceExportExcelFormat; import com.sdm.common.entity.req.project.GetAllTasksByDisciplineReq; import com.sdm.common.entity.req.project.GetTaskDetailReq; import com.sdm.common.entity.req.task.TaskExportExcelFormat; -import com.sdm.common.entity.req.task.TaskTreeExportExcelFormat; import com.sdm.project.model.bo.ModifyTaskNode; import com.sdm.project.model.req.*; -import com.sdm.project.model.req.YA.SyncCidTaskReq; +import com.sdm.project.YA.req.SyncCidTaskReq; import com.sdm.project.model.resp.*; -import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp; +import com.sdm.project.YA.resp.BosimSaveProjectTaskRsp; import com.sdm.common.entity.resp.project.SpdmTaskVo; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; diff --git a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java index 31fc8671..10e64d0c 100644 --- a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java @@ -20,7 +20,6 @@ import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.project.*; import com.sdm.common.entity.req.system.QueryGroupDetailReq; import com.sdm.common.entity.req.system.SendMsgReq; -import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp; import com.sdm.common.entity.resp.PageDataResp; @@ -55,12 +54,11 @@ import com.sdm.project.model.bo.TaskExtraNode; import com.sdm.project.model.bo.TaskNode; import com.sdm.project.model.bo.TaskNodeTag; import com.sdm.project.model.entity.*; -import com.sdm.project.model.po.NodeAllBase; import com.sdm.project.model.po.PerformanceNodePo; import com.sdm.project.model.po.ProjectNodePo; import com.sdm.project.model.req.*; -import com.sdm.project.model.req.YA.SyncCidProjectReq; -import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp; +import com.sdm.project.YA.req.SyncCidProjectReq; +import com.sdm.project.YA.resp.BosimSaveProjectTaskRsp; import com.sdm.project.model.vo.*; import com.sdm.project.service.*; import jakarta.servlet.http.HttpServletResponse; @@ -3120,6 +3118,18 @@ public class NodeServiceImpl extends ServiceImpl simulationTasks = query.list(); // 按学科 (discipline) 分组统计任务完成状态 diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 14b12b29..ee35689f 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -1178,7 +1178,7 @@ public class SimulationRunServiceImpl extends ServiceImpl and task.tag10 = #{req.tag10} + + + and task.create_time >= #{req.createTimeArr[0]} + and task.create_time <= #{req.createTimeArr[1]} + + + + and task.finish_time >= #{req.finishTimeArr[0]} + and task.finish_time <= #{req.finishTimeArr[1]} + + @@ -566,6 +577,16 @@ ) + + + and task.create_time >= #{req.createTimeArr[0]} + and task.create_time <= #{req.createTimeArr[1]} + + + + and task.finish_time >= #{req.finishTimeArr[0]} + and task.finish_time <= #{req.finishTimeArr[1]} + @@ -704,6 +725,16 @@ and task.tag10 = #{req.tag10} + + + and task.create_time >= #{req.createTimeArr[0]} + and task.create_time <= #{req.createTimeArr[1]} + + + + and task.finish_time >= #{req.finishTimeArr[0]} + and task.finish_time <= #{req.finishTimeArr[1]} + @@ -854,6 +885,16 @@ and task.tag10 = #{req.tag10} + + + and task.create_time >= #{req.createTimeArr[0]} + and task.create_time <= #{req.createTimeArr[1]} + + + + and task.finish_time >= #{req.finishTimeArr[0]} + and task.finish_time <= #{req.finishTimeArr[1]} + diff --git a/system/src/main/java/com/sdm/system/controller/SysUserController.java b/system/src/main/java/com/sdm/system/controller/SysUserController.java index c2770dd3..a60e2ace 100644 --- a/system/src/main/java/com/sdm/system/controller/SysUserController.java +++ b/system/src/main/java/com/sdm/system/controller/SysUserController.java @@ -11,6 +11,7 @@ import com.sdm.common.feign.inter.system.ISysUserFeignClient; import com.sdm.common.service.UserNameCacheService; import com.sdm.system.model.req.user.*; import com.sdm.system.service.ISimulationRolePermissionService; +import com.sdm.system.service.ISysUserRelationService; import com.sdm.system.service.ISysUserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -39,6 +40,9 @@ public class SysUserController implements ISysUserFeignClient { @Autowired private UserNameCacheService userNameCacheService; + @Autowired + private ISysUserRelationService sysUserRelationService; + /** * 新增用户 * @@ -272,4 +276,18 @@ public class SysUserController implements ISysUserFeignClient { return ISysUserService.listUserDetailByIds(req); } + @Operation(summary = "保存用户关系", description = "保存用户关系,覆盖式更新(先删后增)") + @PostMapping("/saveUserRelation") + public SdmResponse saveUserRelation(@Parameter(description = "保存用户关系请求参数") @RequestBody @Validated SaveUserRelationReq req) { + return sysUserRelationService.saveUserRelation(req); + } + + @Operation(summary = "查询关联用户ID列表", description = "查询当前用户的关联用户列表,若无关联则返回自身ID") + @GetMapping("/queryRelatedUserIds") + public SdmResponse> queryRelatedUserIds( + @Parameter(description = "用户ID") @RequestParam("userId") Long userId, + @Parameter(description = "关系类型,默认1-负责人与下属") @RequestParam(value = "relationType", required = false) Integer relationType) { + return sysUserRelationService.queryRelatedUserIds(userId, relationType); + } + } \ No newline at end of file diff --git a/system/src/main/java/com/sdm/system/dao/SysUserRelationMapper.java b/system/src/main/java/com/sdm/system/dao/SysUserRelationMapper.java new file mode 100644 index 00000000..fafc4a74 --- /dev/null +++ b/system/src/main/java/com/sdm/system/dao/SysUserRelationMapper.java @@ -0,0 +1,8 @@ +package com.sdm.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sdm.system.model.entity.SysUserRelation; + +public interface SysUserRelationMapper extends BaseMapper { + +} diff --git a/system/src/main/java/com/sdm/system/model/entity/SysUserRelation.java b/system/src/main/java/com/sdm/system/model/entity/SysUserRelation.java new file mode 100644 index 00000000..055a6df2 --- /dev/null +++ b/system/src/main/java/com/sdm/system/model/entity/SysUserRelation.java @@ -0,0 +1,47 @@ +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 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("sys_user_relation") +@Schema(description = "用户关系表") +public class SysUserRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Schema(description = "主动方用户ID") + @TableField("user_id") + private Long userId; + + @Schema(description = "被动方用户ID") + @TableField("related_user_id") + private Long relatedUserId; + + @Schema(description = "关系类型: 1-负责人与下属") + @TableField("relation_type") + private Integer relationType; + + @Schema(description = "租户ID") + @TableField("tenant_id") + private Long tenantId; + + @Schema(description = "创建时间") + @TableField("create_time") + private LocalDateTime createTime; +} diff --git a/system/src/main/java/com/sdm/system/model/enums/UserRelationTypeEnum.java b/system/src/main/java/com/sdm/system/model/enums/UserRelationTypeEnum.java new file mode 100644 index 00000000..3ba76509 --- /dev/null +++ b/system/src/main/java/com/sdm/system/model/enums/UserRelationTypeEnum.java @@ -0,0 +1,14 @@ +package com.sdm.system.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UserRelationTypeEnum { + + SUPERVISOR_SUBORDINATE(1, "负责人与下属"); + + private final int code; + private final String desc; +} diff --git a/system/src/main/java/com/sdm/system/model/req/user/SaveUserRelationReq.java b/system/src/main/java/com/sdm/system/model/req/user/SaveUserRelationReq.java new file mode 100644 index 00000000..a743f253 --- /dev/null +++ b/system/src/main/java/com/sdm/system/model/req/user/SaveUserRelationReq.java @@ -0,0 +1,24 @@ +package com.sdm.system.model.req.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Schema(description = "保存用户关系请求参数") +@Data +public class SaveUserRelationReq { + + @Schema(description = "主动方用户ID(负责人)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "userId不能为空") + private Long userId; + + @Schema(description = "被动方用户ID列表(下属)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "relatedUserIds不能为空") + private List relatedUserIds; + + @Schema(description = "关系类型,默认1-负责人与下属") + private Integer relationType = 1; +} diff --git a/system/src/main/java/com/sdm/system/service/ISysUserRelationService.java b/system/src/main/java/com/sdm/system/service/ISysUserRelationService.java new file mode 100644 index 00000000..d3e818c9 --- /dev/null +++ b/system/src/main/java/com/sdm/system/service/ISysUserRelationService.java @@ -0,0 +1,15 @@ +package com.sdm.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.common.common.SdmResponse; +import com.sdm.system.model.entity.SysUserRelation; +import com.sdm.system.model.req.user.SaveUserRelationReq; + +import java.util.List; + +public interface ISysUserRelationService extends IService { + + SdmResponse saveUserRelation(SaveUserRelationReq req); + + SdmResponse> queryRelatedUserIds(Long userId, Integer relationType); +} diff --git a/system/src/main/java/com/sdm/system/service/impl/SysUserRelationServiceImpl.java b/system/src/main/java/com/sdm/system/service/impl/SysUserRelationServiceImpl.java new file mode 100644 index 00000000..3a88bc46 --- /dev/null +++ b/system/src/main/java/com/sdm/system/service/impl/SysUserRelationServiceImpl.java @@ -0,0 +1,75 @@ +package com.sdm.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.common.common.SdmResponse; +import com.sdm.common.common.ThreadLocalContext; +import com.sdm.system.dao.SysUserRelationMapper; +import com.sdm.system.model.entity.SysUserRelation; +import com.sdm.system.model.enums.UserRelationTypeEnum; +import com.sdm.system.model.req.user.SaveUserRelationReq; +import com.sdm.system.service.ISysUserRelationService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class SysUserRelationServiceImpl extends ServiceImpl implements ISysUserRelationService { + + @Override + @Transactional(rollbackFor = Exception.class) + public SdmResponse saveUserRelation(SaveUserRelationReq req) { + Long tenantId = ThreadLocalContext.getTenantId(); + Long userId = req.getUserId(); + Integer relationType = req.getRelationType(); + + // 先删除该用户该类型的所有旧关系 + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(SysUserRelation::getUserId, userId) + .eq(SysUserRelation::getRelationType, relationType); + remove(deleteWrapper); + + // 批量插入新关系 + List relations = req.getRelatedUserIds().stream().map(relatedUserId -> { + SysUserRelation relation = new SysUserRelation(); + relation.setUserId(userId); + relation.setRelatedUserId(relatedUserId); + relation.setRelationType(relationType); + relation.setTenantId(tenantId); + relation.setCreateTime(LocalDateTime.now()); + return relation; + }).collect(Collectors.toList()); + + saveBatch(relations); + return SdmResponse.success(); + } + + @Override + public SdmResponse> queryRelatedUserIds(Long userId, Integer relationType) { + Long tenantId = ThreadLocalContext.getTenantId(); + if (relationType == null) { + relationType = UserRelationTypeEnum.SUPERVISOR_SUBORDINATE.getCode(); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUserRelation::getUserId, userId) + .eq(SysUserRelation::getRelationType, relationType) + .eq(SysUserRelation::getTenantId, tenantId) + .select(SysUserRelation::getRelatedUserId); + + List relatedUserIds = list(queryWrapper).stream() + .map(SysUserRelation::getRelatedUserId) + .collect(Collectors.toList()); + + // 若无下属则返回自己的userId + if (relatedUserIds.isEmpty()) { + return SdmResponse.success(Collections.singletonList(userId)); + } + + return SdmResponse.success(relatedUserIds); + } +} diff --git a/system/src/main/resources/mapper/SysUserRelationMapper.xml b/system/src/main/resources/mapper/SysUserRelationMapper.xml new file mode 100644 index 00000000..bac0fe05 --- /dev/null +++ b/system/src/main/resources/mapper/SysUserRelationMapper.xml @@ -0,0 +1,5 @@ + + + + +