utils.py 8.2 KB

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