Commit 15bda856 authored by lvshibao's avatar lvshibao

代码整理

parent 7461aed9
...@@ -98,7 +98,6 @@ class AgencyApi(viewsets.ViewSet): ...@@ -98,7 +98,6 @@ class AgencyApi(viewsets.ViewSet):
""" """
city_id = req.GET.get('city_id', '') city_id = req.GET.get('city_id', '')
country_id = req.GET.get('country_id', '') country_id = req.GET.get('country_id', '')
team_list = list()
top = Country.objects.filter(id=city_id).first() top = Country.objects.filter(id=city_id).first()
if top is not None: if top is not None:
if top.parent is None: if top.parent is None:
......
# coding: utf-8 # coding: utf-8
from django.db.models import Count, Sum, Avg
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request
from before_request import before_request from before_request import before_request
from inspect_report.agency import get_team_names, get_agent_name from inspect_report.dbhelper import db_static_score, db_seat_rule, db_seat_check, db_seat_area, db_static_rule
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat, Round, Seat, Country from datetime import datetime
import json
from datetime import datetime, timedelta
from config.config import TABLE_PRE, name_list
from django.http import HttpResponse from django.http import HttpResponse
import logging import logging
from pypinyin import Style, pinyin
import csv import csv
import codecs import codecs
from django.utils.http import urlquote from django.utils.http import urlquote
from inspect_report.pagehelper import set_object_seat_name
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -28,27 +25,12 @@ class DataApi(viewsets.ViewSet): ...@@ -28,27 +25,12 @@ class DataApi(viewsets.ViewSet):
@before_request @before_request
def static_score_export(self, req: Request): def static_score_export(self, req: Request):
""" """
概览-地市得分统计-导出 概览-得分统计-导出
:param req: :param req:
:return: :return:
""" """
city_id = req.GET.get('city', None)
country_id = req.GET.get('country', None)
sort = req.GET.get('sort', '-avg_score')
task_condition = req.data.get('date_condition', {})
print(type(country_id))
team_names = get_team_names(city_id, country_id)
task_condition['task__in'] = team_names
rules = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task"}) \ rules = db_static_score(req)
.values('area').annotate(avg_score_svc=Round(Avg('service_score'), 2),
avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'),
validate_num=Sum('validate_num'), validate_zero=Sum('validate_zero')) \
.order_by(sort)
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
file_name = '组长概览_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv' file_name = '组长概览_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream' response['Content-Type'] = 'application/octet-stream'
...@@ -74,41 +56,9 @@ class DataApi(viewsets.ViewSet): ...@@ -74,41 +56,9 @@ class DataApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.GET.get('city', None)
country_id = req.GET.get('country', None)
team_id = req.GET.get('country', None)
task_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id, team_id) data_sort = db_static_rule(req)
task_condition['task__in'] = team_names
call_count = SeatStat.objects.filter(**task_condition).aggregate(Sum("validate_session"))[
'validate_session__sum']
task_condition = req.data.get('date_condition', {})
task_condition['task__in'] = team_names
# tasks = RulesStat.objects.filter(**task_condition).values('rule', 'sessionCollectionId', 'rule_num')
tasks = RulesStat.objects.all().filter(**task_condition) \
.extra(select={'rule': "rule", 'sessionCollectionId': 'sessionCollectionId'}) \
.values('rule', 'sessionCollectionId').annotate(rule_num=Count('id')).order_by('-rule_num')
return_data = {}
for t in tasks:
name = t['rule']
if name in return_data.keys():
return_data[name]['count'] += int(t['rule_num'])
else:
return_data[name] = {'count': int(t['rule_num']), 'tables': []}
if t['sessionCollectionId'] not in return_data[name]['tables']:
return_data[name]['tables'].append(t['sessionCollectionId'])
data_sort = []
for k, v in return_data.items():
v['rule'] = k
v['ratio'] = round(v['count'] / call_count, 2) if call_count else 0
v['ratio'] = '{0}%'.format(int(v['ratio'] * 100))
v['call_count'] = call_count
data_sort.append(v)
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
file_name = '违规项分析_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv' file_name = '违规项分析_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream' response['Content-Type'] = 'application/octet-stream'
...@@ -133,49 +83,9 @@ class DataApi(viewsets.ViewSet): ...@@ -133,49 +83,9 @@ class DataApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.GET.get('city', None)
country_id = req.GET.get('country', None)
team_id = req.GET.get('team', None)
agent_name = req.GET.get('seat', '')
sort = req.GET.get('sort', 'des')
task_condition = req.data.get('date_condition', '')
team_names = get_team_names(city_id, country_id, team_id)
task_condition['task__in'] = team_names
if agent_name: total_count, data_sort = db_seat_rule(req)
task_condition['agentName'] = agent_name
if sort == 'des':
seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('-validate_session')
else:
seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('validate_session')
return_data = []
agent_name_set = set()
for s in seats:
detail = {'agentName': s['agentName'], 'validate_session': s['validate_session'],
'remainTime': s['remainTime'], 'total_session': s['total_session'],
'ratio': round(s['validate_session'] / s['total_session'], 2)}
return_data.append(detail)
agent_name_set.add(s['agentName'])
seat_code_name_lists = Seat.objects.filter(code__in=agent_name_set).values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
if sort == 'asc':
data_sort = sorted(return_data, key=lambda x: x['ratio'])
for i in range(len(data_sort)):
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
else:
data_sort = sorted(return_data, key=lambda x: x['ratio'], reverse=True)
for i in range(len(data_sort)):
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
file_name = '坐席违规_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv' file_name = '坐席违规_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream' response['Content-Type'] = 'application/octet-stream'
...@@ -200,33 +110,8 @@ class DataApi(viewsets.ViewSet): ...@@ -200,33 +110,8 @@ class DataApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.GET.get('city', None) scores = db_seat_area(req)
country_id = req.GET.get('country', None) scores = set_object_seat_name(scores)
team_id = req.GET.get('team', None)
agent_name = req.GET.get('seat', '')
sort = req.GET.get('sort', '-avg_score')
task_condition = req.data.get('date_condition', '')
team_names = get_team_names(city_id, country_id, team_id)
task_condition['task__in'] = team_names
if agent_name:
task_condition['agentName'] = agent_name
# , 'total_session', 'validate_num', 'validate_session', 'validate_zero'
rules = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task", 'agentName': 'agentName'}) \
.values('area', 'agentName').annotate(avg_score_svc=Round(Avg('service_score'), 2),
avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'),
validate_num=Sum('validate_num'), validate_zero=Sum('validate_zero')) \
.order_by(sort)
agent_names = [x['agentName'] for x in rules]
seats_code_name_list = Seat.objects.filter(code__in=agent_names).values('code', 'name')
seats_code_name = dict()
for seat_code_name in seats_code_name_list:
seats_code_name[seat_code_name['code']] = seat_code_name['name']
for rule_dict in rules:
rule_dict['seatName'] = seats_code_name.get(rule_dict['agentName'], rule_dict['agentName'])
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
file_name = '坐席成绩_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv' file_name = '坐席成绩_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream' response['Content-Type'] = 'application/octet-stream'
...@@ -238,7 +123,7 @@ class DataApi(viewsets.ViewSet): ...@@ -238,7 +123,7 @@ class DataApi(viewsets.ViewSet):
header = ['地市', '坐席工号', '坐席名称', '全部会话数', '触发违规项次数', '服务类平均分', '业务类平均分', '平均分', '触发0分项次数'] header = ['地市', '坐席工号', '坐席名称', '全部会话数', '触发违规项次数', '服务类平均分', '业务类平均分', '平均分', '触发0分项次数']
writer.writerow(header) writer.writerow(header)
# 设置表数据 # 设置表数据
for r in rules: for r in scores:
row = [r['area'], r['agentName'], r['seatName'], r['total_session'], r['validate_num'], r['avg_score_svc'], row = [r['area'], r['agentName'], r['seatName'], r['total_session'], r['validate_num'], r['avg_score_svc'],
r['avg_score_bus'], r['avg_score'], r['validate_zero']] r['avg_score_bus'], r['avg_score'], r['validate_zero']]
writer.writerow(row) writer.writerow(row)
...@@ -251,85 +136,7 @@ class DataApi(viewsets.ViewSet): ...@@ -251,85 +136,7 @@ class DataApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.GET.get('city', '') total_count, return_data = db_seat_check(req)
country_id = req.GET.get('country', '')
team_id = req.GET.get('team', '')
agent_name = req.GET.get('agentName', '')
start_date = req.GET.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d'))
end_date = req.GET.get('end_date', datetime.now().strftime('%Y-%m-%d'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if city_id:
city = Country.objects.filter(id=city_id).first()
if city.parent is not None:
task_condition['name__startswith'] = city.name
tasks = Tasks.objects.filter(**task_condition).values('id', 'name', 'sessionCollectionId')
task_dict = {}
task_name_dict = {}
for t in tasks:
task_name_dict[t['id']] = t['name']
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
agent_names = get_agent_name(city_id, country_id, team_id, agent_name)
if len(agent_names) > 0:
seat_code_name_lists = Seat.objects.filter(code__in=agent_names).values('code', 'name')
else:
seat_code_name_lists = Seat.objects.filter().values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
return_data = []
for k, v in task_dict.items():
table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v}
if len(agent_names) > 0:
session_condition['agentName__in'] = agent_names
checks = tn.objects.filter(**session_condition).values('id', 'createdAt', 'agentName', 'extra', 'taskId',
'remainTime', 'startTime', 'closeTime',
'scoreItemRecord', 'sessionId')
for check in checks:
result = check['scoreItemRecord']
t_name = task_name_dict[check['taskId']]
total_score = 100
extra = json.loads(check['extra'])
remain = 0
if check['startTime'] and check['closeTime']:
start = datetime.strptime(check['startTime'], '%Y-%m-%d %H:%M:%S').timestamp()
close = datetime.strptime(check['closeTime'], '%Y-%m-%d %H:%M:%S').timestamp()
remain = int(close - start)
f_name = extra['filename'] if extra and 'filename' in extra.keys() else ''
detail = {'id': check['id'], 'sessionId': check['sessionId'], 'createdAt': check['createdAt'],
'area': t_name.split('_')[0],
'seatName': seat_code_name_dict.get(check['agentName'], check['agentName']),
'agentName': check['agentName'], 'filename': f_name,
'remainTime': remain, 'sessionCollectionId': k, 'taskId': check['taskId']}
rule_detail = {'fwyy': 15, 'kcb': 5, 'jsy': 3, 'fwtd': 5, 'yssb': 5, 'jysb': 5, 'yycl': 10,
'ywcc': 10, 'yyjlz': 10, 'fwjs': 10, 'wtgbj': 2, 'cgjxxhs': 20, 'wgzlf': 100, 'mgc': 100}
if result:
data = json.loads(result)
for d in data:
if 'scoreItemName' in d.keys() and 'score' in d.keys():
item_score = 0 if d['score'] and d['score'] > 0 else 1
name_py = pinyin(d['scoreItemName'], style=Style.FIRST_LETTER, strict=False)
item_name = ''.join([x[0] for x in name_py])
# detail[item_name] = {d['scoreItemName']: item_score}
if item_name in rule_detail.keys():
if item_score == 0:
total_score -= rule_detail[item_name]
rule_detail[item_name] = item_score
for kk, vv in rule_detail.items():
if vv > 1:
rule_detail[kk] = 1
if rule_detail['wgzlf'] == 0 or rule_detail['mgc'] == 0:
total_score = 0
detail.update(rule_detail)
detail['total_score'] = total_score
return_data.append(detail)
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
file_name = '质检绩效考核_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv' file_name = '质检绩效考核_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
......
# coding: utf-8 # coding: utf-8
from django.shortcuts import render from django.shortcuts import render
from django.db.models import Count, Sum, Avg, Q from django.db.models import Sum, Avg
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
from before_request import before_request from before_request import before_request
from inspect_report.agency import get_team_names, get_agent_name from inspect_report.agency import get_team_names
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat, Round, Team, Country, Seat from inspect_report.dbhelper import db_static_score, db_seat_rule, db_seat_check, db_seat_area, db_static_rule
from inspect_report.models import RulesStat, SeatStat, ScoreStat, Round, Seat
import json import json
from datetime import datetime, timedelta
from config.config import TABLE_PRE, name_list, name_code_dict
from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.clickjacking import xframe_options_exempt
import logging import logging
from pypinyin import Style, pinyin
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from inspect_report.pagehelper import page_with_seat_name
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -58,126 +57,126 @@ class TasksApi(viewsets.ViewSet): ...@@ -58,126 +57,126 @@ class TasksApi(viewsets.ViewSet):
extra = [{'code': seat_id, 'name': seat_id} for seat_id in seat_ids if seat_id not in seat_ids_with_name] extra = [{'code': seat_id, 'name': seat_id} for seat_id in seat_ids if seat_id not in seat_ids_with_name]
return Response({'code': 0, 'msg': 'success', 'data': list(seat_id_names) + extra}) return Response({'code': 0, 'msg': 'success', 'data': list(seat_id_names) + extra})
@action(['post'], detail=False) # @action(['post'], detail=False)
def rule(self, req: Request): # def rule(self, req: Request):
""" # """
获取违规项分析 # 获取违规项分析
:param req: # :param req:
:return: # :return:
""" # """
task_id = req.data.get('task', '') # task_id = req.data.get('task', '')
agent_name = req.data.get('agentName', '') # agent_name = req.data.get('agentName', '')
start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')) # start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d'))
end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d')) # end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d'))
q_start_date = datetime.strptime(start_date, '%Y-%m-%d').date() # q_start_date = datetime.strptime(start_date, '%Y-%m-%d').date()
q_end_date = (datetime.strptime(end_date, '%Y-%m-%d') + + timedelta(days=1)).date() # q_end_date = (datetime.strptime(end_date, '%Y-%m-%d') + + timedelta(days=1)).date()
task_condition = {'create_date__gte': q_start_date, 'create_date__lt': q_end_date} # task_condition = {'create_date__gte': q_start_date, 'create_date__lt': q_end_date}
data_sort = [] # data_sort = []
return_data = {} # return_data = {}
if task_id: # if task_id:
task_condition['task'] = task_id # task_condition['task'] = task_id
if agent_name: # if agent_name:
task_condition['agentName'] = agent_name # task_condition['agentName'] = agent_name
# tasks = RulesStat.objects.filter(**task_condition).values('rule', 'sessionCollectionId', 'rule_num') # # tasks = RulesStat.objects.filter(**task_condition).values('rule', 'sessionCollectionId', 'rule_num')
tasks = RulesStat.objects.all().filter(**task_condition) \ # tasks = RulesStat.objects.all().filter(**task_condition) \
.extra(select={'rule': "rule", 'sessionCollectionId': 'sessionCollectionId'}) \ # .extra(select={'rule': "rule", 'sessionCollectionId': 'sessionCollectionId'}) \
.values('rule', 'sessionCollectionId').annotate(rule_num=Count('id')).order_by('-rule_num') # .values('rule', 'sessionCollectionId').annotate(rule_num=Count('id')).order_by('-rule_num')
for t in tasks: # for t in tasks:
name = t['rule'] # name = t['rule']
if name in return_data.keys(): # if name in return_data.keys():
return_data[name]['count'] += int(t['rule_num']) # return_data[name]['count'] += int(t['rule_num'])
else: # else:
return_data[name] = {'count': int(t['rule_num']), 'tables': []} # return_data[name] = {'count': int(t['rule_num']), 'tables': []}
if t['sessionCollectionId'] not in return_data[name]['tables']: # if t['sessionCollectionId'] not in return_data[name]['tables']:
return_data[name]['tables'].append(t['sessionCollectionId']) # return_data[name]['tables'].append(t['sessionCollectionId'])
#
for k, v in return_data.items(): # for k, v in return_data.items():
v['rule'] = k # v['rule'] = k
data_sort.append(v) # data_sort.append(v)
# data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True) # # data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort}) # return Response({'code': 0, 'msg': 'success', 'data': data_sort})
@action(['post'], detail=False) # @action(['post'], detail=False)
def seat_session(self, req: Request): # def seat_session(self, req: Request):
""" # """
坐席违规分析-按照会话 # 坐席违规分析-按照会话
:param req: # :param req:
:return: # :return:
""" # """
task_id = req.data.get('task', '') # task_id = req.data.get('task', '')
num = req.data.get('num', '10') # num = req.data.get('num', '10')
start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')) # start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d'))
end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d')) # end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'} # task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id: # if task_id:
task_condition['name__startswith'] = task_id # task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId') # tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {} # task_dict = {}
for t in tasks: # for t in tasks:
if t['sessionCollectionId'] in task_dict.keys(): # if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id']) # task_dict[t['sessionCollectionId']].append(t['id'])
else: # else:
task_dict[t['sessionCollectionId']] = [t['id'], ] # task_dict[t['sessionCollectionId']] = [t['id'], ]
return_data = {} # return_data = {}
for k, v in task_dict.items(): # for k, v in task_dict.items():
table_name = TABLE_PRE + k # table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name) # tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v} # session_condition = {'taskId__in': v}
checks = tn.objects.filter(**session_condition).values('agentName') # checks = tn.objects.filter(**session_condition).values('agentName')
for check in checks: # for check in checks:
agent_name = check['agentName'] # agent_name = check['agentName']
if agent_name: # if agent_name:
if agent_name in return_data.keys(): # if agent_name in return_data.keys():
return_data[agent_name] += 1 # return_data[agent_name] += 1
else: # else:
return_data[agent_name] = 1 # return_data[agent_name] = 1
data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False) # data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
data_max = data_max[-int(num):] # data_max = data_max[-int(num):]
data_max_return = {} # data_max_return = {}
for dm in data_max: # for dm in data_max:
data_max_return[dm[0]] = dm[1] # data_max_return[dm[0]] = dm[1]
return Response({'code': 0, 'msg': 'success', 'data': data_max_return}) # return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
@action(['post'], detail=False) # @action(['post'], detail=False)
def seat_score(self, req: Request): # def seat_score(self, req: Request):
""" # """
坐席违规分析-按照得分 # 坐席违规分析-按照得分
:param req: # :param req:
:return: # :return:
""" # """
task_id = req.data.get('task', '') # task_id = req.data.get('task', '')
num = req.data.get('num', '10') # num = req.data.get('num', '10')
start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')) # start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d'))
end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d')) # end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'} # task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id: # if task_id:
task_condition['name__startswith'] = task_id # task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId') # tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {} # task_dict = {}
for t in tasks: # for t in tasks:
if t['sessionCollectionId'] in task_dict.keys(): # if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id']) # task_dict[t['sessionCollectionId']].append(t['id'])
else: # else:
task_dict[t['sessionCollectionId']] = [t['id'], ] # task_dict[t['sessionCollectionId']] = [t['id'], ]
return_data = {} # return_data = {}
for k, v in task_dict.items(): # for k, v in task_dict.items():
table_name = TABLE_PRE + k # table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name) # tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v} # session_condition = {'taskId__in': v}
checks = tn.objects.filter(**session_condition).values('agentName', 'score') # checks = tn.objects.filter(**session_condition).values('agentName', 'score')
for check in checks: # for check in checks:
agent_name = check['agentName'] # agent_name = check['agentName']
if agent_name: # if agent_name:
if agent_name in return_data.keys(): # if agent_name in return_data.keys():
return_data[agent_name] += check['score'] # return_data[agent_name] += check['score']
else: # else:
return_data[agent_name] = check['score'] # return_data[agent_name] = check['score']
data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False) # data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
data_max = data_max[:int(num)] # data_max = data_max[:int(num)]
data_max_return = {} # data_max_return = {}
for dm in data_max: # for dm in data_max:
data_max_return[dm[0]] = dm[1] # data_max_return[dm[0]] = dm[1]
return Response({'code': 0, 'msg': 'success', 'data': data_max_return}) # return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
@action(['post'], detail=False) @action(['post'], detail=False)
@before_request @before_request
...@@ -187,62 +186,7 @@ class TasksApi(viewsets.ViewSet): ...@@ -187,62 +186,7 @@ class TasksApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.data.get('city', None) total_count, data_sort = db_seat_rule(req, if_page=True)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
agent_name = req.data.get('seat', '')
sort = req.data.get('sort', 'des')
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
task_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id, team_id)
task_condition['task__in'] = team_names
if agent_name != '' and agent_name is not None:
task_condition['agentName'] = agent_name
if sort == 'des':
seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('-validate_session')
else:
seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('validate_session')
paginator = Paginator(seats, page_size)
total_count = paginator.count
try:
seats = paginator.page(page)
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
return_data = []
agent_name_set = set()
for s in seats:
detail = {'agentName': s['agentName'], 'validate_session': s['validate_session'],
'remainTime': s['remainTime'], 'total_session': s['total_session'],
'ratio': round(s['validate_session'] / s['total_session'], 2)}
agent_name_set.add(s['agentName'])
return_data.append(detail)
seat_code_name_lists = Seat.objects.filter(code__in=agent_name_set).values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
if sort == 'asc':
data_sort = sorted(return_data, key=lambda x: x['ratio'])
for i in range(len(data_sort)):
data_sort[i]['ranking'] = total_count - (int(page) - 1) * int(page_size) - i
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
else:
data_sort = sorted(return_data, key=lambda x: x['ratio'], reverse=True)
for i in range(len(data_sort)):
data_sort[i]['ranking'] = (int(page) - 1) * int(page_size) + i + 1
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': data_sort}) return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': data_sort})
@action(['post'], detail=False) @action(['post'], detail=False)
...@@ -258,8 +202,8 @@ class TasksApi(viewsets.ViewSet): ...@@ -258,8 +202,8 @@ class TasksApi(viewsets.ViewSet):
session_condition = req.data.get('date_condition', {}) session_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id) team_names = get_team_names(city_id, country_id)
session_condition['task__in'] = team_names session_condition['task__in'] = team_names
seat_data = SeatStat.objects.filter(**session_condition).aggregate( seat_data = SeatStat.objects.filter(**session_condition).aggregate(
validate_session_sum=Sum('validate_session'), total_session_sum=Sum('total_session')) validate_session_sum=Sum('validate_session'), total_session_sum=Sum('total_session'))
avg_score = ScoreStat.objects.filter(**session_condition).aggregate(score_avg=Round(Avg('score'), 2)) avg_score = ScoreStat.objects.filter(**session_condition).aggregate(score_avg=Round(Avg('score'), 2))
...@@ -273,54 +217,54 @@ class TasksApi(viewsets.ViewSet): ...@@ -273,54 +217,54 @@ class TasksApi(viewsets.ViewSet):
return_data['avg_score'] = 0.0 return_data['avg_score'] = 0.0
return Response({'code': 0, 'msg': 'success', 'data': return_data}) return Response({'code': 0, 'msg': 'success', 'data': return_data})
@action(['post'], detail=False) # @action(['post'], detail=False)
def static_date(self, req: Request): # def static_date(self, req: Request):
""" # """
获取违规项分析 # 获取违规项分析
:param req: # :param req:
:return: # :return:
""" # """
task_id = req.data.get('task', '') # task_id = req.data.get('task', '')
start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-6)).strftime('%Y-%m-%d')) # start_date = req.data.get('start_date', (datetime.now() + timedelta(days=-6)).strftime('%Y-%m-%d'))
end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d')) # end_date = req.data.get('end_date', datetime.now().strftime('%Y-%m-%d'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'} # task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id: # if task_id:
task_condition['name__startswith'] = task_id # task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId') # tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {} # task_dict = {}
for t in tasks: # for t in tasks:
if t['sessionCollectionId'] in task_dict.keys(): # if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id']) # task_dict[t['sessionCollectionId']].append(t['id'])
else: # else:
task_dict[t['sessionCollectionId']] = [t['id'], ] # task_dict[t['sessionCollectionId']] = [t['id'], ]
return_data = {} # return_data = {}
for k, v in task_dict.items(): # for k, v in task_dict.items():
table_name = TABLE_PRE + k # table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name) # tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v} # session_condition = {'taskId__in': v}
checks = tn.objects.filter(**session_condition).values('violationRuleCount', 'createdAt') # checks = tn.objects.filter(**session_condition).values('violationRuleCount', 'createdAt')
for check in checks: # for check in checks:
date = check['createdAt'].strftime('%Y-%m-%d') # date = check['createdAt'].strftime('%Y-%m-%d')
if date in return_data.keys(): # if date in return_data.keys():
return_data[date]['total_session'] += 1 # return_data[date]['total_session'] += 1
if check['violationRuleCount'] > 0: # if check['violationRuleCount'] > 0:
return_data[date]['validate_session'] += 1 # return_data[date]['validate_session'] += 1
else: # else:
if check['violationRuleCount'] > 0: # if check['violationRuleCount'] > 0:
return_data[date] = {'total_session': 1, 'validate_session': 1} # return_data[date] = {'total_session': 1, 'validate_session': 1}
else: # else:
return_data[date] = {'total_session': 1, 'validate_session': 0} # return_data[date] = {'total_session': 1, 'validate_session': 0}
data_sort = [] # data_sort = []
for k, v in return_data.items(): # for k, v in return_data.items():
# return_data[k]['ratio'] = round(v['validate_session']/v['total_session'], 2) # # return_data[k]['ratio'] = round(v['validate_session']/v['total_session'], 2)
if v['total_session']: # if v['total_session']:
v['ratio'] = round(v['validate_session'] / v['total_session'], 2) # v['ratio'] = round(v['validate_session'] / v['total_session'], 2)
else: # else:
v['ratio'] = 0 # v['ratio'] = 0
v['date'] = k # v['date'] = k
data_sort.append(v) # data_sort.append(v)
data_sort = sorted(data_sort, key=lambda x: x['date'], reverse=True) # data_sort = sorted(data_sort, key=lambda x: x['date'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort}) # return Response({'code': 0, 'msg': 'success', 'data': data_sort})
@action(['post'], detail=False) @action(['post'], detail=False)
@before_request @before_request
...@@ -330,99 +274,7 @@ class TasksApi(viewsets.ViewSet): ...@@ -330,99 +274,7 @@ class TasksApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.data.get('city', '') total_count, return_data = db_seat_check(req, if_page=True)
country_id = req.data.get('country', '')
team_id = req.data.get('team', '')
agent_name = req.data.get('agentName', '')
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
task_condition = req.data.get('at_condition', {})
task_condition['hasCheck'] = 1
if city_id:
city = Country.objects.filter(id=city_id).first()
if city.parent is not None:
task_condition['name__startswith'] = city.name
tasks = Tasks.objects.filter(**task_condition).values('id', 'name', 'sessionCollectionId')
task_dict = {}
task_name_dict = {}
for t in tasks:
task_name_dict[t['id']] = t['name']
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
return_data = []
total_count = 0
agent_names = get_agent_name(city_id, country_id, team_id, agent_name)
if len(agent_names) > 0:
seat_code_name_lists = Seat.objects.filter(code__in=agent_names).values('code', 'name')
else:
seat_code_name_lists = Seat.objects.filter().values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
for k, v in task_dict.items():
# session_collection = t.sessionCollectionId
table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v}
if len(agent_names) > 0:
session_condition['agentName__in'] = agent_names
checks = tn.objects.filter(**session_condition).values('id', 'createdAt', 'agentName', 'extra', 'taskId',
'remainTime', 'startTime', 'closeTime',
'scoreItemRecord', 'sessionId')
paginator = Paginator(checks, page_size)
total_count += paginator.count
try:
seats = paginator.page(page)
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
for check in seats:
result = check['scoreItemRecord']
t_name = task_name_dict[check['taskId']]
total_score = 100
extra = json.loads(check['extra'])
remain = 0
if check['startTime'] and check['closeTime']:
start = datetime.strptime(check['startTime'], '%Y-%m-%d %H:%M:%S').timestamp()
close = datetime.strptime(check['closeTime'], '%Y-%m-%d %H:%M:%S').timestamp()
remain = int(close - start)
f_name = extra['filename'] if extra and 'filename' in extra.keys() else ''
detail = {'id': check['id'], 'sessionId': check['sessionId'], 'createdAt': check['createdAt'],
'area': t_name.split('_')[0],
'seatName': seat_code_name_dict.get(check['agentName'], check['agentName']),
'agentName': check['agentName'], 'filename': f_name,
'remainTime': remain, 'sessionCollectionId': k, 'taskId': check['taskId']}
rule_detail = {'fwyy': 15, 'kcb': 5, 'jsy': 3, 'fwtd': 5, 'yssb': 5, 'jysb': 5, 'yycl': 10,
'ywcc': 10, 'yyjlz': 10, 'fwjs': 10, 'wtgbj': 2, 'cgjxxhs': 20, 'wgzlf': 100, 'mgc': 100}
if result:
data = json.loads(result)
for d in data:
if 'scoreItemName' in d.keys() and 'score' in d.keys():
item_score = 0 if d['score'] and d['score'] > 0 else 1
name_py = pinyin(d['scoreItemName'], style=Style.FIRST_LETTER, strict=False)
item_name = ''.join([x[0] for x in name_py])
# detail[item_name] = {d['scoreItemName']: item_score}
if item_name in rule_detail.keys():
if item_score == 0:
total_score -= rule_detail[item_name]
rule_detail[item_name] = item_score
for kk, vv in rule_detail.items():
if vv > 1:
rule_detail[kk] = 1
if rule_detail['wgzlf'] == 0 or rule_detail['mgc'] == 0:
total_score = 0
detail.update(rule_detail)
detail['total_score'] = total_score
return_data.append(detail)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': return_data}) return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': return_data})
@action(['post'], detail=False) @action(['post'], detail=False)
...@@ -433,46 +285,12 @@ class TasksApi(viewsets.ViewSet): ...@@ -433,46 +285,12 @@ class TasksApi(viewsets.ViewSet):
:param req: :param req:
:return: :return:
""" """
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
agent_name = req.data.get('seat', '')
page = req.data.get('page', '1') page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10') page_size = req.data.get('page_size', '10')
sort = req.data.get('sort', '-avg_score') all_scores = db_seat_area(req)
task_condition = req.data.get('date_condition', '') total_count, scores = page_with_seat_name(all_scores, page, page_size, agent=True)
team_names = get_team_names(city_id, country_id, team_id) return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': scores.object_list})
task_condition['task__in'] = team_names
if agent_name:
task_condition['agentName'] = agent_name
# , 'total_session', 'validate_num', 'validate_session', 'validate_zero'
rules = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task", 'agentName': 'agentName'}) \
.values('area', 'agentName').annotate(avg_score_svc=Round(Avg('service_score'), 2),
avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'),
validate_num=Sum('validate_num'), validate_zero=Sum('validate_zero')) \
.order_by(sort)
paginator = Paginator(rules, page_size)
total_count = paginator.count
try:
seats = paginator.page(page)
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
agent_names = [x['agentName'] for x in seats]
seats_code_name_list = Seat.objects.filter(code__in=agent_names).values('code', 'name')
seats_code_name = dict()
for seat_code_name in seats_code_name_list:
seats_code_name[seat_code_name['code']] = seat_code_name['name']
for rule_dict in seats:
rule_dict['seatName'] = seats_code_name.get(rule_dict['agentName'], rule_dict['agentName'])
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list})
@action(['post'], detail=False) @action(['post'], detail=False)
@before_request @before_request
...@@ -483,39 +301,7 @@ class TasksApi(viewsets.ViewSet): ...@@ -483,39 +301,7 @@ class TasksApi(viewsets.ViewSet):
:return: :return:
""" """
city_id = req.data.get('city', None) data_sort = db_static_rule(req)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
team_names = get_team_names(city_id, country_id, team_id)
task_condition = req.data.get('date_condition', {})
task_condition['task__in'] = team_names
call_count = SeatStat.objects.filter(**task_condition).aggregate(Sum("validate_session"))[
'validate_session__sum']
# tasks = RulesStat.objects.filter(**task_condition).values('rule', 'sessionCollectionId', 'rule_num')
tasks = RulesStat.objects.all().filter(**task_condition) \
.extra(select={'rule': "rule", 'sessionCollectionId': 'sessionCollectionId'}) \
.values('rule', 'sessionCollectionId').annotate(rule_num=Count('id')).order_by('-rule_num')
return_data = {}
for t in tasks:
name = t['rule']
if name in return_data.keys():
return_data[name]['count'] += int(t['rule_num'])
else:
return_data[name] = {'count': int(t['rule_num']), 'tables': []}
if t['sessionCollectionId'] not in return_data[name]['tables']:
return_data[name]['tables'].append(t['sessionCollectionId'])
data_sort = []
for k, v in return_data.items():
v['rule'] = k
v['ratio'] = round(v['count'] / call_count, 2) if call_count else 0
v['ratio'] = '{0}%'.format(int(v['ratio'] * 100))
v['call_count'] = call_count
data_sort.append(v)
# data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True) # data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort}) return Response({'code': 0, 'msg': 'success', 'data': data_sort})
...@@ -542,63 +328,30 @@ class TasksApi(viewsets.ViewSet): ...@@ -542,63 +328,30 @@ class TasksApi(viewsets.ViewSet):
session_condition['rule'] = rule_name session_condition['rule'] = rule_name
session_condition['sessionCollectionId__in'] = table_list session_condition['sessionCollectionId__in'] = table_list
session_condition['task__in'] = get_team_names(city_id, country_id, team_id) session_condition['task__in'] = get_team_names(city_id, country_id, team_id)
checks = RulesStat.objects.filter(**session_condition).values('agentName', 'customName', 'remainTime', 'score', all_rules = RulesStat.objects.filter(**session_condition).values('agentName', 'customName', 'remainTime',
'sessionCollectionId', 'sessionId', 'taskId') 'score',
paginator = Paginator(checks, page_size) 'sessionCollectionId', 'sessionId', 'taskId')
total_count = paginator.count total_count, rules = page_with_seat_name(all_rules, page, page_size, agent=True)
try:
seats = paginator.page(page) return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': rules.object_list})
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
agent_names = [x['agentName'] for x in seats]
seats_code_name_list = Seat.objects.filter(code__in=agent_names).values('code', 'name')
seats_code_name = dict()
for seat_code_name in seats_code_name_list:
seats_code_name[seat_code_name['code']] = seat_code_name['name']
for rule_dict in seats:
rule_dict['seatName'] = seats_code_name.get(rule_dict['agentName'], rule_dict['agentName'])
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list})
@action(['post'], detail=False) @action(['post'], detail=False)
@before_request @before_request
def static_score(self, req: Request): def static_score(self, req: Request):
""" """
概览-地市得分统计 概览-团队得分统计
:param req: :param req:
:return: :return:
""" """
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
page = req.data.get('page', '1') page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10') page_size = req.data.get('page_size', '10')
sort = req.data.get('sort', '-avg_score')
task_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id) all_scores = db_static_score(req)
task_condition['task__in'] = team_names total_count, scores = page_with_seat_name(all_scores, page, page_size)
rules = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task"}) \
.values('area').annotate(avg_score_svc=Round(Avg('service_score'), 2),
avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'),
validate_num=Sum('validate_num'), validate_zero=Sum('validate_zero')) \
.order_by(sort)
paginator = Paginator(rules, page_size)
total_count = paginator.count
try:
seats = paginator.page(page)
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
return Response( return Response(
{'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list}) {'code': 0, 'msg': 'success', 'count': total_count, 'data': scores.object_list})
@action(['post'], detail=False) @action(['post'], detail=False)
@before_request @before_request
...@@ -620,28 +373,14 @@ class TasksApi(viewsets.ViewSet): ...@@ -620,28 +373,14 @@ class TasksApi(viewsets.ViewSet):
if agent_name: if agent_name:
session_condition['agentName'] = agent_name session_condition['agentName'] = agent_name
checks = RulesStat.objects.filter(**session_condition) \ all_rules = RulesStat.objects.filter(**session_condition) \
.extra(select={'sessionCollectionId': 'sessionCollectionId'}) \ .extra(select={'sessionCollectionId': 'sessionCollectionId'}) \
.values('agentName', 'customName', 'remainTime', 'score', 'sessionCollectionId', 'sessionId', 'taskId') \ .values('agentName', 'customName', 'remainTime', 'score', 'sessionCollectionId', 'sessionId', 'taskId') \
.distinct() .distinct()
paginator = Paginator(checks, page_size)
total_count = paginator.count total_count, rules = page_with_seat_name(all_rules, page, page_size, agent=True)
try:
seats = paginator.page(page) return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': rules.object_list})
except PageNotAnInteger:
seats = paginator.page(1)
except EmptyPage:
seats = paginator.page(paginator.num_pages)
agent_names = [x['agentName'] for x in seats]
seats_code_name_list = Seat.objects.filter(code__in=agent_names).values('code', 'name')
seats_code_name = dict()
for seat_code_name in seats_code_name_list:
seats_code_name[seat_code_name['code']] = seat_code_name['name']
for rule_dict in seats:
rule_dict['seatName'] = seats_code_name.get(rule_dict['agentName'], rule_dict['agentName'])
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list})
@xframe_options_exempt @xframe_options_exempt
......
...@@ -16,6 +16,15 @@ score_item_service = {'服务用语': 15, '开场白': 5, '结束语': 3, '服 ...@@ -16,6 +16,15 @@ score_item_service = {'服务用语': 15, '开场白': 5, '结束语': 3, '服
score_item_business = {'异议处理': 10, '业务促成': 10, '预约及流转': 10, '服务介绍': 10, '未提供报价': 2, '成功件信息核实': 20} score_item_business = {'异议处理': 10, '业务促成': 10, '预约及流转': 10, '服务介绍': 10, '未提供报价': 2, '成功件信息核实': 20}
def get_remain(check):
remain = 0
if check['startTime'] and check['closeTime']:
start = datetime.strptime(check['startTime'], '%Y-%m-%d %H:%M:%S').timestamp()
close = datetime.strptime(check['closeTime'], '%Y-%m-%d %H:%M:%S').timestamp()
remain = int(close - start)
return remain
def team_seat(): def team_seat():
teams = Team.objects.values_list('id', 'name') teams = Team.objects.values_list('id', 'name')
team_id_name = {team[0]: team[1] for team in teams} team_id_name = {team[0]: team[1] for team in teams}
...@@ -53,13 +62,8 @@ def rule_stat(start_date=None, end_date=None): ...@@ -53,13 +62,8 @@ def rule_stat(start_date=None, end_date=None):
rules_list = [] rules_list = []
data = json.loads(result) data = json.loads(result)
for d in data: for d in data:
remain = 0 remain = get_remain(check)
if check['startTime'] and check['closeTime']: if 'isViolation' in d.keys() and d['isViolation'] and 'rule' in d.keys() and 'name' in d['rule'].keys():
start = datetime.strptime(check['startTime'], '%Y-%m-%d %H:%M:%S').timestamp()
close = datetime.strptime(check['closeTime'], '%Y-%m-%d %H:%M:%S').timestamp()
remain = int(close - start)
if 'isViolation' in d.keys() and d['isViolation'] and 'rule' in d.keys() and 'name' in d[
'rule'].keys():
name = d['rule']['name'] name = d['rule']['name']
rule_obj = {'create_date': start_date, 'sessionCollectionId': t['sessionCollectionId'], rule_obj = {'create_date': start_date, 'sessionCollectionId': t['sessionCollectionId'],
'rule': name, 'rule_num': 1, 'rule': name, 'rule_num': 1,
...@@ -102,11 +106,7 @@ def seat_stat(start_date=None, end_date=None): ...@@ -102,11 +106,7 @@ def seat_stat(start_date=None, end_date=None):
seat_list = [] seat_list = []
for check in checks: for check in checks:
stat_count += 1 stat_count += 1
remain = 0 remain = get_remain(check)
if check['startTime'] and check['closeTime']:
start = datetime.strptime(check['startTime'], '%Y-%m-%d %H:%M:%S').timestamp()
close = datetime.strptime(check['closeTime'], '%Y-%m-%d %H:%M:%S').timestamp()
remain = int(close - start)
if check['agentName'] in seat_dict.keys(): if check['agentName'] in seat_dict.keys():
seat = seat_dict.get(check['agentName']) seat = seat_dict.get(check['agentName'])
seat['total_session'] += 1 seat['total_session'] += 1
......
import json
from django.db.models import Avg, Sum, Count
from pypinyin import pinyin, Style
from config.config import TABLE_PRE
from inspect_report.agency import get_team_names, get_agent_name
from inspect_report.cron import get_remain
from inspect_report.models import ScoreStat, Round, SeatStat, Seat, Country, Tasks, CheckSession, RulesStat
from inspect_report.pagehelper import page_with_seat_name
def db_static_score(req):
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
task_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id)
task_condition['task__in'] = team_names
sort = req.data.get('sort', '-avg_score')
all_scores = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task"}).values('area').annotate(
avg_score_svc=Round(Avg('service_score'), 2), avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'), validate_num=Sum('validate_num'),
validate_zero=Sum('validate_zero')).order_by(sort)
return all_scores
def db_seat_rule(req, if_page=False):
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
agent_name = req.data.get('seat', '')
sort = req.data.get('sort', 'des')
task_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id, team_id)
task_condition['task__in'] = team_names
if agent_name != '' and agent_name is not None:
task_condition['agentName'] = agent_name
if sort == 'des':
all_seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('-validate_session')
else:
all_seats = SeatStat.objects.filter(**task_condition).extra(select={'agentName': 'agentName'}) \
.values('agentName').annotate(remainTime=Sum('remainTime'), validate_session=Sum('validate_session'),
total_session=Sum('total_session')).order_by('validate_session')
if if_page:
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
total_count, seats = page_with_seat_name(all_seats, page, page_size, agent=False)
else:
page = 1
page_size = 10
total_count = 0
seats = all_seats
return_data = []
agent_name_set = set()
for s in seats:
detail = {'agentName': s['agentName'], 'validate_session': s['validate_session'],
'remainTime': s['remainTime'], 'total_session': s['total_session'],
'ratio': round(s['validate_session'] / s['total_session'], 2)}
agent_name_set.add(s['agentName'])
return_data.append(detail)
seat_code_name_lists = Seat.objects.filter(code__in=agent_name_set).values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
if sort == 'asc':
data_sort = sorted(return_data, key=lambda x: x['ratio'])
for i in range(len(data_sort)):
if if_page:
data_sort[i]['ranking'] = total_count - (int(page) - 1) * int(page_size) - i
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
else:
data_sort = sorted(return_data, key=lambda x: x['ratio'], reverse=True)
for i in range(len(data_sort)):
if if_page:
data_sort[i]['ranking'] = (int(page) - 1) * int(page_size) + i + 1
data_sort[i]['ratio'] = '{0}%'.format(int(data_sort[i]['ratio'] * 100))
data_sort[i]['seatName'] = seat_code_name_dict.get(data_sort[i]['agentName'], data_sort[i]['agentName'])
return total_count, data_sort
def db_seat_check(req, if_page=False):
city_id = req.data.get('city', '')
country_id = req.data.get('country', '')
team_id = req.data.get('team', '')
agent_name = req.data.get('agentName', '')
task_condition = req.data.get('at_condition', {})
task_condition['hasCheck'] = 1
if city_id:
city = Country.objects.filter(id=city_id).first()
if city.parent is not None:
task_condition['name__startswith'] = city.name
tasks = Tasks.objects.filter(**task_condition).values('id', 'name', 'sessionCollectionId')
task_dict = {}
task_name_dict = {}
for t in tasks:
task_name_dict[t['id']] = t['name']
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
return_data = []
total_count = 0
agent_names = get_agent_name(city_id, country_id, team_id, agent_name)
if len(agent_names) > 0:
seat_code_name_lists = Seat.objects.filter(code__in=agent_names).values('code', 'name')
else:
seat_code_name_lists = Seat.objects.filter().values('code', 'name')
seat_code_name_dict = dict()
for seat_code_name in seat_code_name_lists:
seat_code_name_dict[seat_code_name['code']] = seat_code_name['name']
for k, v in task_dict.items():
# session_collection = t.sessionCollectionId
table_name = TABLE_PRE + k
tn = CheckSession.set_table(table_name)
session_condition = {'taskId__in': v}
if len(agent_names) > 0:
session_condition['agentName__in'] = agent_names
all_checks = tn.objects.filter(**session_condition).values('id', 'createdAt', 'agentName', 'extra', 'taskId',
'remainTime', 'startTime', 'closeTime',
'scoreItemRecord', 'sessionId')
if if_page:
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
total_count, checks = page_with_seat_name(all_checks, page, page_size, agent=False)
else:
total_count = 0
checks = all_checks
for check in checks:
result = check['scoreItemRecord']
t_name = task_name_dict[check['taskId']]
total_score = 100
extra = json.loads(check['extra'])
remain = get_remain(check)
f_name = extra['filename'] if extra and 'filename' in extra.keys() else ''
detail = {'id': check['id'], 'sessionId': check['sessionId'], 'createdAt': check['createdAt'],
'area': t_name.split('_')[0],
'seatName': seat_code_name_dict.get(check['agentName'], check['agentName']),
'agentName': check['agentName'], 'filename': f_name,
'remainTime': remain, 'sessionCollectionId': k, 'taskId': check['taskId']}
rule_detail = {'fwyy': 15, 'kcb': 5, 'jsy': 3, 'fwtd': 5, 'yssb': 5, 'jysb': 5, 'yycl': 10,
'ywcc': 10, 'yyjlz': 10, 'fwjs': 10, 'wtgbj': 2, 'cgjxxhs': 20, 'wgzlf': 100, 'mgc': 100}
if result:
data = json.loads(result)
for d in data:
if 'scoreItemName' in d.keys() and 'score' in d.keys():
item_score = 0 if d['score'] and d['score'] > 0 else 1
name_py = pinyin(d['scoreItemName'], style=Style.FIRST_LETTER, strict=False)
item_name = ''.join([x[0] for x in name_py])
# detail[item_name] = {d['scoreItemName']: item_score}
if item_name in rule_detail.keys():
if item_score == 0:
total_score -= rule_detail[item_name]
rule_detail[item_name] = item_score
for kk, vv in rule_detail.items():
if vv > 1:
rule_detail[kk] = 1
if rule_detail['wgzlf'] == 0 or rule_detail['mgc'] == 0:
total_score = 0
detail.update(rule_detail)
detail['total_score'] = total_score
return_data.append(detail)
return total_count, return_data
def db_seat_area(req):
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
agent_name = req.data.get('seat', '')
sort = req.data.get('sort', '-avg_score')
task_condition = req.data.get('date_condition', '')
team_names = get_team_names(city_id, country_id, team_id)
task_condition['task__in'] = team_names
if agent_name:
task_condition['agentName'] = agent_name
# , 'total_session', 'validate_num', 'validate_session', 'validate_zero'
all_scores = ScoreStat.objects.filter(**task_condition).extra(
select={'area': "task", 'agentName': 'agentName'}).values('area', 'agentName').annotate(
avg_score_svc=Round(Avg('service_score'), 2),
avg_score_bus=Round(Avg('business_score'), 2),
avg_score=Round(Avg('score'), 2), total_session=Sum('total_session'),
validate_num=Sum('validate_num'), validate_zero=Sum('validate_zero')).order_by(sort)
return all_scores
def db_static_rule(req):
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
team_id = req.data.get('team', None)
team_names = get_team_names(city_id, country_id, team_id)
task_condition = req.data.get('date_condition', {})
task_condition['task__in'] = team_names
call_count = SeatStat.objects.filter(**task_condition).aggregate(Sum("validate_session"))[
'validate_session__sum']
# tasks = RulesStat.objects.filter(**task_condition).values('rule', 'sessionCollectionId', 'rule_num')
tasks = RulesStat.objects.all().filter(**task_condition).extra(
select={'rule': "rule",
'sessionCollectionId': 'sessionCollectionId'}).values('rule',
'sessionCollectionId').annotate(
rule_num=Count('id')).order_by('-rule_num')
return_data = {}
for t in tasks:
name = t['rule']
if name in return_data.keys():
return_data[name]['count'] += int(t['rule_num'])
else:
return_data[name] = {'count': int(t['rule_num']), 'tables': []}
if t['sessionCollectionId'] not in return_data[name]['tables']:
return_data[name]['tables'].append(t['sessionCollectionId'])
data_sort = []
for k, v in return_data.items():
v['rule'] = k
v['ratio'] = round(v['count'] / call_count, 2) if call_count else 0
v['ratio'] = '{0}%'.format(int(v['ratio'] * 100))
v['call_count'] = call_count
data_sort.append(v)
return data_sort
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from inspect_report.models import Seat
def page_with_seat_name(all_objects, page, page_size, agent=False):
paginator = Paginator(all_objects, page_size)
total_count = paginator.count
try:
objects = paginator.page(page)
except PageNotAnInteger:
objects = paginator.page(1)
except EmptyPage:
objects = paginator.page(paginator.num_pages)
if agent:
objects = set_object_seat_name(objects)
return total_count, objects
def set_object_seat_name(objects):
agent_names = [x['agentName'] for x in objects]
seats_code_name_list = Seat.objects.filter(code__in=agent_names).values('code', 'name')
seats_code_name = dict()
for seat_code_name in seats_code_name_list:
seats_code_name[seat_code_name['code']] = seat_code_name['name']
for object_dict in objects:
object_dict['seatName'] = seats_code_name.get(object_dict['agentName'], object_dict['agentName'])
return objects
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment