utils.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: yq
  4. @time: 2024/12/5
  5. @desc:
  6. """
  7. import json
  8. import os
  9. import shutil
  10. import time
  11. from typing import List
  12. import gradio as gr
  13. import pandas as pd
  14. from commom import f_read_file
  15. from config import BaseConfig
  16. from .manager import engine
  17. DATA_SUB_DIR = "data"
  18. UPLOAD_DATA_PREFIX = "prefix_upload_data_"
  19. def _clean_base_dir(data):
  20. base_dir = _get_base_dir(data)
  21. file_name_list: List[str] = os.listdir(base_dir)
  22. for file_name in file_name_list:
  23. if file_name in [DATA_SUB_DIR]:
  24. continue
  25. file_path = os.path.join(base_dir, file_name)
  26. if os.path.isdir(file_path):
  27. shutil.rmtree(file_path)
  28. else:
  29. os.remove(file_path)
  30. def _check_save_dir(data):
  31. project_name = engine.get(data, "project_name")
  32. if project_name is None or len(project_name) == 0:
  33. raise gr.Error(message='项目名称不能为空', duration=5)
  34. return True
  35. def _get_prefix_file(save_path, prefix):
  36. file_name_list: List[str] = os.listdir(save_path)
  37. for file_name in file_name_list:
  38. if prefix in file_name:
  39. return os.path.join(save_path, file_name)
  40. def _get_base_dir(data):
  41. project_name = engine.get(data, "project_name")
  42. base_dir = os.path.join(BaseConfig.base_dir, project_name)
  43. return base_dir
  44. def _get_upload_data(data) -> pd.ExcelFile:
  45. base_dir = _get_base_dir(data)
  46. save_path = os.path.join(base_dir, DATA_SUB_DIR)
  47. file_path = _get_prefix_file(save_path, UPLOAD_DATA_PREFIX)
  48. excel = pd.ExcelFile(file_path)
  49. return excel
  50. def _get_upload_data_path(data) ->str:
  51. base_dir = _get_base_dir(data)
  52. save_path = os.path.join(base_dir, DATA_SUB_DIR)
  53. file_path = _get_prefix_file(save_path, UPLOAD_DATA_PREFIX)
  54. return file_path
  55. def _get_node_func_dict(data) -> dict:
  56. node_func_dict_path = _get_save_path(data, BaseConfig.node_map_name)
  57. if not os.path.exists(node_func_dict_path):
  58. return None
  59. with open(node_func_dict_path, mode="r", encoding="utf8") as f:
  60. node_func_dict = f.read()
  61. node_func_dict = json.loads(node_func_dict)
  62. return node_func_dict
  63. def f_project_is_exist(data):
  64. project_name = engine.get(data, "project_name")
  65. if project_name is None or len(project_name) == 0:
  66. gr.Warning(message='项目名称不能为空', duration=5)
  67. elif os.path.exists(_get_base_dir(data)):
  68. gr.Warning(message='项目名称已被使用', duration=5)
  69. def _get_save_path(data, file_name: str, sub_dir="", name_prefix=""):
  70. base_dir = _get_base_dir(data)
  71. save_path = os.path.join(base_dir, sub_dir)
  72. os.makedirs(save_path, exist_ok=True)
  73. # 有前缀标示的先删除
  74. if name_prefix:
  75. file = _get_prefix_file(save_path, name_prefix)
  76. if file:
  77. os.remove(file)
  78. save_path = os.path.join(save_path, name_prefix + os.path.basename(file_name))
  79. return save_path
  80. def f_data_upload(data):
  81. if not _check_save_dir(data):
  82. return None
  83. file_data = engine.get(data, "file_data")
  84. data_path = _get_save_path(data, file_data.name, DATA_SUB_DIR, UPLOAD_DATA_PREFIX)
  85. shutil.copy(file_data.name, data_path)
  86. excel = _get_upload_data(data)
  87. df = excel.parse(sheet_name=BaseConfig.flow_sheet_name)
  88. columns = excel.sheet_names
  89. excel.close()
  90. return {
  91. engine.get_elem_by_id("data_upload"): gr.update(value=df, visible=True),
  92. engine.get_elem_by_id("sheet_name"): gr.update(choices=columns, value=BaseConfig.flow_sheet_name),
  93. engine.get_elem_by_id("download_demo"): gr.update(visible=False),
  94. engine.get_elem_by_id("code_view"): gr.update(value=None, visible=False),
  95. engine.get_elem_by_id("download_code"): gr.update(value=None, visible=False),
  96. }
  97. def f_get_sheet_data(data):
  98. sheet_name = engine.get(data, "sheet_name")
  99. excel = _get_upload_data(data)
  100. df = excel.parse(sheet_name=sheet_name)
  101. excel.close()
  102. node_func_dict = _get_node_func_dict(data)
  103. if node_func_dict is not None:
  104. code = f_read_file(_get_save_path(data, node_func_dict[sheet_name]))
  105. return {
  106. engine.get_elem_by_id("data_upload"): gr.update(value=df),
  107. engine.get_elem_by_id("code_view"): gr.update(value=code, label=sheet_name),
  108. }
  109. return {
  110. engine.get_elem_by_id("data_upload"): gr.update(value=df)
  111. }
  112. def f_download_code(data):
  113. file_path = _get_save_path(data, BaseConfig.code_zip_name)
  114. if os.path.exists(file_path):
  115. return {engine.get_elem_by_id("download_code"): gr.update(value=file_path)}
  116. else:
  117. raise FileNotFoundError(f"{file_path} not found.")
  118. def f_verify_param(data):
  119. excel = _get_upload_data(data)
  120. columns = excel.sheet_names
  121. excel.close()
  122. if BaseConfig.flow_sheet_name not in columns:
  123. raise gr.Error(message=f'【{BaseConfig.flow_sheet_name}】sheet不能为空', duration=5)
  124. return True
  125. def f_project_load(data):
  126. project_name = engine.get(data, "project_name")
  127. if project_name is None or len(project_name) == 0:
  128. gr.Warning(message='项目名称不能为空', duration=5)
  129. if os.path.exists(_get_base_dir(data)):
  130. node_func_dict = _get_node_func_dict(data)
  131. if node_func_dict is not None:
  132. excel = _get_upload_data(data)
  133. df = excel.parse(sheet_name=BaseConfig.flow_sheet_name)
  134. columns = excel.sheet_names
  135. excel.close()
  136. code = f_read_file(_get_save_path(data, node_func_dict[BaseConfig.flow_sheet_name]))
  137. code_zip_file_path = _get_save_path(data, BaseConfig.code_zip_name)
  138. upload_data_path = _get_upload_data_path(data)
  139. return {
  140. engine.get_elem_by_id("data_upload"): gr.update(value=df, visible=True),
  141. engine.get_elem_by_id("code_view"): gr.update(value=code, visible=True,
  142. label=BaseConfig.flow_sheet_name),
  143. engine.get_elem_by_id("sheet_name"): gr.update(choices=columns, value=BaseConfig.flow_sheet_name),
  144. engine.get_elem_by_id("download_demo"): gr.update(visible=False),
  145. engine.get_elem_by_id("download_code"): gr.update(value=code_zip_file_path, visible=True),
  146. engine.get_elem_by_id("file_data"): gr.update(value=upload_data_path)
  147. }
  148. return {
  149. engine.get_elem_by_id("data_upload"): gr.update(visible=False),
  150. engine.get_elem_by_id("code_view"): gr.update(visible=False),
  151. engine.get_elem_by_id("download_code"): gr.update(visible=False),
  152. }
  153. def f_code_generate(data, progress=gr.Progress(track_tqdm=True)):
  154. def _reset_component_state():
  155. return {engine.get_elem_by_id("download_code"): gr.update(visible=False),
  156. engine.get_elem_by_id("code_view"): gr.update(visible=False)
  157. }
  158. progress(0, desc="Starting")
  159. all_param = engine.get_all(data)
  160. # 校验参数
  161. if not f_verify_param(data):
  162. yield _reset_component_state()
  163. # 清空储存目录
  164. # _clean_base_dir(data)
  165. yield _reset_component_state()
  166. progress(0.01)
  167. time.sleep(2)
  168. excel = None
  169. try:
  170. excel = _get_upload_data(data)
  171. # strategy_parse = StrategyParse(**all_param)
  172. # strategy_parse.f_parse_strategy(excel, progress)
  173. excel.close()
  174. except Exception as msg:
  175. if excel is not None:
  176. excel.close()
  177. yield _reset_component_state()
  178. raise gr.Error(message=f"系统错误【{msg}】", duration=5)
  179. code_zip_file_path = _get_save_path(data, BaseConfig.code_zip_name)
  180. node_func_dict = _get_node_func_dict(data)
  181. flow_code = f_read_file(_get_save_path(data, node_func_dict[BaseConfig.flow_sheet_name]))
  182. progress(1)
  183. yield {engine.get_elem_by_id("generate_progress"): gr.update(value="生成完成"),
  184. engine.get_elem_by_id("download_code"): gr.update(value=code_zip_file_path, visible=True),
  185. engine.get_elem_by_id("code_view"): gr.update(value=flow_code, label=BaseConfig.flow_sheet_name,
  186. visible=True),
  187. }