@@ -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 |
+ }) |
@@ -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 |
+ |
@@ -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'), |
@@ -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 |
+ ] |
@@ -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 |
+ ] |
@@ -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 |