From dac169053c7dfd240bf7defc7bc46a3f16571da1 Mon Sep 17 00:00:00 2001
From: siyaqi
Date: Fri, 28 Feb 2025 16:56:41 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E9=97=AE=E9=A2=98=E5=A4=84?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 1 +
vue-fastapi-backend/.env.dev | 33 +++++-----
.../controller/metatask_controller.py | 26 ++++++++
.../module_admin/entity/do/metatask_do.py | 3 +-
.../module_admin/entity/vo/dataSource_vo.py | 1 +
.../module_admin/entity/vo/metatask_vo.py | 1 +
.../module_admin/service/metatask_service.py | 66 ++++++++++++++++++-
vue-fastapi-frontend/src/api/meta/metatask.js | 15 +++++
.../src/views/meta/metatask/dsDialog.vue | 56 +++++++++++++---
.../src/views/meta/metatask/index.vue | 64 +++++++++++++-----
.../src/views/meta/metatask/logsDialog.vue | 10 +--
11 files changed, 227 insertions(+), 49 deletions(-)
diff --git a/.gitignore b/.gitignore
index 129a39b..116116d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -136,3 +136,4 @@ dmypy.json
# Cython debug symbols
cython_debug/
+vue-fastapi-backend/.env.dev
diff --git a/vue-fastapi-backend/.env.dev b/vue-fastapi-backend/.env.dev
index 9dd107e..54276fc 100644
--- a/vue-fastapi-backend/.env.dev
+++ b/vue-fastapi-backend/.env.dev
@@ -4,7 +4,7 @@ APP_ENV = 'dev'
# 应用名称
APP_NAME = 'RuoYi-FastAPI'
# 应用代理路径
-APP_ROOT_PATH = '/default-api'
+APP_ROOT_PATH = '/dev-api'
# 应用主机
APP_HOST = '127.0.0.1'
# 应用端口
@@ -33,20 +33,20 @@ JWT_REDIS_EXPIRE_MINUTES = 30
# 数据库类型,可选的有'mysql'、'postgresql',默认为'mysql'
DB_TYPE = 'mysql'
# 数据库主机
-DB_HOST = '192.168.0.3'
-#DB_HOST = '47.113.147.166'
+# DB_HOST = '192.168.0.3'
+DB_HOST = '127.0.0.1'
# 数据库端口
DB_PORT = 3306
# 数据库用户名
-DB_USERNAME = 'admin'
-#DB_USERNAME = 'dbf'
+# DB_USERNAME = 'admin'
+DB_USERNAME = 'root'
# 数据库密码
-DB_PASSWORD = '123456'
-#DB_PASSWORD = '1q2w3e4r'
+# DB_PASSWORD = '123456'
+DB_PASSWORD = 'root'
# 数据库名称
-DB_DATABASE = 'vue_faseapi'
-#DB_DATABASE = 'vfa_test_0115'
+# DB_DATABASE = 'vue_faseapi'
+DB_DATABASE = 'ruoyi-fastapi'
# 是否开启sqlalchemy日志
DB_ECHO = true
@@ -61,8 +61,8 @@ DB_POOL_TIMEOUT = 30
# -------- Redis配置 --------
# Redis主机
-REDIS_HOST = '192.168.0.3'
-#REDIS_HOST = '127.0.0.1'
+# REDIS_HOST = '192.168.0.3'
+REDIS_HOST = '127.0.0.1'
# Redis端口
REDIS_PORT = 6379
@@ -76,14 +76,11 @@ REDIS_DATABASE = 2
# -------- minio配置 --------
# minio主机
-MINIO_ADDRESS = '47.121.207.11:9000'
-# MINIO_ADDRESS = '192.168.0.3:9000'
+MINIO_ADDRESS = '192.168.0.3:9000'
# minio用户
-MINIO_ADMIN = 'WFpLqkCgjoQNsnu6t7FO'
-# MINIO_ADMIN = 'admin'
+MINIO_ADMIN = 'admin'
# minio密码
-MINIO_PASSWORD = 'gPRViF52Or5Fyvr0PCZHuIxZGfrTpNynajMiEjBZ'
-# MINIO_PASSWORD = 'admin123'
+MINIO_PASSWORD = 'admin123'
# 访问dolphinscheduler的接口地址
-DS_SERVER_URL= http://localhost:12345
\ No newline at end of file
+DS_SERVER_URL= http://47.121.207.11:12345
\ No newline at end of file
diff --git a/vue-fastapi-backend/module_admin/controller/metatask_controller.py b/vue-fastapi-backend/module_admin/controller/metatask_controller.py
index d0079d4..93357e3 100644
--- a/vue-fastapi-backend/module_admin/controller/metatask_controller.py
+++ b/vue-fastapi-backend/module_admin/controller/metatask_controller.py
@@ -168,6 +168,32 @@ async def DS_meta_metatask(
return ResponseUtil.success(msg=edit_config_result)
+@metataskController.get('/DS/{id}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:ds'))])
+@Log(title='元数据任务', business_type=BusinessType.UPDATE)
+async def DS_meta_metatask_detail(
+ request: Request,
+ id: int,
+ query_db: AsyncSession = Depends(get_db),
+ current_user: CurrentUserModel = Depends(LoginService.get_current_user)
+):
+ process=ParmScheduleVo()
+ process.processDefinitionCode=id
+ edit_config_result = await MetataskService.ds_metatask_detail(request, query_db, process,current_user)
+
+ return ResponseUtil.success(data=edit_config_result)
+
+@metataskController.delete('/DS', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:ds'))])
+@Log(title='元数据任务', business_type=BusinessType.UPDATE)
+async def DS_meta_metatask(
+ request: Request,
+ process: ParmScheduleVo,
+ query_db: AsyncSession = Depends(get_db),
+ current_user: CurrentUserModel = Depends(LoginService.get_current_user)
+):
+
+ edit_config_result = await MetataskService.ds_metatask_delete(request, query_db, process,current_user)
+
+ return ResponseUtil.success(msg=edit_config_result)
# 元数据任务日志
@metataskController.get('/logs', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:up',"meta:metatask:down"))])
@Log(title='元数据任务', business_type=BusinessType.UPDATE)
diff --git a/vue-fastapi-backend/module_admin/entity/do/metatask_do.py b/vue-fastapi-backend/module_admin/entity/do/metatask_do.py
index 08e806e..b23cfc0 100644
--- a/vue-fastapi-backend/module_admin/entity/do/metatask_do.py
+++ b/vue-fastapi-backend/module_admin/entity/do/metatask_do.py
@@ -28,4 +28,5 @@ class Metatask(Base):
acquisitionType = Column(String(10), nullable=True, default=None, comment='采集方式')
ac_target = Column(String(5), nullable=True, default=None, comment='采集目标')
ds_ids = Column(String(50), nullable=True, default=None, comment='任务Id')
- ds_types = Column(String(5), nullable=True, default=None, comment='ds任务类型')
\ No newline at end of file
+ ds_types = Column(String(5), nullable=True, default=None, comment='ds任务类型')
+ schId = Column(String(50), nullable=True, default=None, comment='调度id')
\ No newline at end of file
diff --git a/vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py b/vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py
index dee6c53..c676f7c 100644
--- a/vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py
+++ b/vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py
@@ -86,6 +86,7 @@ class ParmSchedule(BaseModel):
processDefinitionCode: Optional[int] = Field(None, description="Process definition code")
class ParmScheduleVo(BaseModel):
warningGroupId: Optional[int] = Field(None, description="Warning group ID")
+ metaTaskId: Optional[int] = Field(None, description="metaTaskId")
workerGroup: Optional[str] = Field(None, description="Worker group")
environmentCode: Optional[int] = Field(None, description="Environment code")
processDefinitionCode: Optional[int] = Field(None, description="Process definition code")
diff --git a/vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py b/vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
index bdd2a2c..952db9a 100644
--- a/vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
+++ b/vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
@@ -31,6 +31,7 @@ class MetataskModel(BaseModel):
ac_target: Optional[str] = Field(default=None, description='采集目标')
ds_ids: Optional[str] = Field(default=None, description='ds采集ids')
ds_types: Optional[str] = Field(default=None, description='ds采集类型')
+ schId: Optional[str] = Field(default=None, description='调度id')
class Metatask:
diff --git a/vue-fastapi-backend/module_admin/service/metatask_service.py b/vue-fastapi-backend/module_admin/service/metatask_service.py
index e64aa30..381b782 100644
--- a/vue-fastapi-backend/module_admin/service/metatask_service.py
+++ b/vue-fastapi-backend/module_admin/service/metatask_service.py
@@ -1268,7 +1268,7 @@ class MetataskService:
parm.failureStrategy='CONTINUE'
parm.warningType='NONE'
parm.warningGroupId=process.warningGroupId
- parm.workerGroup='TASK_POST'
+ parm.workerGroup=process.workerGroup
parm.processDefinitionCode =process.processDefinitionCode
parm.environmentCode=process.environmentCode
parm.processInstancePriority='MEDIUM'
@@ -1287,10 +1287,72 @@ class MetataskService:
scheduleId= responsJson['data']['id']
ondsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{scheduleId}/online"
ondsurl = requests.post(ondsurl, headers=headers, verify=False)
+ metatask_info = await cls.metatask_detail_services(query_db, process.metaTaskId)
+ metatask_info.schId=scheduleId
+ metatask_info = metatask_info.model_dump(exclude_unset=True)
+ await MetataskDao.edit_metatask_dao(query_db, metatask_info)
+ await query_db.commit()
return "调度运行成功!"
else:
raise ServiceException(message='运行失败!')
-
+ @classmethod
+ async def ds_metatask_detail(
+ cls, request: Request, query_db: AsyncSession, process: ParmScheduleVo,current_user: CurrentUserModel
+ ):
+ projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
+ # 先查询是否建立定时任务
+ getdsurl=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/schedules?pageSize=10&pageNo=1&processDefinitionCode='+str(process.processDefinitionCode)
+ headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
+ getdsresponse = requests.get(getdsurl, headers=headers, verify=False)
+ getdstext= getdsresponse.text
+ processVo=ParmScheduleVo()
+ responsJson = json.loads(getdstext)
+ if responsJson['msg'] == 'success':
+ if responsJson['data']['total']>0:
+ # getds_json_list = json.dumps(responsJson['data']['totalList'], ensure_ascii=False, indent=4)
+ getds_json_list = responsJson['data']['totalList']
+ for item in getds_json_list:
+ processVo.crontab=item['crontab']
+ processVo.beginTime=item['startTime']
+ processVo.endTime=item['endTime']
+ processVo.workerGroup=item['workerGroup']
+ processVo.warningGroupId=item['warningGroupId']
+ processVo.environmentCode=item['environmentCode']
+ return processVo
+
+ @classmethod
+ async def ds_metatask_delete(
+ cls, request: Request, query_db: AsyncSession, process: ParmScheduleVo,current_user: CurrentUserModel
+ ):
+ projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
+ # 先查询是否建立定时任务
+ getdsurl=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/schedules?pageSize=10&pageNo=1&processDefinitionCode='+str(process.processDefinitionCode)
+ headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
+ getdsresponse = requests.get(getdsurl, headers=headers, verify=False)
+ getdstext= getdsresponse.text
+ responsJson = json.loads(getdstext)
+ if responsJson['msg'] == 'success':
+ if responsJson['data']['total']>0:
+ # getds_json_list = json.dumps(responsJson['data']['totalList'], ensure_ascii=False, indent=4)
+ getds_json_list = responsJson['data']['totalList']
+ for item in getds_json_list:
+ if item['releaseState']=='ONLINE':
+ # 先下线在删除
+ offdsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}/offline"
+ offresponse = requests.post(offdsurl, headers=headers, verify=False)
+ # 删除对应的调度
+ deldsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}?scheduleId={item['id']}"
+ delresponse = requests.delete(deldsurl, headers=headers, verify=False)
+ deldstext= delresponse.text
+ delresponsJson = json.loads(deldstext)
+ if delresponsJson['msg'] == 'success':
+ metatask_info = await cls.metatask_detail_services(query_db, process.metaTaskId)
+ metatask_info.schId=""
+ metatask_info = metatask_info.model_dump(exclude_unset=True)
+ await MetataskDao.edit_metatask_dao(query_db, metatask_info)
+ await query_db.commit()
+ return "调度删除成功!"
+ return "调度删除成功!"
@classmethod
async def get_metatask_logs_services(
diff --git a/vue-fastapi-frontend/src/api/meta/metatask.js b/vue-fastapi-frontend/src/api/meta/metatask.js
index 5efd029..945f9c8 100644
--- a/vue-fastapi-frontend/src/api/meta/metatask.js
+++ b/vue-fastapi-frontend/src/api/meta/metatask.js
@@ -100,6 +100,21 @@ export function dsmetatask(data) {
})
}
+export function dsmetataskdelete(data) {
+ return request({
+ url: '/default-api/meta/metatask/DS',
+ method: 'delete',
+ data: data
+ })
+}
+
+export function dsmetataskdetail(pocessId) {
+ return request({
+ url: '/default-api/meta/metatask/DS/'+pocessId,
+ method: 'get',
+ })
+}
+
// 删除元数据任务
export function delmetatask(metataskId,dsIds) {
const data = {
diff --git a/vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue b/vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue
index 62cc9f7..19e4c0e 100644
--- a/vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue
+++ b/vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue
@@ -41,6 +41,7 @@
v-model="form.workerGroup"
placeholder="请选择Worker分组"
style="width: 100%;"
+ @change="changeWoker"
>
import { ref, reactive, watch } from "vue";
-import { dsmetatask } from "@/api/meta/metatask";
+import { dsmetatask,dsmetataskdetail } from "@/api/meta/metatask";
import Crontab from '@/components/Crontab'
import { ElMessage } from 'element-plus'
@@ -122,12 +123,18 @@ export default {
processDefinitionCode: String,
warningGroupList: Array,
environmentList: Array,
- workerGroupList: Array
+ workerGroupList: Array,
+ getList:{
+ type: Function,
+ required: true,
+ },
},
+
setup(props) {
// Reactive state with `reactive` and `ref`
const visible = ref(false);
const openCron = ref(false);
+ const environmentListVo = ref([]);
const expression = ref("");
const dateRange = ref([]);
const form = reactive({
@@ -135,6 +142,7 @@ export default {
warningGroupId: undefined,
environmentCode: undefined,
workerGroup: undefined,
+ metaTaskId:0,
crontab: "",
});
@@ -145,10 +153,29 @@ export default {
});
// Methods
- const show = (ids) => {
+ const show = (ids,metaTaskId) => {
form.processDefinitionCode = Number(ids[0]);
- visible.value = true;
+ form.metaTaskId =Number(metaTaskId[0]);
+ dsmetataskdetail(form.processDefinitionCode).then((response) => {
+ if (response.success) {
+ if(response.data.crontab!=null)
+ form.crontab =response.data.crontab;
+ dateRange.value[0] =response.data.beginTime;
+ form.workerGroup =response.data.workerGroup;
+ form.warningGroupId =response.data.warningGroupId;
+ form.environmentCode =response.data.environmentCode;
+ dateRange.value[1] =response.data.endTime;
+ }else {
+ form.crontab ="";
+ form.workerGroup =undefined;
+ form.warningGroupId =undefined;
+ form.environmentCode =undefined;
+ }
+ environmentListVo.value = [...props.environmentList];
+ visible.value = true;
+ });
+
};
@@ -162,17 +189,28 @@ export default {
};
+ const changeWoker = (value) => {
+ form.environmentCode=undefined
+ environmentListVo.value=[]
+ props.environmentList.forEach(item=>{
+ if(item.workerGroups.length>0&&item.workerGroups.includes(value)){
+ environmentListVo.value.push(item)
+ }
+
+
+ })
+};
+
const handleds = () => {
dsmetatask(addDateRange(form, dateRange.value)).then((response) => {
if (response.success) {
visible.value = false;
- console.log(response.msg)
ElMessage({
message: response.msg,
type: 'success',
})
-
- }
+ props.getList();
+}
});
};
@@ -191,11 +229,13 @@ export default {
openCron,
expression,
dateRange,
+ environmentListVo,
form,
show,
handleShowCron,
crontabFill,
handleds,
+ changeWoker,
addDateRange,
};
}
diff --git a/vue-fastapi-frontend/src/views/meta/metatask/index.vue b/vue-fastapi-frontend/src/views/meta/metatask/index.vue
index 739e32b..ae3dd0b 100644
--- a/vue-fastapi-frontend/src/views/meta/metatask/index.vue
+++ b/vue-fastapi-frontend/src/views/meta/metatask/index.vue
@@ -193,7 +193,17 @@
>删除
-
+
+ 删除调度
+
@@ -258,14 +268,14 @@
- {{ parseTime(scope.row.createTime) }}
+ {{scope.row.schId}}
diff --git a/vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue b/vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue
index 4b33269..82b2d0d 100644
--- a/vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue
+++ b/vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue
@@ -4,7 +4,7 @@
-
+
实例列表
@@ -20,7 +20,7 @@
-
+
-
+
任务节点
@@ -61,7 +61,7 @@
-
+
-
+
日志详情