增加解绑功能

FFIB 2 lat temu
rodzic
commit
0a9dd97a7e

+ 38 - 0
api/consumer_admin_view.py

@@ -0,0 +1,38 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from paginator import pagination
6
+
7
+from django.db import transaction
8
+from django.db.models import Q
9
+from django_logit import logit
10
+
11
+from kodo.decorators import check_admin
12
+from mch.models import AdministratorInfo, ConsumeShotUnbindingInfo
13
+
14
+
15
+@logit
16
+@check_admin
17
+def consumer_shot_unbinding_list(request, administrator):
18
+    start_time = request.POST.get('start_time', '')
19
+    end_time = request.POST.get('end_time', '')
20
+    query = request.POST.get('query', '')
21
+
22
+    unbindings = ConsumeShotUnbindingInfo.objects.filter(Q(phone__icontains=query) | Q(sn__icontains=query), status=True)
23
+
24
+    if start_time and end_time:
25
+        start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d')
26
+        end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S')
27
+        unbindings = unbindings.filter(created_at__range=(start_time, end_time))
28
+
29
+    count = unbindings.count()
30
+
31
+    unbindings, left = pagination(unbindings, page, num)
32
+    unbindings = [unbinding.admindata for unbinding in unbindings]
33
+
34
+    return response(200, 'Get Cosumer Shot Unbinding List Success', u'用户列表获取成功', data={
35
+        'unbinding': userinfos,
36
+        'count': count,
37
+        'left': left
38
+    })

+ 29 - 1
api/mch_views.py

@@ -19,7 +19,7 @@ from coupon.models import CouponInfo, UserCouponInfo
19 19
 from integral.models import SaleclerkSubmitLogInfo
20 20
 from logs.models import AdministratorLoginLogInfo, MchInfoEncryptLogInfo
21 21
 from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo,
22
-                        LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo)
22
+                        LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo, ConsumeShotUnbindingInfo)
23 23
 from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
24 24
 from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode,
25 25
                                      ProductModelStatusCode, UserStatusCode)
@@ -521,3 +521,31 @@ def consumer_model_list(request):
521 521
     return response(200, 'Get Model List Success', u'获取型号列表成功', {
522 522
         'models': models,
523 523
     })
524
+
525
+
526
+@logit(res=True)
527
+@transaction.atomic
528
+def consumer_shot_unbinding(request):
529
+    user_id = request.POST.get('user_id', '')
530
+    submit_pk = request.POST.get('id', '')
531
+    submit_at = request.POST.get('created_at', '')
532
+    model_id = request.POST.get('model_id', '')
533
+    sn = request.POST.get('serialNo', '')
534
+    reason = request.POST.get('reason', '')
535
+
536
+    # 校验用户是否存在
537
+    try:
538
+        user = UserInfo.objects.get(user_id=user_id)
539
+    except UserInfo.DoesNotExist:
540
+        return response(UserStatusCode.USER_NOT_FOUND)
541
+
542
+    ConsumeShotUnbindingInfo.objects.update_or_create(user_id=user_id, submit_pk=submit_pk, defaults={
543
+        'model_id': model_id,
544
+        'sn': sn,
545
+        'submit_at': submit_at,
546
+        'reason': reason,
547
+    })
548
+    
549
+    return response(200, 'Consume Shot Unbinding Success', u'消费者镜头解绑成功')
550
+    
551
+    

+ 4 - 2
api/urls.py

@@ -6,7 +6,7 @@ from django_file_upload import views as file_views
6 6
 from api import (admin_views, clerk_views, complement_views, distributor_views, encrypt_views, express_views, log_views,
7 7
                  maintenance_point_views, maintenance_views, mch_views, member_views, model_views, operator_views,
8 8
                  refresh_views, sr_views, staff_views, tenancy_admin_views, tenancy_views, tencentcloud_views, wx_views,
9
-                 wxa_views)
9
+                 wxa_views, consumer_admin_view)
10 10
 from miniapp import qy_views
11 11
 from miniapp import views as mini_views
12 12
 from page import oauth_views, sale_views, screen_views
@@ -58,7 +58,8 @@ urlpatterns += [
58 58
     url(r'^consumer_phone$', mch_views.consumer_phone_api, name='consumer_phone_api'),
59 59
     url(r'^consumer_info$', mch_views.consumer_info_api, name='consumer_info_api'),
60 60
     url(r'^consumer_snlist$', mch_views.consumer_snlist_api, name='consumer_snlist_api'),
61
-    url(r'^consumer_model_list$', mch_views.consumer_model_list, name='consumer_model_list')
61
+    url(r'^consumer_model_list$', mch_views.consumer_model_list, name='consumer_model_list'),
62
+    url(r'^consumer/shot/unbinding$', mch_views.consumer_shot_unbinding, name='consumer_shot_unbinding'),
62 63
 ]
63 64
 
64 65
 urlpatterns += [
@@ -159,6 +160,7 @@ urlpatterns += [
159 160
     url(r'^admin/record/sale$', admin_views.record_sale, name='record_sale'),
160 161
     url(r'^admin/record/sale/batch$', admin_views.record_sale_batch, name='record_sale_batch'),
161 162
     url(r'^admin/record/warehouse$', admin_views.record_warehouse, name='record_warehouse'),
163
+    url(r'^admin/consumer/shot/unbinding/list$', consumer_admin_view.consumer_shot_unbinding_list, name='consumer_shot_unbinding_list'),
162 164
 
163 165
     url(r'^admin/list/model$', admin_views.model_list, name='model_list'),
164 166
     url(r'^admin/list/distributor$', admin_views.distributor_list, name='distributor_list'),

+ 37 - 0
mch/migrations/0067_consumeshotunbindinginfo.py

@@ -0,0 +1,37 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.6 on 2023-03-01 07:25
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('mch', '0066_auto_20230208_1344'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='ConsumeShotUnbindingInfo',
17
+            fields=[
18
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
20
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
21
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
22
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='品牌唯一标识', max_length=32, null=True, verbose_name='brand_id')),
23
+                ('brand_name', models.CharField(blank=True, help_text='品牌名称', max_length=255, null=True, verbose_name='brand_name')),
24
+                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')),
25
+                ('submit_pk', models.IntegerField(blank=True, default=0, help_text='消费者提交ID', null=True, verbose_name='submit_pk')),
26
+                ('submit_at', models.DateTimeField(blank=True, help_text='消费者提交时间', null=True, verbose_name='submit_at')),
27
+                ('model_id', models.CharField(blank=True, db_index=True, help_text='型号唯一标识', max_length=32, null=True, verbose_name='model_id')),
28
+                ('sn', models.CharField(blank=True, db_index=True, help_text='序列号', max_length=16, null=True, verbose_name='sn')),
29
+                ('reason', models.CharField(blank=True, db_index=True, help_text='解绑理由', max_length=256, null=True, verbose_name='model_id')),
30
+            ],
31
+            options={
32
+                'verbose_name': '消费者镜头解绑记录',
33
+                'verbose_name_plural': '消费者镜头解绑记录',
34
+                'unique_together': {('user_id', 'submit_pk')},
35
+            },
36
+        ),
37
+    ]

+ 20 - 0
mch/migrations/0068_alter_consumeshotunbindinginfo_reason.py

@@ -0,0 +1,20 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.6 on 2023-03-01 10:21
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('mch', '0067_consumeshotunbindinginfo'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AlterField(
16
+            model_name='consumeshotunbindinginfo',
17
+            name='reason',
18
+            field=models.CharField(blank=True, db_index=True, help_text='解绑理由', max_length=256, null=True, verbose_name='reason'),
19
+        ),
20
+    ]

+ 40 - 0
mch/models.py

@@ -9,6 +9,7 @@ from jsonfield import JSONField
9 9
 from shortuuidfield import ShortUUIDField
10 10
 from TimeConvert import TimeConvert as tc
11 11
 
12
+from kodo.basemodels import BrandInfoMixin
12 13
 from coupon.models import CouponInfo
13 14
 
14 15
 
@@ -770,6 +771,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):
770 771
             'final_coupon_info': act.coupon_info(created_at=self.created_at) if act else self.coupon_info,
771 772
             'has_used': self.has_used,
772 773
             'used_at': self.used_at,
774
+            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M'),
773 775
         }
774 776
 
775 777
     @property
@@ -800,6 +802,44 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):
800 802
         }
801 803
 
802 804
 
805
+class ConsumeShotUnbindingInfo(BaseModelMixin, BrandInfoMixin):
806
+    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
807
+    submit_pk = models.IntegerField(_(u'submit_pk'), default=0, blank=True, null=True, help_text=u'消费者提交ID')
808
+    submit_at = models.DateTimeField(_(u'submit_at'), blank=True, null=True, help_text=u'消费者提交时间')
809
+    model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True)
810
+    sn = models.CharField(_(u'sn'), max_length=16, blank=True, null=True, help_text=u'序列号', db_index=True)
811
+    reason = models.CharField(_(u'reason'), max_length=256, blank=True, null=True, help_text=u'解绑理由', db_index=True)
812
+
813
+    class Meta:
814
+        verbose_name = _(u'消费者镜头解绑记录')
815
+        verbose_name_plural = _(u'消费者镜头解绑记录')
816
+
817
+        unique_together = (
818
+            ('user_id', 'submit_pk'),
819
+        )
820
+
821
+    def __unicode__(self):
822
+        return '%d' % self.pk
823
+
824
+    @property
825
+    def admindata(self):
826
+        from account.models import UserInfo
827
+
828
+        info = ModelInfo.objects.get(model_id=self.model_id).fulldata
829
+        user = UserInfo.objects.get(user_id=self.user_id)
830
+
831
+        return {
832
+            'user_id': self.user_id,
833
+            'phone': user.phone,
834
+            'model_info': model_info,
835
+            'sn': self.sn,
836
+            'reason': self.reason,
837
+            'submit_pk': self.submit_pk,
838
+            'submit_at': self.submit_at,
839
+            'created_at': self.created_at,
840
+        }
841
+
842
+
803 843
 class ActivityInfo(BaseModelMixin):
804 844
     FIXED_EXPIRED_TIME = 0
805 845
     CHANGED_EXPIRED_TIME = 1