dengzedong
2025-02-28 087ffca4b35243b40659f25cfd5c1284f2d520d6
提交 | 用户 | 时间
3e61b6 1 package com.iailab.module.model.matlab.service.impl;
D 2
3 import cn.hutool.core.io.FileUtil;
4 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 import com.baomidou.mybatisplus.core.metadata.IPage;
7 import com.iailab.framework.common.page.PageData;
8 import com.iailab.framework.common.pojo.CommonResult;
9 import com.iailab.framework.common.service.impl.BaseServiceImpl;
10 import com.iailab.framework.common.util.object.ConvertUtils;
11 import com.iailab.module.model.matlab.common.utils.MatlabUtils;
12 import com.iailab.module.model.matlab.dao.MlModelDao;
13 import com.iailab.module.model.matlab.dao.MlProjectDao;
14 import com.iailab.module.model.matlab.dto.MlModelDTO;
15 import com.iailab.module.model.matlab.dto.MlProjectDTO;
16 import com.iailab.module.model.matlab.dto.MlProjectModelDTO;
17 import com.iailab.module.model.matlab.entity.MlProjectEntity;
18 import com.iailab.module.model.matlab.service.MlProjectModelService;
19 import com.iailab.module.model.matlab.service.MlProjectService;
20 import com.iailab.module.model.mpk.common.MdkConstant;
21 import lombok.extern.slf4j.Slf4j;
22 import org.apache.commons.collections.CollectionUtils;
23 import org.apache.commons.lang3.StringUtils;
24 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.beans.factory.annotation.Value;
26 import org.springframework.stereotype.Service;
27
28 import java.io.File;
29 import java.net.URLClassLoader;
30 import java.util.*;
31 import java.util.stream.Collectors;
32
33 /**
34  * @description:
35  * @author: dzd 
36  * @date: 2025/2/25 14:45
37  **/
38 @Service
39 @Slf4j
40 public class MlProjectServiceImpl extends BaseServiceImpl<MlProjectDao, MlProjectEntity> implements MlProjectService {
41
42     @Autowired
43     MlProjectModelService mlProjectModelService;
44     @Autowired
45     MlModelDao mlModelDao;
46
087ffc 47     @Value("${matlab.bak-file-path}")
D 48     private String matlabBakFilePath;
3e61b6 49
D 50     @Override
51     public PageData<MlProjectDTO> page(Map<String, Object> params) {
52         IPage<MlProjectEntity> page = baseDao.selectPage(
53                 getPage(params, null, false),
54                 getWrapper(params)
55         );
56
57         return getPageData(page, MlProjectDTO.class);
58     }
59
60     @Override
61     public List<MlProjectDTO> list(Map<String, Object> params) {
62         List<MlProjectEntity> entityList = baseDao.selectList(getWrapper(params).orderByDesc("create_time"));
63
64         return ConvertUtils.sourceToTarget(entityList, MlProjectDTO.class);
65     }
66
67     @Override
68     public MlProjectDTO get(String id) {
69         MlProjectEntity entity = baseDao.selectById(id);
70         MlProjectDTO dto = ConvertUtils.sourceToTarget(entity, MlProjectDTO.class);
71
72         Map<String,Object> map = new HashMap<>();
73         map.put("projectId",id);
74         List<MlProjectModelDTO> projectModelList = mlProjectModelService.list(map);
75         dto.setModels(projectModelList.stream().map(e -> {
76             MlModelDTO mlModelDTO = new MlModelDTO();
77             mlModelDTO.setId(e.getModelId());
78             return mlModelDTO;
79         }).collect(Collectors.toList()));
80
81         return dto;
82     }
83
84     @Override
85     @DSTransactional(rollbackFor = Exception.class)
86     public void save(MlProjectDTO dto) {
87         MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class);
88         String projectId = UUID.randomUUID().toString();
89         entity.setId(projectId);
90         entity.setCreateTime(new Date());
91         insert(entity);
92
93         //关联模型
94         List<MlModelDTO> models = dto.getModels();
95         if (CollectionUtils.isNotEmpty(models)) {
96             mlProjectModelService.create(models,projectId);
97         }
98     }
99
100     @Override
101     @DSTransactional(rollbackFor = Exception.class)
102     public void update(MlProjectDTO dto) {
103         MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class);
104         entity.setUpdateTime(new Date());
105         updateById(entity);
106
107         String projectId = dto.getId();
108         //删除关联
109         Map<String,Object> map = new HashMap<>();
110         map.put("projectId",projectId);
111         mlProjectModelService.deleteByMap(map);
112
113         //关联模型
114         List<MlModelDTO> models = dto.getModels();
115         if (CollectionUtils.isNotEmpty(models)) {
116             mlProjectModelService.create(models,projectId);
117         }
118     }
119
120     @Override
121     @DSTransactional(rollbackFor = Exception.class)
122     public void delete(String id) {
123         //删除 (级联删除)
124         baseDao.deleteById(id);
125     }
126
127     @Override
128     public PageData<MlModelDTO> getProjectModel(Map<String, Object> params) {
129         String projectId = (String) params.get("projectId");
130
131         int total = mlModelDao.getProjectModelCount(projectId);
132         if (total == 0) {
133             return new PageData<>(new ArrayList<>(), 0);
134         }
135         int page = Integer.parseInt((String) params.get("page"));
136         int pageSize = Integer.parseInt((String) params.get("pageSize"));
137         int offset = (page - 1)*pageSize;
138         params.put("offset",offset);
139         params.put("pageSize",pageSize);
140         List<MlModelDTO> list =  mlModelDao.getProjectModel(params);
141
142         return new PageData<>(list,total);
143     }
144
145     @Override
146     public CommonResult<String> publish(Map<String, Object> params) {
147         String projectId = (String) params.get("projectId");
148
149         // 卸载上次发布的classloader 并删除发布备份文件
150         MatlabUtils.removeClassLoaderCache(projectId);
087ffc 151         MatlabUtils.removeOldFile(matlabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH,projectId);
3e61b6 152
D 153         // 查询关联模型
154         List<MlModelDTO> list = mlProjectModelService.getProjectModel(params);
155         // 将模型文件备份到发布文件
156         String[] jarFilePaths = new String[list.size()];
157         for (int i = 0; i < list.size(); i++) {
158             MlModelDTO mlModelDTO = list.get(i);
087ffc 159             String jarFilePath = matlabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH + File.separator + projectId + MdkConstant.SPLIT + mlModelDTO.getId() + ".jar";
3e61b6 160             FileUtil.copy(mlModelDTO.getModelFilePath(),jarFilePath,true);
D 161             jarFilePaths[i] = jarFilePath;
162         }
163
164         // 加载新的jar,将classloader存入缓存
165         URLClassLoader urlClassLoader = null;
166         try {
167             // 加载新的jar
168             urlClassLoader = MatlabUtils.loadJar(projectId,jarFilePaths);
169         } catch (Exception e) {
170             throw new RuntimeException("加载新的jar异常",e);
171         }
172
173
174         return CommonResult.success();
175     }
176
177     public QueryWrapper<MlProjectEntity> getWrapper(Map<String, Object> params){
178         String id = (String)params.get("id");
179         String projectName = (String)params.get("projectName");
180         String projectCode = (String)params.get("projectCode");
181
182         QueryWrapper<MlProjectEntity> wrapper = new QueryWrapper<>();
183         wrapper.eq(StringUtils.isNotBlank(id), "id", id)
184                 .like(StringUtils.isNotBlank(projectName),"project_name",projectName)
185                 .like(StringUtils.isNotBlank(projectCode),"project_code",projectCode);
186
187         return wrapper;
188     }
189
190
191 }