Browse Source

相关问题修复

master
si@aidatagov.com 1 month ago
parent
commit
390e2ad301
  1. 9
      vue-fastapi-backend/module_admin/controller/metatask_controller.py
  2. 3
      vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py
  3. 3
      vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
  4. 355
      vue-fastapi-backend/module_admin/service/metasecurity_service.py
  5. 16
      vue-fastapi-backend/module_admin/service/metatask_service.py
  6. 9
      vue-fastapi-frontend/src/api/meta/metatask.js
  7. 2
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  8. 4
      vue-fastapi-frontend/src/utils/dsSysUtils.js
  9. 4
      vue-fastapi-frontend/src/views/dataAsset/assetDetail/index.vue
  10. 1
      vue-fastapi-frontend/src/views/datastd/stdcode/index.vue
  11. 38
      vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue
  12. 4
      vue-fastapi-frontend/src/views/meta/metatask/index.vue
  13. 4
      vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue
  14. 4
      vue-fastapi-frontend/src/views/meta/metatask/runDialog.vue
  15. 3
      vue-fastapi-frontend/src/views/meta/metatask/secConfig.vue
  16. 28
      vue-fastapi-frontend/src/views/metadataConfig/log/index.vue
  17. 6
      vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue
  18. 10
      vue-fastapi-frontend/src/views/system/flow/dataAssetMainAppr.vue

9
vue-fastapi-backend/module_admin/controller/metatask_controller.py

