excel_parse.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. from core.dtos import TotalBudgetInfoDto, ChapterDto
  2. import base64
  3. class ExcelParseZgsDto:
  4. def __init__(self,
  5. zgs_id:int,
  6. zgs_name:str):
  7. self.zgs_id = zgs_id
  8. self.zgs_name = zgs_name
  9. @classmethod
  10. def from_dto(cls,dto: TotalBudgetInfoDto):
  11. return cls(
  12. zgs_id=dto.budget_id,
  13. zgs_name=dto.budget_code
  14. )
  15. def to_dict(self):
  16. return {
  17. "zgs_id":self.zgs_id,
  18. "zgs_name":self.zgs_name
  19. }
  20. class ExcelParseItemDto:
  21. def __init__(self,
  22. item_id:int,
  23. item_code:str,
  24. item_name:str
  25. ):
  26. self.item_id = item_id
  27. self.item_code = item_code
  28. self.item_name = item_name
  29. @classmethod
  30. def from_dto(cls,dto:ChapterDto):
  31. return cls(
  32. item_id=dto.item_id,
  33. item_code=dto.item_code,
  34. item_name=dto.project_name
  35. )
  36. def to_dict(self):
  37. return {
  38. "item_id":self.item_id,
  39. "item_code":self.item_code,
  40. "item_name":self.item_name
  41. }
  42. class ExcelParseFileDto:
  43. def __init__(self,
  44. file_id:str,
  45. content:str
  46. ):
  47. self.file_id = file_id
  48. # 从file_id路径中获取文件类型
  49. self.file_type = file_id.split('.')[-1]
  50. self.content = content
  51. def to_dict(self):
  52. return {
  53. "file_id": base64.b64encode(self.file_id.encode()).decode(),
  54. "file_type": self.file_type,
  55. "content": self.content
  56. }
  57. class ExcelParseDto:
  58. def __init__(self,
  59. task_id:int,
  60. version:str,
  61. project_id:str,
  62. project_name:str,
  63. project_stage:str,
  64. selected_zgs_id:int,
  65. zgs_list:list[ExcelParseZgsDto],
  66. hierarchy:list[ExcelParseItemDto],
  67. components:list[ExcelParseItemDto],
  68. files:list[ExcelParseFileDto]):
  69. self.task_id = task_id
  70. self.version = version
  71. self.project_id = project_id
  72. self.project_name = project_name
  73. self.project_stage = project_stage
  74. self.selected_zgs_id = -1 if selected_zgs_id == 0 else selected_zgs_id
  75. self.zgs_list = zgs_list
  76. self.hierarchy = hierarchy
  77. self.components = components
  78. self.files = files
  79. def to_dict(self):
  80. return {
  81. "task_id":self.task_id,
  82. "version":self.version,
  83. "project_id":self.project_id,
  84. "project_name":self.project_name,
  85. "project_stage":self.project_stage,
  86. "selected_zgs_id":self.selected_zgs_id,
  87. "files":[file.to_dict() for file in self.files],
  88. "zgs_list":[zgs.to_dict() for zgs in self.zgs_list],
  89. "hierarchy":[item.to_dict() for item in self.hierarchy],
  90. "components":[item.to_dict() for item in self.components],
  91. }
  92. class ExcelParseResultDataDto:
  93. # {
  94. # "zgs_id": 总概算id, // int
  95. # "zgs_code": 概算编号,
  96. # "item_id": 条⽬序号, // int
  97. # "item_code": 条⽬编码,
  98. # "dinge_code": 定额编号,
  99. # "entry_name": ⼯程或费⽤项⽬名称,来⾃于定额表,
  100. # "units": 单位,
  101. # "amount": 数量, // number
  102. # "target_id": ⽤户数据库中条⽬的id,-1表示没有, // int
  103. # "ex_file_id": excel⽂件id, // str
  104. # "ex_cell": 数量单元格位置,例如 "C17",
  105. # "ex_row": 该⾏内容,由逗号连接多个单元格得到,
  106. # "ex_unit": excel中给出的单位,
  107. # "ex_amount": excel中给出的数量, // number
  108. # }
  109. def __init__(self,
  110. zgs_id:int, # 总概算id
  111. zgs_code:str, # 总概算编号
  112. item_id:int, # 条⽬序号
  113. item_code:str, # 条⽬编码
  114. entry_name:str, # ⼯程或费⽤项⽬名称,来⾃于定额表,
  115. dinge_code:str, # 定额编号,
  116. units:str, # 单位,
  117. amount:float, # 数量,
  118. target_id:int, # ⽤户数据库中条⽬的id,-1表示没有,
  119. ex_file_id:str, # excel⽂件id,
  120. ex_cell:str, # 数量单元格位置,例如 "C17",
  121. ex_row:str, # 该⾏内容,由逗号连接多个单元格得到,
  122. ex_unit:str, # excel中给出的单位,
  123. ex_amount:float # excel中给出的数量,
  124. ):
  125. self.zgs_id = zgs_id
  126. self.zgs_code = zgs_code
  127. self.item_id = item_id
  128. self.item_code = item_code
  129. self.entry_name = entry_name
  130. self.dinge_code = dinge_code
  131. self.units = units
  132. self.amount = amount
  133. self.target_id = target_id
  134. self.ex_file = ex_file_id
  135. self.ex_file_id = ex_file_id
  136. self.ex_cell = ex_cell
  137. self.ex_row = ex_row
  138. self.ex_unit = ex_unit
  139. self.ex_amount = ex_amount
  140. @classmethod
  141. def from_dict(cls, data: dict):
  142. return cls(
  143. zgs_id=data.get('zgs_id', 0),
  144. zgs_code=data.get('zgs_code', ''),
  145. item_id=data.get('item_id', 0),
  146. item_code=data.get('item_code', ''),
  147. entry_name=data.get('entry_name', ''),
  148. dinge_code=data.get('dinge_code', ''),
  149. units=data.get('units', ''),
  150. amount=data.get('amount', 0.0),
  151. target_id=data.get('target_id', -1),
  152. ex_file_id= base64.b64decode(data.get('ex_file_id', '').encode('utf-8')).decode('utf-8') if data.get('ex_file_id', '') else '',
  153. ex_cell=data.get('ex_cell', ''),
  154. ex_row=data.get('ex_row', ''),
  155. ex_unit=data.get('ex_unit', ''),
  156. ex_amount=data.get('ex_amount', 0.0)
  157. )
  158. def to_dict(self):
  159. return {
  160. "zgs_id": self.zgs_id,
  161. "zgs_code": self.zgs_code,
  162. "item_id": self.item_id,
  163. "item_code": self.item_code,
  164. "entry_name": self.entry_name,
  165. "dinge_code": self.dinge_code,
  166. "units": self.units,
  167. "amount": self.amount,
  168. "ex_file": self.ex_file_id,
  169. "target_id": self.target_id,
  170. # "ex_file_id": base64.b64encode(self.ex_file_id.encode('utf-8')).decode('utf-8') if self.ex_file_id else self.ex_file_id,
  171. "ex_file_id": self.ex_file_id,
  172. "ex_cell": self.ex_cell,
  173. "ex_row": self.ex_row,
  174. "ex_unit": self.ex_unit,
  175. "ex_amount": self.ex_amount
  176. }
  177. class ExcelParseResultDto:
  178. def __init__(self,
  179. task_id:int,
  180. result:int=-1,
  181. reason:str="",
  182. data:list[ExcelParseResultDataDto]=None,
  183. ):
  184. self.task_id = task_id
  185. self.result = result #-1-失败;0-运行中;1-成功
  186. self.data = data
  187. self.reason = reason
  188. @classmethod
  189. def from_dict(cls, response: dict):
  190. data = [ExcelParseResultDataDto.from_dict(item) for item in response.get('data', [])]
  191. return cls(
  192. task_id=response.get('task_id', 0),
  193. result=response.get('result', 0),
  194. reason=response.get('reason', ''),
  195. data = data,
  196. )
  197. def to_dict(self):
  198. return {
  199. "task_id": self.task_id,
  200. "result": self.result,
  201. "reason": self.reason,
  202. "data": [item.to_dict() for item in self.data] if self.data else []
  203. }