util.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import xml.etree.ElementTree as ET
  2. from typing import Union
  3. import os
  4. import uuid
  5. import re
  6. from pydantic import BaseModel
  7. import pandas as pd
  8. from numpy import float64
  9. def indexrcj(rcjhz, rcjarray):
  10. bm = rcjarray[1]
  11. name = rcjarray[2]
  12. danwei = rcjarray[4]
  13. target = bm + name + danwei
  14. for i in range(len(rcjhz)):
  15. entry = rcjhz[i]
  16. attempt = entry[1] + entry[2] + entry[4]
  17. if attempt == target:
  18. return str(i)
  19. print("###########################warning######################")
  20. print(rcjarray)
  21. print("###########################rcjhz not include ###################")
  22. ##raise Exception("not found rcjid")
  23. return ""
  24. def huizongrcj_order(data):
  25. huizong = {}
  26. result = [
  27. ["ID", "人材机编码", "名称", "规格型号", "单位", "单价", "产地",
  28. "供应厂商", "人材机类别", "甲供标志", "含量", "合价", "暂估价标志", "主要材料标志", "主材标志", "设备标志" ]]
  29. left = []
  30. for entry in data:
  31. bm = entry[1]
  32. name = entry[2]
  33. danwei = entry[4]
  34. if '000FE' in bm and danwei == '%': ##azfy
  35. left.append(entry)
  36. continue
  37. if '00EXP001' in bm and danwei == '%': ##回程费
  38. left.append(entry)
  39. continue
  40. if '99EXP007' in bm and danwei == '%': ##回程费
  41. left.append(entry)
  42. continue
  43. if '99EXP022' in bm and danwei == '%': ##回程费
  44. left.append(entry)
  45. continue
  46. if '31130104' in bm and danwei == '%': ##回程费
  47. left.append(entry)
  48. continue
  49. key = bm + name + danwei
  50. if key in huizong:
  51. huizong[key].append(entry)
  52. else:
  53. huizong[key] = [entry]
  54. for key,value in huizong.items():
  55. result_hl = 0
  56. for i in range(0, len(value)):
  57. result_hl = result_hl + float(value[i][10])
  58. result_dj = float(value[0][5])
  59. result_hj = result_hl * result_dj
  60. result.append([value[0][0], value[0][1], value[0][2], value[0][3], value[0][4],
  61. value[0][5],value[0][6], value[0][7], value[0][8], value[0][9], result_hl,
  62. result_hj, value[0][12],value[0][13],
  63. value[0][14], value[0][15], ])
  64. for entry in left:
  65. result.append([entry[0], entry[1], entry[2], entry[3], entry[4], entry[5],
  66. entry[6], entry[7], entry[8], entry[9], entry[10], entry[11],
  67. entry[12], entry[13], entry[14], entry[15]])
  68. return result
  69. def huizongrcj(data):
  70. huizong = {}
  71. result = [
  72. [ "ID", "编码", "名称", "规格型号", "单位", "数量", "单价", "合价", "产地",
  73. "供应厂商", "人材机类别", "主要材料标志", "主材标志", "设备标志", "甲供标志", "暂估价标志"]]
  74. left = []
  75. for entry in data:
  76. bm = entry[1]
  77. name = entry[2]
  78. danwei = entry[4]
  79. if '000FE' in bm and danwei == '%': ##azfy
  80. left.append(entry)
  81. continue
  82. if '00EXP001' in bm and danwei == '%': ##azfy
  83. left.append(entry)
  84. continue
  85. if '99EXP007' in bm and danwei == '%': ##azfy
  86. left.append(entry)
  87. continue
  88. if '99EXP022' in bm and danwei == '%': ##azfy
  89. left.append(entry)
  90. continue
  91. if '31130104' in bm and danwei == '%': ##azfy
  92. left.append(entry)
  93. continue
  94. key = bm + name + danwei
  95. if key in huizong:
  96. huizong[key].append(entry)
  97. else:
  98. huizong[key] = [entry]
  99. for key,value in huizong.items():
  100. result_hl = 0
  101. for i in range(0, len(value)):
  102. result_hl = result_hl + float(value[i][10])
  103. result_dj = float(value[0][5])
  104. result_hj = result_hl * result_dj
  105. result.append([value[0][0], value[0][1], value[0][2], value[0][3], value[0][4], result_hl,
  106. value[0][5], result_hj, value[0][6], value[0][7], value[0][8], value[0][13],
  107. value[0][14], value[0][15], value[0][9], value[0][12]])
  108. for entry in left:
  109. result.append([entry[0], entry[1], entry[2], entry[3], entry[4], entry[10],
  110. entry[5], entry[11], entry[6], entry[7], entry[8], entry[13],
  111. entry[14], entry[15], entry[9], entry[12]])
  112. return result
  113. def mergerg(rg1, rg2, coef):
  114. isolated=[]
  115. for entry in rg2:
  116. CLBH = entry['CLBH']
  117. hit = False
  118. for toMerge in rg1:
  119. print(toMerge)
  120. if toMerge['CLBH'] == CLBH:
  121. hit = True
  122. toMerge['gr'] = float(toMerge['gr']) + coef * float(entry['gr'])
  123. toMerge['gf'] = float(toMerge['gf']) + coef * float(entry['gf'])
  124. if not hit:
  125. isolated.append({'CLBH':entry['CLBH'],'CLMC':entry['CLMC'],'JLDW':entry['JLDW'],'YSJG':float(entry['YSJG']),'gr':float(entry['gr']),'gf':float(entry['gf'])})
  126. rg1 = rg1 + isolated
  127. return rg1
  128. def multirg(rg1, coef):
  129. for toMerge in rg1:
  130. toMerge['gr'] = float(toMerge['gr']) * coef
  131. toMerge['gf'] = float(toMerge['gf']) * coef
  132. def mergejx(rg1, rg2, coef):
  133. isolated=[]
  134. for entry in rg2:
  135. jxbh = entry['jxbh']
  136. hit=False
  137. for toMerge in rg1:
  138. print(toMerge)
  139. if toMerge['jxbh'] == jxbh:
  140. hit=True
  141. toMerge['sl'] = float(toMerge['sl']) + coef * float(entry['sl'])
  142. toMerge['hj'] = float(toMerge['hj']) + coef * float(entry['hj'])
  143. if not hit:
  144. isolated.append({'jxbh':entry['jxbh'],'jxmc':entry['jxmc'],'DW':entry['DW'],'tbdj':float(entry['tbdj']),'sl':float(entry['sl']),'hj':float(entry['hj'])})
  145. rg1 = rg1 + isolated
  146. return rg1
  147. def multijx(rg1, coef):
  148. for toMerge in rg1:
  149. toMerge['sl'] = float(toMerge['sl']) * coef
  150. toMerge['hj'] = float(toMerge['hj']) * coef
  151. def mergecl(rg1, rg2, coef):
  152. isolated=[]
  153. for entry in rg2:
  154. CLBH = entry['CLBH']
  155. hit=False
  156. for toMerge in rg1:
  157. print(toMerge)
  158. if toMerge['CLBH'] == CLBH:
  159. hit=True
  160. toMerge['SL'] = float(toMerge['SL']) + coef * float(entry['SL'])
  161. toMerge['HJ'] = float(toMerge['HJ']) + coef * float(entry['HJ'])
  162. if not hit:
  163. isolated.append({'CLBH':entry['CLBH'],'CLMC':entry['CLMC'],'JLDW':entry['JLDW'],'YSJG':float(entry['YSJG']),'SL':float(entry['SL']),'HJ':float(entry['HJ'])})
  164. rg1 = rg1 + isolated
  165. return rg1
  166. def multicl(rg1, coef):
  167. for toMerge in rg1:
  168. toMerge['SL'] = float(toMerge['SL']) * coef
  169. toMerge['HJ'] = float(toMerge['HJ']) * coef
  170. def cleanBM(raw):
  171. if raw.find("]") == -1:
  172. return raw
  173. if raw.endswith(']'):
  174. return raw
  175. pos = raw.find("*")
  176. tail = 0
  177. for i in range(pos + 1, len(raw) + 1):
  178. if i == len(raw):
  179. tail = i
  180. break
  181. if (raw[i] > '9' or raw[i] < '0') and raw[i] != '-' and raw[i] != '.':
  182. tail = i
  183. break
  184. return raw[0:tail]