# -*- coding: utf-8 -*-

from __future__ import division

import json
from collections import defaultdict
from datetime import datetime

from django.conf import settings
from django.contrib.auth.hashers import make_password
from django.db import transaction
from django.db.models import Count, Q, Sum
from django_logit import logit
from django_query import get_query_value
from django_response import response
from paginator import pagination
from pysnippets.strsnippets import strip
from TimeConvert import TimeConvert as tc

from account.models import UserInfo
from api.encrypt_views import get_ciphertext
from coupon.models import CouponInfo, UserCouponInfo
from integral.models import SaleclerkSubmitLogInfo
from kodo.decorators import check_admin
from logs.models import AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoEncryptLogInfo
from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo
from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo,
                           MemberActivityContributionWelfareInfo, MemberActivityContributionWelfareUnlockingInfo,
                           MemberActivityGroupShareInfo, MemberActivityInfo, MemberActivitySignupInfo)
from pre.custom_message import sendtemplatemessage, sendwxasubscribemessage
from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, CouponStatusCode,
                                     MemberActivityContributionStatusCode, MemberActivityContributionWelfareStatusCode,
                                     MemberActivityContributionWelfareUnblockingStatusCode, MemberActivityStatusCode,
                                     MemberGoodStatusCode, ProductCouponStatusCode, ProductMachineStatusCode,
                                     UserStatusCode)


WECHAT = settings.WECHAT


@logit
@check_admin
def querysn(request, administrator):
    model_id = request.POST.get('model_id', '')
    sn = request.POST.get('sn', '')

    if administrator.admin_type != AdministratorInfo.MAINTENANCE:
        return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)

    log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, status=True).order_by('has_used', '-pk').first()

    if not log:
        log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, status=True).order_by('-submit_during_activity', 'dupload').first()

    if not log:
        return response(ProductMachineStatusCode.SN_NOT_FOUND)

    return response(200, 'Query SN Success', u'查询序列号成功', data=log.data)


@logit
@check_admin
def queryusedsn(request, administrator):
    if administrator.admin_type != AdministratorInfo.MAINTENANCE:
        return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)

    logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, admin_id=administrator.admin_id, has_used=True, status=True).order_by('-used_at')
    logs = [log.data for log in logs]

    return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
        'logs': logs,
    })


@logit
@check_admin
@transaction.atomic
def usecoupon(request, administrator):
    model_id = request.POST.get('model_id', '')
    sn = request.POST.get('sn', '')

    if administrator.admin_type != AdministratorInfo.MAINTENANCE:
        return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)

    log = ConsumeInfoSubmitLogInfo.objects.filter(
        brand_id=administrator.brand_id,
        model_id=model_id,
        serialNo=sn,
        submit_during_activity=True,
        has_used=False,
        status=True
    ).first()
    if not log:
        return response(ProductMachineStatusCode.SN_NOT_FOUND)

    logdata = log.data
    if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
        return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)

    log.has_used = True
    log.used_at = tc.utc_datetime()
    log.save()

    return response(200, 'Use Coupon Success', u'核销优惠券成功')


@logit
@check_admin
def userinfo(request, administrator):
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    userinfos = UserInfo.objects.filter(status=True).order_by('-pk')
    count = userinfos.count()
    userinfos, left = pagination(userinfos, page, num)
    userinfos = [userinfo.admindata for userinfo in userinfos]

    return response(200, 'Userinfo Success', u'用户列表获取成功', data={
        'userinfos': userinfos,
        'count': count,
        'left': left,
    })


@logit
@check_admin
def query_usercoupons(request, administrator):
    user_id = request.POST.get('user_id', '')

    # 校验用户是否存在
    try:
        user = UserInfo.objects.get(user_id=user_id)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)

    coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')
    coupons = [coupon.admindata for coupon in coupons]

    return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
        'coupons': coupons,
    })


@logit
@check_admin
def query_usergoods(request, administrator):
    user_id = request.POST.get('user_id', '')
    dupload = request.POST.get('dupload', '')

    # 校验用户是否存在
    try:
        user = UserInfo.objects.get(user_id=user_id)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)

    logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')

    if dupload:
        logs = logs.filter(dupload=dupload)

    logs = [log.adminuserdata for log in logs]

    return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
        'logs': logs,
    })


@logit
@check_admin
def query_userinfo(request, administrator):
    query = request.POST.get('query', '')
    level = request.POST.get('level', '')
    is_member = request.POST.get('is_member', '')
    code_version = request.POST.get('code_version', 0)
    sex = request.POST.get('sex', '')
    subscribe = request.POST.get('subscribe', '')
    has_membercard = request.POST.get('has_membercard', '')
    province = request.POST.get('province', '')
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    userinfos = UserInfo.objects.filter(Q(status=True) & (Q(user_id__icontains=query) | Q(nickname__icontains=query) | Q(phone__icontains=query) | Q(memberusercardcode__icontains=query))).order_by('-pk')

    if level:
        userinfos = userinfos.filter(level=level)

    if code_version:
        userinfos = userinfos.filter(code_version=code_version)

    if subscribe:
        userinfos = userinfos.filter(subscribe=subscribe)

    if has_membercard:
        userinfos = userinfos.filter(has_membercard=has_membercard)

    if is_member:
        userinfos = userinfos.filter(level__gte=1)

    if sex:
        userinfos = userinfos.filter(sex=sex)

    if province:
        userinfos = userinfos.filter(province_name=province)

    if start_time and end_time:
        ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S')
        ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        userinfos = userinfos.filter(created_at__range=[ftime, ttime])

    count = userinfos.count()
    userinfos, left = pagination(userinfos, page, num)
    userinfos = [userinfo.admindata for userinfo in userinfos]

    return response(200, 'Userinfo Success', u'用户列表获取成功', data={
        'userinfos': userinfos,
        'count': count,
        'left': left
    })


