| @@ -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( |