@@ -3,7 +3,7 @@  | 
            ||
| 3 | 3 | 
                from django.contrib import admin  | 
            
| 4 | 4 | 
                from django_admin import ChangeOnlyModelAdmin, ReadOnlyModelAdmin  | 
            
| 5 | 5 | 
                 | 
            
| 6 | 
                -from account.models import UserInfo, UserIntegralIncomeExpensesInfo  | 
            |
| 6 | 
                +from account.models import UserInfo, UserIntegralIncomeExpensesInfo, LensmanInfo  | 
            |
| 7 | 7 | 
                from mch.models import ConsumeInfoSubmitLogInfo  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                 | 
            
                @@ -19,6 +19,11 @@ class UserInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):  | 
            ||
| 19 | 19 | 
                ConsumeInfoSubmitLogInfo.objects.filter(user_id=obj.user_id).update(test_user=True)  | 
            
| 20 | 20 | 
                 | 
            
| 21 | 21 | 
                 | 
            
| 22 | 
                +class LensmanInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):  | 
            |
| 23 | 
                +    list_display = ('lensman_id', 'user_id', 'name', 'phone', 'lensman_status', 'start_date', 'end_date', 'status', 'updated_at', 'created_at')
               | 
            |
| 24 | 
                +    list_filter = ('lensman_status', 'status')
               | 
            |
| 25 | 
                +    search_fields = ('user_id', 'name', 'phone')
               | 
            |
| 26 | 
                +  | 
            |
| 22 | 27 | 
                class UserIntegralIncomeExpensesInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):  | 
            
| 23 | 28 | 
                     list_display = ('user_id', 'brand_id', 'brand_name', 'model_id', 'model_name', 'code', 'integral_from', 'integral', 'final_integral', 'remark', 'updated_at', 'created_at')
               | 
            
| 24 | 29 | 
                     list_filter = ('integral_from', 'status')
               | 
            
                @@ -26,4 +31,5 @@ class UserIntegralIncomeExpensesInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin  | 
            ||
| 26 | 31 | 
                 | 
            
| 27 | 32 | 
                 | 
            
| 28 | 33 | 
                admin.site.register(UserInfo, UserInfoAdmin)  | 
            
| 34 | 
                +admin.site.register(LensmanInfo, LensmanInfoAdmin)  | 
            |
| 29 | 35 | 
                admin.site.register(UserIntegralIncomeExpensesInfo, UserIntegralIncomeExpensesInfoAdmin)  | 
            
                @@ -0,0 +1,36 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 3.2.16 on 2024-03-05 02:42  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.db import migrations, models  | 
            |
| 5 | 
                +import shortuuidfield.fields  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('account', '0058_userinfo_tenancy_shot_permission'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.CreateModel(  | 
            |
| 16 | 
                + name='LensmanInfo',  | 
            |
| 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 | 
                +                ('lensman_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='摄影师唯一标识', max_length=22, null=True, unique=True)),
               | 
            |
| 23 | 
                +                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')),
               | 
            |
| 24 | 
                +                ('name', models.CharField(blank=True, help_text='摄影师姓名', max_length=255, null=True, verbose_name='name')),
               | 
            |
| 25 | 
                +                ('phone', models.CharField(blank=True, help_text='摄影师联系电话', max_length=11, null=True, verbose_name='phone')),
               | 
            |
| 26 | 
                +                ('lensman_status', models.IntegerField(choices=[(-1, '已拒绝'), (0, '未验证'), (1, '已激活'), (2, '已禁用')], db_index=True, default=0, help_text='摄影师状态', verbose_name='lensman_status')),
               | 
            |
| 27 | 
                +                ('start_date', models.DateField(blank=True, help_text='合作开始日期', null=True, verbose_name='start_date')),
               | 
            |
| 28 | 
                +                ('end_date', models.DateField(blank=True, help_text='合作截止日期', null=True, verbose_name='end_date')),
               | 
            |
| 29 | 
                + ],  | 
            |
| 30 | 
                +            options={
               | 
            |
| 31 | 
                + 'verbose_name': 'LensmanInfo',  | 
            |
| 32 | 
                + 'verbose_name_plural': 'LensmanInfo',  | 
            |
| 33 | 
                +                'unique_together': {('lensman_id',)},
               | 
            |
| 34 | 
                + },  | 
            |
| 35 | 
                + ),  | 
            |
| 36 | 
                + ]  | 
            
                @@ -4,6 +4,7 @@ from django.conf import settings  | 
            ||
| 4 | 4 | 
                from django.db import models  | 
            
| 5 | 5 | 
                from django.utils.translation import ugettext_lazy as _  | 
            
| 6 | 6 | 
                from django_models_ext import BaseModelMixin, SexModelMixin  | 
            
| 7 | 
                +from shortuuidfield import ShortUUIDField  | 
            |
| 7 | 8 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 8 | 9 | 
                 | 
            
| 9 | 10 | 
                from kodo.basemodels import LensmanTypeBoolMixin  | 
            
                @@ -210,6 +211,14 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 210 | 211 | 
                }  | 
            
| 211 | 212 | 
                ]  | 
            
| 212 | 213 | 
                 | 
            
| 214 | 
                + @property  | 
            |
| 215 | 
                + def lensmaninfo(self):  | 
            |
| 216 | 
                + try:  | 
            |
| 217 | 
                + lensman = LensmanInfo.objects.get(user_id=self.user_id, lensman_status=LensmanInfo.ACTIVATED)  | 
            |
| 218 | 
                + except LensmanInfo.DoesNotExist:  | 
            |
| 219 | 
                + lensman = None  | 
            |
| 220 | 
                +        return lensman.data if lensman else {}
               | 
            |
| 221 | 
                +  | 
            |
| 213 | 222 | 
                def srinfo(self, brand_id=None):  | 
            
| 214 | 223 | 
                try:  | 
            
| 215 | 224 | 
                sr = SalesResponsibilityInfo.objects.get(brand_id=brand_id, unionid=self.unionid, user_status=SalesResponsibilityInfo.ACTIVATED)  | 
            
                @@ -260,6 +269,9 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 260 | 269 | 
                'identity_card_name': self.identity_card_name,  | 
            
| 261 | 270 | 
                 | 
            
| 262 | 271 | 
                'tenancy_shot_permission': self.tenancy_shot_permission,  | 
            
| 272 | 
                + #摄影师  | 
            |
| 273 | 
                + 'is_lensman': bool(self.lensmaninfo),  | 
            |
| 274 | 
                + 'lensman_info': self.lensmaninfo,  | 
            |
| 263 | 275 | 
                }  | 
            
| 264 | 276 | 
                 | 
            
| 265 | 277 | 
                def brand_qydata(self, brand_id=None):  | 
            
                @@ -349,6 +361,64 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 349 | 361 | 
                }  | 
            
| 350 | 362 | 
                 | 
            
| 351 | 363 | 
                 | 
            
| 364 | 
                +class LensmanInfo(BaseModelMixin):  | 
            |
| 365 | 
                + REFUSED = -1  | 
            |
| 366 | 
                + UNVERIFIED = 0  | 
            |
| 367 | 
                + ACTIVATED = 1  | 
            |
| 368 | 
                + DISABLED = 2  | 
            |
| 369 | 
                +  | 
            |
| 370 | 
                + LENSMAN_STATUS = (  | 
            |
| 371 | 
                + (REFUSED, u'已拒绝'),  | 
            |
| 372 | 
                + (UNVERIFIED, u'未验证'),  | 
            |
| 373 | 
                + (ACTIVATED, u'已激活'),  | 
            |
| 374 | 
                + (DISABLED, u'已禁用'),  | 
            |
| 375 | 
                + )  | 
            |
| 376 | 
                +  | 
            |
| 377 | 
                +  | 
            |
| 378 | 
                + lensman_id = ShortUUIDField(_(u'lensman_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True, unique=True)  | 
            |
| 379 | 
                +  | 
            |
| 380 | 
                + user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)  | 
            |
| 381 | 
                +  | 
            |
| 382 | 
                + name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'摄影师姓名')  | 
            |
| 383 | 
                + phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'摄影师联系电话')  | 
            |
| 384 | 
                +  | 
            |
| 385 | 
                + lensman_status = models.IntegerField(_(u'lensman_status'), choices=LENSMAN_STATUS, default=UNVERIFIED, help_text=u'摄影师状态', db_index=True)  | 
            |
| 386 | 
                +  | 
            |
| 387 | 
                + start_date = models.DateField(_(u'start_date'), blank=True, null=True, help_text=u'合作开始日期')  | 
            |
| 388 | 
                + end_date = models.DateField(_(u'end_date'), blank=True, null=True, help_text=u'合作截止日期')  | 
            |
| 389 | 
                +  | 
            |
| 390 | 
                + class Meta:  | 
            |
| 391 | 
                + verbose_name = _(u'LensmanInfo')  | 
            |
| 392 | 
                + verbose_name_plural = _(u'LensmanInfo')  | 
            |
| 393 | 
                +  | 
            |
| 394 | 
                + unique_together = (  | 
            |
| 395 | 
                +            ('lensman_id'),
               | 
            |
| 396 | 
                + )  | 
            |
| 397 | 
                +  | 
            |
| 398 | 
                + def __unicode__(self):  | 
            |
| 399 | 
                + return '%d' % self.pk  | 
            |
| 400 | 
                +  | 
            |
| 401 | 
                + @property  | 
            |
| 402 | 
                + def data(self):  | 
            |
| 403 | 
                +        return {
               | 
            |
| 404 | 
                + 'lensman_id': self.lensman_id,  | 
            |
| 405 | 
                + 'name': self.name,  | 
            |
| 406 | 
                + 'phone': self.phone,  | 
            |
| 407 | 
                + 'lensman_status': self.lensman_status,  | 
            |
| 408 | 
                + }  | 
            |
| 409 | 
                +  | 
            |
| 410 | 
                + @property  | 
            |
| 411 | 
                + def admindata(self):  | 
            |
| 412 | 
                +        return {
               | 
            |
| 413 | 
                + 'lensman_id': self.lensman_id,  | 
            |
| 414 | 
                + 'name': self.name,  | 
            |
| 415 | 
                + 'phone': self.phone,  | 
            |
| 416 | 
                + 'lensman_status': self.lensman_status,  | 
            |
| 417 | 
                + 'start_date': self.start_date,  | 
            |
| 418 | 
                + 'end_date': self.end_date,  | 
            |
| 419 | 
                + 'created_at': tc.local_string(utc_dt=self.created_at),  | 
            |
| 420 | 
                + }  | 
            |
| 421 | 
                +  | 
            |
| 352 | 422 | 
                class UserIntegralIncomeExpensesInfo(BaseModelMixin):  | 
            
| 353 | 423 | 
                PRODUCT = 0  | 
            
| 354 | 424 | 
                SHARE = 1  | 
            
                @@ -0,0 +1,81 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from __future__ import division  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django_logit import logit  | 
            |
| 6 | 
                +from django_response import response  | 
            |
| 7 | 
                +from django.db.models import Q  | 
            |
| 8 | 
                +from paginator import pagination  | 
            |
| 9 | 
                +from TimeConvert import TimeConvert as tc  | 
            |
| 10 | 
                +  | 
            |
| 11 | 
                +from account.models import LensmanInfo  | 
            |
| 12 | 
                +from kodo.decorators import check_admin  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                +@logit  | 
            |
| 16 | 
                +@check_admin  | 
            |
| 17 | 
                +def lensman_list(request, administrator):  | 
            |
| 18 | 
                +    page = request.POST.get('page', 1)
               | 
            |
| 19 | 
                +    num = request.POST.get('num', 20)
               | 
            |
| 20 | 
                +    query = request.POST.get('query', '')
               | 
            |
| 21 | 
                +  | 
            |
| 22 | 
                +    logs = LensmanInfo.objects.filter(status=True).order_by('-pk')
               | 
            |
| 23 | 
                +  | 
            |
| 24 | 
                + if query:  | 
            |
| 25 | 
                + logs = logs.filter(Q(name__icontains=query) | Q(phone__icontains=query))  | 
            |
| 26 | 
                +  | 
            |
| 27 | 
                + count = logs.count()  | 
            |
| 28 | 
                + logs, left = pagination(logs, page, num)  | 
            |
| 29 | 
                + logs = [log.admindata for log in logs]  | 
            |
| 30 | 
                +  | 
            |
| 31 | 
                +    return response(data={
               | 
            |
| 32 | 
                + 'logs': logs,  | 
            |
| 33 | 
                + 'left': left,  | 
            |
| 34 | 
                + 'count': count,  | 
            |
| 35 | 
                + })  | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                +  | 
            |
| 38 | 
                +@logit  | 
            |
| 39 | 
                +@check_admin  | 
            |
| 40 | 
                +def lensman_audit(request, administrator):  | 
            |
| 41 | 
                +    lensman_id = request.POST.get('lensman_id', '')
               | 
            |
| 42 | 
                +    start_date = tc.to_date(request.POST.get('start_date', ''))
               | 
            |
| 43 | 
                +    end_date = tc.to_date(request.POST.get('end_date', ''))
               | 
            |
| 44 | 
                +  | 
            |
| 45 | 
                + try:  | 
            |
| 46 | 
                + lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)  | 
            |
| 47 | 
                + except LensmanInfo.DoesNotExist:  | 
            |
| 48 | 
                + return response(200, 'Lensman Not Found', u'摄影师不存在')  | 
            |
| 49 | 
                +  | 
            |
| 50 | 
                + lensman.lensman_status = LensmanInfo.ACTIVATED  | 
            |
| 51 | 
                + lensman.start_date = start_date  | 
            |
| 52 | 
                + lensman.end_date = end_date  | 
            |
| 53 | 
                +  | 
            |
| 54 | 
                + lensman.save()  | 
            |
| 55 | 
                +  | 
            |
| 56 | 
                + return response(200, 'Lensman Audit Pass Suceess', u'摄影师审核通过')  | 
            |
| 57 | 
                +  | 
            |
| 58 | 
                +  | 
            |
| 59 | 
                +@logit  | 
            |
| 60 | 
                +@check_admin  | 
            |
| 61 | 
                +def lensman_update(request, administrator):  | 
            |
| 62 | 
                +    lensman_id = request.POST.get('lensman_id', '')
               | 
            |
| 63 | 
                +    start_date = tc.to_date(request.POST.get('start_date', ''))
               | 
            |
| 64 | 
                +    end_date = tc.to_date(request.POST.get('end_date', ''))
               | 
            |
| 65 | 
                +    name = request.POST.get('name', '')
               | 
            |
| 66 | 
                +    phone = request.POST.get('phone', '')
               | 
            |
| 67 | 
                +  | 
            |
| 68 | 
                + try:  | 
            |
| 69 | 
                + lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)  | 
            |
| 70 | 
                + except LensmanInfo.DoesNotExist:  | 
            |
| 71 | 
                + return response(200, 'Lensman Not Found', u'摄影师不存在')  | 
            |
| 72 | 
                +  | 
            |
| 73 | 
                + lensman.start_date = start_date  | 
            |
| 74 | 
                + lensman.end_date = end_date  | 
            |
| 75 | 
                + lensman.name = name  | 
            |
| 76 | 
                + lensman.phone = phone  | 
            |
| 77 | 
                +  | 
            |
| 78 | 
                + lensman.save()  | 
            |
| 79 | 
                +  | 
            |
| 80 | 
                + return response(200, 'Lensman Info Update Suceess', u'摄影师信息更新成功')  | 
            |
| 81 | 
                +  | 
            
                @@ -0,0 +1,36 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from __future__ import division  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django_logit import logit  | 
            |
| 6 | 
                +from django_response import response  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +from account.models import LensmanInfo  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                +@logit  | 
            |
| 11 | 
                +def lensman_register(request):  | 
            |
| 12 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 13 | 
                +    name = request.POST.get('name', '')
               | 
            |
| 14 | 
                +    phone = request.POST.get('phone', '')
               | 
            |
| 15 | 
                +  | 
            |
| 16 | 
                +    fields = {
               | 
            |
| 17 | 
                + 'user_id': user_id,  | 
            |
| 18 | 
                + 'name': name,  | 
            |
| 19 | 
                + 'phone': phone,  | 
            |
| 20 | 
                + }  | 
            |
| 21 | 
                +  | 
            |
| 22 | 
                + lensman, _ = LensmanInfo.objects.update_or_create(user_id=user_id, defaults=fields)  | 
            |
