Merge branch 'dev' into dev-zw

This commit is contained in:
cp3hnu 2024-04-26 17:16:57 +08:00
commit 9101179343
15 changed files with 252 additions and 29 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -224,8 +224,8 @@ const Dataset = () => {
<span style={{ color: '#1d1d20', fontSize: '20px' }}>{datasetDetailObj.name}</span>
<div className={Styles.smallTagBox}>
<div className={Styles.tagItem}>数据集 id{datasetDetailObj.id}</div>
<div className={Styles.tagItem}>{datasetDetailObj.data_tag || '...'}</div>
<div className={Styles.tagItem}>{datasetDetailObj.data_type}</div>
<div className={Styles.tagItem}>{datasetDetailObj.dataset_type_name || '...'}</div>
<div className={Styles.tagItem}>{datasetDetailObj.dataset_tag_name || '...'}</div>
</div>
</div>
<div className={Styles.datasetIntroCneterBox}>

View File

@ -229,6 +229,11 @@
border-color: #eaeaea;
border-radius: 4px;
cursor: pointer;
.dropdown{
position: absolute;
right: 20px;
top: 15px;
}
.itemText {
position: absolute;
top: 20px;

View File

@ -1,14 +1,22 @@
import { getAccessToken } from '@/access';
import clock from '@/assets/img/clock.png';
import creatByImg from '@/assets/img/creatBy.png';
import deleteIcon from '@/assets/img/delete-icon.png';
import KFIcon from '@/components/KFIcon';
import { addDatesetAndVesion, getAssetIcon, getDatasetList } from '@/services/dataset/index.js';
import {
addDatesetAndVesion,
deleteDataset,
getAssetIcon,
getDatasetList,
} from '@/services/dataset/index.js';
import { getDictSelectOption } from '@/services/system/dict';
import { modalConfirm } from '@/utils/ui';
import { UploadOutlined } from '@ant-design/icons';
import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload } from 'antd';
import moment from 'moment';
import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import './index.less';
import Styles from './index.less';
const { Search } = Input;
@ -277,7 +285,30 @@ const PublicData = (React.FC = () => {
return (
<div className={Styles.dataItem} onClick={(e) => routeToIntro(e, item)}>
<span className={Styles.itemText}>{item.name}</span>
<img
onClick={(e) => {
e.stopPropagation();
modalConfirm({
title: '确定删除该条数据集实例吗?',
onOk: () => {
deleteDataset(item.id).then((ret) => {
if (ret.code === 200) {
message.success('删除成功');
getModelLists(queryFlow);
} else {
message.error(ret.msg);
}
});
},
});
}}
className={Styles.dropdown}
style={{ width: '17px', marginRight: '6px' }}
src={deleteIcon}
alt=""
/>
<div className={Styles.itemDescripition}>{item.description}</div>
<div className={Styles.itemTime}>
<img
style={{ width: '17px', marginRight: '6px' }}

View File

@ -1,6 +1,8 @@
import clock from '@/assets/img/clock.png';
import creatByImg from '@/assets/img/creatBy.png';
import { getAssetIcon, getDatasetList } from '@/services/dataset/index.js';
import deleteIcon from '@/assets/img/delete-icon.png';
import { deleteDataset, getAssetIcon, getDatasetList } from '@/services/dataset/index.js';
import { modalConfirm } from '@/utils/ui';
import { Form, Input, Pagination } from 'antd';
import moment from 'moment';
import { useEffect, useState } from 'react';
@ -225,6 +227,28 @@ const PublicData = () => {
return (
<div className={Styles.dataItem} onClick={(e) => routeToIntro(e, item)}>
<span className={Styles.itemText}>{item.name}</span>
<img
onClick={(e) => {
e.stopPropagation();
modalConfirm({
title: '确定删除该条数据集实例吗?',
onOk: () => {
deleteDataset(item.id).then((ret) => {
if (ret.code === 200) {
message.success('删除成功');
getModelLists(queryFlow);
} else {
message.error(ret.msg);
}
});
},
});
}}
className={Styles.dropdown}
style={{ width: '17px', marginRight: '6px' }}
src={deleteIcon}
alt=""
/>
<div className={Styles.itemDescripition}>{item.description}</div>
<div className={Styles.itemTime}>
<img

View File

@ -29,12 +29,37 @@
background: #ffffff;
box-shadow: 0px 3px 6px rgba(146, 146, 146, 0.09);
}
.drawBox{
:global{
.ant-drawer .ant-drawer-body{
overflow: hidden;
}
}
}
.experimentDrawer{
:global{
.ant-tabs >.ant-tabs-nav .ant-tabs-nav-list{
margin-left: 24px;
}
.ant-drawer .ant-drawer-body{
overflow-y: hidden;
}
.ant-tabs {
height: calc(100% - 160px);
overflow-y: auto;
}
}
}
.detailBox {
display: flex;
align-items: center;
margin-bottom: 15px;
color: #1d1d20;
font-size: 15px;
padding-left: 24px;
}
.allMessageItem {
display: flex;

View File

@ -386,7 +386,7 @@ const Props = forwardRef(({ onParentChange }, ref) => {
},
}));
return (
<>
<div className={Styles.drawBox}>
<Drawer
title="任务执行详情"
placement="right"
@ -397,9 +397,12 @@ const Props = forwardRef(({ onParentChange }, ref) => {
afterOpenChange={afterOpenChange}
open={open}
width={420}
className={Styles.experimentDrawer}
destroyOnClose={true}
>
<div className={Styles.detailBox}>任务名称{stagingItem.label}</div>
<div className={Styles.detailBox} style={{ marginTop: '15px' }}>
任务名称{stagingItem.label}
</div>
<div className={Styles.detailBox}>
执行状态
<div
@ -429,7 +432,7 @@ const Props = forwardRef(({ onParentChange }, ref) => {
</div>
<Tabs defaultActiveKey="1" items={items} />
</Drawer>
</>
</div>
);
});

View File

@ -69,6 +69,7 @@ function Experiment() {
return { ...item, key: item.id };
}),
);
setTotal(res.data.totalElements);
}
};
@ -82,6 +83,7 @@ function Experiment() {
//
const getQueryByExperiment = (val) => {
getQueryByExperimentId(val).then((ret) => {
console.log(val);
setExpandedRowKeys(val);
if (ret && ret.data && ret.data.length > 0) {
try {
@ -159,6 +161,7 @@ function Experiment() {
};
const expandChange = (e, record) => {
clearExperimentInTimers();
console.log(e, record);
if (record.id === expandedRowKeys) {
setExpandedRowKeys(null);
} else {
@ -517,6 +520,7 @@ function Experiment() {
: ''}
</div>
),
onExpand: (e, a) => {
expandChange(e, a);
},

View File

@ -219,6 +219,11 @@
border-color: #eaeaea;
border-radius: 4px;
cursor: pointer;
.dropdown{
position: absolute;
right: 20px;
top: 15px;
}
.itemText {
position: absolute;
top: 20px;

View File

@ -222,8 +222,8 @@ const Dataset = () => {
<span style={{ color: '#1d1d20', fontSize: '20px' }}>{datasetDetailObj.name}</span>
<div className={Styles.smallTagBox}>
<div className={Styles.tagItem}>模型 id{datasetDetailObj.id}</div>
<div className={Styles.tagItem}>{datasetDetailObj.data_tag || '...'}</div>
<div className={Styles.tagItem}>{datasetDetailObj.data_type}</div>
<div className={Styles.tagItem}>{datasetDetailObj.model_type_name || '...'}</div>
<div className={Styles.tagItem}>{datasetDetailObj.model_tag_name || '...'}</div>
</div>
</div>
<div className={Styles.datasetIntroCneterBox}>

View File

@ -1,10 +1,12 @@
import { getAccessToken } from '@/access';
import clock from '@/assets/img/clock.png';
import creatByImg from '@/assets/img/creatBy.png';
import deleteIcon from '@/assets/img/delete-icon.png';
import KFIcon from '@/components/KFIcon';
import { addModel, getAssetIcon, getModelList } from '@/services/dataset/index.js';
import { addModel, deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js';
import { modalConfirm } from '@/utils/ui';
import { UploadOutlined } from '@ant-design/icons';
import { Button, Form, Input, Modal, Pagination, Select, Upload } from 'antd';
import { Button, Form, Input, Modal, Pagination, Select, Upload, message } from 'antd';
import moment from 'moment';
import { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
@ -54,8 +56,8 @@ const PublicData = () => {
});
const [activeType, setActiveType] = useState(null);
const [activeTag, setActiveTag] = useState(null);
const [datasetTypeList, setDatasetTypeList] = useState([]);
const [datasetDirectionList, setDatasetDirectionList] = useState([]);
const [modelTypeList, setmodelTypeList] = useState([]);
const [modelDirectionList, setmodelDirectionList] = useState([]);
const [isModalOpen, setIsModalOpen] = useState(false);
const [datasetList, setDatasetList] = useState([]);
const [total, setTotal] = useState(0);
@ -82,11 +84,11 @@ const PublicData = () => {
getAssetIcon(params).then((ret) => {
console.log(ret);
if (ret.code == 200 && ret.data.content && ret.data.content.length > 0) {
setDatasetTypeList(ret.data.content.filter((item) => item.category_id == 3));
setDatasetDirectionList(ret.data.content.filter((item) => item.category_id == 4));
setmodelTypeList(ret.data.content.filter((item) => item.category_id == 3));
setmodelDirectionList(ret.data.content.filter((item) => item.category_id == 4));
} else {
setDatasetTypeList([]);
setDatasetDirectionList([]);
setmodelTypeList([]);
setmodelDirectionList([]);
}
});
};
@ -181,8 +183,8 @@ const PublicData = () => {
/>
<div className={Styles.itemTitle}>模型框架</div>
<div className={Styles.itemBox}>
{datasetTypeList && datasetTypeList.length > 0
? datasetTypeList.map((item) => {
{modelTypeList && modelTypeList.length > 0
? modelTypeList.map((item) => {
return (
<div>
<div
@ -222,8 +224,8 @@ const PublicData = () => {
</div>
<div className={Styles.itemTitle}>模型能力</div>
<div className={Styles.itemBox}>
{datasetDirectionList && datasetDirectionList.length > 0
? datasetDirectionList.map((item) => {
{modelDirectionList && modelDirectionList.length > 0
? modelDirectionList.map((item) => {
return (
<div>
<div
@ -282,9 +284,80 @@ const PublicData = () => {
{datasetList && datasetList.length > 0
? datasetList.map((item) => {
return (
<div className={Styles.dataItem} onClick={(e) => routeToIntro(e, item)}>
<div
className={Styles.dataItem}
onClick={(e) => {
routeToIntro(e, item);
}}
>
<span className={Styles.itemText}>{item.name}</span>
<div className={Styles.itemDescripition}>{item.description}</div>
<img
onClick={(e) => {
e.stopPropagation();
modalConfirm({
title: '确定删除该条模型实例吗?',
onOk: () => {
deleteModel(item.id).then((ret) => {
if (ret.code === 200) {
message.success('删除成功');
getModelLists(queryFlow);
} else {
message.error(ret.msg);
}
});
},
});
}}
className={Styles.dropdown}
style={{ width: '17px', marginRight: '6px' }}
src={deleteIcon}
alt=""
/>
{/* <Dropdown
className={Styles.dropdown}
key={item.name}
menu={{
items: [
{
label: '详情',
key: 'detail',
},
{
label: '删除',
key: 'delete',
},
],
onClick: (e) => {
console.log(e);
if (e.key === 'detail') {
routeToIntro(e, item);
} else if (e.key === 'delete') {
modalConfirm({
title: '确定删除该条模型实例吗?',
onOk: () => {
deleteModel(item.id).then((ret) => {
if (ret.code === 200) {
message.success('删除成功');
getModelLists(queryFlow);
} else {
message.error(ret.msg);
}
});
},
});
}
},
}}
>
<div>
<img
style={{ width: '17px', marginRight: '6px' }}
src={moreBack}
alt=""
/>
</div>
</Dropdown> */}
,<div className={Styles.itemDescripition}>{item.description}</div>
<div className={Styles.itemTime}>
<img
style={{ width: '17px', marginRight: '6px' }}
@ -401,7 +474,13 @@ const PublicData = () => {
]
}
>
<Select allowClear placeholder="请选择模型类型" options={[]} />
<Select
allowClear
placeholder="请选择模型类型"
options={modelTypeList.map((item) => {
return { value: item.id, label: item.name };
})}
/>
</Form.Item>
<Form.Item
label="模型能力"
@ -415,7 +494,13 @@ const PublicData = () => {
]
}
>
<Select allowClear placeholder="请选择模型标签" options={[]} />
<Select
allowClear
placeholder="请选择模型标签"
options={modelDirectionList.map((item) => {
return { value: item.id, label: item.name };
})}
/>
</Form.Item>
<Form.Item label="模型文件" name="models_version_vos">
<Upload {...props} data={{ uuid: uuid }} accept=".zip,.tgz">

View File

@ -1,7 +1,9 @@
import clock from '@/assets/img/clock.png';
import creatByImg from '@/assets/img/creatBy.png';
import { getAssetIcon, getModelList } from '@/services/dataset/index.js';
import { Form, Input, Modal, Pagination, Radio } from 'antd';
import deleteIcon from '@/assets/img/delete-icon.png';
import { deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js';
import { modalConfirm } from '@/utils/ui';
import { Form, Input, Modal, Pagination, Radio, message } from 'antd';
import moment from 'moment';
import { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
@ -224,8 +226,35 @@ const PublicData = () => {
{datasetList && datasetList.length > 0
? datasetList.map((item) => {
return (
<div className={Styles.dataItem} onClick={(e) => routeToIntro(e, item)}>
<div
className={Styles.dataItem}
onClick={(e) => {
routeToIntro(e, item);
}}
>
<span className={Styles.itemText}>{item.name}</span>
<img
onClick={(e) => {
e.stopPropagation();
modalConfirm({
title: '确定删除该条模型实例吗?',
onOk: () => {
deleteModel(item.id).then((ret) => {
if (ret.code === 200) {
message.success('删除成功');
getModelLists(queryFlow);
} else {
message.error(ret.msg);
}
});
},
});
}}
className={Styles.dropdown}
style={{ width: '17px', marginRight: '6px' }}
src={deleteIcon}
alt=""
/>
<div className={Styles.itemDescripition}>{item.description}</div>
<div className={Styles.itemTime}>
<img

View File

@ -118,3 +118,15 @@ export function exportDataset(id) {
method: 'GET',
});
}
// 删除模型集
export function deleteModel(id) {
return request(`/api/mmp/models/${id}`, {
method: 'DELETE',
});
}
// 删除数据集
export function deleteDataset(id) {
return request(`/api/mmp/dataset/${id}`, {
method: 'DELETE',
});
}

View File

@ -240,6 +240,7 @@ public class DatasetServiceImpl implements DatasetService {
@Override
public List<Map<String, String>> uploadDataset(MultipartFile[] files, String uuid) throws Exception {
List<Map<String, String>> results = new ArrayList<>();
for (MultipartFile file:files){
// 构建objectName
String username = SecurityUtils.getLoginUser().getUsername();
@ -259,7 +260,6 @@ public class DatasetServiceImpl implements DatasetService {
if (dataset == null) {
throw new Exception("数据集不存在请检查数据集id");
}
DatasetVersion version = datasetVersionService.queryByDatasetVersion(datasetVersion);
String url = "";
if (version == null) {