cxfoot/cart_mqtt_sub/redis_sub.py
2023-10-24 14:54:18 +08:00

834 lines
43 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding:utf-8 -*-
import datetime
import hashlib
import json
import os
import random
import threading
import time
import traceback
import redis
import config
import send_sms
from mysql_obj import mysql_obj
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
import asyncio
import cart_distance
class RedisSub():
redis_obj = None
mqtt_obj = None
is_debug = False
version = None
# 数据写入此队列将数据推送到mqtt的状态
redis_name_mqtt_pub_status = "console:cxaibc:mqtt:pub:status:"
"""
1.gps超出门店范围
2.gps超出安全范围
3.硬件链路异常
4.低电量告警
5.倾倒告警
"""
# 1.gps超出
redis_name_warn_status = "api:cxaibc:mqtt:warn_status:"
"""
连接redis
"""
def redis_connect(self):
try:
print('链接redis')
self.redis_obj = redis.Redis(host=config.redis_server, port=config.redis_port, db=config.redis_database, decode_responses=True)
self.redis_obj.ping()
except redis.ConnectionError as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
print('重新链接redis')
time.sleep(1)
return self.redis_connect()
pass
def run(self):
self.version = time.time()
while True:
try:
self.is_debug = config.is_debug
self.redis_connect()
while True:
data = self.redis_obj.rpop(config.redis_name_mqtt_sub_list)
if data is None:
time.sleep(1)
continue
self.printf(data)
res_data = json.loads(data)
status = 0
if res_data['data']['status'] is True:
status = 1
with mysql_obj() as db:
sql = """
INSERT INTO `cx_qc_data` ( `union`, `data`, `created_at`, `data_time`, `type`, `status`) VALUES ( '{}', '{}', {}, {}, '{}', {});
""".format(res_data['id'], res_data['data']['data'], int(time.time()), int(time.time()), res_data['type'], status)
db.cursor.execute(sql)
db.conn.commit()
if res_data['type'] == 'GPS': # gps范围
json_de = json.loads(res_data['data']['data'])
self.analysisGPS(res_data['id'], json_de['LON'], json_de['LAT'])
pass
if res_data['type'] == 'Warn': # warn告警
self.analysisWarn(res_data)
pass
if res_data['type'] == 'Detail': # 常规信息
self.analysisDetail(res_data)
pass
if res_data['type'] == 'sendAudio': # 常规信息
self.analysisSendAudio(res_data)
pass
time.sleep(0.5)
pass
time.sleep(1)
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
time.sleep(1)
pass
pass
"""
常规信息 - 计算每辆车的时长
"""
def analysisDetail(self, res_data):
try:
json_de = json.loads(res_data['data']['data'])
redis_name = "api:cxaibc:sendOpen:{}".format(res_data['id'])
get = self.redis_obj.get(redis_name)
if get is None or get == 0:
self.printf("车辆未开启,不计算时长")
return False
if "ELEC_PERCENT" not in json_de.keys():
return False
redis_name = "api:cxaibc:ddl_number:send" # 车辆剩余电量推送短信
get = self.redis_obj.get(redis_name)
if get is not None:
if int(get) > int(json_de['ELEC_PERCENT']):
# 发送短信
self.sendDdlSms(res_data['id'])
pass
# 计算可用时长
avg = self.redis_obj.get("api:cxaibc:analysisDetail:avg:{}".format(res_data['id']))
if avg is None or avg == 0:
avg = self.redis_obj.get("api:cxaibc:analysisDetail:avg:all")
if avg is None or avg == 0:
avg = 1
pass
self.redis_obj.hset("api:cxaibc:qc_service_time:hash", res_data['id'], int(json_de['ELEC_PERCENT'])/avg)
# 存储数据
if self.redis_obj.setnx("api:cxaibc:analysisDetail:setnx:{}".format(res_data['id']), 1) == 0:
if self.redis_obj.ttl("api:cxaibc:analysisDetail:setnx:{}".format(res_data['id'])) == -1:
self.redis_obj.expire("api:cxaibc:analysisDetail:setnx:{}".format(res_data['id']), 60*60)
return False
self.redis_obj.expire("api:cxaibc:analysisDetail:setnx:{}".format(res_data['id']), 60*60)
get_up_data = self.redis_obj.get("api:cxaibc:analysisDetail:up_data:{}".format(res_data['id']))
self.redis_obj.setex("api:cxaibc:analysisDetail:up_data:{}".format(res_data['id']), 60 * 80,
json_de['ELEC_PERCENT'])
if get_up_data is None or get_up_data is False:
self.printf("开启第一个小时,只做存储操作")
return False
if int(get_up_data) < int(json_de['ELEC_PERCENT']):
self.printf("正在充电,不进行计算")
return False
# 1小时的耗电量
res_ttl = int(json_de['ELEC_PERCENT']) - int(get_up_data)
if res_ttl == 0:
self.printf("电量没有发生变化")
return False
# 存储表
self.redis_obj.lpush("api:cxaibc:analysisDetail:lpush:{}".format(res_data['id']), json_de['ELEC_PERCENT'])
len_max = 50
len_data = self.redis_obj.llen("api:cxaibc:analysisDetail:lpush:{}".format(res_data['id']))
if len_data > len_max:
for v in range(len_data-len_max):
self.redis_obj.rpop("api:cxaibc:analysisDetail:lpush:{}".format(res_data['id']))
pass
pass
# 计算当前球车数据
data = self.redis_obj.lrange("api:cxaibc:analysisDetail:lpush:{}".format(res_data['id']), 0, 999)
len_data = len(data)
all_data = sum([int(v) for v in data])
avg = all_data/len_data
self.redis_obj.set("api:cxaibc:analysisDetail:avg:{}".format(res_data['id']), avg)
# 存储表
self.redis_obj.lpush("api:cxaibc:analysisDetail:lpush:all", json_de['ELEC_PERCENT'])
len_max = 500
len_data = self.redis_obj.llen("api:cxaibc:analysisDetail:lpush:all")
if len_data > len_max:
for v in range(len_data-len_max):
self.redis_obj.rpop("api:cxaibc:analysisDetail:lpush:all")
pass
pass
# 计算当前球车数据
data = self.redis_obj.lrange("api:cxaibc:analysisDetail:lpush:all", 0, 999)
len_data = len(data)
all_data = sum([int(v) for v in data])
avg = all_data/len_data
self.redis_obj.set("api:cxaibc:analysisDetail:avg:all", avg)
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
"""
告警信息
"""
def analysisWarn(self, res_data):
try:
json_de = json.loads(res_data['data']['data'])
get_data = self.redis_obj.get("{}{}".format(self.redis_name_warn_status, res_data['id']))
if get_data is None or get_data == '':
get_data = {}
else:
get_data = json.loads(get_data)
# 链路异常警告
if 'WARN_HARDWARE' not in get_data.keys() and 'WARN_HARDWARE' in json_de.keys():
self.sendOtherSms(res_data['id'], "发出链路异常告警")
# if str(json_de['WARN_HARDWARE']) == '0':
# get_data['WARN_HARDWARE'] = 0
# else:
# get_data['WARN_HARDWARE'] = int(time.time())
# self.sendOtherSms(res_data['id'], "发出链路异常告警")
pass
else:
if get_data['WARN_HARDWARE'] == 0 and 'WARN_HARDWARE' in json_de.keys():
self.sendOtherSms(res_data['id'], "发出链路异常告警")
# if str(json_de['WARN_HARDWARE']) == '0':
# get_data['WARN_HARDWARE'] = 0
# else:
# get_data['WARN_HARDWARE'] = int(time.time())
# self.sendOtherSms(res_data['id'], "发出链路异常告警")
if 'WARN_HARDWARE' in json_de.keys():
if str(json_de['WARN_HARDWARE']) == '0':
get_data['WARN_HARDWARE'] = 0
pass
pass
# 低电量警告
# if 'WARN_LOW_POWER' not in get_data.keys() and 'WARN_LOW_POWER' in json_de.keys():
# if str(json_de['WARN_LOW_POWER']) == '0':
# get_data['WARN_LOW_POWER'] = 0
# else:
# get_data['WARN_LOW_POWER'] = int(time.time())
# self.sendDdlSms(res_data['id'])
# pass
# else:
# if get_data['WARN_LOW_POWER'] == 0 and 'WARN_LOW_POWER' in json_de.keys():
# if str(json_de['WARN_LOW_POWER']) == '0':
# get_data['WARN_LOW_POWER'] = 0
# else:
# get_data['WARN_LOW_POWER'] = int(time.time())
# self.sendDdlSms(res_data['id'])
# if 'WARN_LOW_POWER' in json_de.keys():
# if str(json_de['WARN_LOW_POWER']) == '0':
# get_data['WARN_LOW_POWER'] = 0
# pass
# pass
# 倾倒告警
if 'WARN_FALLDOWN' not in get_data.keys() and 'WARN_FALLDOWN' in json_de.keys():
self.sendOtherSms(res_data['id'], "发出倾倒告警")
# if str(json_de['WARN_FALLDOWN']) == '0':
# get_data['WARN_FALLDOWN'] = 0
# else:
# get_data['WARN_FALLDOWN'] = int(time.time())
# self.sendOtherSms(res_data['id'], "发出倾倒告警")
# pass
else:
if get_data['WARN_FALLDOWN'] == 0 and 'WARN_FALLDOWN' in json_de.keys():
self.sendOtherSms(res_data['id'], "发出倾倒告警")
# if str(json_de['WARN_FALLDOWN']) == '0':
# get_data['WARN_FALLDOWN'] = 0
# else:
# get_data['WARN_FALLDOWN'] = int(time.time())
# self.sendOtherSms(res_data['id'], "发出倾倒告警")
if 'WARN_FALLDOWN' in json_de.keys():
if str(json_de['WARN_FALLDOWN']) == '0':
get_data['WARN_FALLDOWN'] = 0
pass
pass
self.redis_obj.set("{}{}".format(self.redis_name_warn_status, res_data['id']), json.dumps(get_data))
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
pass
# 当前位置是否在门店范围内
def analysisGPS(self, number, lon, lat):
try:
print('执行经纬度计算')
# 协程函数执行结束时会抛出一个StopIteration 异常标志着协程函数执行结束返回值在value中
pass
if lon == 0 and lat == 0:
self.printf("经纬度为0,0 不进行判断")
return False
try:
t = threading.Thread(target=cart_distance.CartDistance(number, self.version).run)
t.start()
except threading.ThreadError as e:
print(e)
temp_data = None
with mysql_obj() as db:
sql = """
select s.* from cx_ball_cart as c inner join cx_store as s on c.store_id = s.id where c.ball_number = '{}' and c.is_delete = 0 and s.is_delete = 0
""".format(number)
db.cursor.execute(sql)
res = db.cursor.fetchall()
if len(res) != 0:
temp_data = res[0]
if temp_data is None:
return False
if 'area' not in temp_data.keys():
return False
if temp_data['area'] is None or temp_data['area'] == '':
return False
get_data = self.redis_obj.get("{}{}".format(self.redis_name_warn_status, number))
if get_data is None or get_data == '':
get_data = {}
else:
get_data = json.loads(get_data)
json_de = json.loads(temp_data['area'])
point = Point(lon, lat)
if 'call' in json_de.keys():
polygon_data = []
for v in json_de['call']['paths']:
polygon_data.append([v['lng'], v['lat']])
polygon = Polygon(polygon_data)
if polygon.contains(point) is False:
self.printf('不在安全范围内')
self.sendOtherSms(number, "超出安全范围")
# 不在安全范围内
# if 'GPS_CALL' not in get_data.keys():
# get_data['GPS_CALL'] = int(time.time())
# self.sendOtherSms(number, "超出安全范围")
# else:
# if get_data['GPS_CALL'] == 0:
# get_data['GPS_CALL'] = int(time.time())
# self.sendOtherSms(number, "超出安全范围")
# pass
# pass
else:
if 'store' in json_de.keys():
polygon_data = []
for v in json_de['store']['paths']:
polygon_data.append([v['lng'], v['lat']])
polygon = Polygon(polygon_data)
if polygon.contains(point) is False:
self.printf('不在门店范围内')
self.sendOtherSms(number, "超出门店范围")
# 不在门店范围内
# if 'GPS_STORE' not in get_data.keys():
# get_data['GPS_STORE'] = int(time.time())
# self.sendOtherSms(number, "超出门店范围")
# else:
# if get_data['GPS_STORE'] == 0:
# get_data['GPS_STORE'] = int(time.time())
# self.sendOtherSms(number, "超出门店范围")
# pass
# pass
else:
get_data['GPS_STORE'] = 0
get_data['GPS_CALL'] = 0
else:
get_data['GPS_CALL'] = 0
pass
elif 'store' in json_de.keys():
polygon_data = []
for v in json_de['store']['paths']:
polygon_data.append([v['lng'], v['lat']])
polygon = Polygon(polygon_data)
if polygon.contains(point) is False:
self.printf('不在门店范围内')
self.sendOtherSms(number, "超出门店范围")
# 不在门店范围内
# if 'GPS_STORE' not in get_data.keys():
# get_data['GPS_STORE'] = int(time.time())
# self.sendOtherSms(number, "超出门店范围")
# else:
# if get_data['GPS_STORE'] == 0:
# get_data['GPS_STORE'] = int(time.time())
# self.sendOtherSms(number, "超出门店范围")
# pass
# pass
else:
get_data['GPS_STORE'] = 0
get_data['GPS_CALL'] = 0
pass
self.redis_obj.set("{}{}".format(self.redis_name_warn_status, number), json.dumps(get_data))
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
# 解析并发送音频内容
def analysisSendAudio(self, res_data):
try:
json_de = json.loads(res_data['data']['data'])
if 'DATA' not in json_de.keys():
return False
try:
t = threading.Thread(target=cart_distance.CartDistance().sendAudio, args=(res_data['id'], json_de['DATA'], ))
t.start()
except threading.ThreadError as e:
print(e)
pass
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
pass
"""
发送低电量警告短信
"""
def sendDdlSms(self, qc_code):
self.printf("发送低电量警告短信")
try:
if self.redis_obj is None:
self.redis_connect()
redis_name = "api:cxaibc:send_sms:lock:{}".format(hashlib.md5("{}低电量".format(qc_code).encode()).hexdigest())
if self.redis_obj.setnx(redis_name, 1) is False:
if self.redis_obj.ttl(redis_name) == -1:
self.redis_obj.expire(redis_name, 60 * 10)
self.printf("警告不能发出,还未过时长")
return False
# $redis_name = "api:cxaibc:bj_sms:send_sms_pl";
get_ttl = self.redis_obj.get("api:cxaibc:ddl_sms:send_sms_pl")
if get_ttl is None:
get_ttl = 10
self.redis_obj.setex(name=redis_name, time=int(get_ttl) * 60, value=1)
# 查找球车信息
temp_data = None
with mysql_obj() as db:
sql = """
select u.mobile_phone,u.real_name,s.user_type,b.status from cx_ball_cart as b
inner join cx_store_user as s on b.store_id = s.store_id
inner join cx_user as u on u.id = s.user_id
where b.ball_number = '{}' and s.user_type in (1,2) and u.is_delete = 0 and s.is_delete = 0 and s.status = 0 and b.is_delete = 0
""".format(qc_code)
db.cursor.execute(sql)
temp_data = db.cursor.fetchall()
if temp_data is None:
return False
if int(temp_data[0]['status']) != 0:
self.printf("车辆租赁中")
return False
redis_name_time = "api:cxaibc:send:send_time"
get = self.redis_obj.get(redis_name_time)
if get is None:
self.printf("警告不能发出,没有设置时间")
return False
pass
time_ = get.split(' - ')
if len(time_) != 2:
self.printf("警告不能发出,没有设置时间")
return False
time_tuple = time.localtime(time.time())
s_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[0]),
"%Y-%m-%d %H:%M:%S")
s_t_res = int(time.mktime(s_t))
e_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[1]),
"%Y-%m-%d %H:%M:%S")
e_t_res = int(time.mktime(e_t))
if s_t_res > time.time() or e_t_res < time.time():
self.printf("警告不能发出,没有在设置时间内")
return False
get_sms_option = self.getSmsSetting()
if get_sms_option is None:
self.printf("获取短信配置失败")
return False
phone_numbers = []
sign_name = []
template_param = []
arr_type = {
1: '场地管理员',
2: '场地服务员',
}
ELEC_PERCENT = 0
try:
qc_data = self.redis_obj.get("{}{}_{}".format("api:cxaibc:mqtt:data:", qc_code, "Detail"))
if qc_data is not None:
qc_data = json.loads(qc_data)
if 'data' in qc_data.keys():
qc_data = json.loads(qc_data['data'])
if 'ELEC_PERCENT' in qc_data.keys():
ELEC_PERCENT = qc_data['ELEC_PERCENT']
pass
pass
pass
except BaseException as e:
self.printf("数据解析失败", e)
return False
for v in temp_data:
sms_redis = self.redis_obj.get("{}{}".format("api:cxaibc:mqtt:send_sms:", v['mobile_phone']))
print(v)
if sms_redis is None or sms_redis == 'send':
phone_numbers.append(v['mobile_phone'])
sign_name.append(get_sms_option['sign_name'])
template_param.append({
"name": arr_type[v['user_type']],
"numbers": qc_code,
"rato": ELEC_PERCENT,
})
pass
try:
if len(phone_numbers) != 0:
send_sms.Sms(get_sms_option['access_key_id'], get_sms_option['access_secret']).main(
json.dumps(phone_numbers), json.dumps(sign_name), get_sms_option['ball_electric'],
json.dumps(template_param))
self.printf(phone_numbers)
except BaseException as e:
self.printf("发送短信失败", e)
pass
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
"""
发送其他警告短信
"""
def sendOtherSms(self, qc_code, msg):
self.printf("发送其他警告短信")
try:
if self.redis_obj is None:
self.redis_connect()
redis_name = "api:cxaibc:send_sms:lock:{}".format(
hashlib.md5("{}{}".format(qc_code, msg).encode()).hexdigest())
if self.redis_obj.setnx(redis_name, 1) is False:
if self.redis_obj.ttl(redis_name) == -1:
self.redis_obj.expire(redis_name, 60 * 10)
self.printf("警告不能发出,还未过时长")
return False
get_ttl = self.redis_obj.get("api:cxaibc:ddl_sms:send_sms_pl")
if get_ttl is None:
get_ttl = 10
self.redis_obj.setex(redis_name, int(get_ttl) * 60, 1)
redis_name_time = "api:cxaibc:send:send_time"
get = self.redis_obj.get(redis_name_time)
if get is None:
self.printf("警告不能发出,没有设置时间")
return False
pass
time_ = get.split(' - ')
if len(time_) != 2:
self.printf("警告不能发出,没有设置时间")
return False
time_tuple = time.localtime(time.time())
s_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[0]),
"%Y-%m-%d %H:%M:%S")
s_t_res = int(time.mktime(s_t))
e_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[1]),
"%Y-%m-%d %H:%M:%S")
e_t_res = int(time.mktime(e_t))
if s_t_res > time.time() or e_t_res < time.time():
self.printf("警告不能发出,没有在设置时间内")
return False
get_ttl = self.redis_obj.get("api:cxaibc:bj_sms:send_sms_pl")
if get_ttl is None:
get_ttl = 10
self.redis_obj.setex(redis_name, int(get_ttl) * 60, 1)
# 查找球车信息
temp_data = None
with mysql_obj() as db:
sql = """
select u.mobile_phone,u.real_name,s.user_type,b.status from cx_ball_cart as b
inner join cx_store_user as s on b.store_id = s.store_id
inner join cx_user as u on u.id = s.user_id
where b.ball_number = '{}' and s.user_type in (1,2) and u.is_delete = 0 and s.is_delete = 0 and s.status = 0 and b.is_delete = 0
""".format(qc_code)
db.cursor.execute(sql)
temp_data = db.cursor.fetchall()
if temp_data is None:
return False
# if int(temp_data[0]['status']) != 1:
# self.printf("车辆不租赁中")
# return False
phone_numbers = []
sign_name = []
template_param = []
arr_type = {
1: '场地管理员',
2: '场地服务员',
}
get_sms_option = self.getSmsSetting()
if get_sms_option is None:
self.printf("获取短信配置失败")
return False
for v in temp_data:
sms_redis = self.redis_obj.get("{}{}".format("api:cxaibc:mqtt:send_sms:", v['mobile_phone']))
if sms_redis is None or sms_redis == 'send':
phone_numbers.append(v['mobile_phone'])
sign_name.append(get_sms_option['sign_name'])
template_param.append({
"name": arr_type[v['user_type']],
"numbers": qc_code,
"error": msg,
})
pass
try:
if len(phone_numbers) != 0:
send_sms.Sms(get_sms_option['access_key_id'], get_sms_option['access_secret']).main(
json.dumps(phone_numbers), json.dumps(sign_name), get_sms_option['ball_error'],
json.dumps(template_param))
print('短信发送成功')
except BaseException as e:
self.printf("发送短信失败", e)
pass
except BaseException as e:
if os.path.exists('./redis_error') is False:
os.mkdir('./redis_error')
path_name = './redis_error/{}'.format(datetime.date.today().strftime('%Y_%m_%d'))
if os.path.exists(path_name) is False:
os.mkdir(path_name)
file_obj = open('{}/redis_error.txt'.format(path_name), 'a+')
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=file_obj)
traceback.print_exc(file=file_obj)
file_obj.close()
self.printf(e)
self.printf(e.__traceback__.tb_frame.f_globals["__file__"]) # 发生异常所在的文件
self.printf(e.__traceback__.tb_lineno)
pass
"""
获取短信设置数据
"""
def getSmsSetting(self):
redis_name = "api:cxaibc:mqtt:send_setting_v3"
get = self.redis_obj.get(redis_name)
if get is not None:
data = json.loads(get)
return data
temp_data = {}
temp_data['access_key_id'] = ''
temp_data['access_secret'] = ''
temp_data['sign_name'] = ''
with mysql_obj() as db:
sql = """
select * from cx_sms_setting order by id desc limit 1
"""
db.cursor.execute(sql)
res = db.cursor.fetchall()
if len(res) != 0:
temp_data['access_key_id'] = res[0]['access_key_id']
temp_data['access_secret'] = res[0]['access_secret']
temp_data['sign_name'] = res[0]['sign_name']
pass
with mysql_obj() as db:
sql = """
select * from cx_sms_tpl where `key` = 'ball_error'
"""
db.cursor.execute(sql)
res = db.cursor.fetchall()
if len(res) != 0:
temp_data['ball_error'] = res[0]['tpl_code']
pass
with mysql_obj() as db:
sql = """
select * from cx_sms_tpl where `key` = 'ball_electric'
"""
db.cursor.execute(sql)
res = db.cursor.fetchall()
if len(res) != 0:
temp_data['ball_electric'] = res[0]['tpl_code']
pass
self.redis_obj.setex(redis_name, 60*10, json.dumps(temp_data, ensure_ascii=False))
return temp_data
pass
"""
打印信息
"""
def printf(self, *data):
if self.is_debug is True:
print(data, time.time())
pass
if __name__ == '__main__':
# python3 /var/www/xlqc/cart_mqtt_sub/redis_sub.py
# obj = RedisSub()
# obj.redis_connect()
# redis_name = "api:cxaibc:send:send_time"
# get = obj.redis_obj.get(redis_name)
# if get is None:
# pass
# time_ = get.split(' - ')
#
# time_tuple = time.localtime(time.time())
# s_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[0]),
# "%Y-%m-%d %H:%M:%S")
# s_t_res = int(time.mktime(s_t))
# e_t = time.strptime("{}-{}-{} {}".format(time_tuple[0], time_tuple[1], time_tuple[2], time_[1]),
# "%Y-%m-%d %H:%M:%S")
# e_t_res = int(time.mktime(e_t))
# if s_t_res > time.time() or e_t_res < time.time():
# print("警告不能发出,没有在设置时间内")
# res = obj.sendDdlSms("20221000999")
RedisSub().run()
# get_data = {}
# lon = 118.050146181
# lat = 24.523877029898
# json_de = json.loads('{"store":{"styleId":"default","paths":[{"lat":24.53396475482219,"lng":118.03349055688,"height":0},{"lat":24.534017031802232,"lng":118.03486972396968,"height":0},{"lat":24.53391247742138,"lng":118.03601902841581,"height":0},{"lat":24.532448712132755,"lng":118.03745565765735,"height":0},{"lat":24.531350877264686,"lng":118.03929454652553,"height":0},{"lat":24.530828094982756,"lng":118.04101850144013,"height":0},{"lat":24.530723538943473,"lng":118.04274245898637,"height":0},{"lat":24.531507711006046,"lng":118.04527092964486,"height":0},{"lat":24.531350877264686,"lng":118.04630530276904,"height":0},{"lat":24.531612268187843,"lng":118.04653516365829,"height":0},{"lat":24.531978213049605,"lng":118.0487763077665,"height":0},{"lat":24.532500990143173,"lng":118.04958082131748,"height":0},{"lat":24.53239643489861,"lng":118.05021293788548,"height":0},{"lat":24.53213504600724,"lng":118.05044279943263,"height":0},{"lat":24.53213504600724,"lng":118.05107491709725,"height":0},{"lat":24.53182137909801,"lng":118.0513622429894,"height":0},{"lat":24.53182137909801,"lng":118.05199436065402,"height":0},{"lat":24.531769101602627,"lng":118.0523966171005,"height":0},{"lat":24.53119404252936,"lng":118.05285633898859,"height":0},{"lat":24.530880373668047,"lng":118.05331606060247,"height":0},{"lat":24.530618981819547,"lng":118.05371831726825,"height":0},{"lat":24.530566703623986,"lng":118.05394817816943,"height":0},{"lat":24.530200754448273,"lng":118.05400564340039,"height":0},{"lat":24.529730246740858,"lng":118.05383324772652,"height":0},{"lat":24.52711628106854,"lng":118.05584453076756,"height":0},{"lat":24.526750321636595,"lng":118.05624678732363,"height":0},{"lat":24.52659348145376,"lng":118.05538480876976,"height":0},{"lat":24.526488921439217,"lng":118.05469522604744,"height":0},{"lat":24.526959441442592,"lng":118.0534309911568,"height":0},{"lat":24.52554787574422,"lng":118.05354592157391,"height":0},{"lat":24.524136294627546,"lng":118.05354592157391,"height":0},{"lat":24.524031732018347,"lng":118.05228168654628,"height":0},{"lat":24.524397699772074,"lng":118.05101745143634,"height":0},{"lat":24.525652437091058,"lng":118.04958082131748,"height":0},{"lat":24.526750321636595,"lng":118.04756953765968,"height":0},{"lat":24.527168560925254,"lng":118.04492613743378,"height":0},{"lat":24.527429959809115,"lng":118.039696802643,"height":0},{"lat":24.528893783287415,"lng":118.03917961344928,"height":0},{"lat":24.52913841918043,"lng":118.03898200556466,"height":0},{"lat":24.529849297005057,"lng":118.03600423559067,"height":0},{"lat":24.529887722560204,"lng":118.03541290522298,"height":0},{"lat":24.530503825178556,"lng":118.03351664816603,"height":0},{"lat":24.533953890827128,"lng":118.03356179630077,"height":0},{"lat":24.533953890827128,"lng":118.03351664816603,"height":0}],"id":"4821E6AE-BC13-4F36-89F9-BDE24F8EBE80","area_type":"store"},"call":{"styleId":"default","paths":[{"lat":24.53464449656417,"lng":118.03320913274763,"height":0},{"lat":24.53464449656417,"lng":118.03416629669232,"height":0},{"lat":24.53391247742138,"lng":118.03601902841581,"height":0},{"lat":24.532448712132755,"lng":118.03745565765735,"height":0},{"lat":24.531350877264686,"lng":118.03929454652553,"height":0},{"lat":24.530828094982756,"lng":118.04101850144013,"height":0},{"lat":24.530723538943473,"lng":118.04274245898637,"height":0},{"lat":24.531507711006046,"lng":118.04527092964486,"height":0},{"lat":24.531350877264686,"lng":118.04630530276904,"height":0},{"lat":24.531612268187843,"lng":118.04653516365829,"height":0},{"lat":24.531978213049605,"lng":118.0487763077665,"height":0},{"lat":24.532500990143173,"lng":118.04958082131748,"height":0},{"lat":24.53239643489861,"lng":118.05021293788548,"height":0},{"lat":24.53213504600724,"lng":118.05044279943263,"height":0},{"lat":24.53213504600724,"lng":118.05107491709725,"height":0},{"lat":24.53182137909801,"lng":118.0513622429894,"height":0},{"lat":24.531769101602627,"lng":118.0523966171005,"height":0},{"lat":24.53119404252936,"lng":118.05285633898859,"height":0},{"lat":24.530566703623986,"lng":118.05394817816943,"height":0},{"lat":24.530200754448273,"lng":118.05400564340039,"height":0},{"lat":24.529730246740858,"lng":118.05383324772652,"height":0},{"lat":24.526750321636595,"lng":118.05624678732363,"height":0},{"lat":24.524136294627546,"lng":118.05354592157391,"height":0},{"lat":24.52386483926673,"lng":118.0511642225515,"height":0},{"lat":24.525652437091058,"lng":118.04958082131748,"height":0},{"lat":24.526750321636595,"lng":118.04756953765968,"height":0},{"lat":24.527168560925254,"lng":118.04492613743378,"height":0},{"lat":24.527429959809115,"lng":118.039696802643,"height":0},{"lat":24.52913841918043,"lng":118.03898200556466,"height":0},{"lat":24.529887722560204,"lng":118.03541290522298,"height":0},{"lat":24.530503825178556,"lng":118.03351664816603,"height":0},{"lat":24.53467452239805,"lng":118.03324213792325,"height":0}],"id":"AA223BDA-DF98-4BEA-8D7F-764F76886114","area_type":"call"},"stop":{"styleId":"default","paths":[{"lat":24.527254213347913,"lng":118.04904485306122,"height":0},{"lat":24.52681061632031,"lng":118.04870032490044,"height":0},{"lat":24.52654764489498,"lng":118.04884339166438,"height":0},{"lat":24.526425456023883,"lng":118.04921127761588,"height":0},{"lat":24.527047024489168,"lng":118.0496463173913,"height":0},{"lat":24.52715327521774,"lng":118.04987405632801,"height":0},{"lat":24.527554792847575,"lng":118.04967568385439,"height":0},{"lat":24.527254635281558,"lng":118.0490421025479,"height":0}],"id":"5C3EC71B-4EF2-4012-99DE-3DA9DFDA4A9D","area_type":"stop"}}')
# point = Point(lon, lat)
# if 'call' in json_de.keys():
# polygon_data = []
# for v in json_de['call']['paths']:
# polygon_data.append([v['lng'], v['lat']])
# polygon = Polygon(polygon_data)
# if polygon.contains(point) is False:
# print('不在安全范围内')
# # 不在安全范围内
# if 'GPS_CALL' not in get_data.keys():
# get_data['GPS_CALL'] = int(time.time())
# print("超出安全范围")
# else:
# if get_data['GPS_CALL'] == 0:
# get_data['GPS_CALL'] = int(time.time())
# print("超出安全范围")
# pass
# pass
# else:
# if 'store' in json_de.keys():
# polygon_data = []
# for v in json_de['store']['paths']:
# polygon_data.append([v['lng'], v['lat']])
# polygon = Polygon(polygon_data)
# if polygon.contains(point) is False:
# print('不在门店范围内')
# # 不在门店范围内
# if 'GPS_STORE' not in get_data.keys():
# get_data['GPS_STORE'] = int(time.time())
# print("超出门店范围")
# else:
# if get_data['GPS_STORE'] == 0:
# get_data['GPS_STORE'] = int(time.time())
# print("超出门店范围")
# pass
# pass
# else:
# get_data['GPS_STORE'] = 0
# get_data['GPS_CALL'] = 0
# else:
# get_data['GPS_CALL'] = 0
#
# pass
# elif 'store' in json_de.keys():
# polygon_data = []
# for v in json_de['store']['paths']:
# polygon_data.append([v['lng'], v['lat']])
# polygon = Polygon(polygon_data)
# if polygon.contains(point) is False:
# print('不在门店范围内')
# # 不在门店范围内
# if 'GPS_STORE' not in get_data.keys():
# get_data['GPS_STORE'] = int(time.time())
# print("超出门店范围")
# else:
# if get_data['GPS_STORE'] == 0:
# get_data['GPS_STORE'] = int(time.time())
# print("超出门店范围")
# pass
# pass
# else:
# get_data['GPS_STORE'] = 0
# get_data['GPS_CALL'] = 0
# pass
# obj = RedisSub()
# obj.is_debug = True
# obj.sendDdlSms("20221000852")