@@ -6,9 +6,10 @@ from django.conf import settings  | 
            ||
| 6 | 6 | 
                from django.db import transaction  | 
            
| 7 | 7 | 
                from django_logit import logit  | 
            
| 8 | 8 | 
                from django_response import response  | 
            
| 9 | 
                +from TimeConvert import TimeConvert as tc  | 
            |
| 9 | 10 | 
                 | 
            
| 10 | 
                -from mch.models import ConsumeInfoSubmitLogInfo  | 
            |
| 11 | 
                -from utils.error.errno_utils import ProductBrandStatusCode, ProductMachineStatusCode  | 
            |
| 11 | 
                +from mch.models import ConsumeInfoSubmitLogInfo, AdministratorInfo  | 
            |
| 12 | 
                +from utils.error.errno_utils import AdministratorStatusCode, ProductBrandStatusCode, ProductMachineStatusCode  | 
            |
| 12 | 13 | 
                 | 
            
| 13 | 14 | 
                 | 
            
| 14 | 15 | 
                WECHAT = settings.WECHAT  | 
            
                @@ -17,12 +18,16 @@ WECHAT = settings.WECHAT  | 
            ||
| 17 | 18 | 
                @logit  | 
            
| 18 | 19 | 
                def querysn(request):  | 
            
| 19 | 20 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 21 | 
                +    admin_id = request.POST.get('admin_id', '')
               | 
            |
| 20 | 22 | 
                     model_id = request.POST.get('model_id', '')
               | 
            
| 21 | 23 | 
                     sn = request.POST.get('sn', '')
               | 
            
| 22 | 24 | 
                 | 
            
| 23 | 25 | 
                if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            
| 24 | 26 | 
                return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            
| 25 | 27 | 
                 | 
            
| 28 | 
                + if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():  | 
            |
| 29 | 
                + return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)  | 
            |
| 30 | 
                +  | 
            |
| 26 | 31 | 
                     log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, has_used=False).order_by('-pk').first()
               | 
            
| 27 | 32 | 
                 | 
            
| 28 | 33 | 
                if not log:  | 
            
                @@ -35,21 +40,45 @@ def querysn(request):  | 
            ||
| 35 | 40 | 
                 | 
            
| 36 | 41 | 
                 | 
            
| 37 | 42 | 
                @logit  | 
            
| 43 | 
                +def queryusedsn(request):  | 
            |
| 44 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 45 | 
                +    admin_id = request.POST.get('admin_id', '')
               | 
            |
| 46 | 
                +  | 
            |
| 47 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 48 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 49 | 
                +  | 
            |
| 50 | 
                + if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():  | 
            |
| 51 | 
                + return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)  | 
            |
| 52 | 
                +  | 
            |
| 53 | 
                +    logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, admin_id=admin_id, has_used=True).order_by('-used_at')
               | 
            |
| 54 | 
                + logs = [log.data for log in logs]  | 
            |
| 55 | 
                +  | 
            |
| 56 | 
                +    return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
               | 
            |
| 57 | 
                + 'logs': logs,  | 
            |
| 58 | 
                + })  | 
            |
| 59 | 
                +  | 
            |
| 60 | 
                +  | 
            |
| 61 | 
                +@logit  | 
            |
| 38 | 62 | 
                @transaction.atomic  | 
            
| 39 | 63 | 
                def usecoupon(request):  | 
            
| 40 | 64 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 65 | 
                +    admin_id = request.POST.get('admin_id', '')
               | 
            |
| 41 | 66 | 
                     model_id = request.POST.get('model_id', '')
               | 
            
| 42 | 67 | 
                     sn = request.POST.get('sn', '')
               | 
            
| 43 | 68 | 
                 | 
            
| 44 | 69 | 
                if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            
| 45 | 70 | 
                return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            
| 46 | 71 | 
                 | 
            
| 72 | 
                + if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():  | 
            |
| 73 | 
                + return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)  | 
            |
| 74 | 
                +  | 
            |
| 47 | 75 | 
                try:  | 
            
| 48 | 76 | 
                log = ConsumeInfoSubmitLogInfo.objects.get(brand_id=brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, has_used=False)  | 
            
| 49 | 77 | 
                except ConsumeInfoSubmitLogInfo.DoesNotExist:  | 
            
| 50 | 78 | 
                return response(ProductMachineStatusCode.SN_NOT_FOUND)  | 
            