@logit
@check_admin
@transaction.atomic
def userinfo_update(request, administrator):
    user_id = request.POST.get('user_id', '')
    integral = int(request.POST.get('integral', 0))

    # 校验用户是否存在
    try:
        user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)

    user.integral = integral
    user.save()

    return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})


# 统计
@check_admin
def statistic_userprofile(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    model_name = request.POST.get('model_name', '')

    if model_name:
        logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
    else:
        logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)

    sexs = {0: 0, 1: 0, 2: 0}
    subscribes = {0: 0, 1: 0}
    has_membercards = {0: 0, 1: 0}
    provinces = defaultdict(int)
    for log in logs:
        for user in log.users:
            try:
                user = UserInfo.objects.get(user_id=user, status=True)
            except UserInfo.DoesNotExist:
                continue

            provinces[user.province_name] += 1
            sexs[user.sex] += 1
            subscribes[user.subscribe] += 1
            has_membercards[user.has_membercard] += 1

    return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
        'provinces': provinces,
        'sexs': sexs,
        'subscribe': subscribes,
        'has_membercards': has_membercards,
    })


@check_admin
def statistic_daily(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
    user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)

    sale_logs = [log.data for log in sale_logs]
    user_logs = [log.data for log in user_logs]

    return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
        'sale_logs': sale_logs,
        'user_logs': user_logs,
    })


@check_admin
def statistic_model(request, administrator):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    admin_id = request.POST.get('admin_id', '')
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))

    logs = [{'model_name': log[0], 'num': log[1]} for log in logs]

    return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
        'logs': logs
    })


@check_admin
def statistic_distributor(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    model_name = request.POST.get('model_name', '')
    distributor_name = request.POST.get('distributor_name', '')

    daily_sql = 'select id, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '', ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')
    daily_logs = SaleclerkSubmitLogInfo.objects.raw(daily_sql)

    daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in daily_logs]

    model_logs = []
    if model_name == '':
        model_sql = 'select id, model_uni_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY model_uni_name;' % (start_time, end_time, ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')

        model_logs = SaleclerkSubmitLogInfo.objects.raw(model_sql)
        model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in model_logs]

    distributor_logs = []
    if distributor_name == '':
        distributor_sql = 'select id, distributor_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY distributor_name;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')

        distributor_logs = SaleclerkSubmitLogInfo.objects.raw(distributor_sql)
        distributor_logs = [{'distributor_name': log.distributor_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in distributor_logs]

    return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
        'daily_logs': daily_logs,
        'model_logs': model_logs,
        'distributor_logs': distributor_logs
    })


@check_admin
def dashboard(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    # 销售员统计
    sale_logs = SaleclerkSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, test_sn=False, status=True)

    sale_count = sale_logs.count()

    sale_daily_logs = list(sale_logs.values('ymd').annotate(num=Count('pk')))

    sale_model_logs = list(sale_logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]

    sale_distributor_logs = list(sale_logs.values('distributor_name').annotate(num=Count('pk')).order_by('-num'))[:10]

    # 消费者统计
    logs = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True)

    consumer_count = logs.count()

    consumer_daily_logs = list(logs.values('ymd').annotate(num=Count('pk')).order_by('ymd'))

    consumer_model_logs = list(logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]

    consumer_province_logs = list(logs.values('province').annotate(num=Count('pk')).order_by('-num'))[:10]

    return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
        'sale_daily_logs': sale_daily_logs,
        'sale_model_logs': sale_model_logs,
        'sale_distributor_logs': sale_distributor_logs,
        'consumer_daily_logs': consumer_daily_logs,
        'consumer_model_logs': consumer_model_logs,
        'consumer_province_logs': consumer_province_logs,
        'sale_count': sale_count,
        'consumer_count': consumer_count,
    })


@check_admin
def statistic_consumer(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    model_name = request.POST.get('model_name', '')

    # 消费者统计
    daily_sql = 'select id, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')

    daily_logs = ConsumeInfoSubmitLogInfo.objects.raw(daily_sql)
    daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in daily_logs]

    model_logs = []
    if model_name == '':
        model_sql = 'select id, model_uni_name, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True GROUP BY model_uni_name ORDER BY num desc;' % (start_time, end_time)

        model_logs = ConsumeInfoSubmitLogInfo.objects.raw(model_sql)
        model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in model_logs]

    province_sql = 'select id, province, Count(id) AS num, Count(code_version=1 or NULL) AS code1, Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY province ORDER BY num desc;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')

    province_logs = ConsumeInfoSubmitLogInfo.objects.raw(province_sql)
    province_logs = [{'province': log.province, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in province_logs]

    return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
        'daily_logs': daily_logs,
        'model_logs': model_logs,
        'province_logs': province_logs,
    })


@check_admin
def statistic_member(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    # 消费者统计
    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, resgister_at__range=(start_time, end_time))
    else:
        userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, status=True)

    # 关注公众号数
    mp_num = userinfos.filter(subscribe=True).count()

    # 领取保卡数
    membercard_num = userinfos.filter(has_membercard=True).count()

    # 会员级别
    level_logs = list(userinfos.values('level').annotate(num=Count('user_id')))

    # 会员积分
    integral_logs = list(userinfos.values('integral').annotate(num=Count('user_id')))

    # 镜头数
    shot_logs = list(userinfos.values('shots_num').annotate(num=Count('user_id')))

    # 性别
    sex_logs = list(userinfos.values('sex').annotate(num=Count('user_id')))

    # 省份
    province_logs = list(userinfos.values('province_name').annotate(num=Count('user_id')).order_by('-num'))

    return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
        'mp_num': mp_num,
        'membercard_num': membercard_num,
        'level_logs': level_logs,
        'integral_logs': integral_logs,
        'shot_logs': shot_logs,
        'sex_logs': sex_logs,
        'province_logs': province_logs,
    })


@check_admin
def statistic_coupon(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        coupons = UserCouponInfo.objects.filter(active_at__range=(start_time, end_time), status=True)
    else:
        coupons = UserCouponInfo.objects.filter(status=True)

    froms_logs = list(coupons.values('coupon_from').annotate(num=Count('user_coupon_id')))
    type_logs = list(coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))

    if start_time and end_time:
        used_coupons = UserCouponInfo.objects.filter(used_at__range=(start_time, end_time), status=True)
    else:
        used_coupons = UserCouponInfo.objects.filter(has_used=True, status=True)

    type_has_used_logs = list(used_coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))

    return response(200, 'Get Consumer Statistic Success', u'获取用户劵统计成功', data={
        'froms_logs': froms_logs,
        'type_logs': type_logs,
        'type_has_used_logs': type_has_used_logs,
    })


@check_admin
def record_consumer(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    query = request.POST.get('query', '')
    dupload = request.POST.get('dupload', '')
    code_version = request.POST.get('code_version', 0)
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    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('-pk')

    if dupload:
        logs = logs.filter(dupload=dupload)

    if code_version:
        logs = logs.filter(code_version=code_version)

    if start_time and end_time:
        logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Consumer Record Success', u'获取消费者销售记录成功', data={
        'logs': logs,
        'count': count,
        'left': left
    })


@check_admin
def record_consumer_batch(request, administrator):
    logs = json.loads(request.POST.get('logs', '[]'))

    infos = []
    unknows = []

    for log in logs:
        try:
            infos.append(ConsumeInfoSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], serialNo=log['code'], status=True, dupload=False).admindata)
        except ConsumeInfoSubmitLogInfo.DoesNotExist:
            unknows.append(log)

    return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
        'logs': infos,
        'unknows': unknows
    })


@check_admin
def record_sale(request, administrator):
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    query = request.POST.get('query', '')
    dupload = request.POST.get('dupload', '')
    has_scan = request.POST.get('has_scan', '')
    code_version = request.POST.get('code_version', 0)
    is_online_sale = request.POST.get('is_online_sale', '')

    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')

    if dupload:
        logs = logs.filter(dupload=dupload)

    if code_version:
        logs = logs.filter(code_version=code_version)

    if has_scan:
        logs = logs.filter(has_scan=has_scan)

    if start_time and end_time:
        logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)

    if is_online_sale:
        logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else ''))

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Sale Record Success', u'获取销售员销售记录成功', data={
        'logs': logs,
        'count': count,
        'left': left
    })


@check_admin
def record_sale_batch(request, administrator):
    logs = json.loads(request.POST.get('logs', '[]'))

    infos = []
    unknows = []

    for log in logs:
        try:
            infos.append(SaleclerkSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], code=log['code'], status=True, dupload=False).admindata)
        except SaleclerkSubmitLogInfo.DoesNotExist:
            unknows.append(log)

    return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
        'logs': infos,
        'unknows': unknows
    })


@check_admin
def model_list(request, administrator):
    infos = list(ModelInfo.objects.filter(status=True).values_list('model_uni_name', flat=True).distinct().order_by('model_uni_name'))

    return response(200, 'Get Model List Success', u'获取型号列表成功', data={
        'models': infos
    })


@check_admin
def distributor_list(request, administrator):
    infos = list(DistributorInfo.objects.filter(status=True).values_list('distributor_name', flat=True).distinct().order_by('distributor_name'))

    return response(200, 'Get Model List Success', u'获取经销商列表成功', data={
        'distributors': infos
    })


@check_admin
def member_goods_order(request, administrator):
    query = request.POST.get('query', '')
    good_type = request.POST.get('good_type', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)
    order_status = int(request.POST.get('order_status', 0))
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')

    orders = GoodsOrderInfo.objects.filter(Q(phone__icontains=query) | Q(user_id=query) | Q(title__icontains=query) & Q(status=True)).order_by('-pk')

    if good_type:
        orders = orders.filter(good_type=good_type)

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        orders = orders.filter(created_at__range=(start_time, end_time))

    # 未发货,即快递单号为空
    if order_status == 1:
        orders = orders.filter(Q(tracking_number__isnull=True) | Q(tracking_number=''))
    elif order_status == 2:
        orders = orders.filter(tracking_number__isnull=False).exclude(tracking_number='')

    count = orders.count()
    orders, left = pagination(orders, page, num)
    orders = [order.admindata for order in orders]

    return response(200, 'Get Member Goods Order List Success', u'获取会员商品订单列表成功', data={
        'orders': orders,
        'left': left,
        'count': count
    })


@check_admin
def member_goods_order_update(request, administrator):
    order_id = request.POST.get('order_id', '')
    tracking_number = request.POST.get('tracking_number', '')
    remark = request.POST.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')

    if not send_trackingNumber_message(order_id, tracking_number, remark):
        return response(400001, 'Member Goods Order Update Failure', u'会员商品订单修改失败')

    return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')


