From c668dc0d507a260faf56c6c8134ef69d8255b9c2 Mon Sep 17 00:00:00 2001 From: liriming <1343021927@qq.com> Date: 星期五, 28 二月 2025 09:14:55 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java | 1 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java | 16 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcSettingController.java | 79 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java | 18 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java | 33 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java | 140 +- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcSettingEntity.java | 14 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcDataPageReqVO.java | 34 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java | 70 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java | 32 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java | 27 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java | 1 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java | 7 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java | 25 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java | 96 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcDataEntity.java | 12 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java | 93 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java | 23 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/HttpCollector.java | 5 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java | 9 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java | 34 iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java | 20 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java | 1 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java | 31 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java | 48 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java | 22 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcDataDao.java | 22 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/package-info.java | 1 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcSettingPageReqVO.java | 22 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java | 28 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java | 44 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java | 7 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java | 46 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java | 46 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java | 13 iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml | 5 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java | 30 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java | 34 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java | 287 ++++ iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNet1h.java | 6 iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql | 28 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java | 20 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java | 22 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetShift.java | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java | 16 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java | 405 ++++++ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java | 33 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcSettingService.java | 28 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetDay.java | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java | 73 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java | 24 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcSettingDao.java | 21 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetYear.java | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java | 113 + iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml | 120 ++ iailab-module-model/iailab-module-model-biz/db/mysql.sql | 67 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java | 16 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcDataController.java | 42 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java | 25 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java | 19 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java | 18 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java | 44 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java | 13 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java | 46 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java | 47 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java | 16 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java | 30 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java | 32 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcDataService.java | 13 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java | 18 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java | 37 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml | 14 /dev/null | 27 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/package-info.java | 1 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetMonth.java | 4 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcSettingServiceImpl.java | 70 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java | 20 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java | 192 +++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java | 32 iailab-module-model/iailab-module-model-biz/pom.xml | 7 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java | 13 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java | 60 + iailab-module-model/iailab-module-model-biz/src/main/resources/application-dev.yaml | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/asdb/HttpCollectorForAsdb.java | 194 -- 88 files changed, 3,110 insertions(+), 416 deletions(-) diff --git a/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql b/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql index e49a145..9f63ba2 100644 --- a/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql +++ b/iailab-module-data/iailab-module-data-biz/db/mysql/tenant.sql @@ -418,22 +418,26 @@ MODIFY COLUMN `data_time` datetime NULL DEFAULT NULL COMMENT '数据时间' AFTER `item_no`; CREATE TABLE `t_arc_data` ( - `id` varchar(255) NOT NULL COMMENT 'id', - `arc_id` varchar(255) DEFAULT NULL COMMENT '归档id', - `arc_time` varchar(255) DEFAULT NULL COMMENT '归档时间', - `value` varchar(255) DEFAULT NULL COMMENT '归档时间', + `id` varchar(36) NOT NULL COMMENT 'id', + `arc_id` varchar(36) DEFAULT NULL COMMENT '归档id', + `code` varchar(30) DEFAULT NULL COMMENT '编码', + `arc_time` varchar(30) DEFAULT NULL COMMENT '归档时间', + `arc_value` DECIMAL(18,6) DEFAULT NULL COMMENT '归档值', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='归档数据表'; CREATE TABLE `t_arc_setting` ( - `id` varchar(255) NOT NULL COMMENT 'id', - `name` varchar(255) DEFAULT NULL COMMENT '名称', - `type` varchar(255) DEFAULT NULL COMMENT '归档周期(shift、day、month、year)', - `point` varchar(255) DEFAULT NULL COMMENT '归档点位', - `calculate` varchar(255) DEFAULT NULL COMMENT '计算方法(none、sum、diff、avg)', - `is_enable` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '是否启用', + `id` varchar(36) NOT NULL COMMENT 'id', + `code` varchar(30) DEFAULT NULL COMMENT '编码', + `name` varchar(30) DEFAULT NULL COMMENT '名称', + `type` varchar(10) DEFAULT NULL COMMENT '归档周期(shift、day、month、year)', + `point` varchar(36) DEFAULT NULL COMMENT '归档点位', + `calculate` varchar(10) DEFAULT NULL COMMENT '计算方法(none、sum、diff、avg)', + `sort` int COMMENT '排序', + `is_enable` tinyint(1) DEFAULT 1 COMMENT '是否启用', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时归档设置表'; \ No newline at end of file + PRIMARY KEY (`id`), + UNIQUE KEY `uk_code` (`code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='定时归档设置表'; \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcDataController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcDataController.java new file mode 100644 index 0000000..6697823 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcDataController.java @@ -0,0 +1,42 @@ +package com.iailab.module.data.arc.controller.admin; + +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.module.data.arc.entity.ArcDataEntity; +import com.iailab.module.data.arc.service.ArcDataService; +import com.iailab.module.data.arc.vo.ArcDataPageReqVO; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author PanZhibao + * @Description + * @createTime 2025年02月26日 + */ +@Tag(name = "数据归档数据") +@RestController +@RequestMapping("/data/arc/data") +@Validated +public class ArcDataController { + + @Autowired + private ArcDataService arcDataService; + + @PostMapping("archiving") + public CommonResult<Boolean> archiving(@RequestBody String type) { + arcDataService.archiving(type); + return success(true); + } + + @GetMapping("page") + public CommonResult<PageResult<ArcDataEntity>> dataPage(@Valid ArcDataPageReqVO reqVO) { + PageResult<ArcDataEntity> page = arcDataService.queryPage(reqVO); + return success(page); + } +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcSettingController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcSettingController.java new file mode 100644 index 0000000..d077580 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/admin/ArcSettingController.java @@ -0,0 +1,79 @@ +package com.iailab.module.data.arc.controller.admin; + +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.module.data.arc.entity.ArcSettingEntity; +import com.iailab.module.data.arc.service.ArcSettingService; +import com.iailab.module.data.arc.vo.ArcSettingPageReqVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +@Tag(name = "数据归档设置") +@RestController +@RequestMapping("/data/arc/setting") +@Validated +public class ArcSettingController { + + @Autowired + private ArcSettingService arcSettingService; + + @GetMapping("page") + public CommonResult<PageResult<ArcSettingEntity>> page(@Valid ArcSettingPageReqVO reqVO) { + PageResult<ArcSettingEntity> page = arcSettingService.queryPage(reqVO); + return success(page); + } + + @GetMapping("/list") + @Operation(summary = "列表") + public CommonResult<List<ArcSettingEntity>> list(@Valid @RequestParam Map<String, Object> params) { + List<ArcSettingEntity> list = arcSettingService.list(params); + return success(list); + } + + @GetMapping("/info/{id}") + public CommonResult<ArcSettingEntity> info(@PathVariable("id") String id) { + ArcSettingEntity info = arcSettingService.info(id); + return success(info); + } + + @PreAuthorize("@ss.hasPermission('data:arc:create')") + @PostMapping("create") + public CommonResult<Boolean> create(@RequestBody ArcSettingEntity arcSettingEntity) { + String id = UUID.randomUUID().toString(); + arcSettingEntity.setId(id); + arcSettingService.add(arcSettingEntity); + return success(true); + } + + @PreAuthorize("@ss.hasPermission('data:arc:update')") + @PutMapping("/update") + public CommonResult<Boolean> update(@RequestBody ArcSettingEntity arcSettingEntity) { + arcSettingService.update(arcSettingEntity); + return success(true); + } + + @PreAuthorize("@ss.hasPermission('data:arc:delete')") + @DeleteMapping("/delete") + public CommonResult<Boolean> delete(String id) { + arcSettingService.delete(id); + return success(true); + } + + @PutMapping("/enable") + @Operation(summary = "启用") + public CommonResult<Boolean> enable(@RequestBody String[] ids) { + arcSettingService.enableByIds(ids); + return success(true); + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/package-info.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/package-info.java new file mode 100644 index 0000000..8a8da93 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/controller/package-info.java @@ -0,0 +1 @@ +package com.iailab.module.data.arc.controller; \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcDataDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcDataDao.java new file mode 100644 index 0000000..24c3b4c --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcDataDao.java @@ -0,0 +1,22 @@ +package com.iailab.module.data.arc.dao; + +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.mybatis.core.mapper.BaseMapperX; +import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.data.arc.entity.ArcDataEntity; +import com.iailab.module.data.arc.vo.ArcDataPageReqVO; +import org.apache.ibatis.annotations.Mapper; + +@TenantDS +@Mapper +public interface ArcDataDao extends BaseMapperX<ArcDataEntity> { + + default PageResult<ArcDataEntity> selectPage(ArcDataPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<ArcDataEntity>() + .eq(ArcDataEntity::getArcId, reqVO.getArcId()) + .ge(reqVO.getStartTime()!=null, ArcDataEntity::getCreateTime, reqVO.getStartTime()) + .le(reqVO.getEndTime()!=null, ArcDataEntity::getCreateTime, reqVO.getEndTime()) + .orderByDesc(ArcDataEntity::getCreateTime)); + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcSettingDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcSettingDao.java new file mode 100644 index 0000000..d152b99 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/dao/ArcSettingDao.java @@ -0,0 +1,21 @@ +package com.iailab.module.data.arc.dao; + +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.mybatis.core.mapper.BaseMapperX; +import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.data.arc.entity.ArcSettingEntity; +import com.iailab.module.data.arc.vo.ArcSettingPageReqVO; +import org.apache.ibatis.annotations.Mapper; + +@TenantDS +@Mapper +public interface ArcSettingDao extends BaseMapperX<ArcSettingEntity> { + + default PageResult<ArcSettingEntity> selectPage(ArcSettingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<ArcSettingEntity>() + .likeIfPresent(ArcSettingEntity::getName, reqVO.getName()) + .likeIfPresent(ArcSettingEntity::getType, reqVO.getType()) + .orderByDesc(ArcSettingEntity::getCreateTime)); + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcDataEntity.java similarity index 73% rename from iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java rename to iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcDataEntity.java index 3600a36..c93ec39 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointDataEntity.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcDataEntity.java @@ -1,4 +1,4 @@ -package com.iailab.module.data.point.entity; +package com.iailab.module.data.arc.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -6,10 +6,11 @@ import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; @Data @TableName("t_arc_data") -public class ArcPointDataEntity implements Serializable { +public class ArcDataEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -25,9 +26,14 @@ private String arcId; /** + * 编码 + */ + private String code; + + /** * 值 */ - private String value; + private BigDecimal arcValue; /** * 归档时间 diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcSettingEntity.java similarity index 77% rename from iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java rename to iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcSettingEntity.java index 02f61d7..57b08d1 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/entity/ArcSettingEntity.java @@ -1,4 +1,4 @@ -package com.iailab.module.data.point.entity; +package com.iailab.module.data.arc.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -6,10 +6,11 @@ import lombok.Data; import java.io.Serializable; +import java.util.Date; @Data @TableName("t_arc_setting") -public class ArcPointSettingEntity implements Serializable { +public class ArcSettingEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -40,6 +41,11 @@ private String calculate; /** + * 排序 + */ + private Integer sort; + + /** * 是否启用 */ private String isEnable; @@ -47,10 +53,10 @@ /** * 创建时间 */ - private String createTime; + private Date createTime; /** * 更新时间 */ - private String updateTime; + private Date updateTime; } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/package-info.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/package-info.java new file mode 100644 index 0000000..ccdd480 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/package-info.java @@ -0,0 +1 @@ +package com.iailab.module.data.arc; \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcDataService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcDataService.java new file mode 100644 index 0000000..e0eabba --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcDataService.java @@ -0,0 +1,13 @@ +package com.iailab.module.data.arc.service; + +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.data.arc.entity.ArcDataEntity; +import com.iailab.module.data.arc.vo.ArcDataPageReqVO; + +public interface ArcDataService extends BaseService<ArcDataEntity> { + //根据归档类型进行归档 + void archiving(String type); + + PageResult<ArcDataEntity> queryPage(ArcDataPageReqVO reqVO); +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcSettingService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcSettingService.java new file mode 100644 index 0000000..2b21e77 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/ArcSettingService.java @@ -0,0 +1,28 @@ +package com.iailab.module.data.arc.service; + +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.data.arc.entity.ArcSettingEntity; +import com.iailab.module.data.arc.vo.ArcSettingPageReqVO; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public interface ArcSettingService extends BaseService<ArcSettingEntity> { + + List<ArcSettingEntity> list(Map<String, Object> params); + + void update(ArcSettingEntity arcSettingEntity); + + void delete(String id); + + void enableByIds(String[] ids); + + void add(ArcSettingEntity arcSettingEntity); + + ArcSettingEntity info(String id); + + PageResult<ArcSettingEntity> queryPage(ArcSettingPageReqVO reqVO); +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java similarity index 74% rename from iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java rename to iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java index 03907c8..d1dca00 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointDataServiceImpl.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java @@ -1,16 +1,18 @@ -package com.iailab.module.data.point.service.impl; +package com.iailab.module.data.arc.service.impl; +import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.module.data.api.point.DataPointApiImpl; import com.iailab.module.data.api.point.dto.ApiPointValueDTO; import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; import com.iailab.module.data.common.enums.ArcCalculateTypeEnum; -import com.iailab.module.data.point.dao.ArcPointDataDao; -import com.iailab.module.data.point.entity.ArcPointDataEntity; -import com.iailab.module.data.point.entity.ArcPointSettingEntity; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.dao.ArcDataDao; +import com.iailab.module.data.arc.entity.ArcDataEntity; +import com.iailab.module.data.arc.entity.ArcSettingEntity; +import com.iailab.module.data.arc.service.ArcDataService; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.service.ArcPointSettingService; +import com.iailab.module.data.arc.service.ArcSettingService; +import com.iailab.module.data.arc.vo.ArcDataPageReqVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,13 +22,16 @@ @Service -public class ArcPointDataServiceImpl extends BaseServiceImpl<ArcPointDataDao, ArcPointDataEntity> implements ArcPointDataService { +public class ArcDataServiceImpl extends BaseServiceImpl<ArcDataDao, ArcDataEntity> implements ArcDataService { @Autowired - private ArcPointSettingService arcPointSettingService; + private ArcSettingService arcPointSettingService; @Autowired private DataPointApiImpl dataPointApi; + + @Autowired + private ArcDataDao arcDataDao; //根据归档类型进行归档 @Override @@ -36,7 +41,7 @@ switch (ArcTypeEnum.getEumByCode(type)) { case HOUR: //查询对应类型的归档设置列表 - List<ArcPointSettingEntity> arcHourList = arcPointSettingService.list(params); + List<ArcSettingEntity> arcHourList = arcPointSettingService.list(params); //遍历列表 arcHourList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); @@ -55,18 +60,18 @@ //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); String arcTime = dateFormat.format(startTime); - ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity(); - arcPointDataEntity.setId(String.valueOf(new Date().getTime())); - arcPointDataEntity.setArcTime(arcTime); - arcPointDataEntity.setArcId(item.getId()); - arcPointDataEntity.setValue(String.valueOf(value)); - insert(arcPointDataEntity); + ArcDataEntity arcDataEntity = new ArcDataEntity(); + arcDataEntity.setId(String.valueOf(new Date().getTime())); + arcDataEntity.setArcTime(arcTime); + arcDataEntity.setArcId(item.getId()); + arcDataEntity.setArcValue(value); + insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case SHIFT: //查询对应类型的归档设置列表 - List<ArcPointSettingEntity> arcShiftList = arcPointSettingService.list(params); + List<ArcSettingEntity> arcShiftList = arcPointSettingService.list(params); //遍历列表 arcShiftList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); @@ -85,18 +90,18 @@ //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); String arcTime = dateFormat.format(startTime); - ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity(); - arcPointDataEntity.setId(String.valueOf(new Date().getTime())); - arcPointDataEntity.setArcTime(arcTime); - arcPointDataEntity.setArcId(item.getId()); - arcPointDataEntity.setValue(String.valueOf(value)); - insert(arcPointDataEntity); + ArcDataEntity arcDataEntity = new ArcDataEntity(); + arcDataEntity.setId(String.valueOf(new Date().getTime())); + arcDataEntity.setArcTime(arcTime); + arcDataEntity.setArcId(item.getId()); + arcDataEntity.setArcValue(value); + insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case DAY: //查询对应类型的归档设置列表 - List<ArcPointSettingEntity> arcDayList = arcPointSettingService.list(params); + List<ArcSettingEntity> arcDayList = arcPointSettingService.list(params); //遍历列表 arcDayList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); @@ -115,18 +120,18 @@ //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String arcTime = dateFormat.format(startTime); - ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity(); - arcPointDataEntity.setId(String.valueOf(new Date().getTime())); - arcPointDataEntity.setArcTime(arcTime); - arcPointDataEntity.setArcId(item.getId()); - arcPointDataEntity.setValue(String.valueOf(value)); - insert(arcPointDataEntity); + ArcDataEntity arcDataEntity = new ArcDataEntity(); + arcDataEntity.setId(String.valueOf(new Date().getTime())); + arcDataEntity.setArcTime(arcTime); + arcDataEntity.setArcId(item.getId()); + arcDataEntity.setArcValue(value); + insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case MONTH: //查询对应类型的归档设置列表 - List<ArcPointSettingEntity> arcMonthList = arcPointSettingService.list(params); + List<ArcSettingEntity> arcMonthList = arcPointSettingService.list(params); //遍历列表 arcMonthList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); @@ -145,18 +150,18 @@ //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM"); String arcTime = dateFormat.format(startTime); - ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity(); - arcPointDataEntity.setId(String.valueOf(new Date().getTime())); - arcPointDataEntity.setArcTime(arcTime); - arcPointDataEntity.setArcId(item.getId()); - arcPointDataEntity.setValue(String.valueOf(value)); - insert(arcPointDataEntity); + ArcDataEntity arcDataEntity = new ArcDataEntity(); + arcDataEntity.setId(String.valueOf(new Date().getTime())); + arcDataEntity.setArcTime(arcTime); + arcDataEntity.setArcId(item.getId()); + arcDataEntity.setArcValue(value); + insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case YEAR: //查询对应类型的归档设置列表 - List<ArcPointSettingEntity> arcYearList = arcPointSettingService.list(params); + List<ArcSettingEntity> arcYearList = arcPointSettingService.list(params); //遍历列表 arcYearList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); @@ -175,12 +180,12 @@ //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy"); String arcTime = dateFormat.format(startTime); - ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity(); - arcPointDataEntity.setId(String.valueOf(new Date().getTime())); - arcPointDataEntity.setArcTime(arcTime); - arcPointDataEntity.setArcId(item.getId()); - arcPointDataEntity.setValue(String.valueOf(value)); - insert(arcPointDataEntity); + ArcDataEntity arcDataEntity = new ArcDataEntity(); + arcDataEntity.setId(String.valueOf(new Date().getTime())); + arcDataEntity.setArcTime(arcTime); + arcDataEntity.setArcId(item.getId()); + arcDataEntity.setArcValue(value); + insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; @@ -228,4 +233,9 @@ } return value; } + + @Override + public PageResult<ArcDataEntity> queryPage(ArcDataPageReqVO reqVO) { + return arcDataDao.selectPage(reqVO); + } } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcSettingServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcSettingServiceImpl.java new file mode 100644 index 0000000..b2329be --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcSettingServiceImpl.java @@ -0,0 +1,70 @@ +package com.iailab.module.data.arc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.module.data.common.enums.IsEnableEnum; +import com.iailab.module.data.arc.dao.ArcSettingDao; +import com.iailab.module.data.arc.entity.ArcSettingEntity; +import com.iailab.module.data.arc.service.ArcSettingService; +import com.iailab.module.data.arc.vo.ArcSettingPageReqVO; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +@Service +public class ArcSettingServiceImpl extends BaseServiceImpl<ArcSettingDao, ArcSettingEntity> implements ArcSettingService { + + @Autowired + private ArcSettingDao arcPointSettingDao; + + @Override + public List<ArcSettingEntity> list(Map<String, Object> params) { + Object type = params.get("type"); + QueryWrapper<ArcSettingEntity> queryWrapper = new QueryWrapper(); + queryWrapper.eq(!ObjectUtils.isEmpty(type), "type", type); + return arcPointSettingDao.selectList(queryWrapper); + } + + @Override + public void update(ArcSettingEntity arcSettingEntity) { + arcPointSettingDao.updateById(arcSettingEntity); + } + + @Override + public void delete(String id) { + arcPointSettingDao.deleteById(id); + } + + @Override + public void enableByIds(String[] ids) { + if (CollectionUtils.isEmpty(Arrays.asList(ids))) { + return; + } + Arrays.asList(ids).forEach(item -> { + ArcSettingEntity entity = new ArcSettingEntity(); + entity.setId(item); + entity.setIsEnable(IsEnableEnum.ENABLE.getCode().toString()); + entity.setUpdateTime(new Date()); + arcPointSettingDao.updateById(entity); + }); + } + + @Override + public void add(ArcSettingEntity arcSettingEntity) { + arcPointSettingDao.insert(arcSettingEntity); + } + + @Override + public ArcSettingEntity info(String id) { + return arcPointSettingDao.selectById(id); + } + + @Override + public PageResult<ArcSettingEntity> queryPage(ArcSettingPageReqVO reqVO) { + return arcPointSettingDao.selectPage(reqVO); + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcDataPageReqVO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcDataPageReqVO.java new file mode 100644 index 0000000..81108c4 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcDataPageReqVO.java @@ -0,0 +1,34 @@ +package com.iailab.module.data.arc.vo; + +import com.iailab.framework.common.pojo.PageParam; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ArcDataPageReqVO extends PageParam { + + /** + * 归档id + */ + private String arcId; + + /** + * 开始时间 + */ + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date startTime; + + /** + * 结束时间 + */ + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcSettingPageReqVO.java similarity index 68% copy from iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java copy to iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcSettingPageReqVO.java index 02f61d7..4de8f6a 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/entity/ArcPointSettingEntity.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/vo/ArcSettingPageReqVO.java @@ -1,17 +1,21 @@ -package com.iailab.module.data.point.entity; +package com.iailab.module.data.arc.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.iailab.framework.common.pojo.PageParam; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; -import java.io.Serializable; - +/** + * @author lirm + * @Description + * @createTime 2024年09月2日 + */ @Data -@TableName("t_arc_setting") -public class ArcPointSettingEntity implements Serializable { - - private static final long serialVersionUID = 1L; +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ArcSettingPageReqVO extends PageParam { /** * id @@ -53,4 +57,4 @@ * 更新时间 */ private String updateTime; -} +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/HttpCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/HttpCollector.java index 2fcb433..ff3c092 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/HttpCollector.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/HttpCollector.java @@ -43,9 +43,8 @@ Map<String, Object> valueMap = new HashMap<String, Object>(); if (SourceApiEnum.iHyperDB.getCode().equals(httpApi.getCode())) { valueMap = httpCollectorForIhd.getLastValues(apiId, tagNames); - } - if (SourceApiEnum.ASDB.getCode().equals(httpApi.getCode())) { - valueMap = httpCollectorForAsdb.getLastValues(apiId, tagNames); + } else if (SourceApiEnum.ASDB.getCode().equals(httpApi.getCode())) { + valueMap = httpCollectorForAsdb.getTagValues(apiId, tagNames); } if (valueMap.get(tag) == null) { return CommonConstant.BAD_VALUE; diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/asdb/HttpCollectorForAsdb.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/asdb/HttpCollectorForAsdb.java index 6b34fec..e5d6d78 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/asdb/HttpCollectorForAsdb.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/asdb/HttpCollectorForAsdb.java @@ -10,16 +10,13 @@ import com.iailab.module.data.common.utils.TagUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.*; import java.util.concurrent.*; -import java.util.stream.Collectors; /** * AnSteelDB采集 @@ -37,48 +34,7 @@ @Autowired private RedisTemplate redisTemplate; - ThreadPoolExecutor threadPool = new ThreadPoolExecutor(18, 36, 30, TimeUnit.SECONDS, - new ArrayBlockingQueue<Runnable>(36), new ThreadPoolExecutor.AbortPolicy()); - - private static final String STA_TRUE = "true"; - - private static final int GROUP_MAX_COUNT = 300; - - private static final int MAX_WAIT = 30; - - private static final String pattern = "yyyyMMddHHmm00"; - - private static final String IS_SUCCESS = "isSuccess"; - - /** - * tagName - */ - private static final String N = "n"; - - /** - * dimension - */ - private static final String D = "d"; - - /** - * 类型 - */ - private static final String P = "p"; - - /** - * dataValue - */ - private static final String V = "v"; - - /** - * dataTime - */ - private static final String T = "t"; - - /** - * 数据质量G:good,B:bad - */ - private static final String Q = "q"; + public static final long offset = 10; private HttpApiEntity getHttpApi(String id) { if (apiMap.containsKey(id)) { @@ -89,57 +45,38 @@ return httpApi; } - public BigDecimal getTagValue(String sourceId, String tagNo, Integer dimension, String valueType) { + public BigDecimal getTagValue(String sourceId, String tagNo) { BigDecimal value = CommonConstant.BAD_VALUE; HttpApiEntity httpApi = this.getHttpApi(sourceId); - String responseStr = HttpUtils.sendGet(httpApi.getUrl(), null, ""); - if (responseStr == null) { - return value; + //先查缓存 + String catchKey = "IailabData:" + httpApi.getCode() + ":" + tagNo; + if (redisTemplate.hasKey(catchKey)) { + log.info("查找IailabData缓存: " + catchKey); + return new BigDecimal(redisTemplate.opsForValue().get(catchKey).toString()); } + String responseStr = HttpUtils.sendGet(httpApi.getUrl(), null, ""); List<HttpAsdbRespDataVO> dataList = JSON.parseArray(responseStr, HttpAsdbRespDataVO.class); - value = Objects.requireNonNull(dataList.stream().filter(data -> tagNo.equals(data.getPoint())).findFirst().orElse(null)).getValue(); + log.info("存入IailabData缓存: " + catchKey); + dataList.forEach(item -> { + redisTemplate.opsForValue().set(catchKey, item.getValue().toString(), offset, TimeUnit.SECONDS); + }); + for (HttpAsdbRespDataVO data : dataList){ + if (tagNo.equals(data.getPoint())){ + value = data.getValue(); + break; + } + } return value; } - public Map<String, Object> getLastValues(String sourceId, List<String> tagNames) { + public Map<String, Object> getTagValues(String sourceId, List<String> tagNames) { Map<String, Object> result = new HashMap<>(); - HttpApiEntity httpApi = this.getHttpApi(sourceId); try { if (CollectionUtils.isEmpty(tagNames)) { return result; } - List<String> noCacheTagNames = new ArrayList<>();//未缓存的tag - for (int i = 0; i < tagNames.size(); i++) { - //先查缓存 - BoundHashOperations<String, String, Object> ops = redisTemplate.boundHashOps(tagNames.get(i)); - if (ops.get(V) != null) { - BigDecimal value = new BigDecimal(ops.get(V).toString()); - result.put(tagNames.get(i), value.setScale(3, RoundingMode.HALF_UP)); - } else { - noCacheTagNames.add(tagNames.get(i)); - } - } - if (CollectionUtils.isEmpty(noCacheTagNames)) { - log.info("全部读取缓存"); - return result; - } - log.info("查询未缓存的数据"); - String responseStr = HttpUtils.sendGet(httpApi.getUrl(), null, ""); - List<HttpAsdbRespDataVO> dataList = JSON.parseArray(responseStr, HttpAsdbRespDataVO.class); - List<HttpAsdbRespDataVO> noCacheDataList = dataList.stream().filter(data -> noCacheTagNames.contains(data.getPoint())).collect(Collectors.toList()); - for (HttpAsdbRespDataVO data : noCacheDataList ){ - if (data.getValue() != null){ - //存缓存 - BoundHashOperations<String, String, Object> ops = redisTemplate.boundHashOps(data.getValue().toString()); - ops.put(V, data.getValue().toString()); - //设置过期时间 - redisTemplate.expire(data.getValue().toString(), 10, TimeUnit.SECONDS); - //把查询到的数据插入结果集 - BigDecimal value = new BigDecimal(data.getValue().toString()); - result.put(data.getPoint(), value.setScale(3, RoundingMode.HALF_UP)); - } else { - result.put(data.getPoint(), CommonConstant.BAD_VALUE); - } + for (String tagName : tagNames) { + result.put(tagName, getTagValue(sourceId, tagName)); } } catch (Exception ex) { log.info("getCurrentValue异常"); @@ -155,93 +92,26 @@ return new HashMap<>(); } try { - Map<Integer, List<Object[]>> measurePointsCountGroup = new HashMap<>(); - int pointListSize = params.size(); - int groupCount = pointListSize / GROUP_MAX_COUNT + ((pointListSize % GROUP_MAX_COUNT) > 0 ? 1 : 0); - log.info("groupCount=" + groupCount); - for (int i = 0; i < groupCount; i++) { - int end = (i + 1) * GROUP_MAX_COUNT; - if (end > pointListSize) { - end = pointListSize; - } - measurePointsCountGroup.put(i, params.subList(i * GROUP_MAX_COUNT, end)); - } - log.info("measurePointsCountGroup.size()=" + measurePointsCountGroup.size()); - result = new ConcurrentHashMap<>(params.size()); - CountDownLatch countDownLatch = new CountDownLatch(measurePointsCountGroup.size()); - for (Map.Entry<Integer, List<Object[]>> measurePointsItem : measurePointsCountGroup.entrySet()) { - HttpApiEntity httpApi = this.getHttpApi(measurePointsItem.getValue().get(0)[0].toString()); - // 并发 - Thread.sleep(1000); - threadPool.submit(new Task(httpApi.getUrl(), httpApi.getCode(), result, measurePointsItem.getValue(), - collectTime, countDownLatch)); - // 顺序 - //this.getByHtp(result, measurePointsItem.getValue(), collectTime); - } - countDownLatch.await(MAX_WAIT, TimeUnit.SECONDS); - + HttpApiEntity httpApi = this.getHttpApi(params.get(0)[0].toString()); + this.getByHtp(httpApi.getUrl(), httpApi.getCode(), result, params); } catch (Exception ex) { ex.printStackTrace(); } return result; } - /** - * 异步采集任务 - */ - private class Task implements Runnable { - String url; - String sourceName; - Date collectTime; - Map<String, Object> result; - List<Object[]> params; - CountDownLatch countDownLatch; - - public Task(String url, String sourceName, Map<String, Object> result, List<Object[]> params, - Date collectTime, CountDownLatch countDownLatch) { - this.url = url; - this.sourceName = sourceName; - this.result = result; - this.collectTime = collectTime; - this.params = params; - this.countDownLatch = countDownLatch; + private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params) { + String responseStr = HttpUtils.sendGet(url, null, ""); + List<HttpAsdbRespDataVO> dataList = JSON.parseArray(responseStr, HttpAsdbRespDataVO.class); + Map<String, HttpAsdbRespDataVO> valueGroup = new HashMap<>(); + for (HttpAsdbRespDataVO data : dataList) { + valueGroup.put(data.getPoint(), data); } - - @Override - public void run() { - try { - log.info("请求的Tag数量:" + params.size()); - this.getByHtp(url, sourceName, result, params, collectTime); - log.info("请求结束:url=" + url); - } catch (Exception ex) { - log.info("获取采集值失败," + ex.getMessage()); - ex.printStackTrace(); - } finally { - countDownLatch.countDown(); - } - } - - /** - * getTagDataByHttp - * - * @param url - * @param sourceName - * @param result - * @param params - * @param collectTime - */ - private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params, Date collectTime) { - String responseStr = HttpUtils.sendGet(url, null, ""); - List<HttpAsdbRespDataVO> dataList = JSON.parseArray(responseStr, HttpAsdbRespDataVO.class); - for (HttpAsdbRespDataVO data : dataList){ + for (Object[] item : params) { + if (valueGroup.containsKey(item[1].toString())) { + HttpAsdbRespDataVO data = valueGroup.get(item[1].toString()); result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, data.getPoint()), data.getValue()); } } } - - private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params, Date collectTime) {String responseStr = HttpUtils.sendGet(url, null, ""); - List<HttpAsdbRespDataVO> dataList = JSON.parseArray(responseStr, HttpAsdbRespDataVO.class); - for (HttpAsdbRespDataVO data : dataList){ - result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, data.getPoint()), data.getValue()); - }} } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNet1h.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNet1h.java index 27bac8f..66b9680 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNet1h.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNet1h.java @@ -1,14 +1,12 @@ package com.iailab.module.data.job.task; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.collection.PointCollector; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.service.ArcDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Resource; import java.time.LocalDateTime; -import java.util.Calendar; /** * @description: Point归档1h @@ -21,7 +19,7 @@ private final String NET = "1h"; @Resource - private ArcPointDataService arcPointDataService; + private ArcDataService arcPointDataService; @Override public void run(String params){ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetDay.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetDay.java index 7c3c84a..da242b6 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetDay.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetDay.java @@ -1,7 +1,7 @@ package com.iailab.module.data.job.task; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.service.ArcDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ private final String NET = "1h"; @Resource - private ArcPointDataService arcPointDataService; + private ArcDataService arcPointDataService; @Override public void run(String params){ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetMonth.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetMonth.java index dd4b199..aabd610 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetMonth.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetMonth.java @@ -1,7 +1,7 @@ package com.iailab.module.data.job.task; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.service.ArcDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ private final String NET = "1h"; @Resource - private ArcPointDataService arcPointDataService; + private ArcDataService arcPointDataService; @Override public void run(String params){ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetShift.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetShift.java index fd5405b..5035f9b 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetShift.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetShift.java @@ -1,7 +1,7 @@ package com.iailab.module.data.job.task; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.service.ArcDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ private final String NET = "1h"; @Resource - private ArcPointDataService arcPointDataService; + private ArcDataService arcPointDataService; @Override public void run(String params){ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetYear.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetYear.java index 9db2c3c..c54a114 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetYear.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/PointArchivingTaskNetYear.java @@ -1,7 +1,7 @@ package com.iailab.module.data.job.task; import com.iailab.module.data.common.enums.ArcTypeEnum; -import com.iailab.module.data.point.service.ArcPointDataService; +import com.iailab.module.data.arc.service.ArcDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ private final String NET = "1h"; @Resource - private ArcPointDataService arcPointDataService; + private ArcDataService arcPointDataService; @Override public void run(String params){ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java index 14395b3..f5a40de 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java @@ -2,6 +2,7 @@ import com.iailab.framework.common.util.string.StrUtils; import com.iailab.module.data.channel.http.collector.SourceApiEnum; +import com.iailab.module.data.channel.http.collector.asdb.HttpCollectorForAsdb; import com.iailab.module.data.channel.http.collector.ihdb.HttpCollectorForIhd; import com.iailab.module.data.channel.opcda.collector.OpcDACollector; import com.iailab.module.data.common.enums.CommonConstant; @@ -59,6 +60,9 @@ @Autowired private HttpCollectorForIhd httpCollectorForIhd; + @Autowired + private HttpCollectorForAsdb httpCollectorForAsdb; + @Resource private DaPointService daPointService; @@ -77,7 +81,7 @@ List<String[]> modbusTagIds = new ArrayList<>(); List<String[]> kioTagIds = new ArrayList<>(); List<Object[]> httpTagIhd = new ArrayList<>(); - + List<Object[]> httpTagAsdb = new ArrayList<>(); dtos.stream().forEach(item -> { if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) { @@ -92,6 +96,10 @@ if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) { if (item.getTagNo() != null && item.getDimension() != null && item.getValueType() != null) { httpTagIhd.add(new Object[]{item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()}); + } + } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) { + if (item.getTagNo() != null && item.getDimension() != null && item.getValueType() != null) { + httpTagAsdb.add(new Object[]{item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()}); } } } @@ -112,6 +120,9 @@ } if (!CollectionUtils.isEmpty(httpTagIhd)) { tagValues.putAll(httpCollectorForIhd.getTagValues(httpTagIhd, collectTime)); + } + if (!CollectionUtils.isEmpty(httpTagAsdb)) { + tagValues.putAll(httpCollectorForAsdb.getTagValues(httpTagAsdb, collectTime)); } this.toCommonResult(collectTime, dtos, tagValues, dataMap, result,listGood,listBad); log.info("测量点处理结束"); @@ -198,7 +209,11 @@ } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) { value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) { - value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()); + if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) { + value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()); + } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) { + value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo()); + } } else { log.info("没有匹配的TagNo=" + item.getTagNo()); } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java deleted file mode 100644 index 29ccd1c..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/ArcPointController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.iailab.module.data.point.controller.admin; - -import com.iailab.framework.common.pojo.CommonResult; -import com.iailab.module.data.point.dto.DaPointDTO; -import com.iailab.module.data.point.service.ArcPointDataService; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.checkerframework.checker.units.qual.A; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.UUID; - -import static com.iailab.framework.common.pojo.CommonResult.success; - -@Tag(name = "数据归档,测点") -@RestController -@RequestMapping("/data/da/point") -@Validated -public class ArcPointController { - - @Autowired - private ArcPointDataService arcPointDataService; - - - @PostMapping("archiving") - public CommonResult<Boolean> archiving(@RequestBody String type) { - arcPointDataService.archiving(type); - return success(true); - } -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java deleted file mode 100644 index 83dc064..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointDataDao.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iailab.module.data.point.dao; - -import com.iailab.framework.common.dao.BaseDao; -import com.iailab.framework.tenant.core.db.dynamic.TenantDS; -import com.iailab.module.data.point.entity.ArcPointDataEntity; -import org.apache.ibatis.annotations.Mapper; - -@TenantDS -@Mapper -public interface ArcPointDataDao extends BaseDao<ArcPointDataEntity> { -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java deleted file mode 100644 index 6c2d62e..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/ArcPointSettingDao.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iailab.module.data.point.dao; - -import com.iailab.framework.common.dao.BaseDao; -import com.iailab.framework.tenant.core.db.dynamic.TenantDS; -import com.iailab.module.data.point.entity.ArcPointSettingEntity; -import org.apache.ibatis.annotations.Mapper; - -@TenantDS -@Mapper -public interface ArcPointSettingDao extends BaseDao<ArcPointSettingEntity> { -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java deleted file mode 100644 index cdec3bb..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointDataService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.iailab.module.data.point.service; - -import com.iailab.framework.common.service.BaseService; -import com.iailab.module.data.point.entity.ArcPointDataEntity; - -public interface ArcPointDataService extends BaseService<ArcPointDataEntity> { - //根据归档类型进行归档 - void archiving(String type); -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java deleted file mode 100644 index fa69c09..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/ArcPointSettingService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iailab.module.data.point.service; - -import com.iailab.framework.common.service.BaseService; -import com.iailab.module.data.point.entity.ArcPointSettingEntity; -import com.iailab.module.data.point.entity.DaCumulatePointEntity; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; - -@Service -public interface ArcPointSettingService extends BaseService<ArcPointSettingEntity> { - - List<ArcPointSettingEntity> list(Map<String, Object> params); -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java deleted file mode 100644 index 7606b99..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/ArcPointSettingServiceImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iailab.module.data.point.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.iailab.framework.common.service.impl.BaseServiceImpl; -import com.iailab.module.data.point.dao.ArcPointSettingDao; -import com.iailab.module.data.point.entity.ArcPointSettingEntity; -import com.iailab.module.data.point.service.ArcPointSettingService; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; - -@Service -public class ArcPointSettingServiceImpl extends BaseServiceImpl<ArcPointSettingDao, ArcPointSettingEntity> implements ArcPointSettingService { - - @Autowired - private ArcPointSettingDao arcPointSettingDao; - - @Override - public List<ArcPointSettingEntity> list(Map<String, Object> params) { - Object type = params.get("type"); - QueryWrapper<ArcPointSettingEntity> queryWrapper = new QueryWrapper(); - queryWrapper.eq(!ObjectUtils.isEmpty(type), "type", type); - return arcPointSettingDao.selectList(queryWrapper); - } -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml index c2e8195..ba6fd8c 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml +++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml @@ -185,6 +185,8 @@ - t_plan_item - t_da_cumulate_point - t_da_point_collect_status + - t_arc_data + - t_arc_setting app: app-key: data app-secret: 85b0df7edc3df3611913df34ed695011 diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java index 5b391f0..541d1dc 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java @@ -29,6 +29,10 @@ @Operation(summary = "执行单独预测") MdkPredictItemRespDTO predictItem(@Valid @RequestBody MdkPredictReqDTO reqDTO); + @PostMapping(PREFIX + "/predict-sim-adjust") + @Operation(summary = "模拟调整") + Boolean predictSimAdjust(@Valid @RequestBody MdkPredictSimAdjustReqDTO reqDTO); + @PostMapping(PREFIX + "/predict-adjust") @Operation(summary = "预测自动调整") Boolean predictAutoAdjust(@Valid @RequestBody MdkPredictReqDTO reqDTO); diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java new file mode 100644 index 0000000..e4092fc --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java @@ -0,0 +1,32 @@ +package com.iailab.module.model.api.mdk.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * @author PanZhibao + * @Description + * @createTime 2025年02月24日 + */ +@Schema(description = "RPC 模型 - 模拟调整 DTO") +@Data +public class MdkPredictSimAdjustReqDTO { + + @Schema(description = "预测时间") + @NotNull(message="预测时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date predictTime; + + @Schema(description = "调度方案编号") + @NotNull(message="调度方案编号不能为空") + private String scheduleCode; + + @Schema(description = "调度模型结果") + @NotNull(message="调度模型结果不能为空") + private Map<String, Object> modelResult; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java new file mode 100644 index 0000000..ed96f89 --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java @@ -0,0 +1,33 @@ +package com.iailab.module.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author PanZhibao + * @Description + * @createTime 2025年02月24日 + */ +@Getter +@AllArgsConstructor +public enum PredictItemTypeEnum { + + NormalItem("48dffaa8-ac91-42f4-9369-79c9c2080ef5", "com.iailab.predictHandler.impl.PredictItemImpl"), + MergeItem("773ed6fb-3929-47c0-8749-0d6d11111111", "com.iailab.predictHandler.impl.PredictMergeItemImpl"); + + private String id; + private String type; + + public static PredictItemTypeEnum getEumById(String id) { + if (id == null) { + return null; + } + + for (PredictItemTypeEnum statusEnum : PredictItemTypeEnum.values()) { + if (statusEnum.getId().equals(id)) { + return statusEnum; + } + } + return null; + } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/db/mysql.sql b/iailab-module-model/iailab-module-model-biz/db/mysql.sql index 3346f5f..14f2519 100644 --- a/iailab-module-model/iailab-module-model-biz/db/mysql.sql +++ b/iailab-module-model/iailab-module-model-biz/db/mysql.sql @@ -941,3 +941,70 @@ INDEX `idx_schedule_model_id`(`schedule_model_id` ASC) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='模拟调整结果表'; +-- matlab +CREATE TABLE `t_ml_model` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `model_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型名称', + `model_file_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型文件名', + `model_file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型文件路径', + `model_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型类型', + `matlab_platform` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'matlab平台', + `matlab_version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'matlab版本', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `model_file_name`(`model_file_name` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'matlab模型表' ROW_FORMAT = Dynamic; + +CREATE TABLE `t_ml_model_method` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `ml_model_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '模型id', + `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '全类名', + `method_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法名', + `data_length` int NULL DEFAULT 1 COMMENT '数据长度', + `out_length` int NULL DEFAULT NULL COMMENT '输出长度', + `sort` int NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`, `ml_model_id`) USING BTREE, + INDEX `id`(`id` ASC) USING BTREE, + INDEX `index_model_id`(`ml_model_id` ASC) USING BTREE, + CONSTRAINT `t_ml_model_method_ibfk_1` FOREIGN KEY (`ml_model_id`) REFERENCES `t_ml_model` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'matlab模型方法表' ROW_FORMAT = Dynamic; + +CREATE TABLE `t_ml_model_method_setting` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id', + `ml_model_method_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型方法id', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参数名称', + `setting_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参数key', + `setting_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参数值', + `value_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参数类型', + `sort` int NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE, + INDEX `id`(`id` ASC) USING BTREE, + INDEX `ml_model_method_id`(`ml_model_method_id` ASC) USING BTREE, + CONSTRAINT `t_ml_model_method_setting_ibfk_1` FOREIGN KEY (`ml_model_method_id`) REFERENCES `t_ml_model_method` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'matlab模型方法参数表' ROW_FORMAT = Dynamic; + +CREATE TABLE `t_ml_project` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id', + `project_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目名称', + `project_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目编码', + `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', + `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间', + `publish_time` timestamp NULL DEFAULT NULL COMMENT '发布时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'matlab项目表' ROW_FORMAT = DYNAMIC; + +CREATE TABLE `t_ml_project_model` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id', + `project_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '项目id', + `model_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '模型id', + PRIMARY KEY (`id`, `project_id`, `model_id`) USING BTREE, + INDEX `model_id`(`model_id` ASC) USING BTREE, + INDEX `project_id`(`project_id` ASC) USING BTREE, + CONSTRAINT `t_ml_project_model_ibfk_1` FOREIGN KEY (`model_id`) REFERENCES `t_ml_model` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `t_ml_project_model_ibfk_2` FOREIGN KEY (`project_id`) REFERENCES `t_ml_project` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'matlab项目模型关联表' ROW_FORMAT = DYNAMIC; + diff --git a/iailab-module-model/iailab-module-model-biz/pom.xml b/iailab-module-model/iailab-module-model-biz/pom.xml index ce7bdcb..eb7275b 100644 --- a/iailab-module-model/iailab-module-model-biz/pom.xml +++ b/iailab-module-model/iailab-module-model-biz/pom.xml @@ -164,6 +164,13 @@ <version>2.3.2</version> </dependency> + <!-- matlab --> + <dependency> + <groupId>com.matlab.javabuilder</groupId> + <artifactId>javabuilder</artifactId> + <version>9.6.0</version> + </dependency> + </dependencies> <build> diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java index bc62e43..399c022 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java @@ -1,7 +1,6 @@ package com.iailab.module.model.api; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.data.api.point.dto.ApiPointValueWriteDTO; import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO; @@ -9,21 +8,21 @@ import com.iailab.module.model.api.mdk.dto.*; import com.iailab.module.model.common.enums.IsWriteEnum; import com.iailab.module.model.common.enums.ModelOutResultType; -import com.iailab.module.model.common.enums.OutResultType; import com.iailab.module.model.enums.CommonConstant; +import com.iailab.module.model.enums.PredictItemTypeEnum; import com.iailab.module.model.mcs.pre.entity.DmModuleEntity; import com.iailab.module.model.mcs.pre.service.DmModuleService; import com.iailab.module.model.mcs.pre.service.MmPredictItemService; +import com.iailab.module.model.mcs.sche.entity.StAdjustConfigDetEntity; +import com.iailab.module.model.mcs.sche.entity.StScheduleSchemeEntity; +import com.iailab.module.model.mcs.sche.service.StAdjustConfigService; import com.iailab.module.model.mcs.sche.service.StScheduleModelOutService; import com.iailab.module.model.mcs.sche.service.StScheduleRecordService; import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService; import com.iailab.module.model.mdk.predict.PredictModuleHandler; import com.iailab.module.model.mdk.predict.PredictResultHandler; import com.iailab.module.model.mdk.schedule.ScheduleModelHandler; -import com.iailab.module.model.mdk.vo.DataValueVO; -import com.iailab.module.model.mdk.vo.ItemVO; -import com.iailab.module.model.mdk.vo.PredictResultVO; -import com.iailab.module.model.mdk.vo.ScheduleResultVO; +import com.iailab.module.model.mdk.vo.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -32,11 +31,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; +import java.math.BigDecimal; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; - -import static com.iailab.module.model.common.enums.ModelOutResultType.D; /** * @author PanZhibao @@ -74,6 +72,9 @@ @Autowired private DataPointApi dataPointApi; + + @Autowired + private StAdjustConfigService stAdjustConfigService; @Autowired private RedisTemplate<String, Object> redisTemplate; @@ -193,6 +194,37 @@ return resp; } + @Override + public Boolean predictSimAdjust(MdkPredictSimAdjustReqDTO reqDTO) { + StScheduleSchemeEntity scheduleScheme = stScheduleSchemeService.getByCode(reqDTO.getScheduleCode()); + List<StAdjustConfigDetEntity> detList = stAdjustConfigService.getDetByModelId(scheduleScheme.getModelId()); + if (CollectionUtils.isEmpty(detList)) { + return Boolean.FALSE; + } + for (StAdjustConfigDetEntity det : detList) { + ItemVO predictItem = mmPredictItemService.getItemById(det.getPredictItemId()); + List<StAdjustDeviationDTO> deviationList = new ArrayList<>(); + switch (PredictItemTypeEnum.getEumById(det.getItemTypeId())) { + case NormalItem: + double adjustValue = new BigDecimal(reqDTO.getModelResult().get(det.getOutKey()).toString()).doubleValue(); + StAdjustDeviationDTO deviationItem = new StAdjustDeviationDTO(); + deviationItem.setPortIdx(det.getModelParamPortOrder()); + deviationItem.setParamIdx(det.getModelParamPortOrder()); + deviationItem.setValue(adjustValue); + deviationList.add(deviationItem); + break; + case MergeItem: + break; + default: + break; + } + // 开始预测 + predictModuleHandler.predictAdjust(predictItem, reqDTO.getPredictTime(), deviationList, scheduleScheme.getModelId()); + } + return Boolean.TRUE; + } + + /** * 预测调整 * diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java new file mode 100644 index 0000000..21c11fa --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java @@ -0,0 +1,13 @@ +package com.iailab.module.model.matlab.common; + +/** + * @description: + * @author: dzd + * @date: 2025/2/14 10:59 + **/ +public interface MatlabConstant { + /** + * JNI + */ + String JNI = "JNI"; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java new file mode 100644 index 0000000..6d727f1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java @@ -0,0 +1,22 @@ +package com.iailab.module.model.matlab.common.exceptions; + +/** + * @description: 非法jar包异常 + * @author: dzd + * @date: 2025/2/26 17:52 + **/ +public class IllegalityJarException extends Exception { + private Throwable cause; + + public IllegalityJarException() { + } + + public IllegalityJarException(String msg) { + super(msg); + } + + public IllegalityJarException(String msg, Exception cause) { + super(msg, cause); + this.cause = cause; + } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java new file mode 100644 index 0000000..13281e3 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java @@ -0,0 +1,405 @@ +package com.iailab.module.model.matlab.common.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.iail.model.IAILModel; +import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException; +import com.iailab.module.model.matlab.dto.MatlabJarFileClassInfoDTO; +import com.iailab.module.model.matlab.dto.MatlabJarFileMethodInfoDTO; +import com.iailab.module.model.matlab.dto.MlModelMethodSettingDTO; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.mathworks.toolbox.javabuilder.*; +import com.mathworks.toolbox.javabuilder.internal.MWFunctionSignature; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +@Slf4j +public class MatlabUtils { + + private static HashMap<String, URLClassLoader> classLoaderCache = new HashMap<>(); + private static HashMap<String, Object> classCache = new HashMap<>(); + private static HashMap<String, Method> classMethodCache = new HashMap<>(); + + /** + * @description: 解析matlab jar文件 + **/ + public static List<MatlabJarFileClassInfoDTO> parseJarInfo(String jarFilePath, String jatName) throws IllegalityJarException { + List<MatlabJarFileClassInfoDTO> classInfos = new ArrayList<>(); + //加载jar用于解析内部class method + URLClassLoader urlClassLoader = loadJar(null,jarFilePath); + try (JarFile jarFile = new JarFile(jarFilePath)) { + // 获取 JAR 文件中所有的条目 + Enumeration<JarEntry> entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + // 检查条目是否为类文件 + if (entryName.endsWith(".class") && !entryName.endsWith("Remote.class") && !entryName.endsWith("MCRFactory.class")) { + MatlabJarFileClassInfoDTO classInfo = new MatlabJarFileClassInfoDTO(); + // 将类文件的路径转换为类的全限定名 + String className = entryName.replace('/', '.').substring(0, entryName.lastIndexOf(".class")); + // 校验包名是否和文件名一致,不一致则说明修改过jar包名,判定为非法包 + if (!className.startsWith(jatName)) { + throw new IllegalityJarException(); + } + + classInfo.setClassName(className); + try { + // 加载类 + Class<?> clazz = urlClassLoader.loadClass(className); + // 获取该类的所有属性 + Field[] fields = clazz.getDeclaredFields(); + List<MatlabJarFileMethodInfoDTO> methodInfos = new ArrayList<>(); + for (Field field : fields) { + int modifiers = field.getModifiers(); + if (Modifier.isPrivate(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) { + try { + // 绕过访问控制检查 + field.setAccessible(true); + Object value = field.get(null); // 静态字段不需要实例,传 null + if (value instanceof MWFunctionSignature) { + MatlabJarFileMethodInfoDTO methodInfo = new MatlabJarFileMethodInfoDTO(); + methodInfo.setMethodName(value.getClass().getField("name").get(value).toString()); + // 减1是为了排除最后面的setting + methodInfo.setDataLength((Integer) value.getClass().getField("numInputs").get(value) - 1); + methodInfo.setOutLength((Integer) value.getClass().getField("numOutputs").get(value)); + methodInfos.add(methodInfo); + } + } catch (Exception e) { + log.error("get matlab method info exception,className:" + className, e); + } + } + } + classInfo.setMethodInfos(methodInfos); + } catch (Exception e) { + log.error("get matlab class info exception,className:" + className, e); + } + classInfos.add(classInfo); + } + } + } catch (IOException e) { + log.error("get matlab jar info exception,jarFilePath:" + jarFilePath, e); + } finally { + unloadJar(urlClassLoader); + } + return classInfos; + } + + public static synchronized URLClassLoader loadJar(String projectId, String... jarPaths) { + try { + URL[] urls = new URL[jarPaths.length]; + for (int i = 0; i < jarPaths.length; i++) { + String jarPath = jarPaths[i]; + File jarFile = new File(jarPath); + if (!jarFile.exists()) { + throw new RuntimeException("jar沒有找到!" + jarPath); + } + urls[i] = new File(jarPath).toURI().toURL(); + } + + // 不能设置classloader的patent,让它使用双亲委派去找系统classloader中javabuilder.jar中的依赖。因为javabuilder.jar只能加载一次,加载多次会报资源占用 + URLClassLoader urlClassLoader = new URLClassLoader(urls); + if (projectId != null) { + addClassLoaderCache(projectId, urlClassLoader); + } + log.info("成功加载jar包:" + String.join(";",jarPaths)); + return urlClassLoader; + } catch (Exception e) { + throw new RuntimeException("加载jar异常", e); + } + } + + public static synchronized void unloadJar(URLClassLoader urlClassLoader) { + try { + urlClassLoader.close(); + log.info("成功卸载jar包。"); + } catch (Exception e) { + throw new RuntimeException("卸载jar异常", e); + } + } + + public static synchronized void addClassLoaderCache(String projectId, URLClassLoader urlClassLoader) { + classLoaderCache.put(projectId, urlClassLoader); + } + + public static synchronized URLClassLoader getClassLoader(String projectId) { + return classLoaderCache.get(projectId); + } + + public static synchronized void removeClassLoaderCache(String projectId) { + if (classLoaderCache.containsKey(projectId)) { + URLClassLoader urlClassLoader = classLoaderCache.get(projectId); + unloadJar(urlClassLoader); + classLoaderCache.remove(projectId); + removeClassCache(projectId); + removeClassMethodCache(projectId); + } + } + + public static synchronized void removeClassCache(String projectId) { + Iterator<String> iterator = classCache.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + if (key.startsWith(projectId)) { + iterator.remove(); + } + } + } + + public static synchronized void removeClassMethodCache(String projectId) { + Iterator<String> iterator = classMethodCache.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + if (key.startsWith(projectId)) { + iterator.remove(); + } + } + } + + public static void removeOldFile(String bakPath, String projectId) { + File dir = new File(bakPath); + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (null != files && files.length > 0) { + for (File file : files) { + if (file.getName().startsWith(projectId)) { + file.delete(); + } + } + } + } + } + + /** + * @description: 项目启动加载已发布的dll和jar + * @author: dzd + * @date: 2024/10/10 11:58 + **/ + public static void loadProjectPublish(String bakPath) { + File dir = new File(bakPath); + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (null != files && files.length > 0) { + for (File file : files) { + String fileName = file.getName(); + if (fileName.endsWith(".jar")) { + String[] split = fileName.split(MdkConstant.SPLIT); + String projectId = split[0]; + + URLClassLoader urlClassLoader = null; + try { + // 加载新的jar + urlClassLoader = loadJar(projectId,file.getAbsolutePath()); + } catch (Exception e) { + throw new RuntimeException("加载jar异常", e); + } + // 成功后加入缓存 + addClassLoaderCache(projectId, urlClassLoader); + } + } + } + } + + } + + public static HashMap<String, Object> run(IAILModel model, Object[] paramsValueArray, String projectId) throws Exception { + if (model == null) { + throw new RuntimeException("模型文件不能为空!"); + } else { + // 上传时校验文件名和class的开头是相同的,保证className唯一,可以用 projectId_className 作为唯一key + String classCacheKey = projectId + "_" + model.getClassName(); + String methodParams = Arrays.stream(model.getParamsArray()).map(e -> e.getName()).collect(Collectors.joining(",")); + String classMethodCacheKey = classCacheKey + "." + model.getMethodName() + "(" + methodParams + ")"; + // 因为一个类下可能有多多个方法,所以这里classCacheKey 和 classMethodCacheKey 要分开判断 + if (classCache.containsKey(classCacheKey)) { + if (classMethodCache.containsKey(classMethodCacheKey)) { + return (HashMap) classMethodCache.get(classMethodCacheKey).invoke(classCache.get(classCacheKey), paramsValueArray); + } else { + // 运行过这个类的其他方法,类从缓存中取,新建方法 + Object o = classCache.get(classCacheKey); + Class<?>[] paramsArray = new Class[2]; + paramsArray[0] = int.class; + paramsArray[1] = Object[].class; + Method method = o.getClass().getMethod(model.getMethodName(), paramsArray); + classMethodCache.put(classMethodCacheKey, method); + Object[] objects = (Object[]) method.invoke(o, paramsValueArray); + HashMap<String, Object> map = convertStructToMap((MWStructArray) objects[0]); + return map; + } + + } else { + URLClassLoader classLoader = getClassLoader(projectId); + if (null == classLoader) { + throw new RuntimeException("matlab未发布,classLoader为null"); + } + Class<?> clazz = classLoader.loadClass(model.getClassName()); + Object o = clazz.newInstance(); + Class<?>[] paramsArray = new Class[2]; + paramsArray[0] = int.class; + paramsArray[1] = Object[].class; + Method method = clazz.getMethod(model.getMethodName(), paramsArray); + classCache.put(classCacheKey, o); + classMethodCache.put(classMethodCacheKey, method); + Object[] objects = (Object[]) method.invoke(o, paramsValueArray); + HashMap<String, Object> map = convertStructToMap((MWStructArray) objects[0]); + return map; + } + } + } + + public static HashMap<String, Object> convertStructToMap(MWStructArray struct) { + HashMap<String, Object> map; + try { + map = new HashMap<>(); + String[] fieldNames = struct.fieldNames(); + int numElements = struct.numberOfElements(); + for (int i = 1; i <= numElements; i++) { + for (String fieldName : fieldNames) { + MWArray value = struct.getField(fieldName, i); + Object javaValue = convertMWArrayToJavaObject(value); + map.put(fieldName, javaValue); + } + } + } finally { + struct.dispose(); + } + return map; + } + + private static Object convertMWArrayToJavaObject(MWArray mwArray) { + try { + if (mwArray instanceof MWNumericArray) { + MWNumericArray numArray = (MWNumericArray) mwArray; + if (numArray.numberOfElements() == 1) { + MWClassID mwClassID = numArray.classID(); + if (mwClassID.equals(MWClassID.DOUBLE)) { + return numArray.getDouble(); + } else if (mwClassID.equals(MWClassID.SINGLE)) { + return numArray.getFloat(); + } else if (mwClassID.equals(MWClassID.INT8) || mwClassID.equals(MWClassID.UINT8)) { + return numArray.getByte(); + } else if (mwClassID.equals(MWClassID.INT16) || mwClassID.equals(MWClassID.UINT16)) { + return numArray.getShort(); + } else if (mwClassID.equals(MWClassID.INT32) || mwClassID.equals(MWClassID.UINT32)) { + return numArray.getInt(); + } else if (mwClassID.equals(MWClassID.INT64) || mwClassID.equals(MWClassID.UINT64)) { + return numArray.getLong(); + } else if (mwClassID.equals(MWClassID.LOGICAL)) { + return numArray.getByte(); + } + return null; + } else { + MWClassID mwClassID = numArray.classID(); + if (mwClassID.equals(MWClassID.DOUBLE)) { + return numArray.toDoubleArray(); + } else if (mwClassID.equals(MWClassID.SINGLE)) { + return numArray.toFloatArray(); + } else if (mwClassID.equals(MWClassID.INT8)) { + return numArray.toByteArray(); + } else if (mwClassID.equals(MWClassID.INT16) || mwClassID.equals(MWClassID.UINT16)) { + return numArray.toShortArray(); + } else if (mwClassID.equals(MWClassID.INT32) || mwClassID.equals(MWClassID.UINT32)) { + return numArray.toIntArray(); + } else if (mwClassID.equals(MWClassID.INT64) || mwClassID.equals(MWClassID.UINT64)) { + return numArray.toLongArray(); + } else if (mwClassID.equals(MWClassID.LOGICAL)) { + return numArray.toByteArray(); + } + return null; + } + } else if (mwArray instanceof MWCharArray) { + MWCharArray stringArray = (MWCharArray) mwArray; + if (stringArray.numberOfElements() == 1) { + return stringArray.getChar(1); + } else { + // 不支持string,string都是用char[]返回,所以这里将char[]转为string + int[] dimensions = stringArray.getDimensions(); + if (dimensions[0] == 1) { + //string + return stringArray.toString(); + } else { + //String[] 暂时只考虑一维string + char[][] array = (char[][]) stringArray.toArray(); + String[] list = new String[dimensions[0]]; + for (int i = 0; i < dimensions[0]; i++) { + list[i] = (String.valueOf(array[i])); + } + return list; + } + } + } else if (mwArray instanceof MWLogicalArray) { + MWLogicalArray logicalArray = (MWLogicalArray) mwArray; + if (logicalArray.numberOfElements() == 1) { + return logicalArray.getBoolean(1); + } else { + int[] dimensions = logicalArray.getDimensions(); + return logicalArray.toArray(); + } + } else if (mwArray instanceof MWStructArray) { + MWStructArray structArray = (MWStructArray) mwArray; + return convertStructToMap(structArray); + } + } finally { + mwArray.dispose(); + } + return null; + } + + public static HashMap<String, Object> handleModelSettings(List<MlModelMethodSettingDTO> modelSettings) { + HashMap<String, Object> resultMap = null; + try { + resultMap = new HashMap<>(modelSettings.size()); + for (MlModelMethodSettingDTO modelSetting : modelSettings) { + switch (modelSetting.getValueType()) { + case "int": + resultMap.put(modelSetting.getSettingKey(), Integer.valueOf(modelSetting.getSettingValue())); + break; + case "string": + resultMap.put(modelSetting.getSettingKey(), modelSetting.getSettingValue()); + break; + case "decimal": + resultMap.put(modelSetting.getSettingKey(), Double.valueOf(modelSetting.getSettingValue())); + break; + case "decimalArray": + JSONArray jsonArray = JSON.parseArray(modelSetting.getSettingValue()); + double[] doubles = new double[jsonArray.size()]; + for (int i = 0; i < jsonArray.size(); i++) { + doubles[i] = Double.valueOf(String.valueOf(jsonArray.get(i))); + } + resultMap.put(modelSetting.getSettingKey(), doubles); + break; + } + } + } catch (NumberFormatException e) { + throw new RuntimeException("模型参数有误,请检查!!!"); + } + return resultMap; + } + + public static MWStructArray convertMapToStruct(Map<String, Object> map) { + String[] fieldNames = map.keySet().toArray(new String[0]); + MWStructArray struct = new MWStructArray(1, 1, fieldNames); + for (String key : map.keySet()) { + Object value = map.get(key); + if (value instanceof Number) { + struct.set(key, 1, ((Number) value).doubleValue()); + } else if (value instanceof String) { + struct.set(key, 1, value); + } + // 可以根据需要添加更多类型的处理 + } + return struct; + } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java new file mode 100644 index 0000000..ab73a82 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java @@ -0,0 +1,113 @@ +package com.iailab.module.model.matlab.controller.admin; + +import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException; +import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO; +import com.iailab.module.model.matlab.dto.MatlabRunDTO; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.service.MlModelService; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.iailab.framework.common.pojo.CommonResult.success; + + +/** + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@RestController +@RequestMapping("/model/matlab/model") +public class MlModelController { + @Autowired + private MlModelService mlModelService; + + @GetMapping("page") + @Operation(summary = "分页") + @PreAuthorize("@ss.hasPermission('ml:model:query')") + public CommonResult<PageData<MlModelDTO>> page(@RequestParam Map<String, Object> params) { + PageData<MlModelDTO> page = mlModelService.page(params); + return success(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("@ss.hasPermission('ml:model:query')") + public CommonResult<MlModelDTO> get(@PathVariable("id") String id){ + MlModelDTO data = mlModelService.get(id); + + return success(data); + } + + @PreAuthorize("@ss.hasPermission('ml:model:query')") + @GetMapping("list") + public CommonResult<List<MlModelDTO>> list(@RequestParam Map<String, Object> params) { + List<MlModelDTO> list = mlModelService.list(params); + + return success(list); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("@ss.hasPermission('ml:model:create')") + public CommonResult save(@RequestBody MlModelDTO dto){ + mlModelService.save(dto); + + return success(); + } + + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("@ss.hasPermission('ml:model:update')") + public CommonResult update(@RequestBody MlModelDTO dto){ + mlModelService.update(dto); + + return success(); + } + + @DeleteMapping + @Operation(summary = "删除") + @PreAuthorize("@ss.hasPermission('ml:model:delete')") + public CommonResult delete(String id){ + + mlModelService.delete(id); + + return success(); + } + + @PostMapping("/upload") + @Operation(summary = "算法封装jar文件上传") + public CommonResult<MatlabJarFileInfoDTO> upload(@RequestParam("file") MultipartFile file){ + MatlabJarFileInfoDTO result = null; + try { + result = mlModelService.uploadJarFile(file); + } catch (IllegalityJarException e) { + return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"非法jar包"); + } + return success(result); + } + + @PostMapping("/test") + @Operation(summary = "Matlab测试运行") + public CommonResult<String> test(@RequestBody MatlabRunDTO dto) { + return mlModelService.test(dto); + } + + @PostMapping("/importData") + @Operation(summary = "导入参数") + public CommonResult<List<HashMap<String,Object>>> importData(@RequestParam("file") MultipartFile file) throws Exception { + List<HashMap<String,Object>> result = mlModelService.importData(file); + return success(result); + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java new file mode 100644 index 0000000..bf9545c --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java @@ -0,0 +1,93 @@ +package com.iailab.module.model.matlab.controller.admin; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.dto.MlProjectDTO; +import com.iailab.module.model.matlab.service.MlProjectService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.iailab.framework.common.pojo.CommonResult.success; + + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:40 + **/ +@RestController +@RequestMapping("/model/matlab/project") +public class MlProjectController { + @Autowired + private MlProjectService mlProjectService; + + @PreAuthorize("@ss.hasPermission('matlab:project:query')") + @GetMapping("page") + public CommonResult<PageData<MlProjectDTO>> page(@RequestParam Map<String, Object> params){ + PageData<MlProjectDTO> page = mlProjectService.page(params); + + return success(page); + } + + @PreAuthorize("@ss.hasPermission('matlab:project:query')") + @GetMapping("list") + public CommonResult<List<MlProjectDTO>> list() { + List<MlProjectDTO> list = mlProjectService.list(new HashMap<>()); + + return success(list); + } + + @PreAuthorize("@ss.hasPermission('matlab:project:query')") + @GetMapping("{id}") + public CommonResult<MlProjectDTO> get(@PathVariable("id") String id){ + MlProjectDTO data = mlProjectService.get(id); + + return success(data); + } + + @PreAuthorize("@ss.hasPermission('matlab:project:create')") + @PostMapping + public CommonResult<Boolean> save(@RequestBody MlProjectDTO dto){ + mlProjectService.save(dto); + + return CommonResult.success(true); + } + + @PreAuthorize("@ss.hasPermission('matlab:project:update')") + @PutMapping + public CommonResult<Boolean> update(@RequestBody MlProjectDTO dto){ + dto.setUpdateTime(new Date()); + mlProjectService.update(dto); + + return CommonResult.success(true); + } + + @PreAuthorize("@ss.hasPermission('matlab:project:delete')") + @DeleteMapping + public CommonResult<Boolean> delete(String id){ + + mlProjectService.delete(id); + + return CommonResult.success(true); + } + + @GetMapping("getProjectModel") + public CommonResult<PageData<MlModelDTO>> getProjectModel(@RequestParam Map<String, Object> params){ + PageData<MlModelDTO> page = mlProjectService.getProjectModel(params); + + return CommonResult.success(page); + } + + @PostMapping("/publish") + public CommonResult<String> publish(@RequestBody Map<String, Object> params) { + return mlProjectService.publish(params); + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java new file mode 100644 index 0000000..b3a3ac8 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java @@ -0,0 +1 @@ +package com.iailab.module.model.matlab.controller; \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java new file mode 100644 index 0000000..f21f632 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java @@ -0,0 +1,30 @@ +package com.iailab.module.model.matlab.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.entity.MlModelEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@TenantDS +@Mapper +public interface MlModelDao extends BaseDao<MlModelEntity> { + + List<MlModelDTO> list(Map<String, Object> params); + + MlModelDTO get(String id); + + int getProjectModelCount(String projectId); + + List<MlModelDTO> getProjectModel(@Param("params") Map<String, Object> params); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java new file mode 100644 index 0000000..3e2b868 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java @@ -0,0 +1,18 @@ +package com.iailab.module.model.matlab.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.model.matlab.entity.MlModelMethodEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@TenantDS +@Mapper +public interface MlModelMethodDao extends BaseDao<MlModelMethodEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java new file mode 100644 index 0000000..8b1e920 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java @@ -0,0 +1,18 @@ +package com.iailab.module.model.matlab.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@TenantDS +@Mapper +public interface MlModelMethodSettingDao extends BaseDao<MlModelMethodSettingEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java new file mode 100644 index 0000000..c3369f1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java @@ -0,0 +1,16 @@ +package com.iailab.module.model.matlab.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.model.matlab.entity.MlProjectEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:11 + **/ +@TenantDS +@Mapper +public interface MlProjectDao extends BaseDao<MlProjectEntity> { +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java new file mode 100644 index 0000000..a6ca000 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java @@ -0,0 +1,23 @@ +package com.iailab.module.model.matlab.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.entity.MlProjectModelEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:10 + **/ +@TenantDS +@Mapper +public interface MlProjectModelDao extends BaseDao<MlProjectModelEntity> { + + List<MlModelDTO> getProjectModel(@Param("params") Map<String, Object> params); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java new file mode 100644 index 0000000..26105ab --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java @@ -0,0 +1,13 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class MatlabJarFileClassInfoDTO { + + private String className; + + private List<MatlabJarFileMethodInfoDTO> methodInfos; +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java new file mode 100644 index 0000000..85ed1cb --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java @@ -0,0 +1,16 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.util.HashMap; +import java.util.List; + +@Data +public class MatlabJarFileInfoDTO { + + private String fileName; + + private String filePath; + + private List<MatlabJarFileClassInfoDTO> classInfos; +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java new file mode 100644 index 0000000..a5a84ee --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java @@ -0,0 +1,13 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +@Data +public class MatlabJarFileMethodInfoDTO { + + private String methodName; + + private Integer dataLength; + + private Integer outLength; +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java new file mode 100644 index 0000000..4695ad1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java @@ -0,0 +1,28 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @description: + * @author: dzd + * @date: 2025/2/24 15:59 + **/ +@Data +public class MatlabRunDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String modelFileName; + + private String className; + + private String methodName; + + private Integer outLength; + + private List<MlModelMethodSettingDTO> modelSettings; + + private List<String> uuids; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java new file mode 100644 index 0000000..e22a9ca --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java @@ -0,0 +1,46 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +public class MlModelDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String modelName; + + private String modelFileName; + + private String modelFilePath; + + private String modelType; + + private String matlabPlatform; + + private String matlabVersion; + + private String remark; + + private Long updater; + + private Date updateDate; + + private Long creator; + + private Date createDate; + + private List<MlModelMethodDTO> modelMethods; + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java new file mode 100644 index 0000000..2cbe8f6 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java @@ -0,0 +1,34 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +public class MlModelMethodDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String mlModelId; + + private String className; + + private String methodName; + + private Integer dataLength; + + private Integer outLength; + + private Integer sort; + + private List<MlModelMethodSettingDTO> methodSettings; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java new file mode 100644 index 0000000..85a2012 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java @@ -0,0 +1,32 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +public class MlModelMethodSettingDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String mlModelMethodId; + + private String name; + + private String settingKey; + + private String settingValue; + + private String valueType; + + private String sort; + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java new file mode 100644 index 0000000..77cef43 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java @@ -0,0 +1,32 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * @description: 项目表 + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Data +public class MlProjectDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String projectName; + + private String projectCode; + + private Date createTime; + + private Date updateTime; + + private List<MlModelDTO> models; + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java new file mode 100644 index 0000000..2456247 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java @@ -0,0 +1,24 @@ +package com.iailab.module.model.matlab.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:39 + **/ +@Data +public class MlProjectModelDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String projectId; + + private String modelId; + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java new file mode 100644 index 0000000..a280cb6 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java @@ -0,0 +1,73 @@ +package com.iailab.module.model.matlab.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +@TableName("t_ml_model") +public class MlModelEntity { + + /** + * + */ + private String id; + /** + * 模型名称 + */ + private String modelName; + /** + * 模型文件名 + */ + private String modelFileName; + /** + * 模型文件路径 + */ + private String modelFilePath; + /** + * 模型类型 + */ + private String modelType; + /** + * matlab平台 + */ + private String matlabPlatform; + /** + * matlab版本 + */ + private String matlabVersion; + /** + * 备注 + */ + private String remark; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long creator; + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createDate; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java new file mode 100644 index 0000000..7bf16e1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java @@ -0,0 +1,46 @@ +package com.iailab.module.model.matlab.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +@TableName("t_ml_model_method") +public class MlModelMethodEntity { + + /** + * + */ + private String id; + /** + * 模型id + */ + private String mlModelId; + /** + * 全类名 + */ + private String className; + /** + * 方法名 + */ + private String methodName; + /** + * 数据长度 + */ + private Integer dataLength; + /** + * 输出长度 + */ + private Integer outLength; + /** + * 排序 + */ + private Integer sort; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java new file mode 100644 index 0000000..9917bb0 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java @@ -0,0 +1,46 @@ +package com.iailab.module.model.matlab.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Data +@TableName("t_ml_model_method_setting") +public class MlModelMethodSettingEntity { + + /** + * id + */ + private String id; + /** + * 模型方法id + */ + private String mlModelMethodId; + /** + * 参数名称 + */ + private String name; + /** + * 参数key + */ + private String settingKey; + /** + * 参数值 + */ + private String settingValue; + /** + * 参数类型 + */ + private String valueType; + /** + * 排序 + */ + private Integer sort; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java new file mode 100644 index 0000000..d48e0bd --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java @@ -0,0 +1,37 @@ +package com.iailab.module.model.matlab.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:10 + **/ +@Data +@TableName("t_ml_project") +public class MlProjectEntity { + + /** + * id + */ + private String id; + /** + * 项目名称 + */ + private String projectName; + /** + * 项目编码 + */ + private String projectCode; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java new file mode 100644 index 0000000..114ed2f --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java @@ -0,0 +1,27 @@ +package com.iailab.module.model.matlab.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:16 + **/ +@Data +@TableName("t_ml_project_model") +public class MlProjectModelEntity { + + /** + * id + */ + private String id; + /** + * 项目id + */ + private String projectId; + /** + * 模型id + */ + private String modelId; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java new file mode 100644 index 0000000..e31cce4 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java @@ -0,0 +1,20 @@ +package com.iailab.module.model.matlab.service; + +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.matlab.dto.MlModelMethodDTO; +import com.iailab.module.model.matlab.entity.MlModelMethodEntity; + +import java.util.List; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +public interface MlModelMethodService extends BaseService<MlModelMethodEntity> { + + void insertList(List<MlModelMethodDTO> modelMethods, String id); + + void deleteModelMethod(String modelId); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java new file mode 100644 index 0000000..3ceb4d6 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java @@ -0,0 +1,18 @@ +package com.iailab.module.model.matlab.service; + + +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity; + +import java.util.List; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +public interface MlModelMethodSettingService extends BaseService<MlModelMethodSettingEntity> { + + void insertList(List<MlModelMethodSettingEntity> settingEntities); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java new file mode 100644 index 0000000..fdc97ca --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java @@ -0,0 +1,44 @@ +package com.iailab.module.model.matlab.service; + + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.service.BaseService; +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException; +import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO; +import com.iailab.module.model.matlab.dto.MatlabRunDTO; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.entity.MlModelEntity; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +public interface MlModelService extends BaseService<MlModelEntity> { + PageData<MlModelDTO> page(Map<String, Object> params); + + List<MlModelDTO> list(Map<String, Object> params); + + MlModelDTO get(String id); + + void save(MlModelDTO dto); + + void update(MlModelDTO dto); + + void delete(String id); + + MatlabJarFileInfoDTO uploadJarFile(MultipartFile file) throws IllegalityJarException; + + CommonResult<String> test(MatlabRunDTO dto); + + List<HashMap<String, Object>> importData(MultipartFile file) throws IOException; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java new file mode 100644 index 0000000..afddf7f --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java @@ -0,0 +1,25 @@ +package com.iailab.module.model.matlab.service; + +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.dto.MlProjectModelDTO; +import com.iailab.module.model.matlab.entity.MlProjectModelEntity; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +public interface MlProjectModelService extends BaseService<MlProjectModelEntity> { + + List<MlProjectModelDTO> list(Map<String, Object> params); + + void deleteByMap(Map<String,Object> map); + + void create(List<MlModelDTO> models, String projectId); + + List<MlModelDTO> getProjectModel(Map<String, Object> params); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java new file mode 100644 index 0000000..72d4568 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java @@ -0,0 +1,34 @@ +package com.iailab.module.model.matlab.service; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.dto.MlProjectDTO; +import com.iailab.module.model.matlab.entity.MlProjectEntity; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +public interface MlProjectService extends BaseService<MlProjectEntity> { + PageData<MlProjectDTO> page(Map<String, Object> params); + + List<MlProjectDTO> list(Map<String, Object> params); + + MlProjectDTO get(String id); + + void save(MlProjectDTO dto); + + void update(MlProjectDTO dto); + + void delete(String id); + + PageData<MlModelDTO> getProjectModel(Map<String, Object> params); + + CommonResult<String> publish(Map<String, Object> params); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java new file mode 100644 index 0000000..96b9128 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java @@ -0,0 +1,60 @@ +package com.iailab.module.model.matlab.service.impl; + +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.matlab.dao.MlModelMethodDao; +import com.iailab.module.model.matlab.dto.MlModelMethodDTO; +import com.iailab.module.model.matlab.entity.MlModelMethodEntity; +import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity; +import com.iailab.module.model.matlab.service.MlModelMethodService; +import com.iailab.module.model.matlab.service.MlModelMethodSettingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Service +public class MlModelMethodServiceImpl extends BaseServiceImpl<MlModelMethodDao, MlModelMethodEntity> implements MlModelMethodService { + + @Autowired + private MlModelMethodSettingService mlModelMethodSettingService; + @Override + public void insertList(List<MlModelMethodDTO> list, String modelId) { + List<MlModelMethodEntity> methodEntities = new ArrayList<>(); + List<MlModelMethodSettingEntity> settingEntities = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + MlModelMethodEntity entity = ConvertUtils.sourceToTarget(list.get(i), MlModelMethodEntity.class); + String methodId = UUID.randomUUID().toString(); + entity.setId(methodId); + entity.setMlModelId(modelId); + entity.setSort(i); + methodEntities.add(entity); + if (!CollectionUtils.isEmpty(list.get(i).getMethodSettings())) { + List<MlModelMethodSettingEntity> settingEntityList = ConvertUtils.sourceToTarget(list.get(i).getMethodSettings(), MlModelMethodSettingEntity.class); + for (int j = 0; j < settingEntityList.size(); j++) { + MlModelMethodSettingEntity mlModelMethodSettingEntity = settingEntityList.get(j); + mlModelMethodSettingEntity.setId(UUID.randomUUID().toString()); + mlModelMethodSettingEntity.setMlModelMethodId(methodId); + mlModelMethodSettingEntity.setSort(j); + settingEntities.add(mlModelMethodSettingEntity); + } + } + } + baseDao.insert(methodEntities); + mlModelMethodSettingService.insertList(settingEntities); + } + + @Override + public void deleteModelMethod(String modelId) { + Map<String,Object> map = new HashMap<>(); + map.put("ml_model_id", modelId); + baseDao.deleteByMap(map); + } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java new file mode 100644 index 0000000..155c9b5 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java @@ -0,0 +1,25 @@ +package com.iailab.module.model.matlab.service.impl; + +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.module.model.matlab.dao.MlModelMethodSettingDao; +import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity; +import com.iailab.module.model.matlab.service.MlModelMethodSettingService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Service +public class MlModelMethodSettingServiceImpl extends BaseServiceImpl<MlModelMethodSettingDao, MlModelMethodSettingEntity> implements MlModelMethodSettingService { + + + @Override + public void insertList(List<MlModelMethodSettingEntity> settingEntities) { + baseDao.insert(settingEntities); + } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java new file mode 100644 index 0000000..2211a31 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java @@ -0,0 +1,287 @@ +package com.iailab.module.model.matlab.service.impl; + + +import cn.hutool.cache.CacheUtil; +import cn.hutool.cache.impl.FIFOCache; +import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.framework.security.core.util.SecurityFrameworkUtils; +import com.iailab.framework.tenant.core.context.TenantContextHolder; +import com.iailab.module.model.common.utils.DateUtils; +import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException; +import com.iailab.module.model.matlab.common.utils.MatlabUtils; +import com.iailab.module.model.matlab.dao.MlModelDao; +import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO; +import com.iailab.module.model.matlab.dto.MatlabRunDTO; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.entity.MlModelEntity; +import com.iailab.module.model.matlab.service.MlModelMethodService; +import com.iailab.module.model.matlab.service.MlModelService; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.iailab.module.model.mpk.common.utils.Readtxt; +import com.mathworks.toolbox.javabuilder.MWStructArray; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.URLClassLoader; +import java.util.*; + +import static com.iailab.framework.common.pojo.CommonResult.error; +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * + * + * @author Dzd + * @since 1.0.0 2025-02-08 + */ +@Slf4j +@Service +public class MlModelServiceImpl extends BaseServiceImpl<MlModelDao, MlModelEntity> implements MlModelService { + + @Value("${mablab.bak-file-path}") + private String mablabBakFilePath; + + @Autowired + private MlModelMethodService mlModelMethodService; + + // 先进先出缓存 临时保存导入的数据 + private static FIFOCache<String, String> cache = CacheUtil.newFIFOCache(100); + + @Override + public PageData<MlModelDTO> page(Map<String, Object> params) { + IPage<MlModelEntity> page = baseDao.selectPage( + getPage(params, "create_date", false), + getWrapper(params) + ); + + return getPageData(page, MlModelDTO.class); + } + + @Override + public List<MlModelDTO> list(Map<String, Object> params) { + List<MlModelDTO> list = baseDao.list(params); + + return list; + } + + private QueryWrapper<MlModelEntity> getWrapper(Map<String, Object> params) { + String modelName = (String) params.get("modelName"); + String modelFileName = (String) params.get("modelFileName"); + + QueryWrapper<MlModelEntity> wrapper = new QueryWrapper<>(); + wrapper.like(StringUtils.isNotBlank(modelName), "model_name", modelName) + .like(StringUtils.isNotBlank(modelFileName), "model_file_name", modelFileName); + return wrapper; + } + + @Override + public MlModelDTO get(String id) { + MlModelDTO entity = baseDao.get(id); + + return entity; + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void save(MlModelDTO dto) { + MlModelEntity entity = ConvertUtils.sourceToTarget(dto, MlModelEntity.class); + entity.setId(UUID.randomUUID().toString()); + entity.setModelFilePath(dto.getModelFilePath().trim()); + entity.setModelFileName(dto.getModelFileName().trim()); + entity.setCreator(SecurityFrameworkUtils.getLoginUserId()); + entity.setCreateDate(new Date()); + insert(entity); + + mlModelMethodService.insertList(dto.getModelMethods(), entity.getId()); + + saveJarFile(dto.getModelFilePath(),dto.getModelFileName()); + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void update(MlModelDTO dto) { + MlModelEntity entity = ConvertUtils.sourceToTarget(dto, MlModelEntity.class); + entity.setUpdater(SecurityFrameworkUtils.getLoginUserId()); + entity.setUpdateDate(new Date()); + updateById(entity); + mlModelMethodService.deleteModelMethod(entity.getId()); + mlModelMethodService.insertList(dto.getModelMethods(), entity.getId()); + + saveJarFile(dto.getModelFilePath(),dto.getModelFileName()); + } + + /** + * @description: 保存最新jar文件,用于测试运行 + * @author: dzd + * @date: 2025/2/24 16:25 + **/ + private void saveJarFile(String modelFilePath,String modelFileName) { + String matlabTenantBakFilePath = getMatlabTenantBakFilePath(); + + String jarBakPath = matlabTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + modelFileName + ".jar"; + FileUtil.copy(modelFilePath, jarBakPath, true); + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void delete(String id) { + + //删除源文件 + MlModelEntity MlModelEntity = selectById(id); + if (StringUtils.isNoneBlank(MlModelEntity.getModelFilePath())) { + File mpkFile = new File(MlModelEntity.getModelFilePath()); + if (mpkFile.exists()) { + mpkFile.delete(); + log.info("删除源文件备份文件:" + MlModelEntity.getModelFilePath()); + } + } + //删除 会级联删除掉关联表 + deleteById(id); + } + + @Override + public MatlabJarFileInfoDTO uploadJarFile(MultipartFile file) throws IllegalityJarException { + String matlabTenantBakFilePath = getMatlabTenantBakFilePath(); + File bakDir = new File(matlabTenantBakFilePath); + + String jarName = null; + File jarBakFile = null; + try { + String fileName = file.getOriginalFilename(); + jarName = fileName.substring(0, fileName.lastIndexOf(".")); + String pyName_time = jarName + "_" + DateUtils.format(new Date(),DateUtils.DATE_TIME_STRING); + jarBakFile = new File(bakDir.getAbsolutePath() + File.separator + pyName_time + ".jar"); + file.transferTo(jarBakFile); + } catch (IOException e) { + throw new RuntimeException("保存算法封装jar文件失败!"); + } + + //解析jar info + MatlabJarFileInfoDTO result = new MatlabJarFileInfoDTO(); + result.setFilePath(jarBakFile.getAbsolutePath()); + result.setFileName(jarName); + result.setClassInfos(MatlabUtils.parseJarInfo(jarBakFile.getAbsolutePath(),jarName)); + return result; + } + + @Override + public CommonResult<String> test(MatlabRunDTO dto) { + String matlabTenantBakFilePath = getMatlabTenantBakFilePath(); + + Class<?> clazz; + URLClassLoader classLoader; + try { + File jarFile = new File(matlabTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getModelFileName() + ".jar"); + if (!jarFile.exists()) { + throw new RuntimeException("jar包不存在,请检查。jarPath:" + jarFile.getAbsolutePath()); + } + // 加载jar包 + classLoader = MatlabUtils.loadJar(null,jarFile.getAbsolutePath()); + // 实现类 + clazz = classLoader.loadClass(dto.getClassName()); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("加载运行环境失败。"); + } + + try { + List<String> uuids = dto.getUuids(); + + Object[] paramsValueArray = new Object[uuids.size() + 1]; + + try { + for (int i = 0; i < uuids.size(); i++) { + String uuid = uuids.get(i); + if (!cache.containsKey(uuid)) { + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"请重新导入模型参数"); + } + JSONArray jsonArray = JSON.parseArray(cache.get(uuid)); + double[][] data = new double[jsonArray.size()][jsonArray.getJSONArray(0).size()]; + for (int j = 0; j < jsonArray.size(); j++) { + for (int k = 0; k < jsonArray.getJSONArray(j).size(); k++) { + data[j][k] = jsonArray.getJSONArray(j).getDoubleValue(k); + } + } + paramsValueArray[i] = data; + } + } catch (Exception e) { + e.printStackTrace(); + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"模型参数错误,请检查!"); + } + + MWStructArray mwStructArraySetting; + try { + + HashMap<String, Object> settings = MatlabUtils.handleModelSettings(dto.getModelSettings()); + mwStructArraySetting = MatlabUtils.convertMapToStruct(settings); + paramsValueArray[uuids.size()] = mwStructArraySetting; + } catch (Exception e) { + e.printStackTrace(); + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"模型设置错误,请检查!"); + } + + Class<?>[] paramsArray = new Class[2]; + paramsArray[0] = int.class; + paramsArray[1] = Object[].class; + Object[] objects = (Object[]) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), new Object[]{dto.getOutLength(), paramsValueArray}); + mwStructArraySetting.dispose(); + Map<String, Object> result = MatlabUtils.convertStructToMap((MWStructArray) objects[0]); + return success(JSON.toJSONString(result)); + } catch (Exception ex) { + ex.printStackTrace(); + return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常"); + } finally { + if (classLoader != null) { + MatlabUtils.unloadJar(classLoader); + } + } + } + + @Override + public List<HashMap<String, Object>> importData(MultipartFile file) throws IOException { + List<double[][]> datas = Readtxt.readMethodExcel(file); + List<HashMap<String,Object>> result = new ArrayList<>(); + if (!CollectionUtils.isEmpty(datas)) { + for (double[][] data : datas) { + if (data.length > 0) { + HashMap<String,Object> map = new HashMap<>(); + String uuid = UUID.randomUUID().toString(); + map.put("uuid",uuid); + map.put("data", JSON.toJSONString(data)); + cache.put(uuid,JSON.toJSONString(data)); + result.add(map); + } + } + } + return result; + } + + private String getMatlabTenantBakFilePath() { + Long tenantId = TenantContextHolder.getTenantId(); + // 备份文件夹 租户隔离 + String matlabTenantBakFilePath = mablabBakFilePath + File.separator + tenantId; + File bakDir = new File(matlabTenantBakFilePath); + if (!bakDir.exists()) { + bakDir.mkdirs(); + } + return matlabTenantBakFilePath; + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java new file mode 100644 index 0000000..168f641 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java @@ -0,0 +1,70 @@ +package com.iailab.module.model.matlab.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.matlab.dao.MlProjectModelDao; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.dto.MlProjectModelDTO; +import com.iailab.module.model.matlab.entity.MlProjectModelEntity; +import com.iailab.module.model.matlab.service.MlProjectModelService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Service +public class MlProjectModelServiceImpl extends BaseServiceImpl<MlProjectModelDao, MlProjectModelEntity> implements MlProjectModelService { + @Override + public List<MlProjectModelDTO> list(Map<String, Object> params) { + List<MlProjectModelEntity> entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, MlProjectModelDTO.class); + } + + @Override + public void deleteByMap(Map<String,Object> map) { + baseDao.delete(getWrapper(map)); + } + + @Override + public void create(List<MlModelDTO> models, String projectId) { + List<MlProjectModelEntity> list = new ArrayList<>(models.size()); + for (MlModelDTO model : models) { + MlProjectModelEntity projectModel = new MlProjectModelEntity(); + projectModel.setId(UUID.randomUUID().toString()); + projectModel.setProjectId(projectId); + projectModel.setModelId(model.getId()); + list.add(projectModel); + } + baseDao.insert(list); + } + + @Override + public List<MlModelDTO> getProjectModel(Map<String, Object> params) { + return baseDao.getProjectModel(params); + } + + public QueryWrapper<MlProjectModelEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String projectId = (String)params.get("projectId"); + String modelId = (String)params.get("modelId"); + + QueryWrapper<MlProjectModelEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id) + .eq(StringUtils.isNotBlank(projectId), "project_id", projectId) + .eq(StringUtils.isNotBlank(modelId),"model_id",modelId); + + return wrapper; + } + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java new file mode 100644 index 0000000..ca70a63 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java @@ -0,0 +1,192 @@ +package com.iailab.module.model.matlab.service.impl; + +import cn.hutool.core.io.FileUtil; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.matlab.common.utils.MatlabUtils; +import com.iailab.module.model.matlab.dao.MlModelDao; +import com.iailab.module.model.matlab.dao.MlProjectDao; +import com.iailab.module.model.matlab.dto.MlModelDTO; +import com.iailab.module.model.matlab.dto.MlProjectDTO; +import com.iailab.module.model.matlab.dto.MlProjectModelDTO; +import com.iailab.module.model.matlab.entity.MlProjectEntity; +import com.iailab.module.model.matlab.service.MlProjectModelService; +import com.iailab.module.model.matlab.service.MlProjectService; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.iailab.module.model.mpk.common.utils.DllUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.net.URLClassLoader; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @description: + * @author: dzd + * @date: 2025/2/25 14:45 + **/ +@Service +@Slf4j +public class MlProjectServiceImpl extends BaseServiceImpl<MlProjectDao, MlProjectEntity> implements MlProjectService { + + @Autowired + MlProjectModelService mlProjectModelService; + @Autowired + MlModelDao mlModelDao; + + @Value("${mablab.bak-file-path}") + private String mablabBakFilePath; + + @Override + public PageData<MlProjectDTO> page(Map<String, Object> params) { + IPage<MlProjectEntity> page = baseDao.selectPage( + getPage(params, null, false), + getWrapper(params) + ); + + return getPageData(page, MlProjectDTO.class); + } + + @Override + public List<MlProjectDTO> list(Map<String, Object> params) { + List<MlProjectEntity> entityList = baseDao.selectList(getWrapper(params).orderByDesc("create_time")); + + return ConvertUtils.sourceToTarget(entityList, MlProjectDTO.class); + } + + @Override + public MlProjectDTO get(String id) { + MlProjectEntity entity = baseDao.selectById(id); + MlProjectDTO dto = ConvertUtils.sourceToTarget(entity, MlProjectDTO.class); + + Map<String,Object> map = new HashMap<>(); + map.put("projectId",id); + List<MlProjectModelDTO> projectModelList = mlProjectModelService.list(map); + dto.setModels(projectModelList.stream().map(e -> { + MlModelDTO mlModelDTO = new MlModelDTO(); + mlModelDTO.setId(e.getModelId()); + return mlModelDTO; + }).collect(Collectors.toList())); + + return dto; + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void save(MlProjectDTO dto) { + MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class); + String projectId = UUID.randomUUID().toString(); + entity.setId(projectId); + entity.setCreateTime(new Date()); + insert(entity); + + //关联模型 + List<MlModelDTO> models = dto.getModels(); + if (CollectionUtils.isNotEmpty(models)) { + mlProjectModelService.create(models,projectId); + } + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void update(MlProjectDTO dto) { + MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class); + entity.setUpdateTime(new Date()); + updateById(entity); + + String projectId = dto.getId(); + //删除关联 + Map<String,Object> map = new HashMap<>(); + map.put("projectId",projectId); + mlProjectModelService.deleteByMap(map); + + //关联模型 + List<MlModelDTO> models = dto.getModels(); + if (CollectionUtils.isNotEmpty(models)) { + mlProjectModelService.create(models,projectId); + } + } + + @Override + @DSTransactional(rollbackFor = Exception.class) + public void delete(String id) { + //删除 (级联删除) + baseDao.deleteById(id); + } + + @Override + public PageData<MlModelDTO> getProjectModel(Map<String, Object> params) { + String projectId = (String) params.get("projectId"); + + int total = mlModelDao.getProjectModelCount(projectId); + if (total == 0) { + return new PageData<>(new ArrayList<>(), 0); + } + int page = Integer.parseInt((String) params.get("page")); + int pageSize = Integer.parseInt((String) params.get("pageSize")); + int offset = (page - 1)*pageSize; + params.put("offset",offset); + params.put("pageSize",pageSize); + List<MlModelDTO> list = mlModelDao.getProjectModel(params); + + return new PageData<>(list,total); + } + + @Override + public CommonResult<String> publish(Map<String, Object> params) { + String projectId = (String) params.get("projectId"); + + // 卸载上次发布的classloader 并删除发布备份文件 + MatlabUtils.removeClassLoaderCache(projectId); + MatlabUtils.removeOldFile(mablabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH,projectId); + + // 查询关联模型 + List<MlModelDTO> list = mlProjectModelService.getProjectModel(params); + // 将模型文件备份到发布文件 + String[] jarFilePaths = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + MlModelDTO mlModelDTO = list.get(i); + String jarFilePath = mablabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH + File.separator + projectId + MdkConstant.SPLIT + mlModelDTO.getId() + ".jar"; + FileUtil.copy(mlModelDTO.getModelFilePath(),jarFilePath,true); + jarFilePaths[i] = jarFilePath; + } + + // 加载新的jar,将classloader存入缓存 + URLClassLoader urlClassLoader = null; + try { + // 加载新的jar + urlClassLoader = MatlabUtils.loadJar(projectId,jarFilePaths); + } catch (Exception e) { + throw new RuntimeException("加载新的jar异常",e); + } + + + return CommonResult.success(); + } + + public QueryWrapper<MlProjectEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String projectName = (String)params.get("projectName"); + String projectCode = (String)params.get("projectCode"); + + QueryWrapper<MlProjectEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id) + .like(StringUtils.isNotBlank(projectName),"project_name",projectName) + .like(StringUtils.isNotBlank(projectCode),"project_code",projectCode); + + return wrapper; + } + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java index c1be4eb..195dcf0 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java @@ -23,6 +23,7 @@ List<MmItemOutputEntity> getByItemid(String itemId); MmItemOutputEntity getByItemid(String itemid, String resultstr, String resultIndex); + List<MmItemOutputEntity> getByItemid(String itemid, String resultstr, List<Integer> resultIndexs); void deleteByItemId(String itemId); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java index a93f01b..cd2e250 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java @@ -18,6 +18,8 @@ List<Object[]> getData(String outputId, Date predictTime, String timeFormat, int scale); + double[] getSimpleData(String outputId, Date predictTime, int predictLength); + void insert(List<MmItemResultJsonEntity> resultJsonList); void cleanResultJson(Map<String, Date> tMap); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java index 210c467..bc61c47 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java @@ -1,6 +1,5 @@ package com.iailab.module.model.mcs.pre.service; -import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mdk.vo.DataValueVO; import java.util.Date; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java index ecb19ba..fe4005a 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java @@ -72,6 +72,26 @@ } @Override + public double[] getSimpleData(String outputId, Date predictTime, int predictLength) { + double[] result = new double[predictLength]; + QueryWrapper<MmItemResultJsonEntity> wrapper = new QueryWrapper<>(); + wrapper.eq("outputid", outputId) + .eq("predicttime", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + MmItemResultJsonEntity data = baseDao.selectOne(wrapper); + if (data == null || StringUtils.isBlank(data.getJsonvalue())) { + return null; + } + List<Double> valueList = JSONArray.parseArray(data.getJsonvalue(), Double.class); + if (CollectionUtils.isEmpty(valueList)) { + return result; + } + for (int i = 0; i < predictLength; i++) { + result[i] = valueList.get(i); + } + return result; + } + + @Override public void insert(List<MmItemResultJsonEntity> resultJsonList) { baseDao.insertBatch(resultJsonList); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java index d6f9673..8611414 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java @@ -2,6 +2,11 @@ import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mcs.sche.entity.StAdjustResultEntity; +import com.iailab.module.model.mdk.vo.DataValueVO; + +import java.util.Date; +import java.util.List; +import java.util.Map; /** * @author PanZhibao @@ -9,4 +14,8 @@ * @createTime 2025年02月23日 */ public interface StAdjustResultService extends BaseService<StAdjustResultEntity> { + + void saveResult(Map<String, List<DataValueVO>> resultMap, Date predictTime, String adjustValue, String scheduleModelId); + + double[] getSimpleData(String outputId, Date predictTime, int predictLength); } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java index 1f93c8a..68c8485 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java @@ -1,11 +1,23 @@ package com.iailab.module.model.mcs.sche.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.date.DateUtils; import com.iailab.module.model.mcs.sche.dao.StAdjustResultDao; import com.iailab.module.model.mcs.sche.entity.StAdjustResultEntity; import com.iailab.module.model.mcs.sche.service.StAdjustResultService; +import com.iailab.module.model.mdk.vo.DataValueVO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; /** * @author PanZhibao @@ -15,4 +27,39 @@ @Slf4j @Service public class StAdjustResultServiceImpl extends BaseServiceImpl<StAdjustResultDao, StAdjustResultEntity> implements StAdjustResultService { + + @Override + public void saveResult(Map<String, List<DataValueVO>> resultMap, Date predictTime, String adjustValue, String scheduleModelId) { + for (Map.Entry<String, List<DataValueVO>> entry : resultMap.entrySet()) { + StAdjustResultEntity entity = new StAdjustResultEntity(); + entity.setId(UUID.randomUUID().toString()); + entity.setScheduleModelId(scheduleModelId); + entity.setAdjustTime(predictTime); + entity.setAdjustValue(adjustValue); + entity.setOutputId(entry.getKey()); + List<Double> jsonValueList = entry.getValue().stream().map(valueVO -> valueVO.getDataValue()).collect(Collectors.toList()); + entity.setAdjustValue(JSONArray.toJSONString(jsonValueList)); + baseDao.insert(entity); + } + } + + @Override + public double[] getSimpleData(String outputId, Date predictTime, int predictLength) { + double[] result = new double[predictLength]; + QueryWrapper<StAdjustResultEntity> wrapper = new QueryWrapper<>(); + wrapper.eq("output_id", outputId) + .eq("adjust_time", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + StAdjustResultEntity data = baseDao.selectOne(wrapper); + if (data == null || StringUtils.isBlank(data.getAdjustValue())) { + return null; + } + List<Double> valueList = JSONArray.parseArray(data.getAdjustValue(), Double.class); + if (CollectionUtils.isEmpty(valueList)) { + return result; + } + for (int i = 0; i < predictLength; i++) { + result[i] = valueList.get(i); + } + return result; + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java index 2c4cf78..bcc5f54 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java @@ -1,11 +1,14 @@ package com.iailab.module.model.mdk.predict; +import com.iailab.module.model.common.exception.ModelResultErrorException; import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum; import com.iailab.module.model.mdk.common.exceptions.ItemInvokeException; import com.iailab.module.model.mdk.vo.ItemVO; import com.iailab.module.model.mdk.vo.PredictResultVO; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import java.util.Date; +import java.util.List; import java.util.Map; /** @@ -20,8 +23,21 @@ * * @param predictTime * @param predictItemDto + * @param predictValueMap * @return * @throws ItemInvokeException */ PredictResultVO predict(Date predictTime, ItemVO predictItemDto, Map<String, double[]> predictValueMap) throws ItemInvokeException; + + /** + * 单个预测项预测(模拟调整) + * + * @param predictTime + * @param predictItemDto + * @param deviationList + * @return + * @throws ItemInvokeException + * @throws ModelResultErrorException + */ + PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList) throws ItemInvokeException, ModelResultErrorException; } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java index f173849..ef774fb 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java @@ -1,11 +1,12 @@ package com.iailab.module.model.mdk.predict; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import com.iailab.module.model.mcs.pre.entity.MmPredictModelEntity; -import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum; import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException; import com.iailab.module.model.mdk.vo.PredictResultVO; import java.util.Date; +import java.util.List; /** * @author PanZhibao @@ -31,8 +32,8 @@ * @param predictModel * @param itemName * @param itemNo - * @param deviation + * @param adjustValList * @return */ - PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, double[][] deviation) throws ModelInvokeException; + PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, List<StAdjustDeviationDTO> adjustValList) throws ModelInvokeException; } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java index 76d88ec..d0cfb77 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java @@ -1,5 +1,6 @@ package com.iailab.module.model.mdk.predict; +import com.alibaba.fastjson.JSONArray; import com.iailab.module.model.common.exception.ModelResultErrorException; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum; @@ -9,6 +10,7 @@ import com.iailab.module.model.mdk.factory.PredictItemFactory; import com.iailab.module.model.mdk.vo.ItemVO; import com.iailab.module.model.mdk.vo.PredictResultVO; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -45,14 +47,14 @@ * @param intervalTime * @return */ - public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime,Map<String, PredictResultVO> predictResultMap) { + public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime, Map<String, PredictResultVO> predictResultMap) { Map<String, double[]> predictValueMap = null; if (!CollectionUtils.isEmpty(predictResultMap)) { // 将predictResultMap处理成Map<outPutId, double[]> predictValueMap = new HashMap<>(); for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) { for (Map.Entry<MmItemOutputEntity, double[]> mmItemOutputEntityEntry : entry.getValue().getPredictMatrixs().entrySet()) { - predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(),mmItemOutputEntityEntry.getValue()); + predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(), mmItemOutputEntityEntry.getValue()); } } } @@ -63,10 +65,10 @@ calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) { - calendar.set(Calendar.MINUTE,0); - }else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) { - calendar.set(Calendar.MINUTE,0); - calendar.set(Calendar.HOUR_OF_DAY,0); + calendar.set(Calendar.MINUTE, 0); + } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) { + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); } PredictResultVO predictResult; if (!predictItem.getStatus().equals(ItemStatus.STATUS1.getCode())) { @@ -106,11 +108,6 @@ throw new RuntimeException("模型结果保存异常,result:" + predictResult); } itemRunStatusEnum = ItemRunStatusEnum.SUCCESS; -// long endSave = System.currentTimeMillis(); -// Long drtSave = endSave - end; -// log.info(MessageFormat.format("预测项:{0},保存时间:{1}ms", predictItem.getItemName(), -// drtSave)); -// totalDur = totalDur + drtSave; } catch (Exception e) { e.printStackTrace(); log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}", @@ -120,4 +117,29 @@ } } } + + public void predictAdjust(ItemVO predictItem, Date predictTime, List<StAdjustDeviationDTO> deviationList, String scheduleModelId) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(predictTime); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) { + calendar.set(Calendar.MINUTE, 0); + } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) { + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); + } + + try { + PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId()); + PredictResultVO predictResult = predictItemHandler.predictAdjust(calendar.getTime(), predictItem, deviationList); + + // 保存预测结果 + predictResultHandler.savePredictAdjustResult(predictResult, JSONArray.toJSONString(deviationList), scheduleModelId); + } catch (Exception e) { + e.printStackTrace(); + log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}", + predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime)); + } + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java index 89c3866..ebaee0f 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java @@ -4,11 +4,11 @@ import com.iailab.module.model.common.enums.CommonDict; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.service.MmItemResultService; +import com.iailab.module.model.mcs.sche.service.StAdjustResultService; import com.iailab.module.model.mdk.factory.ItemEntityFactory; import com.iailab.module.model.mdk.vo.DataValueVO; import com.iailab.module.model.mdk.vo.PredictResultVO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -23,6 +23,9 @@ @Autowired private ItemEntityFactory itemEntityFactory; + @Autowired + private StAdjustResultService stAdjustResultService; + /** * convertToPredictData * @@ -31,15 +34,9 @@ */ public Map<String, List<DataValueVO>> convertToPredictData(PredictResultVO predictResult) { Map<String, List<DataValueVO>> resultMap = new HashMap<>(); -// List<MmItemOutputEntity> itemOutPutList = itemEntityFactory.getOutPutByItemId(predictResult.getPredictId()); -// -// if (!CollectionUtils.isEmpty(predictResult.getPredictList())) { -// resultMap.put(itemOutPutList.get(0).getId(), predictResult.getPredictList()); -// return resultMap; -// } - Map<com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs(); - HashMap<String,List<DataValueVO>> predictLists = new HashMap<>(); - for (Map.Entry<com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) { + Map<MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs(); + HashMap<String, List<DataValueVO>> predictLists = new HashMap<>(); + for (Map.Entry<MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) { Integer rows = entry.getValue().length; List<DataValueVO> predictDataList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); @@ -57,7 +54,7 @@ //处理累计计算 if (entry.getKey().getIscumulant() == 1) { - resultMap.put(entry.getKey().getId() + CommonDict.CUMULANT_SUFFIX, new ArrayList<DataValueVO>(){{ + resultMap.put(entry.getKey().getId() + CommonDict.CUMULANT_SUFFIX, new ArrayList<DataValueVO>() {{ DataValueVO predictData = new DataValueVO(); // 时间 预测时间+预测长度*粒度 Calendar calendar = Calendar.getInstance(); @@ -111,6 +108,17 @@ mmItemResultService.savePredictValue(resultMap, predictResult.getLt(), "n", predictResult.getPredictTime()); } + /** + * savePredictAdjustResult + * + * @param predictResult + */ + @DSTransactional + public void savePredictAdjustResult(PredictResultVO predictResult, String adjustValue, String scheduleModelId) { + Map<String, List<DataValueVO>> resultMap = convertToPredictData(predictResult); + stAdjustResultService.saveResult(resultMap, predictResult.getPredictTime(), adjustValue, scheduleModelId); + } + public List<DataValueVO> getPredictValueByItemNo(String itemNo, Date start, Date end) { String itemId = itemEntityFactory.getItemByItemNo(itemNo).getId(); List<MmItemOutputEntity> outputList = itemEntityFactory.getOutPutByItemId(itemId); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java index 31d481e..cbcaf87 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java @@ -1,17 +1,16 @@ package com.iailab.module.model.mdk.predict.impl; import com.alibaba.fastjson.JSON; -import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.service.MmItemOutputService; -import com.iailab.module.model.mcs.pre.service.MmItemResultService; +import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService; +import com.iailab.module.model.mcs.sche.service.StAdjustResultService; import com.iailab.module.model.mdk.common.exceptions.ItemInvokeException; import com.iailab.module.model.mdk.factory.ItemEntityFactory; -import com.iailab.module.model.mdk.factory.PredictItemFactory; import com.iailab.module.model.mdk.predict.PredictItemHandler; -import com.iailab.module.model.mdk.predict.PredictResultHandler; import com.iailab.module.model.mdk.vo.ItemVO; import com.iailab.module.model.mdk.vo.PredictResultVO; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -32,19 +31,13 @@ private ItemEntityFactory itemEntityFactory; @Autowired - private DataPointApi dataPointApi; - - @Autowired - private PredictItemFactory predictItemFactory; - - @Autowired - private PredictResultHandler predictResultHandler; - - @Autowired - private MmItemResultService mmItemResultService; + private MmItemResultJsonService mmItemResultJsonService; @Autowired private MmItemOutputService mmItemOutputService; + + @Autowired + private StAdjustResultService stAdjustResultService; /** * MergeItem预测 @@ -66,74 +59,89 @@ String[] mathOutPutId = expression.split("[\\+ \\-]"); ArrayList<Character> operator = new ArrayList<>(); for (int i = 0; i < expression.length(); i++) { - if (expression.charAt(i)=='+' || expression.charAt(i)=='-'){ + if (expression.charAt(i) == '+' || expression.charAt(i) == '-') { operator.add(expression.charAt(i)); } } -// String[] compositionItem = expression.split(String.valueOf("&".toCharArray())); //是否为计算预测项 if (mathOutPutId.length > 1) { -// Map<String, List<DataValueVO>> predictValueMap = new HashMap<>(); -// for (String outPutId : mathOutPutId) { -// if (outPutId.length() > 4) { -// Date endTime = predictTime; -//// ItemVO itemEntity = itemEntityFactory.getItemByItemNo(itemNo); -//// List<MmItemOutputEntity> outPutList = itemEntityFactory.getOutPutByItemId(itemEntity.getId()); -// MmItemOutputEntity outPut = mmItemOutputService.getOutPutById(outPutId); -// ApiPointDTO pointEntity = dataPointApi.getInfoById(outPut.getPointid()); -// -// Calendar calendar = Calendar.getInstance(); -// calendar.setTime(endTime); -// calendar.add(Calendar.SECOND, (predictLength - 1) * DataPointFreqEnum.getEumByCode(pointEntity.getMinfreqid()).getValue()); -// endTime = new Timestamp(calendar.getTime().getTime()); -//// List<DataValueVO> predictValueList = predictResultHandler.getPredictValueByItemNo(itemNo, predictTime, endTime); -// List<DataValueVO> predictValueList = mmItemResultService.getPredictValue(outPutId, predictTime, endTime); -// if (predictValueList.size() != predictLength) { -// log.debug("merge项融合失败:缺少子项预测数据,对应子项outPutId=" + outPutId); -// return null; -// } -// predictValueMap.put(outPutId, predictValueList); -// } -// } - for (Integer i = 0; i < predictLength; i++) { - double sum =0.0; + double sum = 0.0; sum = predictValueMap.get(mathOutPutId[0])[i]; for (int j = 1; j < mathOutPutId.length; j++) { - if (operator.get(j-1)=='+') - {sum += predictValueMap.get(mathOutPutId[j])[i];} - if (operator.get(j-1)=='-') - {sum -= predictValueMap.get(mathOutPutId[j])[i];} + if (operator.get(j - 1) == '+') { + sum += predictValueMap.get(mathOutPutId[j])[i]; + } + if (operator.get(j - 1) == '-') { + sum -= predictValueMap.get(mathOutPutId[j])[i]; + } } predictResultMat[i] = sum; } } - //是否为组合预测项 -// if (compositionItem.length > 1) { -// Map<String, PredictResultVO> predictResultMap = new HashMap<>(); -// Integer columnTotalNumber = 0; -// Integer rowNumber = 0; -// for (String itemNo : compositionItem) { -// PredictItemHandler predictItem = (PredictItemHandler) predictItemFactory.create(itemEntityFactory. -// getItemByItemNo(itemNo).getId()); -// predictResult = predictItem.predict(predictTime, predictItemDto); -// columnTotalNumber += Integer.valueOf(predictResult.getPredictMatrix().length); -// predictResultMap.put(itemNo, predictItem.predict(predictTime, predictItemDto)); -// } -// double[][] matrix = new double[columnTotalNumber][1]; -// for (String itemNo : compositionItem) { -// for (Integer i = 0; i < predictResultMap.get(itemNo).getPredictMatrix().length; i++) { -// matrix[rowNumber][0] = predictResultMap.get(itemNo).getPredictMatrix()[i][0]; -// rowNumber++; -// } -// } -// predictResult.setPredictMatrix(matrix); -// } predictResult.setPredictId(itemId); List<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId); if (!CollectionUtils.isEmpty(outputServiceByItemid)) { Map<MmItemOutputEntity, double[]> predictMatrixs = new HashMap<>(); - predictMatrixs.put(outputServiceByItemid.get(0),predictResultMat); + predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat); + predictResult.setPredictMatrixs(predictMatrixs); + } + predictResult.setPredictTime(predictTime); + } catch (Exception e) { + log.error("merge项预测失败,itemId:" + itemId); + e.printStackTrace(); + throw e; + } + log.info("merge项预测完成,itemId:" + itemId + ",结果:" + JSON.toJSONString(predictResult)); + return predictResult; + } + + @Override + public PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList) + throws ItemInvokeException { + PredictResultVO predictResult = new PredictResultVO(); + String itemId = predictItemDto.getId(); + try { + String expression = itemEntityFactory.getMergeItem(itemId).getExpression(); + int predictLength = itemEntityFactory.getItemById(itemId).getPredictLength(); + double[] predictResultMat = new double[predictLength]; + String[] mathOutPutId = expression.split("[\\+ \\-]"); + ArrayList<Character> operator = new ArrayList<>(); + for (int i = 0; i < expression.length(); i++) { + if (expression.charAt(i) == '+' || expression.charAt(i) == '-') { + operator.add(expression.charAt(i)); + } + } + Map<String, double[]> predictValueMap = new HashMap<>(); + for (int k = 0; k < mathOutPutId.length; k++) { + String outPutId = mathOutPutId[k]; + double[] outPutValue = stAdjustResultService.getSimpleData(outPutId, predictTime, predictLength); + if (outPutValue == null) { + outPutValue = mmItemResultJsonService.getSimpleData(outPutId, predictTime, predictLength); + } + predictValueMap.put(outPutId, outPutValue); + } + + //是否为计算预测项 + if (mathOutPutId.length > 1) { + for (int i = 0; i < predictLength; i++) { + double sum = predictValueMap.get(mathOutPutId[0])[i]; + for (int j = 1; j < mathOutPutId.length; j++) { + if (operator.get(j - 1) == '+') { + sum += predictValueMap.get(mathOutPutId[j])[i]; + } + if (operator.get(j - 1) == '-') { + sum -= predictValueMap.get(mathOutPutId[j])[i]; + } + } + predictResultMat[i] = sum; + } + } + predictResult.setPredictId(itemId); + List<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId); + if (!CollectionUtils.isEmpty(outputServiceByItemid)) { + Map<MmItemOutputEntity, double[]> predictMatrixs = new HashMap<>(); + predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat); predictResult.setPredictMatrixs(predictMatrixs); } predictResult.setPredictTime(predictTime); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java index 6d5a0bb..6fdf115 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java @@ -10,11 +10,13 @@ import com.iailab.module.model.mdk.predict.PredictModelHandler; import com.iailab.module.model.mdk.vo.ItemVO; import com.iailab.module.model.mdk.vo.PredictResultVO; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.text.MessageFormat; import java.util.Date; +import java.util.List; import java.util.Map; /** @@ -59,4 +61,33 @@ } return predictResult; } + + /** + * NormalItem预测 + * + * @param predictTime + * @param predictItemDto + * @return + * @throws ItemInvokeException + */ + @Override + public PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList) throws ItemInvokeException,ModelResultErrorException { + PredictResultVO predictResult = new PredictResultVO(); + String itemId = predictItemDto.getId(); + try { + MmPredictModelEntity predictModel = mmPredictModelService.getActiveModelByItemId(itemId); + if (predictModel == null) { + throw new ModelInvokeException(MessageFormat.format("{0},itemId={1}", + ModelInvokeException.errorGetModelEntity, itemId)); + } + predictResult = predictModelHandler.predictByModel(predictTime, predictModel,predictItemDto.getItemName(),predictItemDto.getItemNo(), deviationList); + predictResult.setPredictId(itemId); + } catch (ModelResultErrorException ex) { + throw ex; + } catch (Exception ex) { + throw new ItemInvokeException(MessageFormat.format("{0},itemId={1}", + ItemInvokeException.errorItemFailed, itemId)); + } + return predictResult; + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java index 466ee10..7e0ac4b 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.iail.model.IAILModel; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import com.iailab.module.model.enums.CommonConstant; import com.iailab.module.model.common.enums.OutResultType; import com.iailab.module.model.common.exception.ModelResultErrorException; @@ -55,7 +56,7 @@ * @throws ModelInvokeException */ @Override - public synchronized PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo) throws ModelInvokeException { + public PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel, String itemName, String itemNo) throws ModelInvokeException { PredictResultVO result = new PredictResultVO(); if (predictModel == null) { throw new ModelInvokeException("modelEntity is null"); @@ -72,7 +73,7 @@ HashMap<String, Object> settings = getPredictSettingsByModelId(modelId); // 校验setting必须有pyFile,否则可能导致程序崩溃 if (!settings.containsKey(MdkConstant.PY_FILE_KEY)) { - throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!"); + throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!"); } if (settings == null) { @@ -87,12 +88,7 @@ param2Values[portLength] = newModelBean.getDataMap().get("models"); param2Values[portLength + 1] = settings; - log.info("####################### 预测模型 "+ "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################"); -// JSONObject jsonObjNewModelBean = new JSONObject(); -// jsonObjNewModelBean.put("newModelBean", newModelBean); -// log.info(String.valueOf(jsonObjNewModelBean)); -// JSONObject jsonObjParam2Values = new JSONObject(); -// jsonObjParam2Values.put("param2Values", param2Values); + log.info("####################### 预测模型 " + "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################"); log.info("参数: " + JSON.toJSONString(param2Values)); //IAILMDK.run @@ -157,18 +153,19 @@ * @param predictModel * @param itemName * @param itemNo + * @param deviationList * @return * @throws ModelInvokeException */ @Override - public synchronized PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, double[][] deviation) throws ModelInvokeException { + public PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel, String itemName, String itemNo, List<StAdjustDeviationDTO> deviationList) throws ModelInvokeException { PredictResultVO result = new PredictResultVO(); if (predictModel == null) { throw new ModelInvokeException("modelEntity is null"); } String modelId = predictModel.getId(); try { - List<SampleData> sampleDataList = sampleConstructor.constructSample(TypeA.Predict.name(), modelId, predictTime, itemName, new HashMap<>()); + List<SampleData> sampleDataList = sampleConstructor.constructSample(TypeA.Predict.name(), modelId, predictTime, itemName, new HashMap<>(), deviationList); String modelPath = predictModel.getModelpath(); if (modelPath == null) { log.info("模型路径不存在,modelId=" + modelId); @@ -178,7 +175,7 @@ HashMap<String, Object> settings = getPredictSettingsByModelId(modelId); // 校验setting必须有pyFile,否则可能导致程序崩溃 if (!settings.containsKey(MdkConstant.PY_FILE_KEY)) { - throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!"); + throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!"); } if (settings == null) { @@ -193,7 +190,7 @@ param2Values[portLength] = newModelBean.getDataMap().get("models"); param2Values[portLength + 1] = settings; - log.info("####################### 模拟调整 "+ "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################"); + log.info("####################### 模拟调整 " + "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################"); log.info("参数: " + JSON.toJSONString(param2Values)); //IAILMDK.run @@ -247,6 +244,7 @@ } return result; } + /** * 构造IAILMDK.run()方法的newModelBean参数 * diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java index cfe224f..9968c29 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java @@ -89,8 +89,7 @@ } } - int deviationIndex = 0; - + int portIdx = 0; //对每个爪分别进行计算 for (ColumnItemPort entry : sampleInfo.getColumnInfo()) { double[][] matrix = new double[0][0]; @@ -107,7 +106,7 @@ if (!CollectionUtils.isEmpty(indItemValueList)) { matrix = new double[entry.getDataLength()][0]; if (indItemValueList.size() > entry.getDataLength()) { - indItemValueList = indItemValueList.subList(0,entry.getDataLength()); + indItemValueList = indItemValueList.subList(0, entry.getDataLength()); } for (int i = 0; i < indItemValueList.size(); i++) { String stringValue = indItemValueList.get(i).getDataValue().toString(); @@ -115,7 +114,7 @@ matrix[i] = asciiArray; } } - }else { + } else { //先依据爪内数据项的modelParamOrder进行排序——重写comparator匿名函数 Collections.sort(entry.getColumnItemList(), new Comparator<ColumnItem>() { @Override @@ -132,33 +131,23 @@ } } - //找出对应的调整值 - double[] deviationItem = null; - if (sampleInfo.getDeviation() != null && sampleInfo.getDeviation().length > 0) { - deviationItem = sampleInfo.getDeviation()[deviationIndex]; - } - deviationIndex ++; - //对每一项依次进行数据查询,然后将查询出的值赋给matrix对应的位置 for (int i = 0; i < entry.getColumnItemList().size(); i++) { try { - List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap,indMap); + List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap, indMap); - //设置调整值 - if (deviationItem != null && deviationItem.length > 0) { - logger.info("设置调整值, i = " + i); - if (deviationItem[i] <= 0) { - continue; - } - for(int dataKey = 1; dataKey < dataEntityList.size(); dataKey ++) { + double adjustVal = SampleInfo.getAdjustValueFromDeviation(portIdx, i, sampleInfo.getDeviation()); + if (adjustVal != 0) { + logger.info("设置调整值adjustVal:" + adjustVal); + for (int dataKey = 1; dataKey < dataEntityList.size(); dataKey++) { DataValueVO item = dataEntityList.get(dataKey); - item.setDataValue(item.getDataValue() + deviationItem[i]); + item.setDataValue(item.getDataValue() + adjustVal); } } //补全数据 ColumnItem columnItem = entry.getColumnItemList().get(i); - dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(),columnItem.getGranularity()); + dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(), columnItem.getGranularity()); /** 如果数据取不满,把缺失的数据点放在后面 */ if (dataEntityList != null && dataEntityList.size() != 0) { @@ -175,6 +164,8 @@ throw e; } } + + portIdx++; } SampleData sampleData = new SampleData(); sampleData.setMatrix(matrix); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java index c50083b..d2c8240 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java @@ -1,13 +1,12 @@ package com.iailab.module.model.mdk.sample; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException; -import com.iailab.module.model.mdk.sample.dto.ColumnItemPort; import com.iailab.module.model.mdk.sample.dto.SampleData; import com.iailab.module.model.mdk.sample.dto.SampleInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.util.Date; @@ -46,11 +45,11 @@ } public List<SampleData> constructSample(String typeA, String modelId, Date runTime,String itemName, - Map<Integer, Integer> dynamicDataLength, double[][] deviation) throws ModelInvokeException { + Map<Integer, Integer> dynamicDataLength, List<StAdjustDeviationDTO> deviationList) throws ModelInvokeException { try { SampleInfoConstructor sampleInfoConstructor = sampleFactory.createSampleInfo(typeA, modelId); SampleInfo sampleInfo = sampleInfoConstructor.prepareSampleInfo(modelId, runTime, dynamicDataLength); - sampleInfo.setDeviation(deviation); + sampleInfo.setDeviation(deviationList); SampleDataConstructor sampleDataConstructor = sampleFactory.createSampleData(typeA); return sampleDataConstructor.prepareSampleData(sampleInfo); } catch (Exception e) { diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java index fe54b94..7d4b804 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java @@ -3,10 +3,12 @@ import com.iailab.module.data.api.ind.dto.ApiIndItemDTO; import com.iailab.module.data.api.plan.dto.ApiPlanItemDTO; import com.iailab.module.data.api.point.dto.ApiPointDTO; +import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.sql.Timestamp; @@ -34,11 +36,23 @@ private Integer sampleCycle; // 调整值 - private double[][] deviation; + private List<StAdjustDeviationDTO> deviation; // 所有测点信息,避免重复查询 private Map<String, ApiPointDTO> pointMap; // 所有计划数据信息,避免重复查询 private Map<String, ApiPlanItemDTO> planMap; // 所有计划数据信息,避免重复查询 private Map<String, ApiIndItemDTO> indMap; + + public static double getAdjustValueFromDeviation(int portIdx, int paramIdx, List<StAdjustDeviationDTO> deviation) { + if (CollectionUtils.isEmpty(deviation)) { + return 0; + } + for (StAdjustDeviationDTO deviationItem : deviation) { + if (deviationItem.getPortIdx() == portIdx && deviationItem.getParamIdx() == paramIdx) { + return deviationItem.getValue(); + } + } + return 0; + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java new file mode 100644 index 0000000..4d0e127 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java @@ -0,0 +1,20 @@ +package com.iailab.module.model.mdk.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author PanZhibao + * @Description + * @createTime 2025年02月24日 + */ +@Schema(description = "模型服务 - 模拟调整值 DTO") +@Data +public class StAdjustDeviationDTO { + + private int portIdx; + + private int paramIdx; + + private double value; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java index f141bdf..0c592b3 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java @@ -347,7 +347,7 @@ String jarSavePath = pkgJar(dirPath.getAbsolutePath()); //备份jar文件,用于后续运行 String jarBakPath = mpkTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + entity.getPyName() + ".jar"; - FileUtil.mkParentDirs(dllBakPath); + FileUtil.mkParentDirs(jarBakPath); FileUtil.copy(jarSavePath, jarBakPath, true); // 打zip包 String zipPath = mpkTenantBakFilePath + File.separator + zipFileName; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/application-dev.yaml b/iailab-module-model/iailab-module-model-biz/src/main/resources/application-dev.yaml index 5618692..487f2b7 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/resources/application-dev.yaml +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/application-dev.yaml @@ -52,6 +52,8 @@ bak-file-path: D:\DLUT\mpkBakFile bak-resources: D:\DLUT\mpkResources model-file-path: D:\DLUT\MDK\Model\miail\ +mablab: + bak-file-path: D:\DLUT\matlabBakFile influx-db: org: iailab diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml b/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml index e675b9c..8a2efe3 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml @@ -222,6 +222,11 @@ - t_mpk_pack - t_mm_item_status - t_electricity_price_segmented + - t_ml_model + - t_ml_model_method + - t_ml_model_method_setting + - t_ml_project + - t_ml_project_model app: app-key: model app-secret: 85b0df7edc3df3611913df34ed695011 diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml new file mode 100644 index 0000000..57dc09e --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > +<mapper namespace="com.iailab.module.model.matlab.dao.MlModelDao"> + <resultMap type="com.iailab.module.model.matlab.dto.MlModelDTO" id="mlModelMap"> + <result property="id" column="id"/> + <result property="modelName" column="model_name"/> + <result property="modelFileName" column="model_file_name"/> + <result property="modelFilePath" column="model_file_path"/> + <result property="modelType" column="model_type"/> + <result property="matlabPlatform" column="matlab_platform"/> + <result property="matlabVersion" column="matlab_version"/> + <result property="remark" column="remark"/> + <result property="creator" column="creator"/> + <result property="createDate" column="create_date"/> + <result property="updater" column="updater"/> + <result property="updateDate" column="update_date"/> + <collection property="modelMethods" ofType="com.iailab.module.model.matlab.dto.MlModelMethodDTO"> + <id property="id" column="method_id"/> + <result property="className" column="class_name"/> + <result property="methodName" column="method_name"/> + <result property="dataLength" column="data_length"/> + <result property="outLength" column="out_length"/> + <collection property="methodSettings" ofType="com.iailab.module.model.matlab.dto.MlModelMethodSettingDTO"> + <id property="id" column="setting_id"/> + <result property="name" column="setting_name"/> + <result property="settingKey" column="setting_key"/> + <result property="settingValue" column="setting_value"/> + <result property="valueType" column="value_type"/> + </collection> + </collection> + </resultMap> + + <select id="list" resultMap="mlModelMap" parameterType="java.util.Map"> + SELECT + a.*, + b.id method_id, + b.class_name, + b.method_name, + b.data_length, + b.out_length, + c.id setting_id, + c.NAME setting_name, + c.setting_key, + c.setting_value, + c.value_type + FROM + t_ml_model a + LEFT JOIN t_ml_model_method b ON a.id = b.ml_model_id + LEFT JOIN t_ml_model_method_setting c ON b.id = c.ml_model_method_id + <where> + <if test="params.modelType != null and params.modelType != ''"> + AND a.model_type = #{params.modelType} + </if> + </where> + ORDER BY + a.create_date, + b.sort, + c.sort + </select> + <select id="get" resultMap="mlModelMap" parameterType="java.lang.String"> + SELECT + a.*, + b.id method_id, + b.class_name, + b.method_name, + b.data_length, + b.out_length, + c.id setting_id, + c.NAME setting_name, + c.setting_key, + c.setting_value, + c.value_type + FROM + t_ml_model a + LEFT JOIN t_ml_model_method b ON a.id = b.ml_model_id + LEFT JOIN t_ml_model_method_setting c ON b.id = c.ml_model_method_id + WHERE a.id = #{id} + ORDER BY b.sort,c.sort + </select> + <select id="getProjectModelCount" resultType="java.lang.Integer" parameterType="java.lang.String"> + SELECT + count(*) + FROM + t_ml_project_model + WHERE + project_id = #{projectId} + </select> + <select id="getProjectModel" resultMap="mlModelMap" parameterType="java.util.Map"> + SELECT + t3.*, + t4.id method_id, + t4.class_name, + t4.method_name, + t4.data_length, + t4.out_length, + t5.id setting_id, + t5.setting_key, + t5.name setting_name, + t5.setting_value, + t5.value_type + FROM + ( + SELECT + t2.* + FROM + t_ml_project_model t1 + LEFT JOIN t_ml_model t2 ON t1.model_id = t2.id + WHERE + t1.project_id = #{params.projectId} + <if test="params.modelFileName != null and params.modelFileName != ''"> + AND t2.model_file_name LIKE CONCAT('%',#{params.modelFileName},'%') + </if> + ORDER BY + t2.create_date DESC + LIMIT #{params.offset},#{params.pageSize} + ) t3 + LEFT JOIN t_ml_model_method t4 ON t3.id = t4.ml_model_id + LEFT JOIN t_ml_model_method_setting t5 ON t4.id = t5.ml_model_method_id + </select> +</mapper> \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml new file mode 100644 index 0000000..a14eab5 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > +<mapper namespace="com.iailab.module.model.matlab.dao.MlProjectModelDao"> + <select id="getProjectModel" resultType="com.iailab.module.model.matlab.dto.MlModelDTO"> + SELECT + t2.id, + t2.model_file_path + FROM + t_ml_project_model t1 + LEFT JOIN t_ml_model t2 ON t1.model_id = t2.id + WHERE + t1.project_id = #{params.projectId} + </select> +</mapper> \ No newline at end of file -- Gitblit v1.9.3