excel_parse.py 7.5 KB

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