Administrator
2023-03-08 3cfa1332c0807a74b4ac5a2150500841f5299147
gpcode_manager.py
@@ -6,11 +6,144 @@
import time
import client_manager
import constant
from db import redis_manager
import tool
import decimal
__redisManager = redis_manager.RedisManager(0)
class CodesNameManager:
    redisManager = redis_manager.RedisManager(0)
    @classmethod
    def __get_redis(cls):
        return cls.redisManager.getRedis()
    @classmethod
    def list_code_name_dict(cls):
        dict_ = {}
        val = cls.list_first_code_name_dict()
        if val is not None:
            for k in val:
                dict_[k] = val[k]
        val = cls.list_second_code_name_dict()
        if val is not None:
            for k in val:
                dict_[k] = val[k]
        return dict_
    @classmethod
    def list_first_code_name_dict(cls):
        val = cls.__get_redis().get("gp_list_names_first")
        if val is not None:
            val = json.loads(val)
            return val
        return None
    @classmethod
    def list_second_code_name_dict(cls):
        val = cls.__get_redis().get("gp_list_names")
        if val is not None:
            val = json.loads(val)
            return val
        return None
    @classmethod
    def get_first_code_name(cls, code):
        val = cls.__get_redis().get("gp_list_names_first")
        if not val:
            return None
        val = json.loads(val)
        for k in val:
            if val[k] == code:
                return k
        return None
    @classmethod
    def get_second_code_name(cls, code):
        val = cls.__get_redis().get("gp_list_names")
        if not val:
            return None
        val = json.loads(val)
        for k in val:
            if val[k] == code:
                return k
    @classmethod
    def get_first_name_code(cls, name):
        val = cls.__get_redis().get("gp_list_names_first")
        if not val:
            return None
        val = json.loads(val)
        return val.get(name)
    @classmethod
    def get_second_name_code(cls, name):
        val = cls.__get_redis().get("gp_list_names")
        if not val:
            return None
        val = json.loads(val)
        return val.get(name)
    # 设置首板代码名称
    @classmethod
    def set_first_code_names(cls, datas):
        cls.__get_redis().set("gp_list_names_first", json.dumps(datas))
    # 设置二板代码名称
    @classmethod
    def set_second_code_names(cls, datas):
        cls.__get_redis().set("gp_list_names", json.dumps(datas))
    # 删除首板代码名称
    @classmethod
    def clear_first_code_names(cls):
        cls.__get_redis().delete("gp_list_names_first")
    # 设置二板代码名称
    @classmethod
    def clear_second_code_names(cls):
        cls.__get_redis().delete("gp_list_names")
# 首板代码管理
class FirstCodeManager:
    redisManager = redis_manager.RedisManager(0)
    @classmethod
    def __get_redis(cls):
        return cls.redisManager.getRedis()
    # 加入首板历史记录
    @classmethod
    def add_record(cls, codes):
        for code in codes:
            cls.__get_redis().sadd("first_code_record", code)
        cls.__get_redis().expire("first_code_record", tool.get_expire())
    @classmethod
    def is_in_first_record(cls, code):
        if cls.__get_redis().sismember("first_code_record", code):
            return True
        else:
            return False
    # 加入首板涨停过代码集合
    @classmethod
    def add_limited_up_record(cls, codes):
        for code in codes:
            cls.__get_redis().sadd("first_code_limited_up_record", code)
        cls.__get_redis().expire("first_code_limited_up_record", tool.get_expire())
    # 是否涨停过
    @classmethod
    def is_limited_up(cls, code):
        if cls.__get_redis().sismember("first_code_limited_up_record", code):
            return True
        else:
            return False
def __parse_codes_data(code_datas):
@@ -28,64 +161,106 @@
    return codes, name_codes
# -------------------------------二板代码管理---------------------------------
def set_gp_list(code_datas):
    codes, name_codes = __parse_codes_data(code_datas)
    redis_instance = __redisManager.getRedis()
    # 删除之前的
    redis_instance.delete("gp_list")
    redis_instance.delete("gp_list_names")
    CodesNameManager.clear_second_code_names()
    for d in codes:
        redis_instance.sadd("gp_list", d)
    redis_instance.set("gp_list_names", json.dumps(name_codes))
    CodesNameManager.set_second_code_names(name_codes)
# 新增代码
def add_gp_list(code_datas):
    if len(code_datas) > 200:
        raise Exception("不能超过200个数据")
    redis_instance = __redisManager.getRedis()
    codes, name_codes = __parse_codes_data(code_datas)
    for d in codes:
        redis_instance.sadd("gp_list", d)
    old_name_codes = get_name_codes()
    old_name_codes = CodesNameManager.list_second_code_name_dict()
    if old_name_codes is None:
        old_name_codes = name_codes
    else:
        for key in name_codes:
            old_name_codes[key] = name_codes[key]
    redis_instance.set("gp_list_names", json.dumps(old_name_codes))
    CodesNameManager.set_second_code_names(old_name_codes)
