@@ -331,6 +331,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
331 | 331 |
province = models.CharField(_(u'province'), max_length=255, blank=True, null=True, help_text=u'用户省份') |
332 | 332 |
city = models.CharField(_(u'city'), max_length=255, blank=True, null=True, help_text=u'用户城市') |
333 | 333 |
location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址') |
334 |
+ province_code = models.CharField(_(u'province_code'), max_length=255, blank=True, null=True, help_text=u'用户省份编码') |
|
334 | 335 |
|
335 | 336 |
# 用户身份 |
336 | 337 |
islensman = models.BooleanField(_(u'islensman'), default=False, help_text=_(u'摄影师?'), db_index=True) |
@@ -473,6 +474,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
473 | 474 |
'sex': self.sex, |
474 | 475 |
'province': self.province, |
475 | 476 |
'city': self.city, |
477 |
+ 'province_code': self.province_code, |
|
476 | 478 |
'subscribe': self.subscribe, |
477 | 479 |
'membercardid': self.membercardid, |
478 | 480 |
'memberusercardcode': self.memberusercardcode, |
@@ -8,13 +8,18 @@ from django_logit import logit |
||
8 | 8 |
from django_response import response |
9 | 9 |
from paginator import pagination |
10 | 10 |
from TimeConvert import TimeConvert as tc |
11 |
+from django.utils import timezone |
|
11 | 12 |
|
12 |
-from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo |
|
13 |
+from mch.models import AdministratorInfo |
|
14 |
+from statistic.models import ConsumeModelSaleStatisticInfo |
|
13 | 15 |
from account.models import UserInfo |
14 | 16 |
from integral.models import SaleclerkSubmitLogInfo |
15 | 17 |
from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode, |
16 | 18 |
ProductMachineStatusCode) |
17 | 19 |
|
20 |
+from collections import defaultdict |
|
21 |
+import json |
|
22 |
+ |
|
18 | 23 |
|
19 | 24 |
WECHAT = settings.WECHAT |
20 | 25 |
|
@@ -200,4 +205,44 @@ def userinfo_update(request): |
||
200 | 205 |
|
201 | 206 |
user.save() |
202 | 207 |
|
203 |
- return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={}) |
|
208 |
+ return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={}) |
|
209 |
+ |
|
210 |
+ |
|
211 |
+# #统计 |
|
212 |
+def statistic_userprofile(request): |
|
213 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
|
214 |
+ admin_id = request.POST.get('admin_id', '') |
|
215 |
+ start_time = request.POST.get('start_time', '') |
|
216 |
+ end_time = request.POST.get('end_time', '') |
|
217 |
+ model_uni_name = request.POST.get('model_uni_name', '') |
|
218 |
+ |
|
219 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
220 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
221 |
+ |
|
222 |
+ try: |
|
223 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
224 |
+ except AdministratorInfo.DoesNotExist: |
|
225 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
226 |
+ |
|
227 |
+ if model_uni_name: |
|
228 |
+ logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_uni_name, ymd__gte=start_time, ymd__lte=end_time) |
|
229 |
+ else: |
|
230 |
+ logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time) |
|
231 |
+ |
|
232 |
+ sexs = {0: 0, 1: 0, 2: 0} |
|
233 |
+ provinces = defaultdict(int) |
|
234 |
+ for log in logs: |
|
235 |
+ for user in log.users: |
|
236 |
+ try: |
|
237 |
+ user = UserInfo.objects.get(user_id=user, status=True) |
|
238 |
+ except UserInfo.DoesNotExist: |
|
239 |
+ continue |
|
240 |
+ |
|
241 |
+ provinces[user.province_code] += 1 |
|
242 |
+ sexs[user.sex] += 1 |
|
243 |
+ |
|
244 |
+ return response(200, 'Get User Profile Success', u'获取用户画像成功', data={ |
|
245 |
+ 'provinces': provinces, |
|
246 |
+ 'sexs': sexs, |
|
247 |
+ }) |
|
248 |
+ |
@@ -293,6 +293,9 @@ urlpatterns += [ |
||
293 | 293 |
url(r'^admin/query_usergoods$', admin_views.query_usergoods, name='query_usergoods'), |
294 | 294 |
url(r'^admin/query_userinfo$', admin_views.query_userinfo, name='query_userinfo'), |
295 | 295 |
url(r'^admin/userinfo_update$', admin_views.userinfo_update, name='userinfo_update'), |
296 |
+ |
|
297 |
+ #statistic |
|
298 |
+ url(r'^admin/statistic/user_profile$', admin_views.statistic_userprofile, name='statistic_userprofile'), |
|
296 | 299 |
] |
297 | 300 |
|
298 | 301 |
urlpatterns += [ |
@@ -10,6 +10,7 @@ from django_models_ext import ProvinceModelMixin, ProvinceShortModelMixin |
||
10 | 10 |
from django_six import CompatibilityBaseCommand, close_old_connections |
11 | 11 |
|
12 | 12 |
from statistic.models import ConsumeProvinceSaleStatisticInfo |
13 |
+from account.models import UserInfo |
|
13 | 14 |
from utils.redis.connect import r |
14 | 15 |
from utils.redis.rkeys import MINI_PROGRAM_GIS_LIST |
15 | 16 |
|
@@ -68,6 +69,12 @@ class Command(CompatibilityBaseCommand): |
||
68 | 69 |
user_id = v.get('user_id', '') |
69 | 70 |
ymd = v.get('ymd', '') |
70 | 71 |
|
72 |
+ #更新用户表 |
|
73 |
+ user = UserInfo.objects.get(user_id=user_id, status=True) |
|
74 |
+ user.province_code = province_code |
|
75 |
+ user.save() |
|
76 |
+ |
|
77 |
+ |
|
71 | 78 |
# [消费者维度]省份销量统计 |
72 | 79 |
# 日 |
73 | 80 |
cpssi, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create( |