| 23 | 
                +  | 
            |
| 24 | 
                + return response(200, 'Submit Success', u'提交成功', data=lensman.data)  | 
            |
| 25 | 
                +  | 
            |
| 26 | 
                +  | 
            |
| 27 | 
                +@logit  | 
            |
| 28 | 
                +def lensman_detail(request):  | 
            |
| 29 | 
                +  user_id = request.POST.get('user_id', '')
               | 
            |
| 30 | 
                +  | 
            |
| 31 | 
                + try:  | 
            |
| 32 | 
                + lensman = LensmanInfo.objects.get(user_id=user_id, status=True)  | 
            |
| 33 | 
                + except LensmanInfo.DoesNotExist:  | 
            |
| 34 | 
                + return response(200, 'Lensman Not Found', u'摄影师不存在')  | 
            |
| 35 | 
                +  | 
            |
| 36 | 
                + return response(200, 'Get Lensman Detail Success', u'获取摄影师信息成功', data=lensman.data)  | 
            
                @@ -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, consumer_admin_view, salesman_mp_views)  | 
            |
| 9 | 
                + wxa_views, consumer_admin_view, salesman_mp_views, lensman_mp_views, lensman_admin_views)  | 
            |
| 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  | 
            
                @@ -369,3 +369,15 @@ urlpatterns += [  | 
            ||
| 369 | 369 | 
                urlpatterns += [  | 
            
| 370 | 370 | 
                     url(r'', include(('member.urls', 'member'), namespace='member')),
               | 
            
| 371 | 371 | 
                ]  | 
            
| 372 | 
                +  | 
            |
| 373 | 
                +#摄影师模块  | 
            |
| 374 | 
                +urlpatterns += [  | 
            |
| 375 | 
                + #小程序  | 
            |
| 376 | 
                + url(r'^mp/lensman/detail$', lensman_mp_views.lensman_detail, name='mp_lensman_detail'),  | 
            |
| 377 | 
                + url(r'^mp/lensman/register$', lensman_mp_views.lensman_register, name='mp_lensman_register'),  | 
            |
| 378 | 
                +  | 
            |
| 379 | 
                + #管理后台  | 
            |
| 380 | 
                + url(r'^admin/lensman/list$', lensman_admin_views.lensman_list, name='admin_lensman_list'),  | 
            |
| 381 | 
                + url(r'^admin/lensman/audit$', lensman_admin_views.lensman_audit, name='admin_lensman_audit'),  | 
            |
| 382 | 
                + url(r'^admin/lensman/update$', lensman_admin_views.lensman_update, name='admin_lensman_update'),  | 
            |
| 383 | 
                +]  | 
            
                @@ -85,6 +85,9 @@ def activity_detail(request):  | 
            ||
| 85 | 85 | 
                def activity_signup(request):  | 
            
| 86 | 86 | 
                     brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
               | 
            
| 87 | 87 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 88 | 
                +    lensman_id = request.POST.get('lensman_id', '')
               | 
            |
| 89 | 
                +    name = request.POST.get('name', '')
               | 
            |
| 90 | 
                +    phone = request.POST.get('phone', '')
               | 
            |
| 88 | 91 | 
                     activity_id = request.POST.get('activity_id', '')
               | 
            
| 89 | 92 | 
                     fields = request.POST.get('fields', '[]')
               | 
            
| 90 | 93 | 
                 | 
            
                @@ -95,6 +98,9 @@ def activity_signup(request):  | 
            ||
| 95 | 98 | 
                 | 
            
| 96 | 99 | 
                     MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
               | 
            
| 97 | 100 | 
                'title': act.title,  | 
            
| 101 | 
                + 'lensman_id': lensman_id,  | 
            |
| 102 | 
                + 'name': name,  | 
            |
| 103 | 
                + 'phone': phone,  | 
            |
| 98 | 104 | 
                'fields': fields,  | 
            
| 99 | 105 | 
                })  | 
            
| 100 | 106 | 
                 | 
            
                @@ -0,0 +1 @@  | 
            ||
| 1 | 
                +Subproject commit ee1882e02e3c73910b1d6df86bbdce784edbb881  |