| @@ -19,7 +19,7 @@ const Settings: ProLayoutProps & { | |||||
| title: '智能软件开发平台', | title: '智能软件开发平台', | ||||
| pwa: true, | pwa: true, | ||||
| logo: '/assets/images/left-top-logo.png', | logo: '/assets/images/left-top-logo.png', | ||||
| iconfontUrl: '//at.alicdn.com/t/c/font_4511326_ndnvm4elll.js', | |||||
| iconfontUrl: '//at.alicdn.com/t/c/font_4511326_2511riex401.js', | |||||
| token: { | token: { | ||||
| // 参见ts声明,demo 见文档,通过token 修改样式 | // 参见ts声明,demo 见文档,通过token 修改样式 | ||||
| //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F | //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F | ||||
| @@ -151,14 +151,18 @@ body { | |||||
| height: 46px; | height: 46px; | ||||
| padding: 1px 11px; | padding: 1px 11px; | ||||
| } | } | ||||
| .ant-input-textarea-affix-wrapper.ant-input-affix-wrapper{ | |||||
| padding: 0; | |||||
| } | |||||
| .ant-modal .ant-select-single { | .ant-modal .ant-select-single { | ||||
| height: 46px; | height: 46px; | ||||
| } | } | ||||
| .ant-modal .ant-select-single .ant-select-selector .ant-select-selection-placeholder { | .ant-modal .ant-select-single .ant-select-selector .ant-select-selection-placeholder { | ||||
| line-height: 46px; | line-height: 46px; | ||||
| } | } | ||||
| .ant-menu-light.ant-menu-inline .ant-menu-item{ | |||||
| color:#575757; | |||||
| } | |||||
| .ant-modal .ant-modal-close-x { | .ant-modal .ant-modal-close-x { | ||||
| width: 26px; | width: 26px; | ||||
| height: 26px; | height: 26px; | ||||
| @@ -389,6 +389,7 @@ const Dataset = () => { | |||||
| > | > | ||||
| 上传文件 | 上传文件 | ||||
| </Button> | </Button> | ||||
| <div className={Styles.tipContent}>只允许上传.zip,.tgz格式文件</div> | |||||
| </Upload> | </Upload> | ||||
| </Form.Item> | </Form.Item> | ||||
| </Form> | </Form> | ||||
| @@ -60,10 +60,26 @@ const Dataset = () => { | |||||
| <div className={Styles.datasetTopBox}></div> | <div className={Styles.datasetTopBox}></div> | ||||
| <div className={Styles.datasetAllBox}> | <div className={Styles.datasetAllBox}> | ||||
| <Tabs defaultActiveKey="1"> | <Tabs defaultActiveKey="1"> | ||||
| <TabPane tab="数据广场" key="1"> | |||||
| <TabPane | |||||
| tab="数据广场" | |||||
| key="1" | |||||
| icon={ | |||||
| <svg className="icon" style={{ width: '14px', height: '14px' }} aria-hidden="true"> | |||||
| <use xlinkHref="#icon-shujujiguangchang"></use> | |||||
| </svg> | |||||
| } | |||||
| > | |||||
| <PublicData /> | <PublicData /> | ||||
| </TabPane> | </TabPane> | ||||
| <TabPane tab="个人数据" key="2"> | |||||
| <TabPane | |||||
| tab="个人数据" | |||||
| key="2" | |||||
| icon={ | |||||
| <svg className="icon" style={{ width: '14px', height: '14px' }} aria-hidden="true"> | |||||
| <use xlinkHref="#icon-gerenshujuji"></use> | |||||
| </svg> | |||||
| } | |||||
| > | |||||
| <PersonalData /> | <PersonalData /> | ||||
| </TabPane> | </TabPane> | ||||
| </Tabs> | </Tabs> | ||||
| @@ -291,6 +291,10 @@ | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| .tipContent{ | |||||
| color: #c73131; | |||||
| margin-top: 5px; | |||||
| } | |||||
| .modal { | .modal { | ||||
| :global { | :global { | ||||
| .ant-modal-content { | .ant-modal-content { | ||||
| @@ -468,6 +468,7 @@ const PublicData = (React.FC = () => { | |||||
| > | > | ||||
| 上传文件 | 上传文件 | ||||
| </Button> | </Button> | ||||
| <div className={Styles.tipContent}>只允许上传.zip,.tgz格式文件</div> | |||||
| </Upload> | </Upload> | ||||
| </Form.Item> | </Form.Item> | ||||
| </Form> | </Form> | ||||
| @@ -59,10 +59,26 @@ const Dataset = () => { | |||||
| <div className={Styles.datasetTopBox}></div> | <div className={Styles.datasetTopBox}></div> | ||||
| <div className={Styles.datasetAllBox}> | <div className={Styles.datasetAllBox}> | ||||
| <Tabs defaultActiveKey="1"> | <Tabs defaultActiveKey="1"> | ||||
| <TabPane tab="模型广场" key="1"> | |||||
| <TabPane | |||||
| tab="模型广场" | |||||
| key="1" | |||||
| icon={ | |||||
| <svg className="icon" style={{ width: '14px', height: '14px' }} aria-hidden="true"> | |||||
| <use xlinkHref="#icon-shujujiguangchang"></use> | |||||
| </svg> | |||||
| } | |||||
| > | |||||
| <PublicData /> | <PublicData /> | ||||
| </TabPane> | </TabPane> | ||||
| <TabPane tab="个人模型" key="2"> | |||||
| <TabPane | |||||
| tab="个人模型" | |||||
| key="2" | |||||
| icon={ | |||||
| <svg className="icon" style={{ width: '14px', height: '14px' }} aria-hidden="true"> | |||||
| <use xlinkHref="#icon-gerenshujuji"></use> | |||||
| </svg> | |||||
| } | |||||
| > | |||||
| <PersonalData /> | <PersonalData /> | ||||
| </TabPane> | </TabPane> | ||||
| </Tabs> | </Tabs> | ||||
| @@ -281,6 +281,10 @@ | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| .tipContent{ | |||||
| color: #c73131; | |||||
| margin-top: 5px; | |||||
| } | |||||
| .modal { | .modal { | ||||
| :global { | :global { | ||||
| .ant-modal-content { | .ant-modal-content { | ||||
| @@ -375,7 +375,7 @@ const Dataset = () => { | |||||
| }, | }, | ||||
| ]} | ]} | ||||
| > | > | ||||
| <Upload {...props} data={{ uuid: uuid }} accept=".zip,.tgz"> | |||||
| <Upload {...props} data={{ uuid: uuid }}> | |||||
| <Button | <Button | ||||
| style={{ | style={{ | ||||
| fontSize: '14px', | fontSize: '14px', | ||||
| @@ -503,7 +503,7 @@ const PublicData = () => { | |||||
| /> | /> | ||||
| </Form.Item> | </Form.Item> | ||||
| <Form.Item label="模型文件" name="models_version_vos"> | <Form.Item label="模型文件" name="models_version_vos"> | ||||
| <Upload {...props} data={{ uuid: uuid }} accept=".zip,.tgz"> | |||||
| <Upload {...props} data={{ uuid: uuid }}> | |||||
| <Button | <Button | ||||
| style={{ | style={{ | ||||
| fontSize: '14px', | fontSize: '14px', | ||||
| @@ -60,6 +60,8 @@ function patchRouteItems(route: any, menu: any, parentPath: string) { | |||||
| element: React.createElement(lazy(() => import('@/pages/' + path))), | element: React.createElement(lazy(() => import('@/pages/' + path))), | ||||
| path: parentPath + menuItem.path, | path: parentPath + menuItem.path, | ||||
| }; | }; | ||||
| console.log(newRoute); | |||||
| route.children.push(newRoute); | route.children.push(newRoute); | ||||
| route.routes.push(newRoute); | route.routes.push(newRoute); | ||||
| } | } | ||||
| @@ -72,7 +74,10 @@ export function patchRouteWithRemoteMenus(routes: any) { | |||||
| } | } | ||||
| let proLayout = null; | let proLayout = null; | ||||
| for (const routeItem of routes) { | for (const routeItem of routes) { | ||||
| if (routeItem.id === 'ant-design-pro-layout') { | if (routeItem.id === 'ant-design-pro-layout') { | ||||
| proLayout = routeItem; | proLayout = routeItem; | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -96,6 +101,7 @@ export async function refreshToken() { | |||||
| } | } | ||||
| export function convertCompatRouters(childrens: API.RoutersMenuItem[]): any[] { | export function convertCompatRouters(childrens: API.RoutersMenuItem[]): any[] { | ||||
| return childrens.map((item: API.RoutersMenuItem) => { | return childrens.map((item: API.RoutersMenuItem) => { | ||||
| return { | return { | ||||
| path: item.path, | path: item.path, | ||||
| @@ -129,6 +135,7 @@ export function getMatchMenuItem( | |||||
| ): MenuDataItem[] { | ): MenuDataItem[] { | ||||
| if (!menuData) return []; | if (!menuData) return []; | ||||
| let items: MenuDataItem[] = []; | let items: MenuDataItem[] = []; | ||||
| menuData.forEach((item) => { | menuData.forEach((item) => { | ||||
| if (item.path) { | if (item.path) { | ||||
| if (item.path === path) { | if (item.path === path) { | ||||
| @@ -142,9 +149,12 @@ export function getMatchMenuItem( | |||||
| const subpath = path.substr(item.path.length + 1); | const subpath = path.substr(item.path.length + 1); | ||||
| const subItem: MenuDataItem[] = getMatchMenuItem(subpath, item.routes); | const subItem: MenuDataItem[] = getMatchMenuItem(subpath, item.routes); | ||||
| items = items.concat(subItem); | items = items.concat(subItem); | ||||
| } else { | } else { | ||||
| const paths = path.split('/'); | const paths = path.split('/'); | ||||
| if (paths.length >= 2 && paths[0] === item.path && paths[1] === 'index') { | if (paths.length >= 2 && paths[0] === item.path && paths[1] === 'index') { | ||||
| console.log(item); | |||||
| items.push(item); | items.push(item); | ||||
| } | } | ||||
| } | } | ||||
| @@ -17,9 +17,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; | |||||
| @EnableRyFeignClients | @EnableRyFeignClients | ||||
| @SpringBootApplication | @SpringBootApplication | ||||
| @EnableScheduling | @EnableScheduling | ||||
| public class | |||||
| RuoYiManagementPlatformApplication { | |||||
| public class RuoYiManagementPlatformApplication { | |||||
| public static void main(String[] args) { | public static void main(String[] args) { | ||||
| SpringApplication.run(RuoYiManagementPlatformApplication.class, args); | SpringApplication.run(RuoYiManagementPlatformApplication.class, args); | ||||
| System.out.println("(♥◠‿◠)ノ゙ 复杂智能软件管理平台启动成功 ლ(´ڡ`ლ)゙ \n" + | System.out.println("(♥◠‿◠)ノ゙ 复杂智能软件管理平台启动成功 ლ(´ڡ`ლ)゙ \n" + | ||||
| @@ -4,7 +4,7 @@ import com.ruoyi.common.core.web.controller.BaseController; | |||||
| import com.ruoyi.common.core.web.domain.GenericsAjaxResult; | import com.ruoyi.common.core.web.domain.GenericsAjaxResult; | ||||
| import com.ruoyi.platform.domain.DatasetVersion; | import com.ruoyi.platform.domain.DatasetVersion; | ||||
| import com.ruoyi.platform.service.DatasetVersionService; | import com.ruoyi.platform.service.DatasetVersionService; | ||||
| import com.ruoyi.platform.vo.LabelDatasetVersion; | |||||
| import com.ruoyi.platform.vo.LabelDatasetVersionVo; | |||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| @@ -138,8 +138,10 @@ public class DatasetVersionController extends BaseController { | |||||
| @PostMapping("/addDatasetVersionsFromLabel") | @PostMapping("/addDatasetVersionsFromLabel") | ||||
| @ApiOperation("从数据标注添加数据集版本") | @ApiOperation("从数据标注添加数据集版本") | ||||
| public GenericsAjaxResult<Boolean> addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersion labelDatasetVersion) throws Exception { | |||||
| return genericsSuccess(true); | |||||
| public GenericsAjaxResult<?> addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersionVo labelDatasetVersionVo) throws Exception { | |||||
| datasetVersionService.addDatasetVersionsFromLabel(labelDatasetVersionVo); | |||||
| return GenericsAjaxResult.success(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -62,7 +62,7 @@ public interface ExperimentDao { | |||||
| * @return 影响行数 | * @return 影响行数 | ||||
| * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 | * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 | ||||
| */ | */ | ||||
| int insertOrUpdateBatch(@Param("entities") List<Experiment> entities); | |||||
| int insertOrUpdateBatch(List<Experiment> entities); | |||||
| /** | /** | ||||
| * 修改数据 | * 修改数据 | ||||
| @@ -62,7 +62,7 @@ public interface ExperimentInsDao { | |||||
| * @return 影响行数 | * @return 影响行数 | ||||
| * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 | * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参 | ||||
| */ | */ | ||||
| int insertOrUpdateBatch(@Param("entities") List<ExperimentIns> entities); | |||||
| int insertOrUpdateBatch(List<ExperimentIns> entities); | |||||
| /** | /** | ||||
| * 修改数据 | * 修改数据 | ||||
| @@ -92,5 +92,7 @@ public interface ExperimentInsDao { | |||||
| List<ExperimentIns> queryByExperiment(@Param("experimentIns") ExperimentIns experimentIns); | List<ExperimentIns> queryByExperiment(@Param("experimentIns") ExperimentIns experimentIns); | ||||
| List<ExperimentIns> queryByExperimentId(Integer id); | List<ExperimentIns> queryByExperimentId(Integer id); | ||||
| List<ExperimentIns> queryByExperimentIsNotTerminated(); | |||||
| } | } | ||||
| @@ -0,0 +1,97 @@ | |||||
| package com.ruoyi.platform.scheduling; | |||||
| import com.ruoyi.common.security.utils.SecurityUtils; | |||||
| import com.ruoyi.platform.domain.Experiment; | |||||
| import com.ruoyi.platform.domain.ExperimentIns; | |||||
| import com.ruoyi.platform.mapper.ExperimentDao; | |||||
| import com.ruoyi.platform.mapper.ExperimentInsDao; | |||||
| import com.ruoyi.platform.service.ExperimentInsService; | |||||
| import com.ruoyi.platform.service.ExperimentService; | |||||
| import com.ruoyi.platform.utils.JsonUtils; | |||||
| import com.ruoyi.system.api.model.LoginUser; | |||||
| import io.swagger.models.auth.In; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.scheduling.annotation.Scheduled; | |||||
| import org.springframework.stereotype.Component; | |||||
| import javax.annotation.Resource; | |||||
| import java.io.IOException; | |||||
| import java.util.*; | |||||
| import java.util.stream.Collectors; | |||||
| @Component() | |||||
| public class ExperimentInstanceStatusTask { | |||||
| @Autowired | |||||
| private ExperimentInsService experimentInsService; | |||||
| @Resource | |||||
| private ExperimentDao experimentDao; | |||||
| @Resource | |||||
| private ExperimentInsDao experimentInsDao; | |||||
| private List<Integer> experimentIds = new ArrayList<>(); | |||||
| @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 | |||||
| public void executeExperimentInsStatus() throws IOException { | |||||
| // 首先查到所有非终止态的实验实例 | |||||
| List<ExperimentIns> experimentInsList = experimentInsService.queryByExperimentIsNotTerminated(); | |||||
| // 去argo查询状态 | |||||
| List<ExperimentIns> updateList = new ArrayList<>(); | |||||
| if (experimentInsList != null && experimentInsList.size() > 0) { | |||||
| for (ExperimentIns experimentIns : experimentInsList) { | |||||
| //当原本状态为null或非终止态时才调用argo接口 | |||||
| String oldStatus = experimentIns.getStatus(); | |||||
| try { | |||||
| experimentIns = experimentInsService.queryStatusFromArgo(experimentIns); | |||||
| }catch (Exception e){ | |||||
| experimentIns.setStatus("Failed"); | |||||
| } | |||||
| if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){ | |||||
| experimentIns.setUpdateTime(new Date()); | |||||
| synchronized (experimentIds) { | |||||
| experimentIds.add(experimentIns.getExperimentId()); // 线程安全的添加操作 | |||||
| } | |||||
| updateList.add(experimentIns); | |||||
| } | |||||
| experimentInsDao.update(experimentIns); | |||||
| } | |||||
| } | |||||
| if (updateList.size() > 0){ | |||||
| experimentInsDao.insertOrUpdateBatch(updateList); | |||||
| } | |||||
| } | |||||
| @Scheduled(cron = "0/30 * * * * ?") // / 每30S执行一次 | |||||
| public void executeExperimentStatus() throws IOException { | |||||
| if (experimentIds.size()==0){ | |||||
| return; | |||||
| } | |||||
| // 存储需要更新的实验对象列表 | |||||
| List<Experiment> updateExperiments = new ArrayList<>(); | |||||
| for (Integer experimentId : experimentIds){ | |||||
| // 获取当前实验的所有实例列表 | |||||
| List<ExperimentIns> insList = experimentInsService.getByExperimentId(experimentId); | |||||
| List<String> statusList = new ArrayList<String>(); | |||||
| // 更新实验状态列表 | |||||
| for (int i=0;i<insList.size();i++){ | |||||
| statusList.add(insList.get(i).getStatus()); | |||||
| } | |||||
| String subStatus = statusList.toString().substring(1, statusList.toString().length() - 1); | |||||
| Experiment experiment = experimentDao.queryById(experimentId); | |||||
| // 如果实验状态列表发生变化,则更新实验对象,并加入到需要更新的列表中 | |||||
| if (!StringUtils.equals(subStatus,experiment.getStatusList())){ | |||||
| experiment.setStatusList(subStatus); | |||||
| updateExperiments.add(experiment); | |||||
| } | |||||
| } | |||||
| if (!updateExperiments.isEmpty()) { | |||||
| experimentDao.insertOrUpdateBatch(updateExperiments); | |||||
| for (int index = 0; index < updateExperiments.size(); index++) { | |||||
| synchronized (experimentIds) { | |||||
| experimentIds.remove(index); // 线程安全的删除操作 | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,11 +1,8 @@ | |||||
| package com.ruoyi.platform.service; | package com.ruoyi.platform.service; | ||||
| import com.ruoyi.platform.domain.Dataset; | |||||
| import com.ruoyi.platform.domain.DatasetVersion; | import com.ruoyi.platform.domain.DatasetVersion; | ||||
| import com.ruoyi.platform.vo.LabelDatasetVersion; | |||||
| import com.ruoyi.platform.vo.LabelDatasetVersionVo; | |||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| @@ -75,5 +72,6 @@ public interface DatasetVersionService { | |||||
| String addDatasetVersions(List<DatasetVersion> datasetVersions) throws Exception; | String addDatasetVersions(List<DatasetVersion> datasetVersions) throws Exception; | ||||
| void addDatasetVersionsFromLabel(LabelDatasetVersion labelDatasetVersion) throws Exception; | |||||
| void | |||||
| addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception; | |||||
| } | } | ||||
| @@ -98,4 +98,9 @@ public interface ExperimentInsService { | |||||
| String getRealtimePodLogFromPod(PodLogVo podLogVo); | String getRealtimePodLogFromPod(PodLogVo podLogVo); | ||||
| /** | |||||
| * 查询非终止态的实例 | |||||
| * @return | |||||
| */ | |||||
| List<ExperimentIns> queryByExperimentIsNotTerminated(); | |||||
| } | } | ||||
| @@ -4,6 +4,7 @@ import org.springframework.core.io.InputStreamResource; | |||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||
| import java.io.InputStream; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| @@ -11,5 +12,5 @@ public interface MinioService { | |||||
| ResponseEntity<InputStreamResource> downloadZipFile(String bucketName , String path); | ResponseEntity<InputStreamResource> downloadZipFile(String bucketName , String path); | ||||
| Map<String, String> uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception; | Map<String, String> uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception; | ||||
| void uploaInputStream(String bucketName, String objectName, InputStream inputStream ) throws Exception; | |||||
| } | } | ||||
| @@ -20,6 +20,7 @@ import com.ruoyi.platform.vo.DatasetVo; | |||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import io.minio.messages.Item; | import io.minio.messages.Item; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Value; | |||||
| import org.springframework.core.io.InputStreamResource; | import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageImpl; | import org.springframework.data.domain.PageImpl; | ||||
| @@ -67,7 +68,8 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| private MinioService minioService; | private MinioService minioService; | ||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | |||||
| @Value("${minio.dataReleaseBucketName}") | |||||
| private String bucketName; | |||||
| @Resource | @Resource | ||||
| private MinioUtil minioUtil; | private MinioUtil minioUtil; | ||||
| @@ -359,6 +361,7 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| // Now we know there's another dataset with the same name | // Now we know there's another dataset with the same name | ||||
| Field[] fields = Dataset.class.getDeclaredFields(); | Field[] fields = Dataset.class.getDeclaredFields(); | ||||
| for (Field field : fields) { | for (Field field : fields) { | ||||
| field.setAccessible(true); // Make private fields accessible | field.setAccessible(true); // Make private fields accessible | ||||
| @@ -1,17 +1,20 @@ | |||||
| package com.ruoyi.platform.service.impl; | package com.ruoyi.platform.service.impl; | ||||
| import com.ruoyi.common.core.utils.DateUtils; | |||||
| import com.ruoyi.common.security.utils.SecurityUtils; | import com.ruoyi.common.security.utils.SecurityUtils; | ||||
| import com.ruoyi.platform.annotations.CheckDuplicate; | import com.ruoyi.platform.annotations.CheckDuplicate; | ||||
| import com.ruoyi.platform.domain.Dataset; | import com.ruoyi.platform.domain.Dataset; | ||||
| import com.ruoyi.platform.domain.DatasetVersion; | import com.ruoyi.platform.domain.DatasetVersion; | ||||
| import com.ruoyi.platform.domain.ModelsVersion; | |||||
| import com.ruoyi.platform.domain.Workflow; | |||||
| import com.ruoyi.platform.mapper.DatasetDao; | |||||
| import com.ruoyi.platform.mapper.DatasetVersionDao; | import com.ruoyi.platform.mapper.DatasetVersionDao; | ||||
| import com.ruoyi.platform.service.DatasetVersionService; | import com.ruoyi.platform.service.DatasetVersionService; | ||||
| import com.ruoyi.platform.service.MinioService; | |||||
| import com.ruoyi.platform.utils.FileUtil; | |||||
| import com.ruoyi.platform.utils.HttpUtils; | import com.ruoyi.platform.utils.HttpUtils; | ||||
| import com.ruoyi.platform.vo.LabelDatasetVersion; | |||||
| import com.ruoyi.platform.vo.LabelDatasetVersionVo; | |||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Value; | |||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageImpl; | import org.springframework.data.domain.PageImpl; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| @@ -35,9 +38,13 @@ import java.util.Map; | |||||
| public class DatasetVersionServiceImpl implements DatasetVersionService { | public class DatasetVersionServiceImpl implements DatasetVersionService { | ||||
| @Resource | @Resource | ||||
| private DatasetVersionDao datasetVersionDao; | private DatasetVersionDao datasetVersionDao; | ||||
| @Resource | |||||
| private DatasetDao datasetDao; | |||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | |||||
| @Value("${minio.dataReleaseBucketName}") | |||||
| private String bucketName; | |||||
| @Resource | |||||
| private MinioService minioService; | |||||
| /** | /** | ||||
| * 通过ID查询单条数据 | * 通过ID查询单条数据 | ||||
| * | * | ||||
| @@ -198,12 +205,31 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void addDatasetVersionsFromLabel(LabelDatasetVersion labelDatasetVersion) throws Exception{ | |||||
| public void addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception{ | |||||
| Dataset dataset = datasetDao.queryById(labelDatasetVersionVo.getDataset_id()); | |||||
| if (dataset == null){ | |||||
| throw new Exception("数据集不存在"); | |||||
| } | |||||
| // 获取label-studio数据流 | // 获取label-studio数据流 | ||||
| InputStream inputStream = HttpUtils.getInputStream("http://127.0.0.1:8080/api/projects/"+labelDatasetVersion.getProject_id()+"/export?exportType="+labelDatasetVersion.getExportType(), labelDatasetVersion.getToken()); | |||||
| // 上传镜像至minio | |||||
| Map<String, String> headers = new HashMap<String, String>(); | |||||
| headers.put("Authorization","Token "+labelDatasetVersionVo.getToken()); | |||||
| InputStream inputStream = HttpUtils.getIntputStream("http://127.0.0.1:8080/api/projects/"+labelDatasetVersionVo.getProject_id()+"/export?exportType="+labelDatasetVersionVo.getExportType(), headers); | |||||
| // 构建objectName | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| String url = username + "/" + DateUtils.dateTimeNow() + "/" + dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType(); | |||||
| String objectName = "datasets/" + url; | |||||
| String formattedSize = FileUtil.formatFileSize(inputStream.available()); | |||||
| minioService.uploaInputStream(bucketName,objectName,inputStream); | |||||
| //保存DatasetVersion | //保存DatasetVersion | ||||
| DatasetVersion datasetVersion = new DatasetVersion(); | |||||
| datasetVersion.setVersion(labelDatasetVersionVo.getVersion()); | |||||
| datasetVersion.setDatasetId(labelDatasetVersionVo.getDataset_id()); | |||||
| datasetVersion.setFileName(dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType()); | |||||
| datasetVersion.setFileSize(formattedSize); | |||||
| datasetVersion.setUrl(url); | |||||
| datasetVersion.setDescription(labelDatasetVersionVo.getDesc()); | |||||
| this.insert(datasetVersion); | |||||
| } | } | ||||
| private void insertPrepare(DatasetVersion datasetVersion) throws Exception { | private void insertPrepare(DatasetVersion datasetVersion) throws Exception { | ||||
| @@ -71,14 +71,16 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { | |||||
| @Override | @Override | ||||
| public ExperimentIns queryById(Integer id) throws IOException { | public ExperimentIns queryById(Integer id) throws IOException { | ||||
| ExperimentIns experimentIns = this.experimentInsDao.queryById(id); | ExperimentIns experimentIns = this.experimentInsDao.queryById(id); | ||||
| if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { | |||||
| experimentIns = this.queryStatusFromArgo(experimentIns); | |||||
| //只有当新状态是终止态时才更新数据库 | |||||
| if (isTerminatedState(experimentIns)) { | |||||
| //同时更新各个节点 | |||||
| this.update(experimentIns); | |||||
| } | |||||
| } | |||||
| //已经迁移至定时任务进行更新操作 | |||||
| // if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { | |||||
| // experimentIns = this.queryStatusFromArgo(experimentIns); | |||||
| // //只有当新状态是终止态时才更新数据库 | |||||
| // if (isTerminatedState(experimentIns)) { | |||||
| // //同时更新各个节点 | |||||
| // this.update(experimentIns); | |||||
| // } | |||||
| // } | |||||
| return experimentIns; | return experimentIns; | ||||
| } | } | ||||
| @@ -93,40 +95,42 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { | |||||
| @Override | @Override | ||||
| public List<ExperimentIns> getByExperimentId(Integer experimentId) throws IOException { | public List<ExperimentIns> getByExperimentId(Integer experimentId) throws IOException { | ||||
| List<ExperimentIns> experimentInsList = experimentInsDao.getByExperimentId(experimentId); | List<ExperimentIns> experimentInsList = experimentInsDao.getByExperimentId(experimentId); | ||||
| //搞个标记,当状态改变才去改表 | |||||
| boolean flag = false; | |||||
| List<ExperimentIns> result = new ArrayList<ExperimentIns>(); | |||||
| if (experimentInsList!=null && experimentInsList.size()>0) { | |||||
| for (ExperimentIns experimentIns : experimentInsList) { | |||||
| //当原本状态为null或非终止态时才调用argo接口 | |||||
| if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { | |||||
| experimentIns = this.queryStatusFromArgo(experimentIns); | |||||
| if (!flag){ | |||||
| flag = true; | |||||
| } | |||||
| //只有当新状态是终止态时才更新数据库 | |||||
| if (isTerminatedState(experimentIns)) { | |||||
| //同时更新各个节点 | |||||
| this.update(experimentIns); | |||||
| } | |||||
| } | |||||
| //新增查询tensorBoard容器状态 | |||||
| result.add(experimentIns); | |||||
| } | |||||
| } | |||||
| if (flag) { | |||||
| List<String> statusList = new ArrayList<String>(); | |||||
| // 更新实验状态列表 | |||||
| for (int i=0;i<result.size();i++){ | |||||
| statusList.add(result.get(i).getStatus()); | |||||
| } | |||||
| Experiment experiment = experimentDao.queryById(experimentId); | |||||
| experiment.setStatusList(statusList.toString().substring(1, statusList.toString().length()-1)); | |||||
| experimentDao.update(experiment); | |||||
| } | |||||
| return result; | |||||
| //代码全部迁移至定时任务 | |||||
| //搞个标记,当状态改变才去改表 | |||||
| // boolean flag = false; | |||||
| // List<ExperimentIns> result = new ArrayList<ExperimentIns>(); | |||||
| // if (experimentInsList!=null && experimentInsList.size()>0) { | |||||
| // for (ExperimentIns experimentIns : experimentInsList) { | |||||
| // //当原本状态为null或非终止态时才调用argo接口 | |||||
| // if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { | |||||
| // experimentIns = this.queryStatusFromArgo(experimentIns); | |||||
| // if (!flag){ | |||||
| // flag = true; | |||||
| // } | |||||
| // //只有当新状态是终止态时才更新数据库 | |||||
| // if (isTerminatedState(experimentIns)) { | |||||
| // //同时更新各个节点 | |||||
| // this.update(experimentIns); | |||||
| // } | |||||
| // } | |||||
| // | |||||
| // //新增查询tensorBoard容器状态 | |||||
| // result.add(experimentIns); | |||||
| // } | |||||
| // } | |||||
| // if (flag) { | |||||
| // List<String> statusList = new ArrayList<String>(); | |||||
| // // 更新实验状态列表 | |||||
| // for (int i=0;i<result.size();i++){ | |||||
| // statusList.add(result.get(i).getStatus()); | |||||
| // } | |||||
| // Experiment experiment = experimentDao.queryById(experimentId); | |||||
| // experiment.setStatusList(statusList.toString().substring(1, statusList.toString().length()-1)); | |||||
| // experimentDao.update(experiment); | |||||
| // } | |||||
| return experimentInsList; | |||||
| } | } | ||||
| @@ -141,15 +145,15 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { | |||||
| public Page<ExperimentIns> queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) throws IOException { | public Page<ExperimentIns> queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) throws IOException { | ||||
| long total = this.experimentInsDao.count(experimentIns); | long total = this.experimentInsDao.count(experimentIns); | ||||
| List<ExperimentIns> experimentInsList = this.experimentInsDao.queryAllByLimit(experimentIns, pageRequest); | List<ExperimentIns> experimentInsList = this.experimentInsDao.queryAllByLimit(experimentIns, pageRequest); | ||||
| if (experimentInsList!=null && experimentInsList.size()>0) { | |||||
| for (ExperimentIns ins : experimentInsList) { | |||||
| //如果实验实例不为空或者 | |||||
| if (ins != null && StringUtils.isEmpty(ins.getStatus())) { | |||||
| ins = this.queryStatusFromArgo(ins); | |||||
| this.update(ins); | |||||
| } | |||||
| } | |||||
| } | |||||
| // if (experimentInsList!=null && experimentInsList.size()>0) { | |||||
| // for (ExperimentIns ins : experimentInsList) { | |||||
| // //如果实验实例不为空或者 | |||||
| // if (ins != null && StringUtils.isEmpty(ins.getStatus())) { | |||||
| // ins = this.queryStatusFromArgo(ins); | |||||
| // this.update(ins); | |||||
| // } | |||||
| // } | |||||
| // } | |||||
| return new PageImpl<>(experimentInsList, pageRequest, total); | return new PageImpl<>(experimentInsList, pageRequest, total); | ||||
| } | } | ||||
| @@ -524,6 +528,11 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { | |||||
| return k8sClientUtil.getPodLogs(podLogVo.getPodName(), podLogVo.getNamespace(),podLogVo.getContainerName(), logsLines); | return k8sClientUtil.getPodLogs(podLogVo.getPodName(), podLogVo.getNamespace(),podLogVo.getContainerName(), logsLines); | ||||
| } | } | ||||
| @Override | |||||
| public List<ExperimentIns> queryByExperimentIsNotTerminated() { | |||||
| return experimentInsDao.queryByExperimentIsNotTerminated(); | |||||
| } | |||||
| private boolean isTerminatedState(ExperimentIns ins) throws IOException { | private boolean isTerminatedState(ExperimentIns ins) throws IOException { | ||||
| // 定义终止态的列表,例如 "Succeeded", "Failed" 等 | // 定义终止态的列表,例如 "Succeeded", "Failed" 等 | ||||
| String status = ins.getStatus(); | String status = ins.getStatus(); | ||||
| @@ -256,8 +256,9 @@ public class ExperimentServiceImpl implements ExperimentService { | |||||
| experimentIns.setExperimentId(experiment.getId()); | experimentIns.setExperimentId(experiment.getId()); | ||||
| experimentIns.setArgoInsNs((String) metadata.get("namespace")); | experimentIns.setArgoInsNs((String) metadata.get("namespace")); | ||||
| experimentIns.setArgoInsName((String) metadata.get("name")); | experimentIns.setArgoInsName((String) metadata.get("name")); | ||||
| //传入实验全局参数 | |||||
| experimentIns.setStatus("Pending"); | |||||
| //传入实验全局参数 | |||||
| experimentIns.setGlobalParam(experiment.getGlobalParam()); | experimentIns.setGlobalParam(experiment.getGlobalParam()); | ||||
| @@ -69,4 +69,9 @@ public class MinioServiceImpl implements MinioService { | |||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| @Override | |||||
| public void uploaInputStream(String bucketName, String objectName, InputStream inputStream ) throws Exception { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| } | |||||
| } | } | ||||
| @@ -21,6 +21,7 @@ import com.ruoyi.system.api.model.LoginUser; | |||||
| import io.minio.messages.Item; | import io.minio.messages.Item; | ||||
| import io.netty.util.Version; | import io.netty.util.Version; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Value; | |||||
| import org.springframework.core.io.InputStreamResource; | import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageImpl; | import org.springframework.data.domain.PageImpl; | ||||
| @@ -67,7 +68,8 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | |||||
| @Value("${minio.dataReleaseBucketName}") | |||||
| private String bucketName; | |||||
| @Resource | @Resource | ||||
| private MinioUtil minioUtil; | private MinioUtil minioUtil; | ||||
| @@ -8,6 +8,7 @@ import com.ruoyi.platform.mapper.ModelsVersionDao; | |||||
| import com.ruoyi.platform.service.ModelsVersionService; | import com.ruoyi.platform.service.ModelsVersionService; | ||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Value; | |||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageImpl; | import org.springframework.data.domain.PageImpl; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| @@ -35,7 +36,8 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { | |||||
| private ModelsDao modelsDao; | private ModelsDao modelsDao; | ||||
| // 固定存储桶名 | // 固定存储桶名 | ||||
| private final String bucketName = "platform-data"; | |||||
| @Value("${minio.dataReleaseBucketName}") | |||||
| private String bucketName; | |||||
| /** | /** | ||||
| * 通过ID查询单条数据 | * 通过ID查询单条数据 | ||||
| @@ -375,25 +375,54 @@ public class HttpUtils { | |||||
| } | } | ||||
| /** | /** | ||||
| * 发送 HTTP 请求并返回二进制数据流(InputStream)。 | |||||
| * 发送 HTTP 请求并返回二进制数据流(OutputStream)。 | |||||
| * | * | ||||
| * @param url 请求的 URL 地址。 | * @param url 请求的 URL 地址。 | ||||
| * @param token 要携带的 Token。 | |||||
| * @return 服务器响应的二进制数据流(InputStream)。 | |||||
| * @param headers 头节点。 | |||||
| * @return 服务器响应的二进制数据流(OutputStream)。 | |||||
| * @throws IOException 如果请求失败或发生其他 I/O 错误。 | * @throws IOException 如果请求失败或发生其他 I/O 错误。 | ||||
| */ | */ | ||||
| public static InputStream getInputStream(String url, String token) throws IOException { | |||||
| public static InputStream getIntputStream(String url, Map<String, String> headers) throws IOException { | |||||
| URL requestUrl = new URL(url); | URL requestUrl = new URL(url); | ||||
| HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); | HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); | ||||
| // Set request headers | |||||
| for (Map.Entry<String, String> entry : headers.entrySet()) { | |||||
| connection.setRequestProperty(entry.getKey(), entry.getValue()); | |||||
| } | |||||
| // Set other connection properties (e.g., timeouts, request method, etc.) | |||||
| connection.setRequestMethod("GET"); | connection.setRequestMethod("GET"); | ||||
| connection.setRequestProperty("Authorization", "Bearer " + token); // 添加 Authorization 头部,携带 Token | |||||
| connection.setConnectTimeout(5000); | |||||
| connection.setReadTimeout(5000); | |||||
| // Connect and get the response code | |||||
| connection.connect(); | |||||
| int responseCode = connection.getResponseCode(); | int responseCode = connection.getResponseCode(); | ||||
| if (responseCode == HttpURLConnection.HTTP_OK) { | if (responseCode == HttpURLConnection.HTTP_OK) { | ||||
| return connection.getInputStream(); // 获取响应的输入流 | |||||
| // Get the response InputStream | |||||
| InputStream inputStream = connection.getInputStream(); | |||||
| // // Create a ByteArrayOutputStream to store the response data | |||||
| // ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); | |||||
| // | |||||
| // // Read data from the InputStream and write it to the ByteArrayOutputStream | |||||
| // byte[] buffer = new byte[1024]; | |||||
| // int bytesRead; | |||||
| // while ((bytesRead = inputStream.read(buffer)) != -1) { | |||||
| // outputStream.write(buffer, 0, bytesRead); | |||||
| // } | |||||
| // | |||||
| // // Close the InputStream | |||||
| // inputStream.close(); | |||||
| // Return the ByteArrayOutputStream as an OutputStream | |||||
| return inputStream; | |||||
| } else { | } else { | ||||
| throw new IOException("HTTP 请求失败,状态码:" + responseCode); | |||||
| throw new IOException("HTTP request failed with response code: " + responseCode); | |||||
| } | } | ||||
| } | } | ||||
| @@ -6,10 +6,10 @@ import com.fasterxml.jackson.databind.annotation.JsonNaming; | |||||
| import java.io.Serializable; | import java.io.Serializable; | ||||
| @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) | @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) | ||||
| public class LabelDatasetVersion implements Serializable { | |||||
| public class LabelDatasetVersionVo implements Serializable { | |||||
| private String token; | private String token; | ||||
| private String project_id; | private String project_id; | ||||
| private String dataset_id; | |||||
| private Integer dataset_id; | |||||
| private String version; | private String version; | ||||
| private String desc; | private String desc; | ||||
| private String exportType; | private String exportType; | ||||
| @@ -29,11 +29,11 @@ public class LabelDatasetVersion implements Serializable { | |||||
| this.project_id = project_id; | this.project_id = project_id; | ||||
| } | } | ||||
| public String getDataset_id() { | |||||
| public Integer getDataset_id() { | |||||
| return dataset_id; | return dataset_id; | ||||
| } | } | ||||
| public void setDataset_id(String dataset_id) { | |||||
| public void setDataset_id(Integer dataset_id) { | |||||
| this.dataset_id = dataset_id; | this.dataset_id = dataset_id; | ||||
| } | } | ||||
| @@ -160,24 +160,25 @@ | |||||
| </foreach> | </foreach> | ||||
| </insert> | </insert> | ||||
| <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true"> | |||||
| insert into experiment(name,workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state) | |||||
| <update id="insertOrUpdateBatch"> | |||||
| insert into experiment (id, name, workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state) | |||||
| values | values | ||||
| <foreach collection="entities" item="entity" separator=","> | |||||
| (#{entity.name},#{entity.workflowId}, #{entity.globalParam}, #{entity.statusList}, #{entity.description}, #{entity.createBy}, #{entity.createTime}, | |||||
| #{entity.updateBy}, #{entity.updateTime}, #{entity.state}) | |||||
| <foreach collection="list" item="item" index="index" separator=","> | |||||
| (#{item.id}, #{item.name}, #{item.workflowId}, #{item.globalParam}, #{item.statusList}, #{item.description}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.state}) | |||||
| </foreach> | </foreach> | ||||
| on duplicate key update | |||||
| name=values(name), | |||||
| workflow_id = values(workflow_id), | |||||
| global_param = values(global_param), | |||||
| description = values(description), | |||||
| create_by = values(create_by), | |||||
| create_time = values(create_time), | |||||
| update_by = values(update_by), | |||||
| update_time = values(update_time), | |||||
| state = values(state) | |||||
| </insert> | |||||
| ON DUPLICATE KEY UPDATE | |||||
| name = VALUES(name), | |||||
| workflow_id = VALUES(workflow_id), | |||||
| global_param = VALUES(global_param), | |||||
| status_list = VALUES(status_list), | |||||
| description = VALUES(description), | |||||
| create_by = VALUES(create_by), | |||||
| create_time = VALUES(create_time), | |||||
| update_by = VALUES(update_by), | |||||
| update_time = VALUES(update_time), | |||||
| state = VALUES(state); | |||||
| </update> | |||||
| <!--通过主键修改数据--> | <!--通过主键修改数据--> | ||||
| <update id="update"> | <update id="update"> | ||||
| @@ -21,7 +21,13 @@ | |||||
| <result property="state" column="state" jdbcType="INTEGER"/> | <result property="state" column="state" jdbcType="INTEGER"/> | ||||
| </resultMap> | </resultMap> | ||||
| <!--查询非终止态的实例--> | |||||
| <select id="queryByExperimentIsNotTerminated" resultMap="ExperimentInsMap"> | |||||
| select id, experiment_id, argo_ins_name, argo_ins_ns, status, nodes_status,nodes_result, nodes_logs,global_param, start_time, finish_time, create_by, create_time, update_by, update_time, state | |||||
| from experiment_ins | |||||
| where (status NOT IN ('Terminated', 'Succeeded', 'Failed') | |||||
| OR status IS NULL) and state = 1 | |||||
| </select> | |||||
| <!--查询单个--> | <!--查询单个--> | ||||
| <select id="queryById" resultMap="ExperimentInsMap"> | <select id="queryById" resultMap="ExperimentInsMap"> | ||||
| @@ -217,18 +223,39 @@ | |||||
| </foreach> | </foreach> | ||||
| </insert> | </insert> | ||||
| <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true"> | |||||
| insert into | |||||
| experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_result,start_time,finish_time,create_by,create_time,update_by,update_time,state) | |||||
| <!-- <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">--> | |||||
| <!-- insert into--> | |||||
| <!-- experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_result,start_time,finish_time,create_by,create_time,update_by,update_time,state)--> | |||||
| <!-- values--> | |||||
| <!-- <foreach collection="entities" item="entity" separator=",">--> | |||||
| <!-- (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.nodesResult},#{entity.startTime},#{entity.finishTime},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state})--> | |||||
| <!-- </foreach>--> | |||||
| <!-- on duplicate key update--> | |||||
| <!-- experiment_id = values(experiment_id)argo_ins_name = values(argo_ins_name)argo_ins_ns = values(argo_ins_ns)status = values(status) nodes_status = values(nodes_status) create_by = values(create_by)create_time = values(create_time)update_by = values(update_by)update_time = values(update_time)state = values(state)--> | |||||
| <!-- </insert>--> | |||||
| <update id="insertOrUpdateBatch"> | |||||
| insert into experiment_ins (id, experiment_id, argo_ins_name, argo_ins_ns, status, nodes_status, nodes_result, nodes_logs, global_param, start_time, finish_time, create_by, create_time, update_by, update_time, state) | |||||
| values | values | ||||
| <foreach collection="entities" item="entity" separator=","> | |||||
| (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.nodesResult},#{entity.startTime},#{entity.finishTime},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state}) | |||||
| <foreach collection="list" item="item" index="index" separator=","> | |||||
| (#{item.id}, #{item.experimentId}, #{item.argoInsName}, #{item.argoInsNs}, #{item.status}, #{item.nodesStatus}, #{item.nodesResult}, #{item.nodesLogs}, #{item.globalParam}, #{item.startTime}, #{item.finishTime}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.state}) | |||||
| </foreach> | </foreach> | ||||
| on duplicate key update | |||||
| experiment_id = values(experiment_id)argo_ins_name = values(argo_ins_name)argo_ins_ns = | |||||
| values(argo_ins_ns)status = values(status) nodes_status = values(nodes_status) create_by = values(create_by)create_time = | |||||
| values(create_time)update_by = values(update_by)update_time = values(update_time)state = values(state) | |||||
| </insert> | |||||
| ON DUPLICATE KEY UPDATE | |||||
| experiment_id = VALUES(experiment_id), | |||||
| argo_ins_name = VALUES(argo_ins_name), | |||||
| argo_ins_ns = VALUES(argo_ins_ns), | |||||
| status = VALUES(status), | |||||
| nodes_status = VALUES(nodes_status), | |||||
| nodes_result = VALUES(nodes_result), | |||||
| nodes_logs = VALUES(nodes_logs), | |||||
| global_param = VALUES(global_param), | |||||
| start_time = VALUES(start_time), | |||||
| finish_time = VALUES(finish_time), | |||||
| create_by = VALUES(create_by), | |||||
| create_time = VALUES(create_time), | |||||
| update_by = VALUES(update_by), | |||||
| update_time = VALUES(update_time), | |||||
| state = VALUES(state); | |||||
| </update> | |||||
| <update id="update"> | <update id="update"> | ||||
| update experiment_ins | update experiment_ins | ||||