# -------------------------------首板代码管理-------------------------------
# 添加首板代码
# code_datas 掘金返回的数据
def set_first_gp_codes_with_data(code_datas):
    redis_instance = __redisManager.getRedis()
    codes, name_codes = __parse_codes_data(code_datas)
    codes_set = set()
    for code in codes:
        codes_set.add(code)
    old_codes_set = redis_instance.smembers("gp_list_first")
    if old_codes_set is None:
        old_codes_set = set()
    del_set = old_codes_set - codes_set
    add_codes = codes_set - old_codes_set
    for code in add_codes:
        redis_instance.sadd("gp_list_first", code)
    for code in del_set:
        redis_instance.srem("gp_list_first", code)
    redis_instance.expire("gp_list_first", tool.get_expire())
    old_name_codes = CodesNameManager.list_first_code_name_dict()
    if old_name_codes is None:
        old_name_codes = name_codes
    else:
        for key in name_codes:
            old_name_codes[key] = name_codes[key]
    CodesNameManager.set_first_code_names(old_name_codes)
# 移除首板代码
def remove_first_gp_code(codes):
    redis_instance = __redisManager.getRedis()
    for code in codes:
        redis_instance.srem("gp_list_first", code)
# 获取首板代码
def get_first_gp_codes():
    redis_instance = __redisManager.getRedis()
    return redis_instance.smembers("gp_list_first")
# 是否在首板里面
def is_in_first_gp_codes(code):
    redis_instance = __redisManager.getRedis()
    return redis_instance.sismember("gp_list_first", code)
# 获取名称对应的代码
def get_name_code(name):
    redis_instance = __redisManager.getRedis()
    val = redis_instance.get("gp_list_names")
    if not val:
        return None
    val = json.loads(val)
    return val.get(name)
    code = CodesNameManager.get_second_name_code(name)
    if code is not None:
        return code
    code = CodesNameManager.get_first_name_code(name)
    return code
def get_code_name(code):
    redis_instance = __redisManager.getRedis()
    val = redis_instance.get("gp_list_names")
    if not val:
        return None
    val = json.loads(val)
    for key in val:
        if val[key] == code:
            return key
    return None
    name = CodesNameManager.get_second_code_name(code)
    if name is not None:
        return name
    name = CodesNameManager.get_first_code_name(code)
    return name
def get_name_codes():
    redis_instance = __redisManager.getRedis()
    val = redis_instance.get("gp_list_names")
    if not val:
        return None
    val = json.loads(val)
    return val
    return CodesNameManager.list_code_name_dict()
# 涨停犁碑坳
# 涨停数据保存
def set_limit_up_list(gpset):
    if gpset is None:
        return
@@ -108,16 +283,26 @@
def rm_gp(code):
    redis_instance = __redisManager.getRedis()
    redis_instance.srem("gp_list", code)
    remove_first_gp_code([code])
def is_in_gp_pool(code):
    redis_instance = __redisManager.getRedis()
    return redis_instance.sismember("gp_list", code)
    return redis_instance.sismember("gp_list", code) or is_in_first_gp_codes(code)
def get_gp_list():
    redis_instance = __redisManager.getRedis()
    return redis_instance.smembers("gp_list")
    codes = redis_instance.smembers("gp_list")
    first_codes = get_first_gp_codes()
    return set.union(codes, first_codes)
# 获取二板代码
def get_second_gp_list():
    redis_instance = __redisManager.getRedis()
    codes = redis_instance.smembers("gp_list")
    return codes
def get_gp_list_with_prefix(data=None):
@@ -263,6 +448,14 @@
    redis_instance.expire(key, tool.get_expire())
# 清除所有监听代码
def clear_listen_codes():
    redis_instance = __redisManager.getRedis()
    keys = redis_instance.keys("listen_code-*-*")
    for key in keys:
        redis_instance.setex(key, tool.get_expire(), "")
# 获取可以操作的位置
def get_can_listen_pos(client_id=0):
    client_ids = []
@@ -278,8 +471,10 @@
        random.shuffle(keys)
        codes = []
        for key in keys:
            index = key.split("-")[-1]
            if int(index) + 1 > constant.L2_CODE_COUNT_PER_DEVICE:
                continue
            result = redis_instance.get(key)
            if result is None or len(result) == 0:
                return client_id, int(key.replace("listen_code-{}-".format(client_id), ""))
            else:
@@ -364,8 +559,6 @@
if __name__ == '__main__':
    _start = time.time()
    redis_instance = __redisManager.getRedis()
    val = redis_instance.get("code_listen_pos-{}".format("603786"))
    print(json.loads(val))
    print((time.time() - _start) * 1000)
    print(get_code_name("603042"))
    print(get_name_code("华脉科技"))
    print(get_name_codes())