From 8ffb521f738254038d85bbade839b2e30456e525 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 04 十一月 2024 00:41:05 +0800
Subject: [PATCH] 扫入参考代码板块优化

---
 third_data/kpl_data_constant.py |  130 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 124 insertions(+), 6 deletions(-)

diff --git a/third_data/kpl_data_constant.py b/third_data/kpl_data_constant.py
index d12a2e2..ac99407 100644
--- a/third_data/kpl_data_constant.py
+++ b/third_data/kpl_data_constant.py
@@ -1,9 +1,119 @@
 # 褰撳墠娑ㄥ仠鏁版嵁
 import constant
-from third_data import kpl_block_util
+from db import redis_manager_delegate as redis_manager
+from db.redis_manager_delegate import RedisUtils
 
 # 鐢ㄤ簬璁$畻婵�杩涗拱寮�1鐨勬澘鏁帮細{"浠g爜":(鍑犵増,{鏉垮潡})}
+from utils import tool
+from utils.kpl_data_db_util import KPLLimitUpDataUtil
+
 open_limit_up_code_dict_for_radical_buy = None
+
+
+class LimitUpCodesBlockRecordManager:
+    """
+    鍘嗗彶娑ㄥ仠浠g爜鐨勬澘鍧楃鐞�
+    """
+    # 娑ㄥ仠鍘熷洜
+    __limit_up_reasons_dict = {}
+    # 娑ㄥ仠鎺ㄨ崘鍘熷洜
+    __limit_up_recommend_reasons_dict = {}
+
+    __instance = None
+
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(LimitUpCodesBlockRecordManager, cls).__new__(cls, *args, **kwargs)
+            cls.__load_data()
+        return cls.__instance
+
+    @classmethod
+    def __load_data(cls):
+        kpl_results = KPLLimitUpDataUtil.get_latest_block_infos()
+        limit_up_reasons_dict = {}
+        limit_up_recommend_block_dict = {}
+        for r in kpl_results:
+            code = r[0]
+            if code not in limit_up_reasons_dict:
+                limit_up_reasons_dict[code] = []
+            if code not in limit_up_recommend_block_dict:
+                limit_up_recommend_block_dict[code] = []
+            if len(limit_up_reasons_dict[code]) >= 2:
+                continue
+            limit_up_reasons_dict[code].append(r[2])
+            if r[3]:
+                limit_up_recommend_block_dict[code].extend(r[3].split("銆�"))
+        for code in limit_up_reasons_dict:
+            cls.__limit_up_reasons_dict[code] = set(limit_up_reasons_dict[code])
+
+        for code in limit_up_recommend_block_dict:
+            cls.__limit_up_recommend_reasons_dict[code] = set(limit_up_recommend_block_dict[code])
+
+    def get_limit_up_reasons(self, code):
+        """
+        鑾峰彇娑ㄥ仠鍘熷洜
+        @param code:
+        @return:
+        """
+        if code in self.__limit_up_reasons_dict:
+            return set(self.__limit_up_reasons_dict[code])
+        return set()
+
+    def get_limit_up_reasons_with_recommend(self, code):
+        """
+        鑾峰彇娑ㄥ仠鍘熷洜涓庢帹鑽愬師鍥�
+        @param code:
+        @return:
+        """
+        blocks = set()
+        if code in self.__limit_up_reasons_dict:
+            blocks |= self.__limit_up_reasons_dict[code]
+        if code in self.__limit_up_recommend_reasons_dict:
+            blocks |= self.__limit_up_recommend_reasons_dict[code]
+        return blocks
+
+
+class TodayLimitUpReasonChangeManager:
+    """
+    浠婃棩娑ㄥ仠鍘熷洜鍙樺寲
+    """
+    # 娑ㄥ仠鍘熷洜
+    __today_change_reasons_dict = {}
+    # 娑ㄥ仠
+    __instance = None
+    __db = 1
+    __redisManager = redis_manager.RedisManager(1)
+
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(TodayLimitUpReasonChangeManager, cls).__new__(cls, *args, **kwargs)
+            cls.__load_data()
+        return cls.__instance
+
+    @classmethod
+    def __get_redis(cls):
+        return cls.__redisManager.getRedis()
+
+    @classmethod
+    def __load_data(cls):
+        keys = RedisUtils.keys(cls.__get_redis(), "kpl_limit_up_reason_his-*")
+        if keys:
+            for key in keys:
+                code = key.split("-")[1]
+                reasons = RedisUtils.smembers(cls.__get_redis(), key)
+                cls.__today_change_reasons_dict[code] = reasons
+
+    def set_today_limit_up_reason_change(self, code, from_reason, to_reason):
+        if code not in self.__today_change_reasons_dict:
+            self.__today_change_reasons_dict[code] = set()
+        self.__today_change_reasons_dict[code].add(from_reason)
+        RedisUtils.sadd_async(self.__db, f"kpl_limit_up_reason_his-{code}", from_reason)
+        RedisUtils.expire_async(self.__db, f"kpl_limit_up_reason_his-{code}", tool.get_expire())
+
+    def get_changed_reasons(self, code):
+        if code in self.__today_change_reasons_dict:
+            return self.__today_change_reasons_dict[code]
+        return set()
 
 
 class LimitUpDataConstant:
@@ -25,14 +135,22 @@
             return
         cls.history_limit_up_datas = history_limit_up_datas_
         for d in cls.history_limit_up_datas:
+            # 鍙傝�冨師鍥狅細褰撳墠娑ㄥ仠鍘熷洜+褰撴棩鍙樺寲涔嬪墠鐨勫師鍥�+180澶╂渶杩�2鏉℃定鍋滃師鍥�
+            code = d[3]
             blocks = {d[2]}
+            history_reasons = LimitUpCodesBlockRecordManager().get_limit_up_reasons(code)
+            if history_reasons:
+                blocks |= history_reasons
+            today_changed_reasons = TodayLimitUpReasonChangeManager().get_changed_reasons(code)
+            if today_changed_reasons:
+                blocks |= today_changed_reasons
             # 寮�1鎵嶈兘鍖呭惈鎺ㄨ崘鍘熷洜
-            if d[6] and kpl_block_util.open_limit_up_time_range[0] <= int(d[5]) < \
-                    kpl_block_util.open_limit_up_time_range[1]:
-                blocks |= set(d[6].split("銆�"))
+            # if d[6] and kpl_block_util.open_limit_up_time_range[0] <= int(d[5]) < \
+            #         kpl_block_util.open_limit_up_time_range[1]:
+            #     blocks |= set(d[6].split("銆�"))
             blocks -= constant.KPL_INVALID_BLOCKS
-            cls.__history_code_blocks_dict[d[3]] = blocks
-            cls.__history_code_data_dict[d[3]] = d
+            cls.__history_code_blocks_dict[code] = blocks
+            cls.__history_code_data_dict[code] = d
 
     @classmethod
     def get_blocks_with_history(cls, code):

--
Gitblit v1.8.0