From 808d4883738a5774ec5abffb36152316e59a8999 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 10 Oct 2020 17:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E5=88=86=E6=9E=90-=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=91=98=E5=B7=A5=E5=8F=8A=E5=88=86=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_client/src/api/analyse.js | 22 +++ test_client/src/views/analyse/chart.vue | 55 ++++++ test_client/src/views/components/BarChart.vue | 124 +++++++++++++ .../{dashboard => }/components/BoxCard.vue | 0 test_client/src/views/components/ChinaMap.vue | 175 ++++++++++++++++++ .../{dashboard => }/components/LineChart.vue | 5 +- .../{dashboard => }/components/PanelGroup.vue | 0 .../{dashboard => }/components/PieChart.vue | 0 .../components/RaddarChart.vue | 0 .../components/TodoList/Todo.vue | 0 .../components/TodoList/index.scss | 0 .../components/TodoList/index.vue | 0 .../components/TransactionTable.vue | 0 .../components/mixins/resize.js | 0 .../views/dashboard/components/BarChart.vue | 102 ---------- test_client/src/views/dashboard/index.vue | 23 ++- test_server/analyse/urls.py | 3 + test_server/analyse/views.py | 39 +++- test_server/crm/models.py | 4 +- test_server/crm/views.py | 45 ++++- 20 files changed, 482 insertions(+), 115 deletions(-) create mode 100644 test_client/src/views/components/BarChart.vue rename test_client/src/views/{dashboard => }/components/BoxCard.vue (100%) create mode 100644 test_client/src/views/components/ChinaMap.vue rename test_client/src/views/{dashboard => }/components/LineChart.vue (95%) rename test_client/src/views/{dashboard => }/components/PanelGroup.vue (100%) rename test_client/src/views/{dashboard => }/components/PieChart.vue (100%) rename test_client/src/views/{dashboard => }/components/RaddarChart.vue (100%) rename test_client/src/views/{dashboard => }/components/TodoList/Todo.vue (100%) rename test_client/src/views/{dashboard => }/components/TodoList/index.scss (100%) rename test_client/src/views/{dashboard => }/components/TodoList/index.vue (100%) rename test_client/src/views/{dashboard => }/components/TransactionTable.vue (100%) rename test_client/src/views/{dashboard => }/components/mixins/resize.js (100%) delete mode 100644 test_client/src/views/dashboard/components/BarChart.vue diff --git a/test_client/src/api/analyse.js b/test_client/src/api/analyse.js index 4df08ac..4248b9a 100644 --- a/test_client/src/api/analyse.js +++ b/test_client/src/api/analyse.js @@ -13,4 +13,26 @@ export function searchCandidates(data) { method: 'post', data }) +} + +export function getAdmindata1() { + //各管理员录入学员数 + return request({ + url: '/analyse/admindata1/', + method: 'get', + }) +} + +export function getCompanydis() { + return request({ + url: '/analyse/companydis/', + method: 'get', + }) +} + +export function getConsumerdis() { + return request({ + url: '/analyse/consumerdis/', + method: 'get', + }) } \ No newline at end of file diff --git a/test_client/src/views/analyse/chart.vue b/test_client/src/views/analyse/chart.vue index e69de29..68db7fc 100644 --- a/test_client/src/views/analyse/chart.vue +++ b/test_client/src/views/analyse/chart.vue @@ -0,0 +1,55 @@ + + \ No newline at end of file diff --git a/test_client/src/views/components/BarChart.vue b/test_client/src/views/components/BarChart.vue new file mode 100644 index 0000000..ce09b51 --- /dev/null +++ b/test_client/src/views/components/BarChart.vue @@ -0,0 +1,124 @@ + + + diff --git a/test_client/src/views/dashboard/components/BoxCard.vue b/test_client/src/views/components/BoxCard.vue similarity index 100% rename from test_client/src/views/dashboard/components/BoxCard.vue rename to test_client/src/views/components/BoxCard.vue diff --git a/test_client/src/views/components/ChinaMap.vue b/test_client/src/views/components/ChinaMap.vue new file mode 100644 index 0000000..5e5e23e --- /dev/null +++ b/test_client/src/views/components/ChinaMap.vue @@ -0,0 +1,175 @@ + + + diff --git a/test_client/src/views/dashboard/components/LineChart.vue b/test_client/src/views/components/LineChart.vue similarity index 95% rename from test_client/src/views/dashboard/components/LineChart.vue rename to test_client/src/views/components/LineChart.vue index e654168..3a6e4a7 100644 --- a/test_client/src/views/dashboard/components/LineChart.vue +++ b/test_client/src/views/components/LineChart.vue @@ -4,7 +4,7 @@ diff --git a/test_client/src/views/dashboard/index.vue b/test_client/src/views/dashboard/index.vue index 85a20a1..4f9e6d3 100644 --- a/test_client/src/views/dashboard/index.vue +++ b/test_client/src/views/dashboard/index.vue @@ -3,15 +3,16 @@ - + diff --git a/test_server/analyse/urls.py b/test_server/analyse/urls.py index a249cd2..8708cae 100644 --- a/test_server/analyse/urls.py +++ b/test_server/analyse/urls.py @@ -7,5 +7,8 @@ from .views import * urlpatterns = [ path('basic/', BasicCount.as_view()), path('quota/', Quota.as_view()), + path('admindata1/', Admindata1.as_view()), + path('companydis/', Companydis.as_view()), + path('consumerdis/', Consumerdis.as_view()), path('searchcandidates/', SearchCandidates.as_view()) ] diff --git a/test_server/analyse/views.py b/test_server/analyse/views.py index 07e3e84..fac0630 100644 --- a/test_server/analyse/views.py +++ b/test_server/analyse/views.py @@ -10,6 +10,8 @@ from question.models import Question import pickle import requests from lxml import etree +from django.db.models import Count +from rbac.models import UserProfile # Create your views here. class BasicCount(APIView): @@ -23,7 +25,42 @@ class BasicCount(APIView): ret['test_count'] = ExamTest.objects.filter(is_delete=False).count() ret['question_count'] = Question.objects.filter(is_delete=False).count() return Response(ret) - + +class Admindata1(APIView): + """ + 各管理员录入学员数-柱状图 + """ + def get(self, request, format=None): + ret = {'x':{'name':'管理员', 'data':[]}, 's':[{'name':'学员数', 'data':[]}], 't':'各管理员录入学员数'} + tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total') + for i in tmp: + ret['x']['data'].append(i['username']) + ret['s'][0]['data'].append(i['total']) + return Response(ret) + +class Companydis(APIView): + """ + 单位分布 + """ + def get(self, request, format=None): + ret = {'s':[{'name':'浙江', 'value':5000}], 't':'单位分布'} + # tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total') + # for i in tmp: + # ret['x']['data'].append(i['username']) + # ret['s'][0]['data'].append(i['total']) + return Response(ret) + +class Consumerdis(APIView): + """ + 学员分布 + """ + def get(self, request, format=None): + ret = {'s':[{'name':'河北', 'value':5000}], 't':'学员分布'} + # tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total') + # for i in tmp: + # ret['x']['data'].append(i['username']) + # ret['s'][0]['data'].append(i['total']) + return Response(ret) class Quota(APIView): ''' 获取考试名额 diff --git a/test_server/crm/models.py b/test_server/crm/models.py index d12f8d8..29c2336 100644 --- a/test_server/crm/models.py +++ b/test_server/crm/models.py @@ -13,7 +13,7 @@ class Company(CommonModel): name = models.CharField(max_length=60, verbose_name='名称', unique=True) pid = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父') create_admin = models.ForeignKey(UserProfile, default=1, on_delete=models.DO_NOTHING) - + geo = JSONField('地理位置', null=True, blank=True) class Meta: verbose_name = '客户企业' verbose_name_plural = verbose_name @@ -73,7 +73,7 @@ class Consumer(CommonModel): realname = models.CharField('真实姓名', max_length=100, null=True, blank=True) ID_number1 = models.CharField('身份证号', max_length=100, null=True, blank=True) - create_admin = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, null=True, blank=True) + create_admin = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, null=True, blank=True, related_name='consumer_create_admin') exceed_date = models.DateField('账号过期', null=True, blank=True) diff --git a/test_server/crm/views.py b/test_server/crm/views.py index 041a303..91d6e02 100644 --- a/test_server/crm/views.py +++ b/test_server/crm/views.py @@ -30,11 +30,10 @@ from .filters import ConsumerFilter from .exports import export_consumer from .models import Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole from .serializers import CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer -import requests from lxml import etree from rbac.models import UserProfile from django.http import Http404 - +import time appid = 'wxf1e9471c93f05ad6' secret = '4bf7f9bd6c52634586bbe792a1f0a834' sms_appid = '100172' @@ -92,6 +91,16 @@ class ConsumerPermViewSet(ModelViewSet): ordering_fields = ['create_time'] ordering = ['-create_time'] + +def getPosition(address): + url = 'http://restapi.amap.com/v3/geocode/geo' + par = {'address': address, 'key': '86e0993305a427ac2d0b5371ad97f242'} + res = requests.get(url, par) + json_data = json.loads(res.text) + if json_data['status'] == '1' and int(json_data['count']) > 0: + return json_data + return None + class CompanyViewSet(ModelViewSet): """ 客户企业:增删改查 @@ -108,7 +117,18 @@ class CompanyViewSet(ModelViewSet): ordering = ['-id'] def perform_create(self, serializer): - serializer.save(create_admin=self.request.user) + instance = serializer.save(create_admin=self.request.user) + geo = getPosition(instance.name) + if geo: + instance.geo = geo + instance.save() + + def perform_update(self, serializer): + instance = serializer.save() + geo = getPosition(instance.name) + if geo: + instance.geo = geo + instance.save() def get_queryset(self): queryset = self.queryset @@ -150,6 +170,21 @@ class CompanyViewSet(ModelViewSet): else: return Response({"error":"账号错误"}) + @action(methods=['put'], detail=False, url_name='correct_geo',perms_map=[{'*':'correct_geo'}]) + def correctgeo(self, request, *args, **kwargs): + """ + 地理位置 + """ + companys = Company.objects.exclude(geo__isnull=True).order_by('-create_time') + for i in companys: + geo = getPosition(i.name) + if geo: + i.geo = geo + i.save() + time.sleep(1) + return Response(status=status.HTTP_200_OK) + + class ConsumerViewSet(ModelViewSet): """ 学员:增删改查 @@ -374,6 +409,10 @@ class ConsumerViewSet(ModelViewSet): companyobj = Company.objects.get(name=companyname) else: companyobj = Company.objects.create(name=companyname, create_admin=request.user) + geo = getPosition(companyobj.name) + if geo: + companyobj.geo = geo + companyobj.save() workscope = sheet['d'+str(m)].value role = sheet['e'+str(m)].value if Consumer.objects.filter(username = username).exists():