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 @@ 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 @@
-