|
# -*- coding: utf-8 -*-
import logging
import requests
import json
from django.core.paginator import Paginator
from django.contrib.auth.hashers import check_password
from django.db import transaction
from django.db.models import Q
from django_logit import logit
from django_response import response
from django.core.files import File
from TimeConvert import TimeConvert as tc
from django.conf import settings
from pywe_token import access_token
from pywe_storage import RedisStorage
from account.models import AdministratorInfo, UserInfo
from goods.models import GoodsInfo, PackInfo
from kol.models import KOLInfo
from pay.models import OrderInfo
from live.models import RoomInfo, RoomGoodsInfo, RoomOrderInfo, AnchorInfo, liveGoodsInfo
from utils.error.errno_utils import AdministratorStatusCode, OrderStatusCode
from utils.redis.connect import r
logger = logging.getLogger('logit')
WECHAT = settings.WECHAT
@logit(res=True)
def login(request):
name = request.POST.get('name', '')
password = request.POST.get('password', '')
try:
administrator = AdministratorInfo.objects.get(name=name, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
if administrator.user_status == AdministratorInfo.DISABLED:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED)
elif administrator.user_status == AdministratorInfo.DELETED:
return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED)
if not check_password(password, administrator.encryption):
return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR)
request.session['admin_id'] = administrator.admin_id
return response(200, 'Admin Login Success', '管理员登录成功', data={
'admin_id': administrator.admin_id,
'admin_type': administrator.admin_type,
})
@logit(res=True)
def order_list(request):
admin_id = request.POST.get('admin_id', '')
kol_id = request.POST.get('kol_id', '')
pack_id = request.POST.get('pack_id', '')
ftime = request.POST.get('ftime', '')
ttime = request.POST.get('ttime', '')
query = request.POST.get('query', '')
page = request.POST.get('page', 0)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
infos = OrderInfo.objects.filter(
Q(phone__contains=query) | Q(name__contains=query) & Q(kol_id__contains=kol_id) & Q(
pack_id__contains=pack_id) & Q(pay_status=1)).order_by('-paid_at')
res = []
for info in infos:
goods_info = []
try:
pack = PackInfo.objects.get(pack_id=info.pack_id)
except PackInfo.DoesNotExist:
continue
try:
kol = KOLInfo.objects.get(kol_id=info.kol_id)
except KOLInfo.DoesNotExist:
continue
for g in info.goods_info:
try:
goods = GoodsInfo.objects.get(good_id=g.get('good_id', ''))
except GoodsInfo.DoesNotExist:
continue
goods_info.append({
'title': goods.title,
'num': g.get('num', 0)
})
res.append({
'name': info.name,
'phone': info.phone,
'address': info.address,
'paid_at': tc.local_string(utc_dt=info.paid_at, format='%Y-%m-%d %H:%M'),
'order_id': info.order_id,
'transaction_id': info.transaction_id,
'tracking_number': info.tracking_number,
'goods_info': goods_info,
'kol_name': kol.name,
'pack_title': pack.title
})
return response(200, 'Order List Success', '获取订单列表成功', {
'orders': res
})
@logit(res=True)
@transaction.atomic
def order_update(request):
admin_id = request.POST.get('admin_id', '')
order_id = request.POST.get('order_id', '')
tracking_number = request.POST.get('tracking_number', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
try:
order = OrderInfo.objects.get(order_id=order_id)
except OrderInfo.DoesNotExist:
return response(OrderStatusCode.ORDER_NOT_FOUND)
order.tracking_number = tracking_number
order.save()
return response(200, 'Order Update Success', '订单更新成功')
@logit(res=True)
def live_goods_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
goods_list = liveGoodsInfo.objects.filter(status=True).order_by('-created_at')
count = goods_list.count()
goods_list = Paginator(goods_list, num).get_page(page)
goods_list = [goods.admindata for goods in goods_list]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'goods_list': goods_list,
'count': count,
})
@logit(res=True)
def live_goods_create(request):
admin_id = request.POST.get('admin_id', '')
goods_name = request.POST.get('goods_name', '')
goods_img = request.POST.get('goods_img', '')
price_type = int(request.POST.get('price_type', 1))
price = int(request.POST.get('price', 0))
price2 = int(request.POST.get('price2', 0))
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
media = requests.post(url=('https://api.weixin.qq.com/cgi-bin/media/upload?access_token=' + token + '&type=image'), files={'media': open(settings.MEDIA_ROOT + '/' + goods_img, 'rb')}).text
media_id = json.loads(media).get('media_id', '')
if media_id == '':
return response()
goods_info, _ = liveGoodsInfo.objects.get_or_create(
name=goods_name,
coverImgUrl=media_id,
price_type=price_type,
price=price,
price2=price2,
goods_img=goods_img
)
data ={
"goodsInfo": {
'name': goods_name,
'coverImgUrl': media_id,
'priceType': price_type,
'price': price,
'price2': price2,
'url': 'pages/live/order/order?goods_id=' + goods_info.goods_id,
}
}
wx_goods = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=' + token), json=data).text
wx_goods = json.loads(wx_goods)
goods_info.wx_goods_id = wx_goods.get('goodsId', '')
goods_info.audit_id = wx_goods.get('auditId', '')
goods_info.url = 'pages/live/order/order?goods_id=' + goods_info.goods_id,
goods_info.save()
return response(200, 'Live Goods Create Success', u'直播商品库创建成功', data={
'goods': goods_info.admindata,
})
@logit(res=True)
def live_goods_audit(request):
admin_id = request.POST.get('admin_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
goods_infos = liveGoodsInfo.objects.exclude(audit_status=2)
wx_goods_ids = [goods.wx_goods_id for goods in goods_infos]
data = {
"goods_ids": wx_goods_ids
}
wx_goods_infos = requests.post(url=('https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=' + token), json=data).text
wx_goods_infos = json.loads(wx_goods_infos).get('goods', [])
for goods in wx_goods_infos:
g = liveGoodsInfo.objects.get(wx_goods_id=goods.get('goods_id', ''), status=True)
g.audit_status = goods.get('audit_status', 0)
g.save()
return response(200, 'Live Goods Audit Success', '获取直播商品库审核状态成功')
@logit(res=True)
def live_goods_delete(request):
admin_id = request.POST.get('admin_id', '')
goods_id = request.POST.get('goods_id', '')
wx_goods_id = request.POST.get('wx_goods_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=' + token), json={ 'goodsId': wx_goods_id}).text
errcode = json.loads(status).get('errcode', -1)
if errcode != 0:
return response()
try:
liveGoodsInfo.objects.filter(goods_id=goods_id, status=True).update(status=False)
except:
return response()
return response(200, 'Live Goods Delete Success', '直播商品库删除成功')
@logit(res=True)
def live_room_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
live_status = request.POST.get('live_status', 0)
query = request.POST.get('query', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
rooms = RoomInfo.objects.filter(name__contains=query, status=True).order_by('-created_at')
if live_status:
rooms = rooms.filter(live_status=live_status)
count = rooms.count()
rooms = Paginator(rooms, num).get_page(page)
rooms = [room.admindata for room in rooms]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'rooms': rooms,
'count': count,
})
@logit(res=True)
def live_order_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
pay_status = request.POST.get('pay_status', '')
query = request.POST.get('query', '')
goods_name = request.POST.get('goods_name', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
orders = RoomOrderInfo.objects.filter(Q(name__contains=query) | Q(phone__contains=query)).order_by('-created_at')
if pay_status:
orders = orders.filter(pay_status=pay_status)
if goods_name:
goods_infos = liveGoodsInfo.objects.filter(goods_name__contains=goods_name)
goods_infos = [info.goods_id for info in goods_infos]
orders = orders.filter(goods_id__in=goods_infos)
count = orders.count()
orders = Paginator(orders, num).get_page(page)
orders = [order.admindata for order in orders]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'orders': orders,
'count': count,
})
@logit(res=True)
def live_order_delivery(request):
admin_id = request.POST.get('admin_id', '')
order_id = request.POST.get('order_id', '')
user_id = request.POST.get('user_id', '')
delivery_id = request.POST.get('delivery_id', '')
biz_id = request.POST.get('biz_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
user = UserInfo.objects.get(user_id=user_id, status=True)
order = RoomOrderInfo.objects.get(order_id=order_id, status=True)
goods = liveGoodsInfo.objects.get(goods_id=order.goods_id, status=True)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
data = {
'add_source': 0,
'order_id': order_id,
'openid': user.openid,
'delivery_id': delivery_id,
'biz_id': biz_id,
'custom_remark': goods.name + ' x' + str(order.amount),
'sender': {
'name': '孔令朋',
'tel': '15117949737',
'company': '',
'province': '北京市',
'city': '北京市',
'area': '海淀区',
'address': '四季青路8号郦城工作区地下一层1号门',
},
'receiver': {
'name': order.name,
'tel': order.phone,
'company': '',
'province': order.province,
'city': order.city,
'area': order.county,
'address': order.address,
},
'cargo': {
'count': 1,
'weight': 5,
'spaceX': 10,
'spaceY': 10,
'spaceZ': 10,
'detail_list': [{
'name': goods.name,
'count': order.amount,
}]
},
'shop': {
'wxa_path': 'pages/live/anchorHome/anchorHome?anchor_id='+order.anchor_id,
'img_url': goods.goods_img_url,
'goods_name': goods.name,
'goods_count': order.amount,
},
'insured': {
'use_insured': 0,
'insured_value': 0,
},
'service': {
'service_type': 3,
'service_name': '顺丰标快',
},
'expect_time': 0
}
res = requests.post(url=('https://api.weixin.qq.com/cgi-bin/express/business/order/add?access_token=' + token), data=json.dumps(data, ensure_ascii=False).encode("utf-8")).text
res = json.loads(res)
errCode = res.get('errcode', 0)
if errCode != 0:
errMsg = res.get('errmsg', '')
deliveryResultcode = res.get('delivery_resultcode', '')
deliveryResultmsg = res.get('delivery_resultmsg', '')
return response(errCode, errMsg, str(deliveryResultcode) + ':' + deliveryResultmsg)
order.tracking_number = res.get('waybill_id', '')
order.save()
return response(200, 'Live Order Delivery Success', '直播订单下单成功', data={
'order': order.admindata
})
@logit(res=True)
def fetch_wx_room_list(request):
admin_id = request.POST.get('admin_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
rooms = RoomInfo.objects.exclude(Q(live_status=101) | Q(live_status=102))
start = 0
if rooms.count() != 0:
start = int(rooms[0].room_id) - 1
roominfos = requests.post(url=('http://api.weixin.qq.com/wxa/business/getliveinfo?access_token='+token), json={'start': 0, 'limit': 99})
roominfos = json.loads(roominfos.text).get('room_info', {})
for roominfo in roominfos:
anchor, _ = AnchorInfo.objects.get_or_create(
anchor_name=roominfo.get('anchor_name')
)
room, _ = RoomInfo.objects.get_or_create(
room_id=roominfo.get('roomid')
)
room.name = roominfo.get('name', '')
room.live_status = roominfo.get('live_status', '')
room.start_time = roominfo.get('start_time', '')
room.end_time = roominfo.get('end_time', '')
room.wx_cover_img = roominfo.get('cover_img', '')
room.wx_share_img = roominfo.get('share_img', '')
room.anchor_name = roominfo.get('anchor_name', '')
room.anchor_id = anchor.anchor_id
room.save()
return response(200, 'Fetch wx Room List Success', u'微信直播间列表获取成功')
@logit(res=True)
def room_goods_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
goods_list = RoomGoodsInfo.objects.filter(status=True).order_by('-created_at')
count = goods_list.count()
goods_list = Paginator(goods_list, num).get_page(page)
goods_list = [goods.admindata for goods in goods_list]
return response(200, 'Room Goods Success', u'直播间商品库获取成功', data={
'goods_list': goods_list,
'count': count,
})
|