check_level.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import functools
  2. import sys
  3. def floor_sort_cmp(x, y):
  4. positive = 1
  5. negative = -1
  6. x_name = x.get('floor_name')[0:len(x.get('floor_name'))-5]
  7. y_name = y.get('floor_name')[0:len(y.get('floor_name'))-5]
  8. # x 夹层号
  9. x_m_num = 1
  10. # y 夹层号
  11. y_m_num = 1
  12. # x 楼层号
  13. x_floor_num = 1
  14. # y 楼层号
  15. y_floor_num = 1
  16. if x_name.startswith('RFM'):
  17. if y_name.startswith('RFM'):
  18. if len(x_name) > 3:
  19. x_m_num = int(x_name[3:])
  20. if len(y_name) > 3:
  21. y_m_num = int(y_name[3:])
  22. return x_m_num - y_m_num
  23. elif y_name.startswith('RF'):
  24. return negative
  25. else:
  26. return positive
  27. if x_name.startswith('RF'):
  28. return positive
  29. if x_name.startswith('F'):
  30. if y_name.startswith('RF'):
  31. return negative
  32. elif y_name.startswith('F'):
  33. if 'M' in x_name:
  34. x_index = x_name.index('M')
  35. x_floor_num = int(x_name[1 : x_index])
  36. if not x_name.endswith('M'):
  37. x_m_num = int(x_name[x_index + 1:])
  38. else:
  39. x_floor_num = int(x_name[1:])
  40. if 'M' in y_name:
  41. y_index = y_name.index('M')
  42. y_floor_num = int(y_name[1:y_index])
  43. if not y_name.endswith('M'):
  44. y_m_num = int(y_name[y_index + 1:])
  45. else:
  46. y_floor_num = int(y_name[1:])
  47. if x_floor_num == y_floor_num:
  48. return x_m_num - y_m_num
  49. else:
  50. return x_floor_num - y_floor_num
  51. else:
  52. return positive
  53. if x_name.startswith('B'):
  54. if y_name.startswith('B'):
  55. if 'M' in x_name:
  56. x_index = x_name.index('M')
  57. x_floor_num = int(x_name[1 : x_index])
  58. if not x_name.endswith('M'):
  59. x_m_num = int(x_name[x_index + 1:])
  60. else:
  61. x_floor_num = int(x_name[1:])
  62. if 'M' in y_name:
  63. y_index = y_name.index('M')
  64. y_floor_num = int(y_name[1:y_index])
  65. if not y_name.endswith('M'):
  66. y_m_num = int(y_name[y_index + 1:])
  67. else:
  68. y_floor_num = int(y_name[1:])
  69. if x_floor_num == y_floor_num:
  70. return x_m_num - y_m_num
  71. else:
  72. return y_floor_num - x_floor_num
  73. else:
  74. return negative
  75. return 1
  76. def check_level_reasonable(model_list):
  77. sorted_arr = sorted(model_list, key=functools.cmp_to_key(floor_sort_cmp))
  78. last_height = -999999999
  79. last_model_id = ''
  80. error = set()
  81. group = 0
  82. elevations = {}
  83. for row in sorted_arr:
  84. current_height = row.get('level')
  85. current_model_id = row.get('fid')
  86. elevations[current_model_id] = current_height
  87. if current_height is not None and current_height > last_height:
  88. last_height = current_height
  89. last_model_id = current_model_id
  90. continue
  91. else:
  92. # 标高有问题
  93. group += 1
  94. error.add(last_model_id)
  95. error.add(current_model_id)
  96. last_height = -999999999
  97. last_model_id = ''
  98. continue
  99. for floor_row in model_list:
  100. model_id = floor_row.get('fid')
  101. if model_id in error:
  102. floor_row['has_error'] = True
  103. floor_row['error'] = '标高冲突'
  104. else:
  105. floor_row['has_error'] = False
  106. floor_row['error'] = None
  107. if len(error) == 0:
  108. return True
  109. return False
  110. # arr = ['F1M1-saga', 'F1M2-saga', 'RFM1-saga', 'RFM3-saga', 'RFM2-saga', 'B1-saga', 'B1M-saga', 'B1M2-saga', 'B4-saga', 'F2-saga', 'F2M2-saga', 'RF-saga']
  111. # print(sorted(arr, key=functools.cmp_to_key(floor_sort_cmp)))