@check_admin
def member_goods_order_batch_update(request, administrator):
    orders = json.loads(request.POST.get('orders', '[]'))

    err_orders = []
    for order in orders:
        if not send_trackingNumber_message(order.get('order_id', ''), order.get('tracking_number', ''), order.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')):
            err_orders.append(order.get('order_id', ''))

    if err_orders:
        return response(40001, 'Member Goods Order Update Error', u'部分会员商品订单修改失败', data={
            'orders': err_orders
        })

    return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')


def send_trackingNumber_message(order_id, tracking_number, remark):
    try:
        order = GoodsOrderInfo.objects.get(order_id=order_id, status=True)
        order.remark = remark
        order.tracking_number = tracking_number
        if tracking_number and order.good_type == GoodsInfo.PHYSICAL and not order.has_send_template_message:
            order.has_send_template_message = True

            # 校验用户是否存在
            user = UserInfo.objects.get(user_id=order.user_id)

            data = {
                "thing6": {
                    "value": order.title,
                    "color": "#173177"
                },
                "character_string7": {
                    "value": tracking_number,
                    "color": "#173177"
                },
                "number2": {
                    "value": order.integral,
                    "color": "#173177"
                },
                "thing5": {
                    "value": order.remark,
                    "color": "#173177"
                },
            }

            res = sendwxasubscribemessage(openid=user.openid_miniapp, template_id=settings.TEMPLATE_ID_TRACKING, data=data, miniprogram_state=None, lang=None, page=None)
            order.send_template_message_res = json.dumps(res)

        order.save()

        return True
    except Exception:
        return False


@check_admin
def record_warehouse(request, administrator):
    model_name = request.POST.get('model_name', '')
    sn = request.POST.get('sn', '')
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    models = ModelInfo.objects.filter(model_name__icontains=model_name, status=True).values_list('pk', flat=True)
    logs = MchInfoEncryptLogInfo.objects.filter(model_pk__in=models, sn__icontains=sn, status=True)

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        logs = logs.filter(created_at__range=(start_time, end_time))

    logs = logs.order_by('-pk')

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Warehouse Record Success', u'获取入库记录成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
def member_activity_list(request, administrator):
    activity_type = request.POST.get('activity_type', '')
    title = request.POST.get('title', '')
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    logs = MemberActivityInfo.objects.filter(status=True)

    if activity_type:
        logs = logs.filter(activity_type=activity_type)

    if title:
        logs = logs.filter(title__icontains=title)

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        logs = logs.filter(created_at__range=(start_time, end_time))

    logs = logs.order_by('-pk')

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
def member_activity_detail(request, administrator):
    activity_id = request.POST.get('activity_id', '')

    try:
        log = MemberActivityInfo.objects.get(activity_id=activity_id)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)

    return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
        'log': log.admindetails,
    })


@check_admin
def member_activity_update(request, administrator):
    activity_id = request.POST.get('activity_id', '')
    activity_type = int(request.POST.get('activity_type', 0))
    title = request.POST.get('title', '')
    subtitle = request.POST.get('subtitle', '')
    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
    end_date = date = tc.to_date(request.POST.get('date', '') or request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
    city = request.POST.get('city', '')
    location = request.POST.get('location', '')
    integral = int(request.POST.get('integral', 0))
    is_slider = request.POST.get('is_slider', 0)
    slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
    cover_path = request.POST.get('cover_path', '')
    # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '')
    limit_image_num = int(request.POST.get('limit_image_num', 3))
    is_signup = request.POST.get('is_signup', 0)
    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
    group_share_integral = int(request.POST.get('share_integral', 0))
    content_rich_text = request.POST.get('content_rich_text', '')
    share_h5_link = request.POST.get('share_h5_link', '')
    activity_state = int(request.POST.get('activity_state', 0))
    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
    poster_content = request.POST.get('poster_content', '')

    try:
        log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)

    log.activity_type = activity_type
    log.title = title
    log.subtitle = subtitle
    log.date = date
    log.start_date = start_date
    log.end_date = end_date
    log.start_display_date = start_display_date
    log.end_display_date = end_display_date
    log.city = city
    log.location = location
    log.integral = integral
    log.is_slider = is_slider
    log.slider_image = slider_image_path
    log.cover = cover_path
    # log.image = image_path
    log.limit_image_num = limit_image_num
    log.is_signup = is_signup
    log.group_share_integral = group_share_integral
    log.group_share_max_integral = group_share_max_integral
    log.content_rich_text = content_rich_text
    log.share_h5_link = share_h5_link
    log.activity_state = activity_state
    log.poster_kv_img_url = poster_kv_img_url
    log.poster_content = poster_content
    log.save()

    return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功')


@check_admin
def member_activity_create(request, administrator):
    activity_type = int(request.POST.get('activity_type', 0))
    title = request.POST.get('title', '')
    subtitle = request.POST.get('subtitle', '')
    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
    end_date = date = tc.to_date(request.POST.get('date', '') or request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
    city = request.POST.get('city', '')
    location = request.POST.get('location', '')
    integral = int(request.POST.get('integral', 0))
    is_slider = request.POST.get('is_slider', 0)
    slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
    cover_path = request.POST.get('cover_path', '')
    # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '')
    limit_image_num = int(request.POST.get('limit_image_num', 3))
    is_signup = request.POST.get('is_signup', 0)
    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
    group_share_integral = int(request.POST.get('share_integral', 0))
    content_rich_text = request.POST.get('content_rich_text', '')
    share_h5_link = request.POST.get('share_h5_link', '')
    activity_state = int(request.POST.get('activity_state', 0))
    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
    poster_content = request.POST.get('poster_content', '')

    act = MemberActivityInfo.objects.create(
        brand_id=administrator.brand_id,
        activity_type=activity_type,
        title=title,
        subtitle=subtitle,
        date=date,
        start_date=start_date,
        end_date=end_date,
        start_display_date=start_display_date,
        end_display_date=end_display_date,
        city=city,
        location=location,
        integral=integral,
        is_slider=is_slider,
        slider_image=slider_image_path,
        cover=cover_path,
        # image=image_path,
        limit_image_num=limit_image_num,
        is_signup=is_signup,
        group_share_max_integral=group_share_max_integral,
        group_share_integral=group_share_integral,
        content_rich_text=content_rich_text,
        share_h5_link=share_h5_link,
        activity_state=activity_state,
        poster_kv_img_url=poster_kv_img_url,
        poster_content=poster_content
    )

    return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
        'activity': act.admindetails
    })


@check_admin
def member_activity_share_list(request, administrator):
    activity_id = request.POST.get('activity_id', '')
    page = int(request.POST.get('page', 1))
    num = int(request.POST.get('num', 20))

    logs = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, status=True)

    total_integral = logs.aggregate(Sum('integral'))['integral__sum']

    logs = logs.values('share_user_id').annotate(integral_sum=Sum('integral'), group_count=Count('open_gid'), user_count=Count('click_user_id')).order_by('-user_count')

    count = logs.count()
    logs, left = pagination(logs, page, num)

    return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
        'logs': list(logs),
        'count': count,
        'left': left,
        'total_integral': total_integral
    })


@check_admin
def member_activity_register_list(request, administrator):
    activity_id = request.POST.get('activity_id', '')
    page = int(request.POST.get('page', 1))
    num = int(request.POST.get('num', 20))

    logs = MemberActivitySignupInfo.objects.filter(activity_id=activity_id, status=True)

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
        'logs': list(logs),
        'count': count,
        'left': left,
    })


@check_admin
@logit
def member_activity_contribute_list(request, administrator):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    activity_id = request.POST.get('activity_id', '')
    content_type = get_query_value(request, 'content_type', val_cast_type='int')
    audit_status = request.POST.get('audit_status', '')
    is_selected = request.POST.get('is_selected', '')
    query = request.POST.get('query', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True)
    if 'content_type' in request.POST:
        contributions = contributions.filter(content_type=content_type)
    if audit_status != '':
        contributions = contributions.filter(audit_status=audit_status)
    if is_selected != '':
        contributions = contributions.filter(is_selected=is_selected)
    if query:
        contributions = contributions.filter(Q(title__icontains=query) | Q(user_name__icontains=query))

    contributions = contributions.order_by('-pk')
    count = contributions.count()
    contributions, left = pagination(contributions, page, num)
    contributions = [contribution.admindata for contribution in contributions]

    return response(data={
        'contributions': contributions,
        'left': left,
        'count': count
    })


@check_admin
@transaction.atomic
def member_activity_contribute_audit(request, administrator):
    contribution_id = request.POST.get('contribution_id', '')
    audit_status = get_query_value(request, 'audit_status', val_cast_type='int')

    try:
        contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
    except MemberActivityContributionInfo.DoesNotExist:
        return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)

    contribution.audit_status = audit_status
    contribution.save()

    return response(200, 'Member Activity Contribution Audit Success', u'会员活动投稿审批成功')


@check_admin
@transaction.atomic
def member_activity_contribute_selected(request, administrator):
    contribution_id = request.POST.get('contribution_id', '')
    selected = get_query_value(request, 'selected', val_cast_type='int')

    try:
        contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
    except MemberActivityContributionInfo.DoesNotExist:
        return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)

    contribution.is_selected = selected
    contribution.save()

    return response(200, 'Member Activity Contribution Selected Success', u'会员活动投稿入围成功')


@check_admin
def member_activity_contribute_welfare_list(request, administrator):
    welfare_type = request.POST.get('welfare_type', '')
    welfare_title = request.POST.get('welfare_title', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    welfares = MemberActivityContributionWelfareInfo.objects.filter(status=True)

    if welfare_type:
        welfares = welfares.filter(welfare_type=welfare_type)

    if welfare_title:
        welfares = welfares.filter(welfare_title__icontains=welfare_title)

    welfares = welfares.order_by('-pk')

    count = welfares.count()
    welfares, left = pagination(welfares, page, num)
    welfares = [welfare.data for welfare in welfares]

    return response(200, 'Get Member Activity Contribute Welfare List Success', u'获取会员活动投稿福利列表成功', data={
        'welfares': welfares,
        'left': left,
        'count': count
    })


@check_admin
def member_activity_contribute_welfare_detail(request, administrator):
    welfare_id = request.POST.get('welfare_id', '')

    try:
        welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id)
    except MemberActivityContributionWelfareInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)

    return response(200, 'Get Member Activity Contribute Welfare Detail Success', u'获取会员活动投稿福利详情成功', data={
        'welfare': welfare.data,
    })


@check_admin
def member_activity_contribute_welfare_update(request, administrator):
    activity_id = request.POST.get('activity_id', '')
    welfare_id = request.POST.get('welfare_id', '')
    welfare_type = int(request.POST.get('welfare_type', 0))
    welfare_title = request.POST.get('welfare_title', '')
    welfare_detail = request.POST.get('welfare_detail', '')
    welfare_value = request.POST.get('welfare_value', 0)
    welfare_image_path = request.POST.get('welfare_image_path', '')

    try:
        welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
    except MemberActivityContributionWelfareInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)

    welfare.activity_id = activity_id
    welfare.welfare_type = welfare_type
    welfare.welfare_title = welfare_title
    welfare.welfare_detail = welfare_detail
    welfare.welfare_value = welfare_value if welfare_value else 0
    welfare.welfare_image = welfare_image_path
    welfare.save()

    return response(200, 'Update Member Activity Contribute Welfare Success', u'更新会员活动投稿福利成功')


@check_admin
def member_activity_contribute_welfare_create(request, administrator):
    activity_id = request.POST.get('activity_id', '')
    welfare_type = int(request.POST.get('welfare_type', 0))
    welfare_title = request.POST.get('welfare_title', '')
    welfare_detail = request.POST.get('welfare_detail', '')
    welfare_value = request.POST.get('welfare_value', 0)
    welfare_image_path = request.POST.get('welfare_image_path', None)

    MemberActivityContributionWelfareInfo.objects.create(
        brand_id=administrator.brand_id,
        activity_id=activity_id,
        welfare_type=welfare_type,
        welfare_title=welfare_title,
        welfare_detail=welfare_detail,
        welfare_value=welfare_value if welfare_value else 0,
        welfare_image=welfare_image_path,
    )

    return response(200, 'Create Member Activity Contribute Welfare Success', u'创建会员活动投稿福利成功')


@check_admin
def member_activity_contribute_welfare_delete(request, administrator):
    welfare_id = request.POST.get('welfare_id', '')

    try:
        welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
    except MemberActivityContributionWelfareInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)

    welfare.status = False
    welfare.save()

    return response(200, 'Delete Member Activity Contribute Welfare Success', u'删除会员活动投稿福利成功')


@check_admin
def member_activity_contribute_welfare_unlock(request, administrator):
    admin_id = request.POST.get('admin_id', '')
    contribution_id = request.POST.get('contribution_id', '')
    welfare_id = request.POST.get('welfare_id', '')

    try:
        contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True)
    except MemberActivityContributionInfo.DoesNotExist:
        return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)

    try:
        welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
    except MemberActivityContributionWelfareInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)

    MemberActivityContributionWelfareUnlockingInfo.objects.create(
        brand_id=administrator.brand_id,
        admin_id=admin_id,
        user_id=contribution.user_id,
        activity_id=contribution.activity_id,
        contribution_id=contribution_id,
        welfare_id=welfare_id,
        welfare_type=welfare.welfare_type,
        welfare_value=welfare.welfare_value,
    )

    return response(200, 'Unlock Member Activity Contribute Welfare Success', u'解锁会员活动投稿福利成功')


@logit
@check_admin
def member_activity_contribute_welfare_unlocking_list(request, administrator):
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    contribution_id = request.POST.get('contribution_id', '')
    welfare_id = request.POST.get('welfare_id', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    unlockings = MemberActivityContributionWelfareUnlockingInfo.objects.filter(status=True)
    if user_id:
        unlockings = unlockings.filter(user_id=user_id)
    if activity_id:
        unlockings = unlockings.filter(activity_id=activity_id)
    if contribution_id:
        unlockings = unlockings.filter(contribution_id=contribution_id)
    if welfare_id:
        unlockings = unlockings.filter(welfare_id=welfare_id)
    unlockings = unlockings.order_by('-pk')
    count = unlockings.count()
    unlockings, left = pagination(unlockings, page, num)
    unlockings = [unlocking.data for unlocking in unlockings]

    return response(data={
        'unlockings': unlockings,
        'left': left,
        'count': count,
    })


@logit
@check_admin
def member_activity_contribute_welfare_unlocking_detail(request, administrator):
    unlocking_id = request.POST.get('unlocking_id', '')

    try:
        unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.get(unlocking_id=unlocking_id, status=True)
    except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)

    return response(data=unlocking.data)


@logit
@check_admin
@transaction.atomic
def member_activity_contribute_welfare_unlocking_update(request, administrator):
    unlocking_id = request.POST.get('unlocking_id', '')
    name = request.POST.get('name', '')
    phone = request.POST.get('phone', '')
    address = request.POST.get('address', '')
    tracking_number = request.POST.get('tracking_number', '')

    try:
        unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
    except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)

    if name:
        unlocking.name = name
    if phone:
        unlocking.phone = phone
    if address:
        unlocking.address = address
    if tracking_number:
        unlocking.tracking_number = tracking_number
    unlocking.save()

    return response(200, 'Update Member Activity Contribute Welfare Unblocking Success', u'更新会员活动投稿福利解锁成功')


@logit
@check_admin
@transaction.atomic
def member_activity_contribute_welfare_unlocking_delete(request, administrator):
    unlocking_id = request.POST.get('unlocking_id', '')

    try:
        unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
    except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
        return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)

    unlocking.status = False
    unlocking.save()

    return response(200, 'Delete Member Activity Contribute Welfare Unblocking Success', u'删除会员活动投稿福利解锁成功')


@check_admin
def coupon_list(request, administrator):
    title = request.POST.get('title', '')
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    logs = CouponInfo.objects.filter(coupon_title__icontains=title, status=True)

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        logs = logs.filter(created_at__range=(start_time, end_time))

    logs = logs.order_by('-pk')

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get CouponInfo List Success', u'获取劵列表成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
def coupon_detail(request, administrator):
    coupon_id = request.POST.get('coupon_id', '')

    try:
        log = CouponInfo.objects.get(coupon_id=coupon_id)
    except CouponInfo.DoesNotExist:
        return response(CouponStatusCode.COUPON_NOT_FOUND)

    log = log.admindetails

    return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
        'log': log,
    })


