Unverified Commit 6cfe7bae authored by hxp0618's avatar hxp0618 Committed by GitHub

[feature][admin,web]add task copy feature (#673)

Co-authored-by: 's avatarhuangxp <18670141050@163.com>
parent 5c6d1ae4
......@@ -220,4 +220,14 @@ public class CatalogueController {
return Result.failed(false, "移动失败");
}
}
@PostMapping("/copyTask")
public Result copyTask(@RequestBody Catalogue catalogue) throws Exception {
if ( catalogueService.copyTask(catalogue)) {
return Result.succeed("复制作业成功");
} else {
return Result.failed("复制作业失败");
}
}
}
......@@ -13,4 +13,5 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TaskMapper extends SuperMapper<Task> {
Integer queryAllSizeByName(String name);
}
......@@ -27,4 +27,6 @@ public interface CatalogueService extends ISuperService<Catalogue> {
boolean removeCatalogueAndTaskById(Integer id);
boolean moveCatalogue(Integer id, Integer parentId);
boolean copyTask(Catalogue catalogue);
}
......@@ -63,4 +63,5 @@ public interface TaskService extends ISuperService<Task> {
Result rollbackTask(TaskRollbackVersionDTO dto);
Integer queryAllSizeByName(String name);
}
package com.dlink.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dlink.db.service.impl.SuperServiceImpl;
import com.dlink.dto.CatalogueTaskDTO;
import com.dlink.mapper.CatalogueMapper;
import com.dlink.model.Catalogue;
import com.dlink.model.JobLifeCycle;
import com.dlink.model.Statement;
import com.dlink.model.Task;
import com.dlink.service.CatalogueService;
import com.dlink.service.StatementService;
......@@ -121,4 +126,50 @@ public class CatalogueServiceImpl extends SuperServiceImpl<CatalogueMapper, Cata
return updateById(catalogue);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean copyTask(Catalogue catalogue) {
if (ObjectUtil.isNull(catalogue.getTaskId())) {
return false;
}
Task oldTask = taskService.getById(catalogue.getTaskId());
if (ObjectUtil.isNull(oldTask)) {
return false;
}
//查询作业名称
int size = taskService.queryAllSizeByName(oldTask.getName());
Task newTask = new Task();
BeanUtil.copyProperties(oldTask, newTask);
newTask.setId(null);
//设置复制后的作业名称为:原名称+自增序列
size = size + 1;
newTask.setName(oldTask.getName() + "_" + size);
newTask.setAlias(oldTask.getAlias() + "_" + size );
newTask.setStep(JobLifeCycle.DEVELOP.getValue());
taskService.save(newTask);
Statement statementServiceById = statementService.getById(catalogue.getTaskId());
//新建作业的sql语句
Statement statement = new Statement();
statement.setStatement(statementServiceById.getStatement());
statement.setId(newTask.getId());
statementService.save(statement);
Catalogue one = this.getOne(new LambdaQueryWrapper<Catalogue>().eq(Catalogue::getTaskId, catalogue.getTaskId()));
catalogue.setName(newTask.getAlias());
catalogue.setIsLeaf(one.getIsLeaf());
catalogue.setTaskId(newTask.getId());
catalogue.setType(one.getType());
catalogue.setParentId(one.getParentId());
return this.save(catalogue);
}
}
......@@ -786,6 +786,13 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
return "127.0.0.1:" + serverPort;
}
@Override
public Integer queryAllSizeByName(String name) {
return baseMapper.queryAllSizeByName(name);
}
private String getDuration(long jobStartTimeMills, long jobEndTimeMills) {
Instant startTime = Instant.ofEpochMilli(jobStartTimeMills);
Instant endTime = Instant.ofEpochMilli(jobEndTimeMills);
......
......@@ -29,4 +29,11 @@
</if>
</where>
</select>
<select id="queryAllSizeByName" resultType="java.lang.Integer">
SELECT count(*)
from dlink_task
where `name` REGEXP '${name}_[0-9]$'
</select>
</mapper>
......@@ -7,7 +7,7 @@ import {convertToTreeData, getTreeNodeByKey, TreeDataNode} from "@/components/St
import style from "./index.less";
import {StateType} from "@/pages/DataStudio/model";
import {
getInfoById, handleAddOrUpdate, handleAddOrUpdateWithResult, handleRemoveById, handleSubmit
getInfoById, handleAddOrUpdate, handleAddOrUpdateWithResult, handleOption, handleRemoveById, handleSubmit
} from "@/components/Common/crud";
import UpdateCatalogueForm from './components/UpdateCatalogueForm';
import SimpleTaskForm from "@/components/Studio/StudioTree/components/SimpleTaskForm";
......@@ -170,6 +170,8 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
toCut(rightClickNode);
} else if (key == 'Paste') {
toPaste(rightClickNode);
}else if (key == 'Copy') {
toCopy(rightClickNode);
}
};
......@@ -304,6 +306,18 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
}
};
const toCopy = async (node: TreeDataNode | undefined) => {
let catalogues = {
taskId:node?.taskId,
parentId: node?.id
};
const datas = await handleOption('/api/catalogue/copyTask',"复制作业",catalogues);
if (datas) {
getTreeData();
}
};
const createTask = (node: TreeDataNode | undefined) => {
if (!node?.isLeaf) {
handleUpdateTaskModalVisible(true);
......@@ -349,6 +363,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
<Menu.Item key='Open'>{'打开'}</Menu.Item>
<Menu.Item key='Submit'>{'异步提交'}</Menu.Item>
<Menu.Item key='Rename'>{'重命名'}</Menu.Item>
<Menu.Item key='Copy'>{'复制'}</Menu.Item>
<Menu.Item key='Cut'>{'剪切'}</Menu.Item>
{cutId && <Menu.Item key='Paste'>{'粘贴'}</Menu.Item>}
<Menu.Item key='Delete'>{'删除'}</Menu.Item>
......@@ -360,6 +375,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
<Menu.Item key='ShowUploadModal'>{'上传zip包创建工程'}</Menu.Item>
<Menu.Item key='CreateTask'>{'创建作业'}</Menu.Item>
<Menu.Item key='Rename'>{'重命名'}</Menu.Item>
<Menu.Item key='Copy'>{'复制'}</Menu.Item>
<Menu.Item key='Cut'>{'剪切'}</Menu.Item>
{cutId && <Menu.Item key='Paste'>{'粘贴'}</Menu.Item>}
<Menu.Item disabled>{'删除'}</Menu.Item>
......@@ -369,6 +385,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
<Menu.Item key='CreateCatalogue'>{'创建目录'}</Menu.Item>
<Menu.Item key='CreateTask'>{'创建作业'}</Menu.Item>
<Menu.Item key='Rename'>{'重命名'}</Menu.Item>
<Menu.Item key='Copy'>{'复制'}</Menu.Item>
<Menu.Item key='Cut'>{'剪切'}</Menu.Item>
{cutId && <Menu.Item key='Paste'>{'粘贴'}</Menu.Item>}
<Menu.Item key='Delete'>{'删除'}</Menu.Item>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment