LISHUZUOXUN_yangjiang/PureBackend/manage_driver.py

714 lines
31 KiB
Python
Raw Normal View History

2024-09-23 14:54:15 +08:00
# coding: gb2312
import copy
import json
import os
import threading
import time
import traceback
from flask import send_file
from Database.database_mgr import *
from AcrossPlatform.get_platform import GLOBAL_DIR
from DeviceDefine.consensus import *
from LogRecord.log_recorder import GLOBAL_LOG
from PureBackend.base_driver import MODEL_MEDIAPIPE
from PureBackend.standard_manager import StandardManager
from PureBackend.general import *
from Speaker.fake_speak_base import beep
video_path = os.path.join(GLOBAL_DIR, "LSZXVideo", "Video")
SUMMARY_FILE = os.path.join(GLOBAL_DIR, "summary_info.json")
class ManagerDriver(StandardManager):
def __init__(self, master_mode=True, positioning=True, camera=True, model=MODEL_MEDIAPIPE, speaker=True,
multi_positioning_mode=True, device_type=UNKNOWN, pure_mode=False):
super().__init__(master_mode, positioning, camera, model, speaker, multi_positioning_mode, device_type, pure_mode)
# <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>˵ijɼ<C4B3>
self.synchronization_info = {}
self.statistics_score = {SITUP: [], RUNAROUND: [], PUSHUP: [], PULLUP: [], RUNNING: [], 'total': [],
'top': {'total': {}, SITUP: {}, RUNAROUND: {}, PULLUP: {}, PUSHUP: {}, RUNNING: {}}}
self._statistics_score = {}
self._statistics_sql_score = {}
self._sql_score = {}
self.hrbo_info = {}
self._hrbo_info = {}
self.closed_chamber = {}
self.tag_mes = {HR: None, BO: None}
if device_type == MANAGER:
self.sql_data = self.manager.select_all_score()
for i in self.sql_data:
i.update({'hr': {'hr': '', 'color': 'W'}, 'bo': {'bo': '', 'color': 'W'}})
self._sql_score.update({i['id']: copy.deepcopy(i)})
for key in i.keys():
if '_count' in key:
if i[key]:
score = str(i[key])
else:
score = ''
i[key] = {'count': score, 'is_changed': False}
threading.Thread(target=self.processing_sql).start()
self.processing_score_signal = threading.Event()
threading.Thread(target=self.processing_score).start()
# <20><>ȡ<EFBFBD><C8A1>Ƶ<EFBFBD>б<EFBFBD>
def video_list(self, person_id, project):
try:
response_data = []
for i in os.listdir(video_path):
v_name = i.rsplit('.', 1)[0]
data = v_name.split('_')
if data[0] == person_id and data[2] == project:
t = data[4].split('-')
date = "{}<EFBFBD><EFBFBD>{}<EFBFBD><EFBFBD>{}<EFBFBD><EFBFBD>{}ʱ{}<EFBFBD><EFBFBD>".format(t[0], t[1], t[2], t[3], t[4])
response_data.append({'name': i, 'date': date, 'project': data[2], 'score': data[3]})
response_data = sorted(response_data, key=lambda item: (item['date'], item['score']), reverse=True)
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ƶ<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ȡ<EFBFBD><C8A1>Ƶ
def video_server(self, file_name):
try:
video_dir = os.path.join(video_path, file_name)
return send_file(video_dir)
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ܳɼ<DCB3>
def totals_synchronization_server(self, cmd):
try:
# print(cmd)
ip = cmd['ip']
cmd['data']['time'] = time.time()
if ip not in self._statistics_score:
self._statistics_score.update({ip: {}})
self._statistics_score[ip] = cmd['data']
self.processing_score_signal.set()
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ܳɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5>ɼ<EFBFBD>
def processing_score(self):
while True:
try:
self.processing_score_signal.wait()
self.processing_score_signal.clear()
new_statistics_score = {SITUP: [], RUNAROUND: [], PUSHUP: [], PULLUP: [], RUNNING: []}
for k, v in self._statistics_score.items():
for key, value in v.items():
if key == RUNNING:
new_statistics_score.setdefault(key, [])
new_statistics_score[key] = value
new_statistics_score[key].sort(key=lambda x: (1 if x['normal'] else 0, x['rank']))
elif key != 'time':
new_statistics_score.setdefault(key, [])
if value:
new_statistics_score[key].append(value)
else:
pass
if key == 'runaround':
new_statistics_score[key].sort(key=lambda x: (1 if x['normal'] else 0, x['count']))
else:
new_statistics_score[key].sort(key=lambda x: (1 if x['normal'] else 0, -x['count']))
if key != 'time':
for i in new_statistics_score[key]:
if not i['normal'] and int(i['id']) not in self.closed_chamber:
self.hrbo_info.update({int(i['id']): i})
self.statistics_score.update(new_statistics_score)
# 5<><35><EFBFBD>Ӻ<EFBFBD><D3BA>Ƴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
temp = self.closed_chamber.copy()
for key, value in temp.items():
this_time = time.time()
if this_time - int(value) > 300:
del self.closed_chamber[key]
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ɼ<EFBFBD>
def totals_sql_synchronization_server(self, cmd):
try:
print(cmd)
if cmd['data']:
exercise_tag = next(iter(cmd['data']))
if exercise_tag != RUNAROUND:
record = str(exercise_tag) + '_' + 'count'
score = str(exercise_tag) + '_' + 'score'
else:
record = 'run_bf_count'
score = 'run_bf_score'
for o in self.sql_data:
for key, value in cmd['data'][exercise_tag].items():
if o['id'] == key:
_record = self._sql_score[key][record]
o[score] = value['score']
s = str(round(value['record'], 2))
if _record:
o[record]['count'] = s + '(' + str(_record) + ')'
else:
o[record]['count'] = s
o[record]['is_changed'] = True
threading.Thread(target=self.processing_sql).start()
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ɼ<EFBFBD>
def processing_sql(self):
try:
response_data = self.sql_data
total = [
{'hr': row['hr'], 'bo': row['bo'], 'id': row['id'], 'name': row['name'], SITUP: row['situp_count'],
RUNAROUND: row['run_bf_count'], PUSHUP: row['pushup_count'], PULLUP: row['pullup_count'],
RUNNING: row['running_count']} for row
in response_data]
top_score = 0
top_situp = 0
top_pushup = 0
top_pullup = 0
top_runround = 40
top_running = 1800
for i in response_data:
if i['pullup_score'] and i['situp_score'] and i['running_score'] and \
i['run_bf_score']:
total_score = (float(i['pullup_score']) + float(i['situp_score']) +
float(i['running_score']) + float(i['run_bf_score'])) / 4
if total_score > top_score:
top_score = total_score
self.statistics_score['top']['total'] = {'name': i['name'], 'score': top_score}
if i['pullup_count']['count']:
if '(' in str(i['pullup_count']['count']):
count = float(i['pullup_count']['count'].split('(')[0])
if count > top_pullup:
top_pullup = count
self.statistics_score['top'][PULLUP] = {'name': i['name'], 'score': top_pullup}
else:
if float(i['pullup_count']['count']) > top_pullup:
top_pullup = float(i['pullup_count']['count'])
self.statistics_score['top'][PULLUP] = {'name': i['name'], 'score': top_pullup}
if i['pushup_count']['count']:
if '(' in str(i['pushup_count']['count']):
count = float(i['pushup_count']['count'].split('(')[0])
if count > top_pushup:
top_pushup = count
self.statistics_score['top'][PUSHUP] = {'name': i['name'], 'score': top_pushup}
else:
if float(i['pushup_count']['count']) > top_pushup:
top_pushup = float(i['pushup_count']['count'])
self.statistics_score['top'][PUSHUP] = {'name': i['name'], 'score': top_pushup}
if i['situp_count']['count']:
if '(' in str(i['pushup_count']['count']):
count = float(i['situp_count']['count'].split('(')[0])
if count > top_situp:
top_situp = count
self.statistics_score['top'][SITUP] = {'name': i['name'], 'score': top_situp}
else:
if float(i['situp_count']['count']) > top_situp:
top_situp = float(i['situp_count']['count'])
self.statistics_score['top'][SITUP] = {'name': i['name'], 'score': top_situp}
if i['run_bf_count']['count']:
if '(' in str(i['run_bf_count']['count']):
count = float(i['run_bf_count']['count'].split('(')[0])
if top_runround > count > 0:
top_runround = count
self.statistics_score['top'][RUNAROUND] = {'name': i['name'], 'score': top_runround}
else:
if top_runround > float(i['run_bf_count']['count']) > 0:
top_runround = float(i['run_bf_count']['count'])
self.statistics_score['top'][RUNAROUND] = {'name': i['name'], 'score': top_runround}
if i['running_count']['count']:
if '(' in str(i['running_count']['count']):
count = float(i['running_count']['count'].split('(')[0])
if count < top_running:
top_running = count
self.statistics_score['top'][RUNNING] = {'name': i['name'], 'score': top_running}
else:
if float(i['running_count']['count']) < top_running:
top_running = float(i['running_count']['count'])
self.statistics_score['top'][RUNNING] = {'name': i['name'], 'score': top_running}
self.statistics_score['total'] = total
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
def statistics(self):
try:
time.sleep(0.5)
self.statistics_score.update({STATUS: OK})
temp = self._statistics_score.copy()
for k, v in temp.items():
this_time = time.time()
if this_time - v['time'] > 60:
del self._statistics_score[k]
self.processing_score_signal.set()
return self.statistics_score
except Exception as e:
GLOBAL_LOG.write(f"statistics<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA><EFBFBD><EFBFBD>Ϣ
def totals_HrBoInfo_server(self, cmd):
try:
data = cmd["data"]
# 5<><35><EFBFBD>Ӻ<EFBFBD><D3BA>Ƴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
temp = self.closed_chamber.copy()
for key, value in temp.items():
this_time = time.time()
if this_time - int(value) > 300:
del self.closed_chamber[key]
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>hrbo<62><6F>Ϣ
for k, v in data.items():
self._hrbo_info[k] = v
# ɸѡ<C9B8><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
temp = self._hrbo_info.copy()
for key, value in temp.items():
this_time = time.time()
if this_time - value['record_time'] > 120:
del self._hrbo_info[key]
p_data = self.manager.select_a_person_from_band(key)
if p_data:
p_id = int(p_data[0]["id"])
p_name = p_data[0]["name"]
for i in self.statistics_score['total']:
if p_id == int(i[ID]):
i['hr'] = value['hr']
i['bo'] = value['bo']
break
if not value["normal"] and p_id not in self.closed_chamber:
self.hrbo_info.update({p_id: value})
self.hrbo_info[p_id]["name"] = p_name
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
# <20><><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def abnormal(self):
report_tag = ""
try:
time.sleep(0.5)
if self.hrbo_info:
data = []
for key, value in self.hrbo_info.items():
data.append({"name": value["name"], "id": key, HR: value[HR], BO: value[BO]})
# <20><>ʾ<EFBFBD><CABE>
# if int(key) == 34:
# data.append({"name": value["name"], "id": key, HR: value[HR]['hr'], BO: value[BO]['bo']})
data = sorted(data, key=lambda item: item['id'])
new_report_tag = "@".join([str(item['id']) for item in data])
if report_tag != new_report_tag:
beep(duration=1500, freq=640)
self.speak_driver.add_speak("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
for d in data:
self.speak_driver.add_speak(f"{d['name']}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>")
return data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4>źŸ<C5BA><C5B8><EFBFBD><EFBFBD><EFBFBD>
def receive(self, data):
try:
self.hrbo_info = {}
# <20><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
for i in data:
this_time = time.time()
p_id = int(i["id"])
self.closed_chamber.update({p_id: this_time})
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD>źŸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
return False
# <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# <20><>ȡ<EFBFBD><C8A1><EFBFBD>еĿ<D0B5>Ŀ
def get_all_projects(self):
try:
projects = []
for k, v in EXERCISE_NAME_LIST.items():
projects.append({'value': k, 'label': v})
return projects
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>еĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
def get_all_batch(self):
try:
all_batch = self.manager.get_all_batch()
return all_batch
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ա
def get_all_people(self):
try:
all_name = []
for k, v in self.manager.get_all_name().items():
all_name.append({'id': k, 'name': v})
return all_name
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ȡ<EFBFBD><C8A1><EFBFBD>еİ༶
def get_all_classes(self):
try:
all_class = self.manager.get_all_class()
return all_class
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>еİ༶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ÿ<EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def get_projects_batch(self):
try:
projects = []
for k, v in self.summary_info['default_projects'].items():
projects.append(v)
batch = self.summary_info['default_batch']
return projects, batch
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ÿ<EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def set_projects_batch(self, projects, batch):
try:
self.summary_info['default_projects'] = projects
self.summary_info['default_batch'] = batch
self._update_summary_info()
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
return False
# <20><><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD>
def circular_diagram(self, projects, batch):
try:
projects_list = []
categorize = []
response_data = {}
for k, v in projects.items():
projects_list.append(k)
response_data.update({k: []})
categorize.append({'name': v, 'keyname': k})
data = self.manager.get_exercise_statistic(
type_list=projects_list,
batch=batch)
for k, v in data.items():
for j in categorize:
if k == j['keyname']:
for i in GRADE_RANK:
percentage = round(v[i]['percentage'] * 100, 2)
response_data[k].append(percentage)
return categorize, response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ϸ<EFBFBD>ɼ<EFBFBD><C9BC>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
def detailed_grade_info_1(self, projects, batch, grade):
try:
project = None
for k, v in projects.items():
project = k
data = self.manager.get_exercise_statistic(
type_list=[project],
batch=batch
)
response_data = [
{
"id": person_data[ID],
"name": person_data[NAME],
"score": person_data[SCORE],
"count": person_data[RECORD]
}
for person_data in data[project][grade][DATA]
]
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ϸ<EFBFBD>ɼ<EFBFBD><EFBFBD>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def get_class_projects_batch(self):
try:
projects = []
for k, v in self.summary_info['default_class_projects'].items():
projects.append(v)
batch = self.summary_info['default_class_batch']
return projects, batch
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def set_class_projects_batch(self, projects, batch):
try:
self.summary_info['default_class_projects'] = projects
self.summary_info['default_class_batch'] = batch
self._update_summary_info()
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><EFBFBD><E0BCB6><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD>
def class_bar_chart(self, projects, batch):
try:
project = None
for k, v in projects.items():
project = k
data = self.manager.get_class_statistic(
batch=batch,
_type=project
)
team = []
for k, v in data.items():
team.append(k)
team = sorted(team)
response_data = [[] for _ in GRADE_RANK]
for index, item in enumerate(GRADE_RANK):
for _index, _item in enumerate(team):
percentage = round(data[_item][item]['percentage'] * 100, 2)
response_data[index].append(percentage)
return team, response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ϸ<EFBFBD>ɼ<EFBFBD><C9BC>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BCB6><EFBFBD><EFBFBD>ͼ
def detailed_grade_info_2(self, projects, batch, grade, _class):
try:
project = None
for k, v in projects.items():
project = k
data = self.manager.get_class_statistic(
batch=batch,
_type=project
)
response_data = [
{
"id": person_data[ID],
"name": person_data[NAME],
"score": person_data[SCORE],
"count": person_data[RECORD]
}
for person_data in data[_class][grade][DATA]
]
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ϸ<EFBFBD>ɼ<EFBFBD><EFBFBD>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BCB6><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ
def get_group_projects(self):
try:
projects = []
for k, v in self.summary_info['default_group_projects'].items():
projects.append(v)
return projects
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<C4BF><D1B5><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ
def set_group_projects(self, projects):
try:
self.summary_info['default_group_projects'] = projects
self._update_summary_info()
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD>
def batch_bar_chart(self, projects):
try:
project = None
for k, v in projects.items():
project = k
data = self.manager.get_group_statistic(
_type=project
)
all_batch = self.manager.get_all_batch()
response_data = [[] for _ in GRADE_RANK]
for index, item in enumerate(GRADE_RANK):
for _index, _item in enumerate(all_batch):
percentage = round(data[_item][item]['percentage'] * 100, 2)
response_data[index].append(percentage)
return all_batch, response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><>ϸ<EFBFBD>ɼ<EFBFBD><C9BC>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
def detailed_grade_info_3(self, projects, batch, grade):
try:
project = None
for k, v in projects.items():
project = k
data = self.manager.get_group_statistic(
_type=project
)
response_data = [
{
"id": person_data[ID],
"name": person_data[NAME],
"score": person_data[SCORE],
"count": person_data[RECORD]
}
for person_data in data[batch][grade][DATA]
]
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ϸ<EFBFBD>ɼ<EFBFBD><EFBFBD>ֲ<EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><E0BCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def get_team_projects_batch_class(self):
try:
projects = None
for k, v in self.summary_info['default_team_project'].items():
projects = v
batch = self.summary_info['default_team_batch']
team = self.summary_info['default_team_class']
return projects, batch, team
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><E0BCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def set_team_projects_batch_class(self, projects, batch, _class):
try:
self.summary_info['default_team_project'] = projects
self.summary_info['default_team_batch'] = batch
self.summary_info['default_team_class'] = _class
self._update_summary_info()
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
return False
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD>ͼ
def scale_drawing(self, projects, _class, batch):
try:
project = None
for k, v in projects.items():
project = k
team = _class
group_data = self.manager.get_group_multiple_statistic(
_type=project,
class_list=team,
batch=batch
)
response_data = [
{
"name": grade,
"value": len(group_data[grade][DATA]),
"children": [
{
"id": data[ID],
"name": data[NAME],
"score": data[SCORE],
"count": data[RECORD] if data[RECORD] else "<EFBFBD><EFBFBD>",
"cn_name": GRADE_LIST[grade],
"value": 1
}
for data in group_data[grade][DATA]
]
}
for grade in GRADE_LIST
]
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
## <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽<EFBFBD><CBBD><EFBFBD>
# <20><><EFBFBD>ø<EFBFBD><C3B8>˻<EFBFBD><CBBB><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def get_personal_projects_batch_person(self):
try:
projects = []
for k, v in self.summary_info['default_personal_projects'].items():
projects.append(v)
batch = self.summary_info['default_personal_batch']
personal = self.summary_info['default_personal_personal']
return projects, batch, personal
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>ø<EFBFBD><C3B8>˻<EFBFBD><CBBB><EFBFBD>Ĭ<EFBFBD>ϵĿ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def set_personal_projects_batch_person(self, projects, batch, person):
try:
self.summary_info['default_personal_projects'] = projects
self.summary_info['default_personal_batch'] = batch
self.summary_info['default_personal_personal'] = person
self._update_summary_info()
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĿ<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
return False
# <20>״<EFBFBD>ͼ
def radar_chart(self, person_id, projects, batch):
try:
projects_list = []
for k, v in projects.items():
projects_list.append(k)
data = self.manager.get_individual_statistic(
_id=str(person_id),
_type_list=projects_list,
batch_list=batch
)
response_data = data['type_avg']
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD>״<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD><EFBFBD>ͼ
def line_chart(self,person_id, projects, batch):
try:
projects_list = []
categorize = []
valueDdata = {}
for k, v in projects.items():
projects_list.append(k)
valueDdata.update({k: []})
categorize.append({'name': v, 'keyname': k})
data = self.manager.get_individual_statistic(
_id=str(person_id),
_type_list=projects_list,
batch_list=batch
)
batch_data = data['batch']
batch_avg = data['batch_avg']
maxScode = 0
minScore = 0
average = []
for i in batch_data.values():
for k, v in valueDdata.items():
valueDdata[k].append(i[k]['score'])
if i[k]['score'] > maxScode:
maxScode = i[k]['score']
remainder = maxScode % 10
maxScode = maxScode + (10 - remainder)
if maxScode < 100:
maxScode = 100
interval = maxScode / 5
for k, v in batch_avg.items():
average.append(v)
response_data = {
'minScore': minScore,
'maxScore': maxScode,
'interval': interval,
'average': average,
'barData': {
'categorize': categorize,
'valueDdata': valueDdata
}
}
return response_data
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)
# <20><><EFBFBD>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD>Ϣjson
def _update_summary_info(self):
try:
with open(SUMMARY_FILE, "w", encoding='utf-8_sig') as f:
json.dump(self.summary_info, f, ensure_ascii=False)
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣjson<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}", need_print=True)