@check_admin
def coupon_create(request, administrator):
    coupon_title = request.POST.get('coupon_title', '')
    coupon_detail = request.POST.get('coupon_detail', '')
    coupon_value = int(request.POST.get('coupon_value', 0))
    coupon_image = request.POST.get('coupon_image', '')
    coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
    coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
    coupon_expire_at = request.POST.get('coupon_expire_at', '')
    is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))

    info = CouponInfo.objects.create(
        brand_id=administrator.brand_id,
        coupon_title=coupon_title,
        coupon_detail=coupon_detail,
        coupon_value=coupon_value,
        coupon_image=coupon_image,
        coupon_expire_type=coupon_expire_type,
        coupon_valid_period=coupon_valid_period,
        is_coupon_admin_writeoff=is_coupon_admin_writeoff,
    )

    if coupon_expire_at:
        info.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
        info.save()

    return response(200, 'CouponInfo Create Success', u'劵创建成功')


@check_admin
def coupon_update(request, administrator):
    coupon_id = request.POST.get('coupon_id', '')
    coupon_title = request.POST.get('coupon_title', '')
    coupon_detail = request.POST.get('coupon_detail', '')
    coupon_value = int(request.POST.get('coupon_value', 0))
    coupon_image = request.POST.get('coupon_image', '')
    coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
    coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
    coupon_expire_at = request.POST.get('coupon_expire_at', '')
    is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))

    try:
        log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
    except CouponInfo.DoesNotExist:
        return response(CouponStatusCode.COUPON_NOT_FOUND)

    log.brand_id = administrator.brand_id
    log.coupon_title = coupon_title
    log.coupon_detail = coupon_detail
    log.coupon_value = coupon_value
    log.coupon_image = coupon_image
    log.coupon_expire_type = coupon_expire_type
    log.coupon_valid_period = coupon_valid_period
    if coupon_expire_at:
        log.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
    log.is_coupon_admin_writeoff = is_coupon_admin_writeoff
    log.save()

    return response(200, 'CouponInfo Update Success', u'劵更新成功')


@check_admin
def coupon_delete(request, administrator):
    coupon_id = request.POST.get('activity_id', '')

    try:
        log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
    except CouponInfo.DoesNotExist:
        return response(CouponStatusCode.COUPON_NOT_FOUND)

    log.status = False
    log.save()

    return response(200, 'CouponInfo Delete Success', u'劵删除成功')


@check_admin
def member_goods_list(request, administrator):
    title = request.POST.get('title', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    logs = GoodsInfo.objects.filter(title__icontains=title, only_for_member=False).order_by('-pk')

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Member Goods Success', u'获取会员商品成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
def member_goods_detail(request, administrator):
    good_id = request.POST.get('good_id', '')

    try:
        log = GoodsInfo.objects.get(good_id=good_id)
    except GoodsInfo.DoesNotExist:
        return response(MemberGoodStatusCode.GOOD_NOT_FOUND)

    log = log.admindetails

    return response(200, 'Get Member Goods Details Success', u'获取积分商品详情成功', data={
        'log': log,
    })


@check_admin
def member_goods_update(request, administrator):
    good_id = request.POST.get('good_id', '')
    title = request.POST.get('title', '')
    desc = request.POST.get('desc', '')
    value = int(request.POST.get('value', 0))
    left_num = int(request.POST.get('left_num', 0))
    image = request.POST.get('image_path', '')
    coupon_id = request.POST.get('coupon_id', '')
    slider_image = request.POST.get('slider_path', '')
    integral = int(request.POST.get('integral', 0))
    fee = int(request.POST.get('fee', 0))

    try:
        log = GoodsInfo.objects.get(good_id=good_id, status=True)
    except GoodsInfo.DoesNotExist:
        return response(MemberGoodStatusCode.GOOD_NOT_FOUND)

    log.title = title
    log.desc = desc
    log.value = value
    log.left_num = left_num
    log.image = image
    log.coupon_id = coupon_id
    log.slider_image = slider_image
    log.integral = integral
    log.fee = fee
    log.save()

    return response(200, 'GoodsInfo Update Success', u'积分商品更新成功')


@check_admin
def member_goods_create(request, administrator):
    good_type = int(request.POST.get('good_type', 0))
    title = request.POST.get('title', '')
    desc = request.POST.get('desc', '')
    value = int(request.POST.get('value', 0))
    left_num = int(request.POST.get('left_num', 0))
    image = request.POST.get('image_path', '')
    coupon_id = request.POST.get('coupon_id', '')
    slider_image = request.POST.get('slider_path', '')
    integral = int(request.POST.get('integral', 0))
    fee = int(request.POST.get('fee', 0))

    GoodsInfo.objects.create(
        brand_id=administrator.brand_id,
        good_type=good_type,
        title=title,
        desc=desc,
        value=value,
        left_num=left_num,
        image=image,
        coupon_id=coupon_id,
        slider_image=slider_image,
        integral=integral,
        fee=fee,
    )

    return response(200, 'GoodsInfo Create Success', u'积分商品创建成功')


@check_admin
def complement_code_list(request, administrator):
    start_time = request.POST.get('start_time', '')
    end_time = request.POST.get('end_time', '')
    type_ = request.POST.get('type', '')
    query = request.POST.get('query', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    logs = ComplementCodeLogInfo.objects.filter(status=True)

    if start_time and end_time:
        start_time = datetime.strptime(start_time, '%Y%m%d')
        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
        logs = logs.filter(created_at__range=(start_time, end_time))

    if type_ == 'todo':
        logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_TODO)
    elif type_ == 'pass':
        logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_PASS)
    elif type_ == 'refused':
        logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_REFUSED)
    logs = logs.order_by('audit_status', '-pk')

    if query:
        logs = logs.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query))

    count = logs.count()

    logs, left = pagination(logs, page, num)
    logs = [log.data for log in logs]

    return response(200, 'Get Complement Code List Success', u'获取补码列表成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
@transaction.atomic
def complement_code_audit(request, administrator):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    admin_id = request.POST.get('admin_id', '')
    log_id = request.POST.get('log_id', '')
    audit_status = int(request.POST.get('audit_status', 0))  # -1 审核不通过, 1 审核通过

    if audit_status not in [ComplementCodeLogInfo.AUDIT_REFUSED, ComplementCodeLogInfo.AUDIT_PASS]:
        return response(ComplementCodeStatusCode.COMPLEMENT_CODE_STATUS_INVALID)

    try:
        log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
    except ComplementCodeLogInfo.DoesNotExist:
        return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)

    if log.audit_status != ComplementCodeLogInfo.AUDIT_TODO:
        return response(ComplementCodeStatusCode.COMPLEMENT_CODE_HAS_AUDITED)

    log.audit_status = audit_status
    log.save()

    # 如果"审核通过"
    if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS:
        try:
            brand = BrandInfo.objects.get(brand_id=brand_id)
        except BrandInfo.DoesNotExist:
            brand = None

        try:
            model = ModelInfo.objects.get(model_id=log.model_id)
        except ModelInfo.DoesNotExist:
            model = None

        # brand_id#model_id#distributor_id#sn#time
        # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
        # brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
        plaintext = '{}#{}#{}#{}#{}'.format(
            brand.pk if brand else 0,
            model.pk if model else 0,
            0,
            log.sn,
            tc.local_string(format='%Y%m%d')[2:],
        )
        ciphertext = get_ciphertext(plaintext, admin_id, True)

        log.ciphertext = ciphertext
        log.save()

        try:
            user = UserInfo.objects.get(user_id=log.user_id, status=True)
        except UserInfo.DoesNotExist:
            return response(UserStatusCode.USER_NOT_FOUND)

        # Send template_message
        data = {
            "first": {
                "value": u'你的补码申请已通过,请点击消息绑定您的电子保修卡',
                "color": "#173177"
            },
            "keyword1": {
                "value": log.name,
                "color": "#173177"
            },
            "keyword2": {
                "value": log.model_name,
                "color": "#173177"
            },
            "keyword3": {
                "value": log.sn,
                "color": "#173177"
            },
            "remark": {
                "value": u'感谢您的使用',
                "color": "#173177"
            }
        }

        wxcfg = WECHAT.get('MINIAPP', {})
        appid = wxcfg.get('appID')

        sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_COMPLEMENT, data=data, miniappid=appid, minipagepath='/pages/register/consumer/consumer?q={}&marketcode=1'.format(ciphertext))

        return response(data={
            'ciphertext': ciphertext,
        })

    return response()