@ -47,14 +47,16 @@ async def get_process_instances_list(
return ResponseUtil.success(model_content=config_page_query_result) return ResponseUtil.success(model_content=config_page_query_result)
# 获取工作流实例节点 # 获取工作流实例节点
@metataskController.get( @metataskController.get(
'/task_nodes/{id}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:log'))] '/task_nodes/{id}/{projectType}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:log'))]
) )
async def get_task_nodes_list( async def get_task_nodes_list(
request: Request, request: Request,
id:int,current_user: CurrentUserModel = Depends(LoginService.get_current_user) id:int,
projectType:str,
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
): ):
config_page_query_result = await MetataskService.get_task_nodes_services(request, id,current_user) config_page_query_result = await MetataskService.get_task_nodes_services(request, id,projectType,current_user)
logger.info('获取成功') logger.info('获取成功')
return ResponseUtil.success(rows=config_page_query_result) return ResponseUtil.success(rows=config_page_query_result)
@ -136,7 +138,6 @@ async def up_or_down_meta_metatask(
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
edit_config_result = await MetataskService.up_or_down_metatask_services(request, query_db,current_user, DownOrUpdate.id,DownOrUpdate.type) edit_config_result = await MetataskService.up_or_down_metatask_services(request, query_db,current_user, DownOrUpdate.id,DownOrUpdate.type)
logger.info(edit_config_result.message) logger.info(edit_config_result.message)

3
vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py

@ -69,6 +69,7 @@ class ProcessDefinition(BaseModel):
expectedParallelismNumber: Optional[int] = Field(None, description="Expected parallelism number") expectedParallelismNumber: Optional[int] = Field(None, description="Expected parallelism number")
dryRun: Optional[int] = Field(None, description="Dry run flag") dryRun: Optional[int] = Field(None, description="Dry run flag")
scheduleTime: Optional[str] = Field(None, description="Schedule time") scheduleTime: Optional[str] = Field(None, description="Schedule time")
projectType: Optional[str] = Field(default='meta', description="Schedule time")
# class Schedule(BaseModel): # class Schedule(BaseModel):
# startTime: Optional[datetime] = Field(default=None, description='更新时间') # startTime: Optional[datetime] = Field(default=None, description='更新时间')
@ -88,6 +89,7 @@ class ParmScheduleVo(BaseModel):
warningGroupId: Optional[int] = Field(None, description="Warning group ID") warningGroupId: Optional[int] = Field(None, description="Warning group ID")
metaTaskId: Optional[int] = Field(None, description="metaTaskId") metaTaskId: Optional[int] = Field(None, description="metaTaskId")
workerGroup: Optional[str] = Field(None, description="Worker group") workerGroup: Optional[str] = Field(None, description="Worker group")
projectType: Optional[str] = Field(default='meta', description="Worker group")
environmentCode: Optional[int] = Field(None, description="Environment code") environmentCode: Optional[int] = Field(None, description="Environment code")
processDefinitionCode: Optional[int] = Field(None, description="Process definition code") processDefinitionCode: Optional[int] = Field(None, description="Process definition code")
crontab: Optional[str] = Field(default=None, description='更新时间') crontab: Optional[str] = Field(default=None, description='更新时间')
@ -97,6 +99,7 @@ class ParmScheduleVo(BaseModel):
class ProcessInstancePage(BaseModel): class ProcessInstancePage(BaseModel):
searchVal: Optional[str] = Field(default=None, description="Name of the task node") searchVal: Optional[str] = Field(default=None, description="Name of the task node")
projectType: Optional[str] = Field(default='meta', description="Worker group")
page_num: int = Field(default=1, description='当前页码') page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数') page_size: int = Field(default=10, description='每页记录数')

3
vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py

@ -80,6 +80,7 @@ class DeleteMetataskModel(BaseModel):
""" """
metatask_ids: str metatask_ids: str
ds_ids: str ds_ids: str
class OperaMetataskModel(BaseModel): class OperaMetataskModel(BaseModel):
""" """
@ -87,7 +88,7 @@ class OperaMetataskModel(BaseModel):
""" """
id: str id: str
type:str type:str
class CrudMetataskResponse(BaseModel): class CrudMetataskResponse(BaseModel):
""" """
操作参数配置响应模型 操作参数配置响应模型

355
vue-fastapi-backend/module_admin/service/metasecurity_service.py

@ -517,149 +517,228 @@ async def get_table_configs(query_db, page_object, user, role_id_list, table_nam
"user_row_list": user_row_list, "user_row_list": user_row_list,
"isHave":isHave "isHave":isHave
} }
async def generate_sql(tablesRowCol:dict, table_columns:dict): # async def generate_sql(tablesRowCol:dict, table_columns:dict):
sql_queries = {} # sql_queries = {}
# 1. 列控制 # # 1. 列控制
# 遍历每个表 # # 遍历每个表
no_configTable_name="" # no_configTable_name=""
for table_name, table_configs in tablesRowCol.items(): # for table_name, table_configs in tablesRowCol.items():
if not table_configs.get("isHave", False): # if not table_configs.get("isHave", False):
no_configTable_name += table_name + "," # no_configTable_name += table_name + ","
if no_configTable_name: # if no_configTable_name:
no_configTable_name = no_configTable_name.rstrip(',') # no_configTable_name = no_configTable_name.rstrip(',')
raise ValueError(f"表:{no_configTable_name}均未配置行列数据安全") # raise ValueError(f"表:{no_configTable_name}均未配置行列数据安全")
# for table_name, config in tablesRowCol.items():
# # 获取该表的字段名
# columns = {col.lower(): col for col in table_columns[table_name]} # 将字段名转为小写
# # 初始化 SELECT 部分:用字典存储字段名,值是 null 字段名
# select_columns = {col: f"null as {col}" for col in columns}
# # 处理角色列配置
# for col in config["role_col_list"]:
# # If dbCName is "ALL", handle it as a special case
# if col.dbCName == "ALL":
# if col.ctrl_type == '0': # If ctrl_type is '0', prefix all columns with null
# for db_column in columns: # Assuming 'user' is the table name
# select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
# elif col.ctrl_type == '1': # If ctrl_type is '1', use actual column names
# for db_column in columns:
# select_columns[db_column] = db_column # 使用实际字段名
# else:
# # Handle specific columns listed in dbCName
# db_columns = [db_column.strip().lower() for db_column in col.dbCName.split(",")]
# for db_column in db_columns:
# db_column = db_column.strip()
# if db_column in columns: # Check if the column exists in the table
# if col.ctrl_type == '0': # If ctrl_type is '0', prefix with null
# select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
# elif col.ctrl_type == '1': # If ctrl_type is '1', use actual column name
# select_columns[db_column] = db_column # 使用实际字段名
# # 处理用户列配置
# for col in config["user_col_list"]:
# if col.dbCName == "ALL": # 如果 dbCName 为 "ALL"
# if col.ctrl_type == "0": # ctrlType 为 0,字符串字段
# for db_column in columns: # 对所有字段加上 null
# select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
# elif col.ctrl_type == "1": # ctrlType 为 1,实际数据库字段
# for db_column in columns: # 使用实际字段名,不加 null
# select_columns[db_column] = db_column # 使用实际字段名
# else: # 处理 dbCName 不为 "ALL" 的情况
# db_columns = [db_column.strip().lower() for db_column in col.dbCName.split(",")]
# for db_column in db_columns:
# db_column = db_column.strip()
# if db_column in columns:
# if col.ctrl_type == "0":
# select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
# elif col.ctrl_type == "1":
# select_columns[db_column] = db_column # 使用实际字段名
# # 生成 SQL 查询
# sql_queries[table_name] = f"SELECT {', '.join(select_columns.values())} FROM {table_name}"
# # 2.行控制
# select_rows={}
# # 处理角色行配置
# for row in config["role_row_list"]:
# # 仅仅对固定值有效,不加行限制
# if row.ctrl_value == "ALL" and row.ctrl_type == '0':
# # 控制方式 --固定值
# select_rows[row.dbCName] = ""
# else:
# if row.ctrl_type == '0':
# # row.ctrl_value 是逗号分隔的字符串时,改为 IN 语句
# if "," in row.ctrl_value:
# # 将 ctrl_value 按逗号分割,并用单引号包裹每个值
# values = [f"'{value.strip()}'" for value in row.ctrl_value.split(",")]
# select_rows[row.dbCName] = f"{row.dbCName} IN ({', '.join(values)})"
# else:
# select_rows[row.dbCName] = f"{row.dbCName} = '{row.ctrl_value}'"
# if row.ctrl_type == '1':
# tab_col_value=row.ctrl_value.split(".")
# if len(tab_col_value) != 2:
# raise RuntimeError(f"{row.dbCName}字段控制类型为表字段,未维护正确的值")
# select_rows[row.dbCName] = f"{row.dbCName} in (select {tab_col_value[1]} from {row.dbSName}.{tab_col_value[0]} where user_id = '1')"
# # 处理用户行配置
# for row in config["user_row_list"]:
# # 仅仅对固定值有效,不加行限制
# if row.ctrl_value == "ALL" and row.ctrl_type == '0':
# # 控制方式 --固定值
# select_rows[row.dbCName] = ""
# else:
# if row.ctrl_type == '0':
# # row.obj_value 是逗号分隔的字符串时,改为 IN 语句
# if "," in row.ctrl_value:
# # 将 obj_value 按逗号分割,并用单引号包裹每个值
# values = [f"'{value.strip()}'" for value in row.ctrl_value.split(",")]
# select_rows[row.dbCName] = f"{row.dbCName} IN ({', '.join(values)})"
# else:
# select_rows[row.dbCName] = f"{row.dbCName} = '{row.ctrl_value}'"
# if row.ctrl_type == '1':
# tab_col_value=row.ctrl_value.split(".")
# if len(tab_col_value) != 2:
# raise RuntimeError(f"{row.dbCName}字段控制类型为表字段,未维护正确的值")
# select_rows[row.dbCName] = f"{row.dbCName} in (select {tab_col_value[1]} from {row.dbSName}.{tab_col_value[0]} where user_id = '1')"
# if select_rows.values():
# where_conditions = " AND ".join(select_rows.values())
# if where_conditions:
# sql_queries[table_name] += " WHERE " + where_conditions
# else:
# sql_queries[table_name] += " WHERE 1 = 0"
# return sql_queries
async def generate_sql(tablesRowCol: dict, table_columns: dict):
sql_queries = {}
# ========= 0. 校验是否存在未配置安全策略的表 =========
no_config_tables = [
table_name
for table_name, cfg in tablesRowCol.items()
if not cfg.get("isHave", False)
]
if no_config_tables:
raise ValueError(f"表:{','.join(no_config_tables)} 均未配置行列数据安全")
# ========= 1. 遍历每个表 =========
for table_name, config in tablesRowCol.items(): for table_name, config in tablesRowCol.items():
# 获取该表的字段名 # 字段映射:小写 → 原始字段名
columns = {col.lower(): col for col in table_columns[table_name]} # 将字段名转为小写 columns = {col.lower(): col for col in table_columns[table_name]}
# 初始化 SELECT 部分:用字典存储字段名,值是 null 字段名
select_columns = {col: f"null as {col}" for col in columns} # ====================================================
# 2. 列控制(不可见优先)
# 处理角色列配置 # ====================================================
for col in config["role_col_list"]:
# If dbCName is "ALL", handle it as a special case # 0 = 不可见,1 = 可见,None = 未配置(默认不可见)
if col.dbCName == "ALL": column_visibility = {col: None for col in columns}
if col.ctrl_type == '0': # If ctrl_type is '0', prefix all columns with null
for db_column in columns: # Assuming 'user' is the table name def set_visibility(col_name: str, ctrl_type: str):
select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀 """
elif col.ctrl_type == '1': # If ctrl_type is '1', use actual column names 不可见(ctrl_type=0) 优先级最高
for db_column in columns: """
select_columns[db_column] = db_column # 使用实际字段名 if ctrl_type == '0':
else: column_visibility[col_name] = '0'
# Handle specific columns listed in dbCName elif ctrl_type == '1':
db_columns = [db_column.strip().lower() for db_column in col.dbCName.split(",")] if column_visibility[col_name] != '0':
for db_column in db_columns: column_visibility[col_name] = '1'
db_column = db_column.strip()
if db_column in columns: # Check if the column exists in the table def handle_col_config(col_cfg_list):
if col.ctrl_type == '0': # If ctrl_type is '0', prefix with null for col in col_cfg_list:
select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀 if col.dbCName == "ALL":
elif col.ctrl_type == '1': # If ctrl_type is '1', use actual column name for db_col in columns:
select_columns[db_column] = db_column # 使用实际字段名 set_visibility(db_col, col.ctrl_type)
# 处理用户列配置 else:
for col in config["user_col_list"]: db_cols = [c.strip().lower() for c in col.dbCName.split(",")]
if col.dbCName == "ALL": # 如果 dbCName 为 "ALL" for db_col in db_cols:
if col.ctrl_type == "0": # ctrlType 为 0,字符串字段 if db_col in columns:
for db_column in columns: # 对所有字段加上 null set_visibility(db_col, col.ctrl_type)
select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
elif col.ctrl_type == "1": # ctrlType 为 1,实际数据库字段 # 角色列 + 用户列
for db_column in columns: # 使用实际字段名,不加 null handle_col_config(config.get("role_col_list", []))
select_columns[db_column] = db_column # 使用实际字段名 handle_col_config(config.get("user_col_list", []))
else: # 处理 dbCName 不为 "ALL" 的情况
db_columns = [db_column.strip().lower() for db_column in col.dbCName.split(",")] # 生成 SELECT 字段
for db_column in db_columns: select_columns = []
db_column = db_column.strip() for col in columns:
if db_column in columns: if column_visibility[col] == '1':
if col.ctrl_type == "0": select_columns.append(col)
select_columns[db_column] = f"null as {db_column}" # 仍然保留 null 前缀
elif col.ctrl_type == "1":
select_columns[db_column] = db_column # 使用实际字段名
# 生成 SQL 查询
sql_queries[table_name] = f"SELECT {', '.join(select_columns.values())} FROM {table_name}"
# 2.行控制
select_rows={}
# 处理角色行配置
for row in config["role_row_list"]:
# 仅仅对固定值有效,不加行限制
if row.ctrl_value == "ALL" and row.ctrl_type == '0':
# 控制方式 --固定值
select_rows[row.dbCName] = ""
else:
if row.ctrl_type == '0':
# row.ctrl_value 是逗号分隔的字符串时,改为 IN 语句
if "," in row.ctrl_value:
# 将 ctrl_value 按逗号分割,并用单引号包裹每个值
values = [f"'{value.strip()}'" for value in row.ctrl_value.split(",")]
select_rows[row.dbCName] = f"{row.dbCName} IN ({', '.join(values)})"
else:
select_rows[row.dbCName] = f"{row.dbCName} = '{row.ctrl_value}'"
if row.ctrl_type == '1':
tab_col_value=row.ctrl_value.split(".")
if len(tab_col_value) != 2:
raise RuntimeError(f"{row.dbCName}字段控制类型为表字段,未维护正确的值")
select_rows[row.dbCName] = f"{row.dbCName} in (select {tab_col_value[1]} from {row.dbSName}.{tab_col_value[0]} where user_id = '1')"
# 处理用户行配置
for row in config["user_row_list"]:
# 仅仅对固定值有效,不加行限制
if row.ctrl_value == "ALL" and row.ctrl_type == '0':
# 控制方式 --固定值
select_rows[row.dbCName] = ""
else: else:
if row.ctrl_type == '0': select_columns.append(f"null as {col}")
# row.obj_value 是逗号分隔的字符串时,改为 IN 语句
if "," in row.ctrl_value: sql = f"SELECT {', '.join(select_columns)} FROM {table_name}"
# 将 obj_value 按逗号分割,并用单引号包裹每个值
values = [f"'{value.strip()}'" for value in row.ctrl_value.split(",")] # ====================================================
select_rows[row.dbCName] = f"{row.dbCName} IN ({', '.join(values)})" # 3. 行控制
else: # ====================================================
select_rows[row.dbCName] = f"{row.dbCName} = '{row.ctrl_value}'"
if row.ctrl_type == '1': where_conditions = []
tab_col_value=row.ctrl_value.split(".")
if len(tab_col_value) != 2: def build_row_condition(row):
raise RuntimeError(f"{row.dbCName}字段控制类型为表字段,未维护正确的值") # 固定值 & ALL → 不加限制
select_rows[row.dbCName] = f"{row.dbCName} in (select {tab_col_value[1]} from {row.dbSName}.{tab_col_value[0]} where user_id = '1')" if row.ctrl_type == '0' and row.ctrl_value == "ALL":
if select_rows.values(): return None
where_conditions = " AND ".join(select_rows.values())
if where_conditions: # 固定值
sql_queries[table_name] += " WHERE " + where_conditions if row.ctrl_type == '0':
if "," in row.ctrl_value:
values = [f"'{v.strip()}'" for v in row.ctrl_value.split(",")]
return f"{row.dbCName} IN ({', '.join(values)})"
return f"{row.dbCName} = '{row.ctrl_value}'"
# 表字段
if row.ctrl_type == '1':
tab_col = row.ctrl_value.split(".")
if len(tab_col) != 2:
raise RuntimeError(
f"{row.dbCName} 字段控制类型为表字段,但未维护正确的值"
)
table, column = tab_col
return (
f"{row.dbCName} IN ("
f"SELECT {column} FROM {row.dbSName}.{table} "
f"WHERE user_id = '1')"
)
return None
def handle_row_config(row_cfg_list):
for row in row_cfg_list:
condition = build_row_condition(row)
if condition:
where_conditions.append(condition)
# 角色行 + 用户行
handle_row_config(config.get("role_row_list", []))
handle_row_config(config.get("user_row_list", []))
# ====================================================
# 4. WHERE 拼接(无行权限则拒绝访问)
# ====================================================
if where_conditions:
sql += " WHERE " + " AND ".join(where_conditions)
else: else:
sql_queries[table_name] += " WHERE 1 = 0" sql += " WHERE 1 = 0"
sql_queries[table_name] = sql
return sql_queries return sql_queries
# async def replace_table_with_subquery(ctrSqlDict, oldStrSql):
# table_alias_map = {} # 存储表名和别名的映射
# for table_name, subquery in ctrSqlDict.items():
# # 构建正则表达式,匹配表名及可能的别名
# pattern = (
# r'(\b(?:[a-zA-Z_][a-zA-Z0-9_]*\.)?' # 匹配模式名(可选)
# + re.escape(table_name) # 转义表名
# + r'\b)' # 结束表名
# r'(\s+(?:AS\s+)?(\w+))?' # 捕获别名部分(含 AS 或直接别名)
# r'(?=\s*[\w\(\)]*)' # 确保后面是合法 SQL 语法,不是 SQL 关键字
# )
# def replace(match):
# original_table = match.group(1) # 原始表名(可能含模式名)
# alias_part = match.group(2) # 别名部分(含空格、AS 或直接别名)
# alias_name = match.group(3) # 别名名称(无 AS 前缀)
# if original_table not in table_alias_map:
# # 处理表名后直接跟着 SQL 关键字的情况
# sql_keywords = {"LIMIT", "WHERE", "ORDER", "GROUP", "HAVING", "JOIN", "ON", "USING", "UNION",
# "EXCEPT", "INTERSECT", "FETCH", "OFFSET"}
# if alias_name and alias_name.upper().split()[0] not in sql_keywords:
# # 已存在别名,且别名后没有紧跟 SQL 关键字,保留原别名
# replaced = f"({subquery}) {alias_part}"
# table_alias_map[original_table] = alias_part
# else:
# # 无别名时,或者别名无效(如 LIMIT),添加默认别名
# alias = original_table.split('.')[-1]
# replaced = f"({subquery}) AS {alias}{alias_part}"
# table_alias_map[original_table] = alias
# else:
# alias = table_alias_map[original_table]
# replaced = f"{alias}" # 使用别名
# return replaced
# # 执行替换(忽略大小写)
# oldStrSql = re.sub(pattern, replace, oldStrSql, flags=re.IGNORECASE)
# return oldStrSql

