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;
|
}
|
|
|
}
|