Commit 0276654d authored by zhengjinlei's avatar zhengjinlei

首页统计

parent 28cbe4ea
......@@ -5,7 +5,7 @@ from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat
import json
from datetime import datetime, timedelta
from config.config import TABLE_PRE
......@@ -414,6 +414,7 @@ class TasksApi(viewsets.ViewSet):
agent_name = req.data.get('agentName', '')
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
sort = req.data.get('sort', '-avg_score')
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()
......@@ -423,9 +424,13 @@ class TasksApi(viewsets.ViewSet):
task_condition['task'] = task_id
if agent_name:
task_condition['agentName'] = agent_name
rules = RulesStat.objects.filter(**task_condition).extra(select={'area': "task", 'agentName': 'agentName'})\
.values('area', 'agentName').annotate(avg_score=Avg('score')).order_by('-avg_score')
# , '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=Avg('service_score'),
avg_score_bus=Avg('business_score'),
avg_score=Avg('score'), 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:
......@@ -526,6 +531,40 @@ class TasksApi(viewsets.ViewSet):
seats = paginator.page(paginator.num_pages)
return Response({'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list})
@action(['post'], detail=False)
def static_score(self, req: Request):
"""
概览-地市得分统计
:param req:
:return:
"""
task_id = req.data.get('task', '')
page = req.data.get('page', '1')
page_size = req.data.get('page_size', '10')
sort = req.data.get('sort', '-avg_score')
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}
if task_id:
task_condition['task'] = task_id
rules = ScoreStat.objects.filter(**task_condition).extra(select={'area': "task"}) \
.values('area').annotate(avg_score_svc=Avg('service_score'), avg_score_bus=Avg('business_score'),
avg_score=Avg('score'), 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({'code': 0, 'msg': 'success', 'count': total_count, 'data': seats.object_list})
@xframe_options_exempt
def rule(request):
......
# coding: utf-8
from rest_framework.request import Request
from datetime import datetime, timedelta
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat
from inspect_report.models import Tasks, CheckSession, RulesStat, SeatStat, ScoreStat
from config.config import TABLE_PRE
import json
import logging
......@@ -10,6 +8,11 @@ import logging
参考:https://github.com/jgorset/django-kronos
"""
logger = logging.getLogger("app_file")
score_item_zero = {'违规则零分': 100, '敏感词': 100}
score_item_service = {'异议处理': 10, '业务促成': 15, '预约及流转': 15, '服务介绍': 5, '6_引导流程_2个场景': 0, '未提供报价': 5,
'未做优惠费率介绍': 5}
score_item_business = {'结束语': 5, '服务态度': 10, '服务用语': 10, '语速识别': 5, '静音识别': 5, '6_2_引导流程_投诉安抚': 0,
'开场白': 10}
def rule_stat(start_date, end_date):
......@@ -80,3 +83,61 @@ def seat_stat(start_date, end_date):
seat_obj.update(v)
seat_list.append(SeatStat(**seat_obj))
SeatStat.objects.bulk_create(seat_list)
def score_stat(start_date, end_date):
"""
坐席违规统计
:return:
"""
task_condition = {'hasCheck': 1, 'createdAt__gte': start_date, 'createdAt__lt': end_date}
tasks = Tasks.objects.filter(**task_condition).values('id', 'name', 'sessionCollectionId')
for t in tasks:
if ScoreStat.objects.filter(taskId=t['id']).exists():
continue
table_name = TABLE_PRE + t['sessionCollectionId']
tn = CheckSession.set_table(table_name)
session_condition = {'taskId': t['id']}
checks = tn.objects.filter(**session_condition).values('id', 'agentName', 'taskId', 'violationRuleCount',
'startTime', 'score', 'scoreItemRecord')
seat_dict = {}
seat_list = []
for check in checks:
score_item = json.loads(check['scoreItemRecord'])
service_score = 55
business_score = 45
validate_zero = 0
for m in score_item:
if m['scoreItemName'] in score_item_service.keys():
service_score -= m['score']
if m['scoreItemName'] in score_item_business.keys():
business_score -= m['score']
if m['scoreItemName'] in score_item_zero.keys():
validate_zero += 1
if validate_zero > 0:
score = 0
else:
score = service_score + business_score
if check['agentName'] in seat_dict.keys():
seat = seat_dict.get(check['agentName'])
seat['total_session'] += 1
seat['validate_session'] += 1 if check['violationRuleCount'] > 0 else 0
seat['validate_num'] += len(score_item)
seat['score'] = round((seat['score'] + score)/2, 2)
seat['service_score'] = round((seat['service_score'] + service_score)/2, 2)
seat['business_score'] = round((seat['business_score'] + business_score)/2, 2)
else:
seat_dict[check['agentName']] = {'create_date': start_date, 'agentName': check['agentName'],
'taskId': check['taskId'], 'task': t['name'].split('_')[0],
'sessionCollectionId': t['sessionCollectionId'], 'total_session': 1,
'score': score, 'service_score': service_score,
'business_score': business_score, 'validate_zero': validate_zero}
seat_dict[check['agentName']]['validate_session'] = 1 if check['violationRuleCount'] > 0 else 0
seat_dict[check['agentName']]['validate_num'] = len(score_item)
for k, v in seat_dict.items():
seat_obj = {'agentName': k}
seat_obj.update(v)
seat_list.append(ScoreStat(**seat_obj))
ScoreStat.objects.bulk_create(seat_list)
......@@ -61,6 +61,28 @@ class SeatStat(models.Model):
db_table = 'seats_datastat'
class ScoreStat(models.Model):
sessionCollectionId = models.CharField('所在表', null=True, max_length=32)
validate_session = models.IntegerField('违规会话数量', default=0)
validate_num = models.IntegerField('违规次数', default=0)
total_session = models.IntegerField('会话数量', default=0)
task = models.CharField('所在地市', null=True, max_length=24)
create_date = models.DateField('统计日期', null=True)
start_time = models.DateTimeField('会话日期', null=True)
agentName = models.CharField('坐席名称', null=True, max_length=64)
taskId = models.IntegerField('质检任务标识')
service_score = models.FloatField('服务类的评分', default=0)
business_score = models.FloatField('业务类的评分', default=0)
score = models.FloatField('对当前会话的评分', default=0)
validate_zero = models.IntegerField('触发0分项次数', default=0)
def __str__(self):
return self.agentName
class Meta:
db_table = 'scores_datastat'
class CheckSession(models.Model):
taskId = models.IntegerField('质检任务标识')
sessionId = models.CharField('会话唯一标识')
......
......@@ -16,7 +16,7 @@ Including another URLconf
from django.contrib import admin
from django.urls import path
from .api.tasksapi import rule, seat, group, score, check
from .views import stat_rules_every, stat_seats_every
from .views import stat_rules_every, stat_seats_every, stat_scores_every
urlpatterns = [
# path('admin/', admin.site.urls),
......@@ -27,4 +27,5 @@ urlpatterns = [
path('inspect/check/', check),
path('inspect/stat/rule/', stat_rules_every),
path('inspect/stat/seat/', stat_seats_every),
path('inspect/stat/score/', stat_scores_every),
]
from datetime import datetime, timedelta
from .cron import rule_stat, seat_stat
from .cron import rule_stat, seat_stat, score_stat
from django.http.response import JsonResponse
from dateutil.rrule import rrule, DAILY
......@@ -29,3 +29,16 @@ def stat_seats_every(request):
end_date = datetime.strptime(date.strftime('%Y-%m-%d') + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
seat_stat(start_date, end_date)
return JsonResponse({'code': 0, 'msg': 'stat success'})
def stat_scores_every(request):
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
s_date = datetime.strptime(start_date, '%Y-%m-%d')
e_date = datetime.strptime(end_date + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
seed_dt = list(rrule(DAILY, byweekday=[0, 1, 2, 3, 4, 5, 6], dtstart=s_date, until=e_date))
for date in seed_dt:
start_date = date
end_date = datetime.strptime(date.strftime('%Y-%m-%d') + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
score_stat(start_date, end_date)
return JsonResponse({'code': 0, 'msg': 'stat success'})
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