| @@ -7,7 +7,7 @@ from jsonfield import JSONField | ||
| 7 | 7 | from TimeConvert import TimeConvert as tc | 
| 8 | 8 |  | 
| 9 | 9 | from kodo.basemodels import LensmanTypeBoolMixin | 
| 10 | -from mch.models import SaleclerkInfo, MaintenancemanInfo | |
| 10 | +from mch.models import MaintenancemanInfo, SaleclerkInfo | |
| 11 | 11 | from sales.models import SalesResponsibilityInfo | 
| 12 | 12 |  | 
| 13 | 13 |  | 
| @@ -475,7 +475,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): | ||
| 475 | 475 | 'shots_num': self.shots_num, | 
| 476 | 476 | 'level': self.level, | 
| 477 | 477 | } | 
| 478 | - | |
| 478 | + | |
| 479 | 479 | def brand_qydata(self, brand_id=None): | 
| 480 | 480 | if self.phone: | 
| 481 | 481 | try: | 
| @@ -485,12 +485,12 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): | ||
| 485 | 485 |              saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {} | 
| 486 | 486 | else: | 
| 487 | 487 |              saleclerk_info = {} | 
| 488 | - | |
| 488 | + | |
| 489 | 489 | try: | 
| 490 | 490 | maintenance = MaintenancemanInfo.objects.get(brand_id=brand_id, user_id=self.user_id, status=True) | 
| 491 | - except: | |
| 491 | + except MaintenancemanInfo.DoesNotExist: | |
| 492 | 492 |              maintenance = {} | 
| 493 | - | |
| 493 | + | |
| 494 | 494 |          maintenance_info = maintenance.data if maintenance and self.is_maintenance else {} | 
| 495 | 495 |          return { | 
| 496 | 496 | 'has_unionid': bool(self.unionid), | 
| @@ -2,27 +2,22 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | -import json | |
| 6 | 5 | from collections import defaultdict | 
| 7 | 6 | from datetime import datetime | 
| 8 | -from itertools import chain, groupby | |
| 9 | 7 |  | 
| 10 | 8 | from django.conf import settings | 
| 11 | 9 | from django.db import transaction | 
| 12 | -from django.db.models import Count, Sum, Q | |
| 10 | +from django.db.models import Count, Q, Sum | |
| 13 | 11 | from django_logit import logit | 
| 14 | 12 | from django_response import response | 
| 15 | 13 | from paginator import pagination | 
| 16 | 14 | from TimeConvert import TimeConvert as tc | 
| 17 | -from django.utils.timezone import utc | |
| 18 | 15 |  | 
| 19 | 16 | from account.models import UserInfo | 
| 20 | -from integral.models import SaleclerkSubmitLogInfo | |
| 21 | -from logs.models import MchInfoEncryptLogInfo | |
| 22 | 17 | from coupon.models import UserCouponInfo | 
| 23 | -from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, ModelInfo, SaleclerkInfo | |
| 24 | -from statistic.models import (ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo, | |
| 25 | - ModelSaleStatisticInfo) | |
| 18 | +from integral.models import SaleclerkSubmitLogInfo | |
| 19 | +from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo | |
| 20 | +from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo | |
| 26 | 21 | from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode, | 
| 27 | 22 | ProductMachineStatusCode, UserStatusCode) | 
| 28 | 23 |  | 
| @@ -97,7 +92,7 @@ def usecoupon(request): | ||
| 97 | 92 | model_id=model_id, | 
| 98 | 93 | serialNo=sn, | 
| 99 | 94 | submit_during_activity=True, | 
| 100 | - has_used=False, | |
| 95 | + has_used=False, | |
| 101 | 96 | status=True | 
| 102 | 97 | ).first() | 
| 103 | 98 | if not log: | 
| @@ -168,6 +163,7 @@ def query_usercoupons(request): | ||
| 168 | 163 | 'coupons': coupons, | 
| 169 | 164 | }) | 
| 170 | 165 |  | 
| 166 | + | |
| 171 | 167 | @logit | 
| 172 | 168 | def query_usergoods(request): | 
| 173 | 169 |      brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | 
| @@ -224,22 +220,22 @@ def query_userinfo(request): | ||
| 224 | 220 |  | 
| 225 | 221 | if level: | 
| 226 | 222 | userinfos = userinfos.filter(level=level) | 
| 227 | - | |
| 223 | + | |
| 228 | 224 | if code_version: | 
| 229 | 225 | userinfos = userinfos.filter(code_version=code_version) | 
| 230 | - | |
| 226 | + | |
| 231 | 227 | if subscribe: | 
| 232 | 228 | userinfos = userinfos.filter(subscribe=subscribe) | 
| 233 | - | |
| 229 | + | |
| 234 | 230 | if has_membercard: | 
| 235 | 231 | userinfos = userinfos.filter(has_membercard=has_membercard) | 
| 236 | - | |
| 232 | + | |
| 237 | 233 | if is_member: | 
| 238 | 234 | userinfos = userinfos.filter(level__gte=1) | 
| 239 | - | |
| 235 | + | |
| 240 | 236 | if sex: | 
| 241 | 237 | userinfos = userinfos.filter(sex=sex) | 
| 242 | - | |
| 238 | + | |
| 243 | 239 | if start_time and end_time: | 
| 244 | 240 | ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S') | 
| 245 | 241 | ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') | 
| @@ -626,6 +622,7 @@ def statistic_consumer(request): | ||
| 626 | 622 | 'province_logs': province_logs, | 
| 627 | 623 | }) | 
| 628 | 624 |  | 
| 625 | + | |
| 629 | 626 | def statistic_member(request): | 
| 630 | 627 |      brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | 
| 631 | 628 |      admin_id = request.POST.get('admin_id', '') | 
| @@ -647,7 +644,7 @@ def statistic_member(request): | ||
| 647 | 644 |  | 
| 648 | 645 | for user in users: | 
| 649 | 646 |          userinfos |= UserInfo.objects.filter(user_id=user.get('user_id', '')) | 
| 650 | - | |
| 647 | + | |
| 651 | 648 | # 会员级别 | 
| 652 | 649 |      level_logs = list(userinfos.values('level').annotate(num=Count('user_id'))) | 
| 653 | 650 |  | 
| @@ -671,6 +668,7 @@ def statistic_member(request): | ||
| 671 | 668 | 'province_logs': province_logs, | 
| 672 | 669 | }) | 
| 673 | 670 |  | 
| 671 | + | |
| 674 | 672 | def record_consumer(request): | 
| 675 | 673 |      brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | 
| 676 | 674 |      page = request.POST.get('page', 1) | 
| @@ -689,15 +687,15 @@ def record_consumer(request): | ||
| 689 | 687 | administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) | 
| 690 | 688 | except AdministratorInfo.DoesNotExist: | 
| 691 | 689 | return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) | 
| 692 | - | |
| 690 | + | |
| 693 | 691 |      logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & (Q(model_name__icontains=query) | Q(phone__icontains=query) | Q(serialNo__icontains=query))).order_by('-created_at') | 
| 694 | 692 |  | 
| 695 | 693 | if dupload: | 
| 696 | 694 | logs = logs.filter(dupload=dupload) | 
| 697 | - | |
| 695 | + | |
| 698 | 696 | if code_version: | 
| 699 | 697 | logs = logs.filter(code_version=code_version) | 
| 700 | - | |
| 698 | + | |
| 701 | 699 | if start_time and end_time: | 
| 702 | 700 | logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time) | 
| 703 | 701 |  | 
| @@ -711,6 +709,7 @@ def record_consumer(request): | ||
| 711 | 709 | 'left': left | 
| 712 | 710 | }) | 
| 713 | 711 |  | 
| 712 | + | |
| 714 | 713 | def record_sale(request): | 
| 715 | 714 |      brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | 
| 716 | 715 |      admin_id = request.POST.get('admin_id', '') | 
| @@ -731,15 +730,15 @@ def record_sale(request): | ||
| 731 | 730 | administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) | 
| 732 | 731 | except AdministratorInfo.DoesNotExist: | 
| 733 | 732 | return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) | 
| 734 | - | |
| 735 | -    logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query)| Q(code__icontains=query))).order_by('-created_at') | |
| 733 | + | |
| 734 | +    logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query) | Q(code__icontains=query))).order_by('-created_at') | |
| 736 | 735 |  | 
| 737 | 736 | if dupload: | 
| 738 | 737 | logs = logs.filter(dupload=dupload) | 
| 739 | - | |
| 738 | + | |
| 740 | 739 | if code_version: | 
| 741 | 740 | logs = logs.filter(code_version=code_version) | 
| 742 | - | |
| 741 | + | |
| 743 | 742 | if has_scan: | 
| 744 | 743 | logs = logs.filter(has_scan=has_scan) | 
| 745 | 744 |  | 
| @@ -748,7 +747,6 @@ def record_sale(request): | ||
| 748 | 747 |  | 
| 749 | 748 | if is_online_sale: | 
| 750 | 749 |          logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else '')) | 
| 751 | - | |
| 752 | 750 |  | 
| 753 | 751 | count = logs.count() | 
| 754 | 752 | logs, left = pagination(logs, page, num) | 
| @@ -294,28 +294,33 @@ def consumer_info_api(request): | ||
| 294 | 294 | for act in activities: | 
| 295 | 295 | try: | 
| 296 | 296 | coupon = CouponInfo.objects.get(coupon_id=act['coupon_id']) | 
| 297 | + except CouponInfo.DoesNotExist: | |
| 298 | + continue | |
| 299 | + | |
| 300 | + try: | |
| 297 | 301 | activity = ActivityInfo.objects.get(activity_id=act['activity_id']) | 
| 298 | - UserCouponInfo.objects.create( | |
| 299 | - brand_id=coupon.brand_id, | |
| 300 | - brand_name=coupon.brand_name, | |
| 301 | - coupon_id=coupon.coupon_id, | |
| 302 | - user_id=user_id, | |
| 303 | - coupon_title=coupon.coupon_title, | |
| 304 | - coupon_detail=coupon.coupon_detail, | |
| 305 | - coupon_value=coupon.coupon_value, | |
| 306 | - coupon_image=coupon.coupon_image, | |
| 307 | - active_at=tc.utc_datetime(), | |
| 308 | - expire_at=coupon.final_expire_at, | |
| 309 | - is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff, | |
| 310 | - coupon_valid_period=coupon.coupon_valid_period, | |
| 311 | - coupon_limit_model_ids=coupon.coupon_limit_model_ids, | |
| 312 | - coupon_from='PROMOTION', | |
| 313 | - activity_id=activity.activity_id, | |
| 314 | - activity_name=activity.activity_name, | |
| 315 | - ) | |
| 316 | - except: | |
| 302 | + except ActivityInfo.DoesNotExist: | |
| 317 | 303 | continue | 
| 318 | 304 |  | 
| 305 | + UserCouponInfo.objects.create( | |
| 306 | + brand_id=coupon.brand_id, | |
| 307 | + brand_name=coupon.brand_name, | |
| 308 | + coupon_id=coupon.coupon_id, | |
| 309 | + user_id=user_id, | |
| 310 | + coupon_title=coupon.coupon_title, | |
| 311 | + coupon_detail=coupon.coupon_detail, | |
| 312 | + coupon_value=coupon.coupon_value, | |
| 313 | + coupon_image=coupon.coupon_image, | |
| 314 | + active_at=tc.utc_datetime(), | |
| 315 | + expire_at=coupon.final_expire_at, | |
| 316 | + is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff, | |
| 317 | + coupon_valid_period=coupon.coupon_valid_period, | |
| 318 | + coupon_limit_model_ids=coupon.coupon_limit_model_ids, | |
| 319 | + coupon_from='PROMOTION', | |
| 320 | + activity_id=activity.activity_id, | |
| 321 | + activity_name=activity.activity_name, | |
| 322 | + ) | |
| 323 | + | |
| 319 | 324 | # 更新销售员提交的表 | 
| 320 | 325 | SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk, status=True).update(has_scan=True) | 
| 321 | 326 |  | 
| @@ -13,7 +13,8 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui | ||
| 13 | 13 | tourguidegroupuser_views) | 
| 14 | 14 | from group import views as group_views | 
| 15 | 15 | from message import views as message_views | 
| 16 | -from miniapp import views as mini_views, qy_views | |
| 16 | +from miniapp import qy_views | |
| 17 | +from miniapp import views as mini_views | |
| 17 | 18 | from operation import views as op_views | 
| 18 | 19 | from page import oauth_views, sale_views, screen_views | 
| 19 | 20 | from pay import views as pay_views | 
| @@ -187,7 +188,7 @@ urlpatterns += [ | ||
| 187 | 188 |  | 
| 188 | 189 | url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'), # 小程序登录 | 
| 189 | 190 |  | 
| 190 | - url(r'^qy/query/userinfo$', qy_views.query_userinfo, name='query_userinfo'), # 查询用户等级及维修劵 | |
| 191 | + url(r'^qy/query/userinfo$', qy_views.query_userinfo, name='query_userinfo'), # 查询用户等级及维修劵 | |
| 191 | 192 | ] | 
| 192 | 193 |  | 
| 193 | 194 | urlpatterns += [ | 
| @@ -6,9 +6,9 @@ import os | ||
| 6 | 6 | from django_six import CompatibilityBaseCommand, close_old_connections | 
| 7 | 7 |  | 
| 8 | 8 | from integral.models import SaleclerkSubmitLogInfo | 
| 9 | +from utils.qiniucdn import upload_file_path | |
| 9 | 10 | from utils.redis.connect import r | 
| 10 | 11 | from utils.redis.rkeys import QINIU_UPLOAD_LIST | 
| 11 | -from utils.qiniucdn import upload_file_path | |
| 12 | 12 |  | 
| 13 | 13 |  | 
| 14 | 14 |  logger = logging.getLogger('console') | 
| @@ -8,11 +8,11 @@ from django_redis_connector import connector | ||
| 8 | 8 | from django_six import CompatibilityBaseCommand, close_old_connections | 
| 9 | 9 | from django_we.models import SubscribeUserInfo | 
| 10 | 10 | from pywe_storage import RedisStorage | 
| 11 | +from pywe_user import get_user_info | |
| 11 | 12 |  | 
| 12 | 13 | from account.models import UserInfo | 
| 13 | 14 | from mch.models import BrandInfo | 
| 14 | 15 | from pre.custom_message import sendcustomwxamessage | 
| 15 | -from pywe_user import get_user_info | |
| 16 | 16 | from utils.redis.rkeys import SUBSCRIBE_USERINFO_LIST | 
| 17 | 17 |  | 
| 18 | 18 |  | 
| @@ -118,7 +118,7 @@ class UserCouponInfo(BaseModelMixin): | ||
| 118 | 118 | if not self.expire_at: | 
| 119 | 119 | return False | 
| 120 | 120 | return tc.utc_datetime() > self.expire_at | 
| 121 | - | |
| 121 | + | |
| 122 | 122 | @property | 
| 123 | 123 | def coupon_source(self): | 
| 124 | 124 | if self.coupon_from == 'INTEGRAL_MALL': | 
| @@ -151,7 +151,7 @@ class UserCouponInfo(BaseModelMixin): | ||
| 151 | 151 | 'admin_id': self.admin_id, | 
| 152 | 152 | 'used_at': self.used_at | 
| 153 | 153 | } | 
| 154 | - | |
| 154 | + | |
| 155 | 155 | @property | 
| 156 | 156 | def admindata(self): | 
| 157 | 157 |          return { | 
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from django.db import models | 
| 4 | 4 | from django.utils.translation import ugettext_lazy as _ | 
| 5 | -from django_models_ext import BaseModelMixin, upload_path, upload_file_path, upload_file_url | |
| 5 | +from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path | |
| 6 | 6 | from TimeConvert import TimeConvert as tc | 
| 7 | 7 |  | 
| 8 | 8 | from mch.models import ModelInfo | 
| @@ -129,7 +129,7 @@ class SaleclerkSubmitLogInfo(BaseModelMixin): | ||
| 129 | 129 |  | 
| 130 | 130 | def __unicode__(self): | 
| 131 | 131 | return unicode(self.pk) | 
| 132 | - | |
| 132 | + | |
| 133 | 133 | @property | 
| 134 | 134 | def image_path(self): | 
| 135 | 135 | return upload_file_path(self.image) | 
| @@ -137,7 +137,7 @@ class SaleclerkSubmitLogInfo(BaseModelMixin): | ||
| 137 | 137 | @property | 
| 138 | 138 | def image_url(self): | 
| 139 | 139 | return qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.image) | 
| 140 | - | |
| 140 | + | |
| 141 | 141 | @property | 
| 142 | 142 | def code_image_path(self): | 
| 143 | 143 | return upload_file_path(self.code_image) | 
| @@ -164,4 +164,4 @@ class SaleclerkSubmitLogInfo(BaseModelMixin): | ||
| 164 | 164 | 'image': self.image_url, | 
| 165 | 165 | 'code_image': self.code_image_url, | 
| 166 | 166 | 'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d'), | 
| 167 | - } | |
| 167 | + } | 
| @@ -9,8 +9,8 @@ from django_models_ext import ProvinceShortModelMixin | ||
| 9 | 9 | from pysnippets.strsnippets import strip | 
| 10 | 10 |  | 
| 11 | 11 | from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, CameraModelInfo, ConsumeInfoSubmitLogInfo, | 
| 12 | - DistributorInfo, LatestAppInfo, LatestAppScreenInfo, ModelCameraBodyInfo, ModelInfo, | |
| 13 | - OperatorInfo, SaleclerkInfo, MaintenancemanInfo) | |
| 12 | + DistributorInfo, LatestAppInfo, LatestAppScreenInfo, MaintenancemanInfo, ModelCameraBodyInfo, | |
| 13 | + ModelInfo, OperatorInfo, SaleclerkInfo) | |
| 14 | 14 | from utils.redis.rshot import update_member_shot_data | 
| 15 | 15 |  | 
| 16 | 16 |  | 
| @@ -161,6 +161,7 @@ class SaleclerkInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmi | ||
| 161 | 161 |      search_fields = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'clerk_id', 'clerk_name', 'clerk_phone', 'unionid', 'openid') | 
| 162 | 162 |      actions_exclude = ('delete_selected', ) | 
| 163 | 163 |  | 
| 164 | + | |
| 164 | 165 | class MaintenancemanInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmin, admin.ModelAdmin): | 
| 165 | 166 |      list_display = ('brand_name', 'wx_userid', 'maintenance_id', 'maintenance_name', 'maintenance_phone', 'status', 'created_at', 'updated_at') | 
| 166 | 167 |      search_fields = ('maintenance_id', 'maintenance_name', 'maintenance_phone') | 
| @@ -252,4 +253,4 @@ admin.site.register(LatestAppInfo, LatestAppInfoAdmin) | ||
| 252 | 253 | admin.site.register(LatestAppScreenInfo, LatestAppScreenInfoAdmin) | 
| 253 | 254 | admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin) | 
| 254 | 255 | admin.site.register(ActivityInfo, ActivityInfoAdmin) | 
| 255 | -admin.site.register(MaintenancemanInfo, MaintenancemanInfoAdmin) | |
| 256 | +admin.site.register(MaintenancemanInfo, MaintenancemanInfoAdmin) | 
| @@ -478,6 +478,7 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin): | ||
| 478 | 478 |  | 
| 479 | 479 | data = admindata | 
| 480 | 480 |  | 
| 481 | + | |
| 481 | 482 | class MaintenancemanInfo(BaseModelMixin, SexModelMixin): | 
| 482 | 483 | brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | 
| 483 | 484 | brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | 
| @@ -503,12 +504,13 @@ class MaintenancemanInfo(BaseModelMixin, SexModelMixin): | ||
| 503 | 504 |  | 
| 504 | 505 | @property | 
| 505 | 506 | def data(self): | 
| 506 | -        return  { | |
| 507 | +        return { | |
| 507 | 508 | 'maintenance_id': self.maintenance_id, | 
| 508 | 509 | 'maintenance_name': self.maintenance_name, | 
| 509 | 510 | 'maintenance_phone': self.maintenance_phone, | 
| 510 | 511 | } | 
| 511 | 512 |  | 
| 513 | + | |
| 512 | 514 | class BrandModelDistributorPriceInfo(BaseModelMixin): | 
| 513 | 515 | brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | 
| 514 | 516 | brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | 
| @@ -729,7 +731,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin): | ||
| 729 | 731 | 'code_version': self.code_version, | 
| 730 | 732 | 'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d'), | 
| 731 | 733 | } | 
| 732 | - | |
| 734 | + | |
| 733 | 735 | @property | 
| 734 | 736 | def admindata(self): | 
| 735 | 737 |          return { | 
| @@ -219,7 +219,7 @@ class RightInfo(BaseModelMixin): | ||
| 219 | 219 | 'left_num': 3, | 
| 220 | 220 | 'left_tip': 3, | 
| 221 | 221 | } | 
| 222 | - | |
| 222 | + | |
| 223 | 223 | def maintaindata(self, level): | 
| 224 | 224 | right_detail = '' | 
| 225 | 225 | if level == 1: | 
| @@ -232,7 +232,7 @@ class RightInfo(BaseModelMixin): | ||
| 232 | 232 | right_detail = self.level4 if self.level4 else '' | 
| 233 | 233 | elif level == 5: | 
| 234 | 234 | right_detail = self.level5 if self.level5 else '' | 
| 235 | - | |
| 235 | + | |
| 236 | 236 | return right_detail | 
| 237 | 237 |  | 
| 238 | 238 |  | 
| @@ -1,9 +1,9 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | -import logging | |
| 4 | -import requests | |
| 5 | 3 | import json | 
| 4 | +import logging | |
| 6 | 5 |  | 
| 6 | +import requests | |
| 7 | 7 | from django.conf import settings | 
| 8 | 8 | from django.db import transaction | 
| 9 | 9 | from django_curtail_uuid import CurtailUUID | 
| @@ -16,14 +16,15 @@ from pywe_storage import RedisStorage | ||
| 16 | 16 | from TimeConvert import TimeConvert as tc | 
| 17 | 17 |  | 
| 18 | 18 | from account.models import UserInfo | 
| 19 | -from mch.models import SaleclerkInfo, DistributorInfo, MaintenancemanInfo | |
| 20 | -from statistic.models import RegisterStatisticInfo | |
| 21 | -from member.models import RightInfo | |
| 22 | 19 | from coupon.models import UserCouponInfo | 
| 20 | +from mch.models import DistributorInfo, MaintenancemanInfo, SaleclerkInfo | |
| 21 | +from member.models import RightInfo | |
| 22 | +from statistic.models import RegisterStatisticInfo | |
| 23 | 23 | from utils.error.errno_utils import ProductBrandStatusCode, ProductDistributorStatusCode, UserStatusCode | 
| 24 | 24 | from utils.redis.connect import r | 
| 25 | 25 | from utils.redis.rprofile import set_profile_info | 
| 26 | 26 |  | 
| 27 | + | |
| 27 | 28 | WECHAT = settings.WECHAT | 
| 28 | 29 |  logger = logging.getLogger('logit') | 
| 29 | 30 |  | 
| @@ -48,11 +49,11 @@ def qy_login_api(request): | ||
| 48 | 49 |  | 
| 49 | 50 | token = access_token(appid=appid, secret=secret, storage=RedisStorage(r)) | 
| 50 | 51 |  | 
| 51 | - userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token='+token+'&userid='+userid).text | |
| 52 | + userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=' + token + '&userid=' + userid).text | |
| 52 | 53 | userinfo = json.loads(userinfo) | 
| 53 | 54 |  | 
| 54 | 55 |      mobile = userinfo.get('mobile', '') | 
| 55 | - | |
| 56 | + | |
| 56 | 57 | # Get or Create User | 
| 57 | 58 | user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid) | 
| 58 | 59 |  | 
| @@ -83,14 +84,14 @@ def qy_login_api(request): | ||
| 83 | 84 |      if 122 in userinfo.get('department', []): | 
| 84 | 85 | maintenance, created = MaintenancemanInfo.objects.get_or_create(brand_id=brand_id, maintenance_phone=mobile, status=True) | 
| 85 | 86 | user.is_maintenance = True | 
| 86 | - | |
| 87 | + | |
| 87 | 88 | if created: | 
| 88 | 89 |              maintenance.maintenance_name = userinfo.get('name', '') | 
| 89 | 90 |              maintenance.maintenance_sex = userinfo.get('gender', 0) | 
| 90 | 91 | maintenance.maintenance_phone = mobile | 
| 91 | 92 | maintenance.user_id = user.user_id | 
| 92 | 93 | maintenance.wx_userid = userid | 
| 93 | - maintenance.save() | |
| 94 | + maintenance.save() | |
| 94 | 95 | else: | 
| 95 | 96 | user.is_maintenance = False | 
| 96 | 97 | # 销售员登录 | 
| @@ -99,9 +100,9 @@ def qy_login_api(request): | ||
| 99 | 100 | if created: | 
| 100 | 101 | try: | 
| 101 | 102 |                  distributor = DistributorInfo.objects.get(department_id__in=userinfo.get('department', [])) | 
| 102 | - except: | |
| 103 | + except DistributorInfo.DoesNotExist: | |
| 103 | 104 | return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) | 
| 104 | - | |
| 105 | + | |
| 105 | 106 | saleclerk.brand_id = brand_id | 
| 106 | 107 | saleclerk.distributor_id = distributor.distributor_id | 
| 107 | 108 | saleclerk.distributor_name = distributor.distributor_name | 
| @@ -113,7 +114,7 @@ def qy_login_api(request): | ||
| 113 | 114 | saleclerk.user_status = SaleclerkInfo.ACTIVATED | 
| 114 | 115 | saleclerk.is_auth = True | 
| 115 | 116 | saleclerk.save() | 
| 116 | - | |
| 117 | + | |
| 117 | 118 | user.save() | 
| 118 | 119 |  | 
| 119 | 120 | return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brand_qydata(brand_id=brand_id)) | 
| @@ -128,9 +129,9 @@ def query_userinfo(request): | ||
| 128 | 129 |  | 
| 129 | 130 | try: | 
| 130 | 131 | user = UserInfo.objects.get(memberusercardcode=memebercardcode, status=True) | 
| 131 | - except: | |
| 132 | + except UserInfo.DoesNotExist: | |
| 132 | 133 | return response(UserStatusCode.USER_NOT_FOUND) | 
| 133 | - | |
| 134 | + | |
| 134 | 135 | # 维修人工费 | 
| 135 | 136 | right = RightInfo.objects.get(right_id='X457xEV8KVxHQiTvhA7Dtf') | 
| 136 | 137 | coupons = UserCouponInfo.objects.filter(user_id=user.user_id, has_used=False, status=True) | 
| @@ -14,8 +14,8 @@ from pywe_storage import RedisStorage | ||
| 14 | 14 | from TimeConvert import TimeConvert as tc | 
| 15 | 15 |  | 
| 16 | 16 | from account.models import UserInfo | 
| 17 | -from statistic.models import RegisterStatisticInfo | |
| 18 | 17 | from mch.models import SaleclerkInfo | 
| 18 | +from statistic.models import RegisterStatisticInfo | |
| 19 | 19 | from utils.error.errno_utils import ProductBrandStatusCode, UserStatusCode | 
| 20 | 20 | from utils.redis.connect import r | 
| 21 | 21 | from utils.redis.rprofile import set_profile_info | 
| @@ -158,9 +158,10 @@ def mini_login_api(request): | ||
| 158 | 158 | # 同步销售员手机号 | 
| 159 | 159 | try: | 
| 160 | 160 | saleclerk = SaleclerkInfo.objects.get(unionid=unionid, is_auth=True, status=True) | 
| 161 | + except SaleclerkInfo.DoesNotExist: | |
| 162 | + saleclerk = None | |
| 163 | + if saleclerk: | |
| 161 | 164 | user.phone = saleclerk.clerk_phone | 
| 162 | - except: | |
| 163 | - pass | |
| 164 | 165 | user.unionid = unionid | 
| 165 | 166 | user.user_status = UserInfo.ACTIVATED | 
| 166 | 167 | user.signup_ip = client_ip(request) | 
| @@ -17,10 +17,11 @@ from account.models import UserInfo | ||
| 17 | 17 | from coupon.models import UserCouponInfo | 
| 18 | 18 | from integral.models import SaleclerkIntegralIncomeExpensesInfo, SaleclerkSubmitLogInfo | 
| 19 | 19 | from logs.models import MchInfoEncryptLogInfo | 
| 20 | -from mch.models import BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo, SaleclerkInfo, MaintenancemanInfo | |
| 20 | +from mch.models import (BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, MaintenancemanInfo, ModelInfo, | |
| 21 | + SaleclerkInfo) | |
| 22 | +from member.models import RightInfo | |
| 21 | 23 | from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo, | 
| 22 | 24 | SaleclerkSaleStatisticInfo, SaleStatisticInfo) | 
| 23 | -from member.models import RightInfo | |
| 24 | 25 | from utils.error.errno_utils import (CouponStatusCode, ProductBrandStatusCode, ProductDistributorStatusCode, | 
| 25 | 26 | ProductMachineStatusCode, ProductModelStatusCode, SaleclerkStatusCode) | 
| 26 | 27 |  | 
| @@ -454,19 +455,26 @@ def clerk_query_coupon(request): | ||
| 454 | 455 | user_coupon = UserCouponInfo.objects.get(user_coupon_id=user_coupon_id) | 
| 455 | 456 | except UserCouponInfo.DoesNotExist: | 
| 456 | 457 | return response(CouponStatusCode.COUPON_NOT_FOUND) | 
| 457 | - | |
| 458 | + | |
| 458 | 459 | right_detail = '' | 
| 459 | 460 | if is_maintenance: | 
| 460 | 461 | try: | 
| 461 | - maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True) | |
| 462 | - | |
| 463 | - # 维修人工费 | |
| 462 | + maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True) | |
| 463 | + except MaintenancemanInfo.DoesNotExist: | |
| 464 | + return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在') | |
| 465 | + | |
| 466 | + # 维修人工费 | |
| 467 | + try: | |
| 464 | 468 | right = RightInfo.objects.get(right_id='X457xEV8KVxHQiTvhA7Dtf') | 
| 465 | - member = UserInfo.objects.get(user_id=user_coupon.user_id) | |
| 469 | + except RightInfo.DoesNotExist: | |
| 470 | + return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在') | |
| 466 | 471 |  | 
| 467 | - right_detail = right.maintaindata(level=member.level) | |
| 468 | - except: | |
| 472 | + try: | |
| 473 | + member = UserInfo.objects.get(user_id=user_coupon.user_id) | |
| 474 | + except UserInfo.DoesNotExist: | |
| 469 | 475 | return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在') | 
| 476 | + | |
| 477 | + right_detail = right.maintaindata(level=member.level) | |
| 470 | 478 | else: | 
| 471 | 479 | try: | 
| 472 | 480 | clerk = SaleclerkInfo.objects.get(brand_id=brand.brand_id, clerk_phone=user.phone, status=True) | 
| @@ -503,40 +511,43 @@ def clerk_writeoff_coupon(request): | ||
| 503 | 511 | brand = BrandInfo.objects.get(brand_id=brandID) | 
| 504 | 512 | except BrandInfo.DoesNotExist: | 
| 505 | 513 | return response(ProductBrandStatusCode.BRAND_NOT_FOUND) | 
| 506 | - | |
| 514 | + | |
| 507 | 515 | try: | 
| 508 | 516 | user_coupon = UserCouponInfo.objects.get(user_coupon_id=user_coupon_id) | 
| 509 | - if user_coupon.has_used: | |
| 510 | - return response(CouponStatusCode.COUPON_HAS_USED) | |
| 511 | - elif user_coupon.is_coupon_admin_writeoff and not is_maintenance: | |
| 512 | - return response(CouponStatusCode.COUPON_PERMISSION_DENIED) | |
| 513 | - elif user_coupon.has_expired: | |
| 514 | - return response(CouponStatusCode.COUPON_EXPIRED) | |
| 515 | 517 | except UserCouponInfo.DoesNotExist: | 
| 516 | 518 | return response(CouponStatusCode.COUPON_NOT_FOUND) | 
| 517 | - | |
| 519 | + | |
| 520 | + if user_coupon.has_used: | |
| 521 | + return response(CouponStatusCode.COUPON_HAS_USED) | |
| 522 | + elif user_coupon.is_coupon_admin_writeoff and not is_maintenance: | |
| 523 | + return response(CouponStatusCode.COUPON_PERMISSION_DENIED) | |
| 524 | + elif user_coupon.has_expired: | |
| 525 | + return response(CouponStatusCode.COUPON_EXPIRED) | |
| 526 | + | |
| 518 | 527 | user_coupon.has_used = True | 
| 519 | 528 | user_coupon.used_at = tc.utc_datetime() | 
| 520 | 529 |  | 
| 521 | 530 | if is_maintenance: | 
| 522 | 531 | try: | 
| 523 | - maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True) | |
| 524 | - user_coupon.admin_id = maintenance.maintenance_id | |
| 525 | - user_coupon.admin_name = maintenance.maintenance_name | |
| 526 | - user_coupon.save() | |
| 527 | - except: | |
| 532 | + maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True) | |
| 533 | + except MaintenancemanInfo.DoesNotExist: | |
| 528 | 534 | return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在') | 
| 535 | + | |
| 536 | + user_coupon.admin_id = maintenance.maintenance_id | |
| 537 | + user_coupon.admin_name = maintenance.maintenance_name | |
| 538 | + user_coupon.save() | |
| 529 | 539 | else: | 
| 530 | 540 | try: | 
| 531 | 541 | clerk = SaleclerkInfo.objects.get(brand_id=brand.brand_id, clerk_phone=user.phone, status=True) | 
| 532 | - user_coupon.clerk_id = clerk.clerk_id | |
| 533 | - user_coupon.clerk_name = clerk.clerk_name | |
| 534 | - user_coupon.distributor_id = clerk.distributor_id | |
| 535 | - user_coupon.distributor_name = clerk.distributor_name | |
| 536 | - user_coupon.save() | |
| 537 | 542 | except SaleclerkInfo.DoesNotExist: | 
| 538 | 543 | return response(SaleclerkStatusCode.CLERK_NOT_FOUND) | 
| 539 | 544 |  | 
| 545 | + user_coupon.clerk_id = clerk.clerk_id | |
| 546 | + user_coupon.clerk_name = clerk.clerk_name | |
| 547 | + user_coupon.distributor_id = clerk.distributor_id | |
| 548 | + user_coupon.distributor_name = clerk.distributor_name | |
| 549 | + user_coupon.save() | |
| 550 | + | |
| 540 | 551 | return response(200, 'Write Off Coupon Success', u'劵核销成功') | 
| 541 | 552 |  | 
| 542 | 553 |  | 
| @@ -3,8 +3,8 @@ | ||
| 3 | 3 | from django.conf import settings | 
| 4 | 4 | from django_redis_connector import connector | 
| 5 | 5 | from pywe_storage import RedisStorage | 
| 6 | - | |
| 7 | 6 | from pywe_user import get_all_users | 
| 7 | + | |
| 8 | 8 | from utils.redis.rkeys import SUBSCRIBE_USERINFO_LIST | 
| 9 | 9 |  | 
| 10 | 10 |  |