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 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 implements MlProjectService { @Autowired MlProjectModelService mlProjectModelService; @Autowired MlModelDao mlModelDao; @Value("${matlab.bak-file-path}") private String matlabBakFilePath; @Override public PageData page(Map params) { IPage page = baseDao.selectPage( getPage(params, null, false), getWrapper(params) ); return getPageData(page, MlProjectDTO.class); } @Override public List list(Map params) { List 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 map = new HashMap<>(); map.put("projectId",id); List 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 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 map = new HashMap<>(); map.put("projectId",projectId); mlProjectModelService.deleteByMap(map); //关联模型 List 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 getProjectModel(Map 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 list = mlModelDao.getProjectModel(params); return new PageData<>(list,total); } @Override public CommonResult publish(Map params) { String projectId = (String) params.get("projectId"); // 卸载上次发布的classloader 并删除发布备份文件 MatlabUtils.removeClassLoaderCache(projectId); MatlabUtils.removeOldFile(matlabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH,projectId); // 查询关联模型 List 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 = matlabBakFilePath + 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 getWrapper(Map params){ String id = (String)params.get("id"); String projectName = (String)params.get("projectName"); String projectCode = (String)params.get("projectCode"); QueryWrapper 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; } }