Commit 15bda856 authored by lvshibao's avatar lvshibao

代码整理

parent 7461aed9
......@@ -98,7 +98,6 @@ class AgencyApi(viewsets.ViewSet):
"""
city_id = req.GET.get('city_id', '')
country_id = req.GET.get('country_id', '')
team_list = list()
top = Country.objects.filter(id=city_id).first()
if top is not None:
if top.parent is None:
......
# coding: utf-8
from django.db.models import Count, Sum, Avg
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.request import Request
from before_request import before_request
from inspect_report.agency import get_team_names, get_agent_name
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat, Round, Seat, Country
import json
from datetime import datetime, timedelta
from config.config import TABLE_PRE, name_list
from inspect_report.dbhelper import db_static_score, db_seat_rule, db_seat_check, db_seat_area, db_static_rule
from datetime import datetime
from django.http import HttpResponse
import logging
from pypinyin import Style, pinyin
import csv
import codecs
from django.utils.http import urlquote
from inspect_report.pagehelper import set_object_seat_name
logger = logging.getLogger(__name__)
......@@ -28,27 +25,12 @@ class DataApi(viewsets.ViewSet):
@before_request
def static_score_export(self, req: Request):
"""
概览-地市得分统计-导出
概览-得分统计-导出
:param req:
: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"}) \
.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)
rules = db_static_score(req)
response = HttpResponse(content_type='text/csv')
file_name = '组长概览_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream'
......@@ -74,41 +56,9 @@ class DataApi(viewsets.ViewSet):
:param req:
: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')
file_name = '违规项分析_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream'
......@@ -133,49 +83,9 @@ class DataApi(viewsets.ViewSet):
:param req:
: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:
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')
total_count, data_sort = db_seat_rule(req)
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')
file_name = '坐席违规_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream'
......@@ -200,33 +110,8 @@ class DataApi(viewsets.ViewSet):
:param req:
: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', '-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'])
scores = db_seat_area(req)
scores = set_object_seat_name(scores)
response = HttpResponse(content_type='text/csv')
file_name = '坐席成绩_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
response['Content-Type'] = 'application/octet-stream'
......@@ -238,7 +123,7 @@ class DataApi(viewsets.ViewSet):
header = ['地市', '坐席工号', '坐席名称', '全部会话数', '触发违规项次数', '服务类平均分', '业务类平均分', '平均分', '触发0分项次数']
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'],
r['avg_score_bus'], r['avg_score'], r['validate_zero']]
writer.writerow(row)
......@@ -251,85 +136,7 @@ class DataApi(viewsets.ViewSet):
:param req:
:return:
"""
city_id = req.GET.get('city', '')
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)
total_count, return_data = db_seat_check(req)
response = HttpResponse(content_type='text/csv')
file_name = '质检绩效考核_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.csv'
......
# coding: utf-8
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.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from before_request import before_request
from inspect_report.agency import get_team_names, get_agent_name
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat, Round, Team, Country, Seat
from inspect_report.agency import get_team_names
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
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
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__)
......@@ -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]
return Response({'code': 0, 'msg': 'success', 'data': list(seat_id_names) + extra})
@action(['post'], detail=False)
def rule(self, req: Request):
"""
获取违规项分析
:param req:
:return:
"""
task_id = req.data.get('task', '')
agent_name = req.data.get('agentName', '')
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'))
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()
task_condition = {'create_date__gte': q_start_date, 'create_date__lt': q_end_date}
data_sort = []
return_data = {}
if task_id:
task_condition['task'] = task_id
if agent_name:
task_condition['agentName'] = agent_name
# 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')
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'])
for k, v in return_data.items():
v['rule'] = k
data_sort.append(v)
# data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort})
@action(['post'], detail=False)
def seat_session(self, req: Request):
"""
坐席违规分析-按照会话
:param req:
:return:
"""
task_id = req.data.get('task', '')
num = req.data.get('num', '10')
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'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id:
task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {}
for t in tasks:
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
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}
checks = tn.objects.filter(**session_condition).values('agentName')
for check in checks:
agent_name = check['agentName']
if agent_name:
if agent_name in return_data.keys():
return_data[agent_name] += 1
else:
return_data[agent_name] = 1
data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
data_max = data_max[-int(num):]
data_max_return = {}
for dm in data_max:
data_max_return[dm[0]] = dm[1]
return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
@action(['post'], detail=False)
def seat_score(self, req: Request):
"""
坐席违规分析-按照得分
:param req:
:return:
"""
task_id = req.data.get('task', '')
num = req.data.get('num', '10')
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'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id:
task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {}
for t in tasks:
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
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}
checks = tn.objects.filter(**session_condition).values('agentName', 'score')
for check in checks:
agent_name = check['agentName']
if agent_name:
if agent_name in return_data.keys():
return_data[agent_name] += check['score']
else:
return_data[agent_name] = check['score']
data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
data_max = data_max[:int(num)]
data_max_return = {}
for dm in data_max:
data_max_return[dm[0]] = dm[1]
return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
# @action(['post'], detail=False)
# def rule(self, req: Request):
# """
# 获取违规项分析
# :param req:
# :return:
# """
# task_id = req.data.get('task', '')
# agent_name = req.data.get('agentName', '')
# 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'))
# 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()
# task_condition = {'create_date__gte': q_start_date, 'create_date__lt': q_end_date}
# data_sort = []
# return_data = {}
# if task_id:
# task_condition['task'] = task_id
# if agent_name:
# task_condition['agentName'] = agent_name
# # 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')
# 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'])
#
# for k, v in return_data.items():
# v['rule'] = k
# data_sort.append(v)
# # data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True)
# return Response({'code': 0, 'msg': 'success', 'data': data_sort})
# @action(['post'], detail=False)
# def seat_session(self, req: Request):
# """
# 坐席违规分析-按照会话
# :param req:
# :return:
# """
# task_id = req.data.get('task', '')
# num = req.data.get('num', '10')
# 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'))
# task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
# if task_id:
# task_condition['name__startswith'] = task_id
# tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
# task_dict = {}
# for t in tasks:
# if t['sessionCollectionId'] in task_dict.keys():
# task_dict[t['sessionCollectionId']].append(t['id'])
# else:
# task_dict[t['sessionCollectionId']] = [t['id'], ]
# 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}
# checks = tn.objects.filter(**session_condition).values('agentName')
# for check in checks:
# agent_name = check['agentName']
# if agent_name:
# if agent_name in return_data.keys():
# return_data[agent_name] += 1
# else:
# return_data[agent_name] = 1
# data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
# data_max = data_max[-int(num):]
# data_max_return = {}
# for dm in data_max:
# data_max_return[dm[0]] = dm[1]
# return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
# @action(['post'], detail=False)
# def seat_score(self, req: Request):
# """
# 坐席违规分析-按照得分
# :param req:
# :return:
# """
# task_id = req.data.get('task', '')
# num = req.data.get('num', '10')
# 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'))
# task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
# if task_id:
# task_condition['name__startswith'] = task_id
# tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
# task_dict = {}
# for t in tasks:
# if t['sessionCollectionId'] in task_dict.keys():
# task_dict[t['sessionCollectionId']].append(t['id'])
# else:
# task_dict[t['sessionCollectionId']] = [t['id'], ]
# 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}
# checks = tn.objects.filter(**session_condition).values('agentName', 'score')
# for check in checks:
# agent_name = check['agentName']
# if agent_name:
# if agent_name in return_data.keys():
# return_data[agent_name] += check['score']
# else:
# return_data[agent_name] = check['score']
# data_max = sorted(return_data.items(), key=lambda item: item[1], reverse=False)
# data_max = data_max[:int(num)]
# data_max_return = {}
# for dm in data_max:
# data_max_return[dm[0]] = dm[1]
# return Response({'code': 0, 'msg': 'success', 'data': data_max_return})
@action(['post'], detail=False)
@before_request
......@@ -187,62 +186,7 @@ class TasksApi(viewsets.ViewSet):
:param req:
: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', '')
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'])
total_count, data_sort = db_seat_rule(req, if_page=True)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': data_sort})
@action(['post'], detail=False)
......@@ -258,8 +202,8 @@ class TasksApi(viewsets.ViewSet):
session_condition = req.data.get('date_condition', {})
team_names = get_team_names(city_id, country_id)
session_condition['task__in'] = team_names
seat_data = SeatStat.objects.filter(**session_condition).aggregate(
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))
......@@ -273,54 +217,54 @@ class TasksApi(viewsets.ViewSet):
return_data['avg_score'] = 0.0
return Response({'code': 0, 'msg': 'success', 'data': return_data})
@action(['post'], detail=False)
def static_date(self, req: Request):
"""
获取违规项分析
:param req:
:return:
"""
task_id = req.data.get('task', '')
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'))
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
if task_id:
task_condition['name__startswith'] = task_id
tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
task_dict = {}
for t in tasks:
if t['sessionCollectionId'] in task_dict.keys():
task_dict[t['sessionCollectionId']].append(t['id'])
else:
task_dict[t['sessionCollectionId']] = [t['id'], ]
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}
checks = tn.objects.filter(**session_condition).values('violationRuleCount', 'createdAt')
for check in checks:
date = check['createdAt'].strftime('%Y-%m-%d')
if date in return_data.keys():
return_data[date]['total_session'] += 1
if check['violationRuleCount'] > 0:
return_data[date]['validate_session'] += 1
else:
if check['violationRuleCount'] > 0:
return_data[date] = {'total_session': 1, 'validate_session': 1}
else:
return_data[date] = {'total_session': 1, 'validate_session': 0}
data_sort = []
for k, v in return_data.items():
# return_data[k]['ratio'] = round(v['validate_session']/v['total_session'], 2)
if v['total_session']:
v['ratio'] = round(v['validate_session'] / v['total_session'], 2)
else:
v['ratio'] = 0
v['date'] = k
data_sort.append(v)
data_sort = sorted(data_sort, key=lambda x: x['date'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort})
# @action(['post'], detail=False)
# def static_date(self, req: Request):
# """
# 获取违规项分析
# :param req:
# :return:
# """
# task_id = req.data.get('task', '')
# 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'))
# task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date + ' 23:59:59'}
# if task_id:
# task_condition['name__startswith'] = task_id
# tasks = Tasks.objects.filter(**task_condition).values('id', 'sessionCollectionId')
# task_dict = {}
# for t in tasks:
# if t['sessionCollectionId'] in task_dict.keys():
# task_dict[t['sessionCollectionId']].append(t['id'])
# else:
# task_dict[t['sessionCollectionId']] = [t['id'], ]
# 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}
# checks = tn.objects.filter(**session_condition).values('violationRuleCount', 'createdAt')
# for check in checks:
# date = check['createdAt'].strftime('%Y-%m-%d')
# if date in return_data.keys():
# return_data[date]['total_session'] += 1
# if check['violationRuleCount'] > 0:
# return_data[date]['validate_session'] += 1
# else:
# if check['violationRuleCount'] > 0:
# return_data[date] = {'total_session': 1, 'validate_session': 1}
# else:
# return_data[date] = {'total_session': 1, 'validate_session': 0}
# data_sort = []
# for k, v in return_data.items():
# # return_data[k]['ratio'] = round(v['validate_session']/v['total_session'], 2)
# if v['total_session']:
# v['ratio'] = round(v['validate_session'] / v['total_session'], 2)
# else:
# v['ratio'] = 0
# v['date'] = k
# data_sort.append(v)
# data_sort = sorted(data_sort, key=lambda x: x['date'], reverse=True)
# return Response({'code': 0, 'msg': 'success', 'data': data_sort})
@action(['post'], detail=False)
@before_request
......@@ -330,99 +274,7 @@ class TasksApi(viewsets.ViewSet):
:param req:
:return:
"""
city_id = req.data.get('city', '')
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)
total_count, return_data = db_seat_check(req, if_page=True)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': return_data})
@action(['post'], detail=False)
......@@ -433,46 +285,12 @@ class TasksApi(viewsets.ViewSet):
:param req:
: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_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, team_id)
all_scores = db_seat_area(req)
total_count, scores = page_with_seat_name(all_scores, page, page_size, agent=True)
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})
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': scores.object_list})
@action(['post'], detail=False)
@before_request
......@@ -483,39 +301,7 @@ class TasksApi(viewsets.ViewSet):
:return:
"""
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)
data_sort = db_static_rule(req)
# data_sort = sorted(data_sort, key=lambda x: x['count'], reverse=True)
return Response({'code': 0, 'msg': 'success', 'data': data_sort})
......@@ -542,63 +328,30 @@ class TasksApi(viewsets.ViewSet):
session_condition['rule'] = rule_name
session_condition['sessionCollectionId__in'] = table_list
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',
'score',
'sessionCollectionId', 'sessionId', 'taskId')
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)
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})
total_count, rules = page_with_seat_name(all_rules, page, page_size, agent=True)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': rules.object_list})
@action(['post'], detail=False)
@before_request
def static_score(self, req: Request):
"""
概览-地市得分统计
概览-团队得分统计
:param req:
:return:
"""
city_id = req.data.get('city', None)
country_id = req.data.get('country', None)
page = req.data.get('page', '1')
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
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)
total_count, scores = page_with_seat_name(all_scores, page, page_size)
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)
@before_request
......@@ -620,28 +373,14 @@ class TasksApi(viewsets.ViewSet):
if agent_name:
session_condition['agentName'] = agent_name
checks = RulesStat.objects.filter(**session_condition) \
all_rules = RulesStat.objects.filter(**session_condition) \
.extra(select={'sessionCollectionId': 'sessionCollectionId'}) \
.values('agentName', 'customName', 'remainTime', 'score', 'sessionCollectionId', 'sessionId', 'taskId') \
.distinct()
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)
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})
total_count, rules = page_with_seat_name(all_rules, page, page_size, agent=True)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': rules.object_list})
@xframe_options_exempt
......
......@@ -16,6 +16,15 @@ score_item_service = {'服务用语': 15, '开场白': 5, '结束语': 3, '服
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():
teams = Team.objects.values_list('id', 'name')
team_id_name = {team[0]: team[1] for team in teams}
......@@ -53,13 +62,8 @@ def rule_stat(start_date=None, end_date=None):
rules_list = []
data = json.loads(result)
for d in data:
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)
if 'isViolation' in d.keys() and d['isViolation'] and 'rule' in d.keys() and 'name' in d[
'rule'].keys():
remain = get_remain(check)
if 'isViolation' in d.keys() and d['isViolation'] and 'rule' in d.keys() and 'name' in d['rule'].keys():
name = d['rule']['name']
rule_obj = {'create_date': start_date, 'sessionCollectionId': t['sessionCollectionId'],
'rule': name, 'rule_num': 1,
......@@ -102,11 +106,7 @@ def seat_stat(start_date=None, end_date=None):
seat_list = []
for check in checks:
stat_count += 1
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)
remain = get_remain(check)
if check['agentName'] in seat_dict.keys():
seat = seat_dict.get(check['agentName'])
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