16
vue-fastapi-backend/module_admin/service/metatask_service.py

@ -1228,8 +1228,16 @@ class MetataskService:
process.runMode='RUN_MODE_SERIAL' process.runMode='RUN_MODE_SERIAL'
process.processInstancePriority='MEDIUM' process.processInstancePriority='MEDIUM'
process.dryRun=0 process.dryRun=0
process.scheduleTime="{complementStartDate:'2025-01-12 00:00:00',complementEndDate:'2025-01-12 00:00:00'}" today = datetime.now().strftime("%Y-%m-%d")
process.scheduleTime = (
"{"
f"complementStartDate:'{today} 00:00:00',"
f"complementEndDate:'{today} 00:00:00'"
"}"
)
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode') projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
if(process.projectType=='dispatch'):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.taskBatchCode')
url=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/executors/start-process-instance' url=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/executors/start-process-instance'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'} headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
# form_data = {key: str(value) for key, value in process.__dict__.items()} # form_data = {key: str(value) for key, value in process.__dict__.items()}
@ -1433,6 +1441,8 @@ class MetataskService:
cls, request: Request, query_object: ProcessInstancePage,current_user: CurrentUserModel cls, request: Request, query_object: ProcessInstancePage,current_user: CurrentUserModel
): ):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode') projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
if(query_object.projectType=='dispatch'):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.taskBatchCode')
url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/process-instances?pageNo={query_object.page_num}&pageSize={query_object.page_size}&searchVal={query_object.searchVal}' url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/process-instances?pageNo={query_object.page_num}&pageSize={query_object.page_size}&searchVal={query_object.searchVal}'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password} headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password}
response = requests.get(url, headers=headers, verify=False) response = requests.get(url, headers=headers, verify=False)
@ -1452,9 +1462,11 @@ class MetataskService:
@classmethod @classmethod
async def get_task_nodes_services( async def get_task_nodes_services(
cls, request: Request,id:int,current_user: CurrentUserModel cls, request: Request,id:int, projectType:str,current_user: CurrentUserModel
): ):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode') projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
if(projectType=='dispatch'):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.taskBatchCode')
url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/process-instances/{id}/tasks' url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/process-instances/{id}/tasks'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password} headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password}
response = requests.get(url, headers=headers, verify=False) response = requests.get(url, headers=headers, verify=False)

9
vue-fastapi-frontend/src/api/meta/metatask.js

@ -18,9 +18,9 @@ export function listInstances(query) {
}) })
} }
// 查询节点 // 查询节点
export function taskNodes(id) { export function taskNodes(id,projectType) {
return request({ return request({
url: '/default-api/meta/metatask/task_nodes/'+id, url: '/default-api/meta/metatask/task_nodes/'+id+'/'+projectType,
method: 'get', method: 'get',
}) })
} }
@ -72,10 +72,11 @@ export function updatemetatask(data) {
}) })
} }
// 上下线 // 上下线
export function downOrUpmetatask(id,type) { export function downOrUpmetatask(id,type,projectType) {
const data = { const data = {
id, id,
type type,
projectType
} }
return request({ return request({
url: '/default-api/meta/metatask/upOrdown', url: '/default-api/meta/metatask/upOrdown',

2
vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js

@ -441,7 +441,7 @@ export function dsmetataskdelete(data) {
// 查询任务定义列表 // 查询任务定义列表
export function listTaskDefinitions(query) { export function listTaskDefinitions(query) {
return request({ return request({
url: '/ds-api/dolphinscheduler/projects/15094505099232/task-definition', url: '/ds-api/dolphinscheduler/projects/15094505099232/process-definition',
method: 'get', method: 'get',
params: { params: {
pageSize: query.pageSize || 10, pageSize: query.pageSize || 10,

4
vue-fastapi-frontend/src/utils/dsSysUtils.js

@ -4,12 +4,12 @@ export function getNameById(id) {
const userStore = useUserStore(); const userStore = useUserStore();
const list = userStore.dsSysList || []; const list = userStore.dsSysList || [];
const item = list.find(x => x.id == id); const item = list.find(x => x.id == id);
return item ? item.name : ''; return item ? item.name : id;
} }
export function getIdByName(name) { export function getIdByName(name) {
const userStore = useUserStore(); const userStore = useUserStore();
const list = userStore.dsSysList || []; const list = userStore.dsSysList || [];
const item = list.find(x => x.name == name); const item = list.find(x => x.name == name);
return item ? item.id : null; return item ? item.id : name;
} }

4
vue-fastapi-frontend/src/views/dataAsset/assetDetail/index.vue

@ -254,6 +254,8 @@ const defaultProps = {
import useUserStore from '@/store/modules/user'; // import useUserStore from '@/store/modules/user'; //
import { get } from "@vueuse/core/index.cjs";
import { getNameById, getIdByName } from '@/utils/dsSysUtils';
const metaClasList = ref([]); const metaClasList = ref([]);
const userStore = useUserStore(); // const userStore = useUserStore(); //
@ -322,7 +324,7 @@ function getDeptTree() {
/** 节点单击事件 */ /** 节点单击事件 */
function handleNodeClick(data) { function handleNodeClick(data) {
queryParams.value.dataAstSrc = data.name; queryParams.value.dataAstSrc = getIdByName(data.name);
handleQuery(); handleQuery();
}; };

1
vue-fastapi-frontend/src/views/datastd/stdcode/index.vue

@ -376,6 +376,7 @@ const resetQuery = () => {
cdType: '', cdType: '',
sysName: '', sysName: '',
srcSys: '', srcSys: '',
classId:'code',
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10
}; };

38
vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue

@ -117,7 +117,7 @@ import { dsmetatask,dsmetataskdetail } from "@/api/meta/metatask";
import { dsmetataskSec} from "@/api/metadataConfig/metadataConfig"; import { dsmetataskSec} from "@/api/metadataConfig/metadataConfig";
import { dsmetataskBiz } from "@/api/taskMetadataConfig/metadataConfig"; import { dsmetataskBiz } from "@/api/taskMetadataConfig/metadataConfig";
import Crontab from '@/components/Crontab' import Crontab from '@/components/Crontab'
import { ElMessage } from 'element-plus' import { ElMessage,ElMessageBox } from 'element-plus'
export default { export default {
components: { Crontab }, components: { Crontab },
@ -131,6 +131,7 @@ export default {
type: Function, type: Function,
required: true, required: true,
}, },
projectType: String,
}, },
setup(props) { setup(props) {
@ -212,7 +213,8 @@ const taskSubmitMap = {
}; };
const handleds = () => { const handleds = () => {
const submitData = addDateRange(form, dateRange.value); const submitData = addDateRange(form, dateRange.value,props.projectType);
submitData.projectType=props.projectType;
const submitApi = taskSubmitMap[props.processDefinitionType]; const submitApi = taskSubmitMap[props.processDefinitionType];
if (!submitApi) { if (!submitApi) {
@ -220,13 +222,33 @@ const handleds = () => {
return; return;
} }
submitApi(submitData).then((response) => { const doSubmit = () => {
if (response.success) { submitApi(submitData).then((response) => {
visible.value = false; if (response.success) {
ElMessage.success(response.msg); visible.value = false;
props.getList(); ElMessage.success(response.msg);
props.getList();
}
});
};
//
ElMessageBox.confirm(
'请确认调度频率配置合理。若设置为秒级或过高频率,' +
'可能导致 DS 调度服务压力过大甚至崩溃,是否继续执行?',
'调度风险提示',
{
type: 'warning',
confirmButtonText: '确认执行',
cancelButtonText: '取消'
} }
}); )
.then(() => {
doSubmit();
})
.catch(() => {
//
});
}; };
// Helper function to add the date range to the form // Helper function to add the date range to the form

4
vue-fastapi-frontend/src/views/meta/metatask/index.vue

@ -538,6 +538,7 @@
:environmentList="environmentList" :environmentList="environmentList"
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
projectType="meta"
/> />
<ds-dialog ref="dsdialog" <ds-dialog ref="dsdialog"
processDefinitionType="metaTask" processDefinitionType="metaTask"
@ -546,9 +547,12 @@
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
:getList="getList" :getList="getList"
projectType="meta"
/> />
<log-dialog ref="logdialog" <log-dialog ref="logdialog"
:defindName="defindName" :defindName="defindName"
prpjectType="meta"
/> />
</div> </div>

4
vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue

@ -102,6 +102,7 @@ const { meta_instance_status } = proxy.useDict("meta_instance_status");
// Props // Props
const props = defineProps({ const props = defineProps({
defindName: String, defindName: String,
prpjectType: String,
}); });
// State // State
@ -128,6 +129,7 @@ const fetchInstances = (name) => {
page_num: currentPage.value, page_num: currentPage.value,
page_size: pageSize.value, page_size: pageSize.value,
searchVal: name, searchVal: name,
projectType: props.prpjectType,
}).then((response) => { }).then((response) => {
instances.value = response.rows; instances.value = response.rows;
total.value = response.total; total.value = response.total;
@ -150,7 +152,7 @@ const handlePageChange = (page) => {
// //
const handleFirstRowClick = (row) => { const handleFirstRowClick = (row) => {
taskNodes(row.id).then((response) => { taskNodes(row.id,props.prpjectType).then((response) => {
taskNodesData.value = response.rows; taskNodesData.value = response.rows;
if (taskNodesData.value.length > 0) { if (taskNodesData.value.length > 0) {

4
vue-fastapi-frontend/src/views/meta/metatask/runDialog.vue

@ -67,7 +67,7 @@ import { runmetatask } from "@/api/meta/metatask";
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
export default { export default {
props: ["processDefinitionCode", "warningGroupList", "environmentList", "workerGroupList"], props: ["processDefinitionCode", "warningGroupList", "environmentList", "workerGroupList","projectType"],
data() { data() {
return { return {
visible: false, visible: false,
@ -76,6 +76,7 @@ export default {
warningGroupId: undefined, warningGroupId: undefined,
environmentCode: undefined, environmentCode: undefined,
workerGroup: undefined, workerGroup: undefined,
projectType: undefined,
}, },
}; };
}, },
@ -86,6 +87,7 @@ export default {
this.visible = true; this.visible = true;
}, },
handleRun() { handleRun() {
this.form.projectType = this.projectType;
runmetatask(this.form).then((response) => { runmetatask(this.form).then((response) => {
if (response.success) { if (response.success) {
this.visible = false; this.visible = false;

3
vue-fastapi-frontend/src/views/meta/metatask/secConfig.vue

@ -386,6 +386,7 @@
:environmentList="environmentList" :environmentList="environmentList"
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
projectType="dispatch"
/> />
<ds-dialog ref="dsdialog" <ds-dialog ref="dsdialog"
processDefinitionType="secTask" processDefinitionType="secTask"
@ -394,9 +395,11 @@
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
:getList="getList" :getList="getList"
prpjectType="dispatch"
/> />
<log-dialog ref="logdialog" <log-dialog ref="logdialog"
:defindName="defindName" :defindName="defindName"
prpjectType="dispatch"
/> />
</div> </div>

28
vue-fastapi-frontend/src/views/metadataConfig/log/index.vue

@ -24,26 +24,24 @@
border border
stripe stripe
> >
<el-table-column prop="taskCode" label="任务编号" width="180" /> <el-table-column prop="code" label="任务编号" width="180" />
<el-table-column prop="processDefinitionName" label="工作流名称" /> <el-table-column prop="name" label="工作流名称" />
<el-table-column prop="taskType" label="任务类型" width="180" /> <el-table-column prop="releaseState" label="状态" width="100">
<el-table-column prop="taskName" label="任务名称" width="220" />
<el-table-column prop="processReleaseState" label="状态" width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-tag :type="row.processReleaseState === 'ONLINE' ? 'success' : 'info'"> <el-tag :type="row.releaseState === 'ONLINE' ? 'success' : 'info'">
{{ row.processReleaseState === 'ONLINE' ? '上线' : '下线' }} {{ row.releaseState === 'ONLINE' ? '上线' : '下线' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="taskVersion" label="版本" width="120">
<template #default="{ row }">
V{{ row.taskVersion }}
</template>
</el-table-column>
<el-table-column prop="taskCreateTime" label="创建时间" width="180" /> <el-table-column prop="scheduleReleaseState" label="定时状态" width="180" />
<el-table-column prop="taskUpdateTime" label="更新时间" width="180" /> <el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column prop="updateTime" label="更新时间" width="180" />
<el-table-column prop="description" label="描述" width="180" />
<el-table-column prop="userName" label="创建用户" width="180" />
<el-table-column prop="modifyBy" label="更新用户" width="180" />
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->

6
vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue

@ -384,6 +384,7 @@
:environmentList="environmentList" :environmentList="environmentList"
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
projectType="dispatch"
/> />
<ds-dialog <ds-dialog
ref="dsdialog" ref="dsdialog"
@ -393,8 +394,11 @@
:workerGroupList="workerGroupList" :workerGroupList="workerGroupList"
:processDefinitionCode="dsIds" :processDefinitionCode="dsIds"
:getList="getList" :getList="getList"
projectType="dispatch"
/> />
<log-dialog ref="logdialog" :defindName="defindName" /> <log-dialog ref="logdialog" :defindName="defindName" prpjectType="dispatch"/>
</div> </div>
</template> </template>

10
vue-fastapi-frontend/src/views/system/flow/dataAssetMainAppr.vue

@ -7,7 +7,13 @@
:row-class-name="tableRowClassName" :row-class-name="tableRowClassName"
> >
<el-table-column label="资产编号" align="center" prop="astNo"></el-table-column> <el-table-column label="资产编号" align="center" prop="astNo"></el-table-column>
<el-table-column label="表来源系统" align="center" prop="dataAstSrc"></el-table-column> <el-table-column label="表来源系统" align="center" prop="dataAstSrc">
<template #default="{ row }">
{{
getSrcSysName(row.dataAstSrc)
}}
</template>
</el-table-column>
<el-table-column label="表英文名称" align="center" prop="dataAstEngName"></el-table-column> <el-table-column label="表英文名称" align="center" prop="dataAstEngName"></el-table-column>
<el-table-column label="表中文名称" align="center" prop="dataAstCnName"></el-table-column> <el-table-column label="表中文名称" align="center" prop="dataAstCnName"></el-table-column>
<el-table-column label="表类型" align="center" prop="dataAstType"></el-table-column> <el-table-column label="表类型" align="center" prop="dataAstType"></el-table-column>
@ -59,7 +65,7 @@ const props = defineProps({
} }
}); });
const getSrcSysName = (id) => { const getSrcSysName = (id) => {
const match = dsSysList.find(item => item.id === id); const match = dsSysList.find(item => item.id == id);
return match ? match.name : id; return match ? match.name : id;
}; };
// //

Loading…
Cancel
Save