@check_admin
@transaction.atomic
def complement_code_contacted(request, administrator):
    log_id = request.POST.get('log_id', '')
    is_contacted = int(request.POST.get('is_contacted', 0))  # 0 未联系, 1 已联系

    try:
        log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
    except ComplementCodeLogInfo.DoesNotExist:
        return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)

    log.is_contacted = is_contacted
    log.save()

    return response()


@check_admin
def administrator_list(request, administrator):
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
        return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)

    logs = AdministratorInfo.objects.filter(status=True).order_by('-created_at')

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Admin List Success', u'获取后台管理员成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })


@check_admin
def administrator_create(request, administrator):
    admin_type = request.POST.get('admin_type', '')
    phone = request.POST.get('phone', '')
    name = request.POST.get('name', '')
    password = request.POST.get('password', '')
    brand_name = request.POST.get('brand_name', '')

    if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
        return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)

    encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)

    AdministratorInfo.objects.create(
        brand_id=administrator.brand_id,
        brand_name=brand_name or administrator.brand_name,
        admin_type=admin_type,
        phone=phone,
        name=name,
        password='',
        encryption=encryption,
    )

    return response(200, 'Create Admin Success', u'创建后台管理员成功')


@check_admin
def administrator_update(request, administrator):
    target_admin_id = request.POST.get('target_admin_id', '')
    admin_type = int(request.POST.get('admin_type', -1))
    phone = request.POST.get('phone', '')
    name = request.POST.get('name', '')
    password = request.POST.get('password', '')

    if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
        return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)

    target_admin = AdministratorInfo.objects.get(admin_id=target_admin_id, status=True)

    if admin_type != -1:
        target_admin.admin_type = admin_type

    if phone:
        target_admin.phone = phone

    if name:
        target_admin.name = name
        AdministratorLoginLogInfo.objects.filter(admin_id=target_admin_id).update(admin_name=name)

    if password:
        encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
        target_admin.encryption = encryption

    target_admin.save()

    return response(200, 'Update Admin Success', u'更新后台管理员成功')


@check_admin
def administrator_delete(request, administrator):
    target_admin_id = request.POST.get('target_admin_id', '')

    if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
        return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)

    AdministratorInfo.objects.filter(admin_id=target_admin_id).update(status=False)

    return response(200, 'Delete Admin Success', u'删除后台管理员成功')


@check_admin
def administrator_login_list(request, administrator):
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)
    target_admin_id = request.POST.get('target_admin_id', '')

    if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
        return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)

    logs = AdministratorLoginLogInfo.objects.filter(status=True).order_by('-login_at')

    if target_admin_id:
        logs = logs.filter(admin_id=target_admin_id)

    count = logs.count()
    logs, left = pagination(logs, page, num)
    logs = [log.admindata for log in logs]

    return response(200, 'Get Administrator Login List Success', u'获取后台管理员登录日志成功', data={
        'logs': logs,
        'left': left,
        'count': count
    })