123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import functools
- import sys
- def floor_sort_cmp(x, y):
- positive = 1
- negative = -1
- x_name = x.get('floor_name')[0:len(x.get('floor_name'))-5]
- y_name = y.get('floor_name')[0:len(y.get('floor_name'))-5]
- # x 夹层号
- x_m_num = 1
- # y 夹层号
- y_m_num = 1
- # x 楼层号
- x_floor_num = 1
- # y 楼层号
- y_floor_num = 1
- if x_name.startswith('RFM'):
- if y_name.startswith('RFM'):
- if len(x_name) > 3:
- x_m_num = int(x_name[3:])
- if len(y_name) > 3:
- y_m_num = int(y_name[3:])
- return x_m_num - y_m_num
- elif y_name.startswith('RF'):
- return negative
- else:
- return positive
- if x_name.startswith('RF'):
- return positive
- if x_name.startswith('F'):
- if y_name.startswith('RF'):
- return negative
- elif y_name.startswith('F'):
- if 'M' in x_name:
- x_index = x_name.index('M')
- x_floor_num = int(x_name[1 : x_index])
- if not x_name.endswith('M'):
- x_m_num = int(x_name[x_index + 1:])
- else:
- x_floor_num = int(x_name[1:])
- if 'M' in y_name:
- y_index = y_name.index('M')
- y_floor_num = int(y_name[1:y_index])
- if not y_name.endswith('M'):
- y_m_num = int(y_name[y_index + 1:])
- else:
- y_floor_num = int(y_name[1:])
- if x_floor_num == y_floor_num:
- return x_m_num - y_m_num
- else:
- return x_floor_num - y_floor_num
- else:
- return positive
- if x_name.startswith('B'):
- if y_name.startswith('B'):
- if 'M' in x_name:
- x_index = x_name.index('M')
- x_floor_num = int(x_name[1 : x_index])
- if not x_name.endswith('M'):
- x_m_num = int(x_name[x_index + 1:])
- else:
- x_floor_num = int(x_name[1:])
- if 'M' in y_name:
- y_index = y_name.index('M')
- y_floor_num = int(y_name[1:y_index])
- if not y_name.endswith('M'):
- y_m_num = int(y_name[y_index + 1:])
- else:
- y_floor_num = int(y_name[1:])
- if x_floor_num == y_floor_num:
- return x_m_num - y_m_num
- else:
- return y_floor_num - x_floor_num
- else:
- return negative
- return 1
- def check_level_reasonable(model_list):
- sorted_arr = sorted(model_list, key=functools.cmp_to_key(floor_sort_cmp))
- last_height = -999999999
- last_model_id = ''
- error = set()
- group = 0
- elevations = {}
- for row in sorted_arr:
- current_height = row.get('level')
- current_model_id = row.get('fid')
- elevations[current_model_id] = current_height
- if current_height is not None and current_height > last_height:
- last_height = current_height
- last_model_id = current_model_id
- continue
- else:
- # 标高有问题
- group += 1
- error.add(last_model_id)
- error.add(current_model_id)
- last_height = -999999999
- last_model_id = ''
- continue
- for floor_row in model_list:
- model_id = floor_row.get('fid')
- if model_id in error:
- floor_row['has_error'] = True
- floor_row['error'] = '标高冲突'
- else:
- floor_row['has_error'] = False
- floor_row['error'] = None
- if len(error) == 0:
- return True
- return False
- # 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']
- # print(sorted(arr, key=functools.cmp_to_key(floor_sort_cmp)))
|