excel_parse.py 7.8 KB

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