| 51 | 79 | 
                 | 
            
| 52 | 80 | 
                log.has_used = True  | 
            
| 81 | 
                + log.used_at = tc.utc_datetime()  | 
            |
| 53 | 82 | 
                log.save()  | 
            
| 54 | 83 | 
                 | 
            
| 55 | 84 | 
                return response(200, 'Use Coupon Success', u'核销优惠券成功')  | 
            
                @@ -277,5 +277,6 @@ urlpatterns += [  | 
            ||
| 277 | 277 | 
                 | 
            
| 278 | 278 | 
                urlpatterns += [  | 
            
| 279 | 279 | 
                url(r'^admin/querysn$', admin_views.querysn, name='querysn'),  | 
            
| 280 | 
                + url(r'^admin/queryusedsn$', admin_views.queryusedsn, name='queryusedsn'),  | 
            |
| 280 | 281 | 
                url(r'^admin/usecoupon$', admin_views.usecoupon, name='usecoupon'),  | 
            
| 281 | 282 | 
                ]  | 
            
                @@ -0,0 +1,25 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.20 on 2019-07-01 06:41  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('mch', '0035_auto_20190625_1443'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='consumeinfosubmitloginfo',  | 
            |
| 17 | 
                + name='admin_id',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u6838\u9500\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='admin_id'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AddField(  | 
            |
| 21 | 
                + model_name='consumeinfosubmitloginfo',  | 
            |
| 22 | 
                + name='used_at',  | 
            |
| 23 | 
                + field=models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u6838\u9500\u65f6\u95f4', null=True, verbose_name='used_at'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + ]  | 
            
                @@ -507,6 +507,8 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):  | 
            ||
| 507 | 507 | 
                coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间'))  | 
            
| 508 | 508 | 
                coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)'))  | 
            
| 509 | 509 | 
                has_used = models.BooleanField(_(u'has_used'), default=False, help_text=_(u'是否已核销'), db_index=True)  | 
            
| 510 | 
                + admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True)  | 
            |
| 511 | 
                + used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=_(u'维修券核销时间'))  | 
            |
| 510 | 512 | 
                 | 
            
| 511 | 513 | 
                test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'), db_index=True)  | 
            
| 512 | 514 | 
                 | 
            
                @@ -534,7 +536,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):  | 
            ||
| 534 | 536 | 
                 | 
            
| 535 | 537 | 
                @property  | 
            
| 536 | 538 | 
                def data(self):  | 
            
| 537 | 
                - if self.submit_during_activity and not self.has_used:  | 
            |
| 539 | 
                + if self.submit_during_activity:  | 
            |
| 538 | 540 | 
                try:  | 
            
| 539 | 541 | 
                act = ActivityInfo.objects.get(pk=self.activity_id)  | 
            
| 540 | 542 | 
                except ActivityInfo.DoesNotExist:  | 
            
                @@ -554,6 +556,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):  | 
            ||
| 554 | 556 | 
                'submit_during_activity': self.submit_during_activity,  | 
            
| 555 | 557 | 
                'coupon_info': act.coupon_info(created_at=self.created_at) if act else self.coupon_info,  | 
            
| 556 | 558 | 
                'has_used': self.has_used,  | 
            
| 559 | 
                + 'used_at': self.used_at,  | 
            |
| 557 | 560 | 
                }  | 
            
| 558 | 561 | 
                 | 
            
| 559 | 562 | 
                 | 
            
                @@ -82,6 +82,8 @@ class AdministratorStatusCode(BaseStatusCode):  | 
            ||
| 82 | 82 | 
                ADMINISTRATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Administrator Not Activated', description=u'管理员未激活')  | 
            
| 83 | 83 | 
                ADMINISTRATOR_HAS_DISABLED = StatusCodeField(400216, 'Administrator Has Disabled', description=u'管理员已禁用')  | 
            
| 84 | 84 | 
                ADMINISTRATOR_HAS_DELETED = StatusCodeField(400217, 'Administrator Has Deleted', description=u'管理员已删除')  | 
            
| 85 | 
                + # 管理员  | 
            |
| 86 | 
                + MAINTENANCE_NOT_FOUND = StatusCodeField(400251, 'Maintenance Not Found', description=u'核销员不存在')  | 
            |
| 85 | 87 | 
                 | 
            
| 86 | 88 | 
                 | 
            
| 87 | 89 | 
                class OperatorStatusCode(BaseStatusCode):  |