From 06df6025404f0aa1cae1bff229c00bb09db0a861 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 27 十一月 2023 16:42:56 +0800
Subject: [PATCH] 新版选票机制实行

---
 third_data/code_plate_key_manager.py |  244 ++++++++++++++++++++++++------------------------
 1 files changed, 124 insertions(+), 120 deletions(-)

diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py
index 5eea3db..7fe0f9d 100644
--- a/third_data/code_plate_key_manager.py
+++ b/third_data/code_plate_key_manager.py
@@ -6,7 +6,6 @@
 import json
 
 import constant
-from code_attribute.code_nature_analyse import HighIncreaseCodeManager
 from db.redis_manager_delegate import RedisUtils
 from third_data import kpl_block_util, kpl_api
 from utils import global_util, tool
@@ -455,60 +454,89 @@
         l2_trade_util.forbidden_trade(code, msg=msg)
         logger_kpl_block_can_buy.info(msg)
 
+    # 杩斿洖鍐呭(鏄惁鍙拱, 鏄惁涓虹嫭鑻�, 鎻忚堪淇℃伅)
     @classmethod
     def __is_block_can_buy(cls, code, block, current_limit_up_datas, code_limit_up_reason_dict,
-                           yesterday_current_limit_up_codes, limit_up_record_datas):
-        # log.logger_kpl_debug.info(f"鍒ゆ柇鏉垮潡鏄惁鍙拱锛歿block}")
-        # is_top_8_record, top_8_record = kpl_block_util.is_record_top_block(code, block, limit_up_record_datas,
-        #                                                                    yesterday_current_limit_up_codes, 50)
-        # is_top_4_current, top_4_current = kpl_block_util.is_current_top_block(code, block, current_limit_up_datas,
-        #                                                                       yesterday_current_limit_up_codes, 50)
-        # is_top_4 = is_top_8_record and is_top_4_current
-        # msg_list.append(f"\n瀹炴椂top10(娑ㄥ仠鏁伴噺锛歿len(current_limit_up_datas)})")
-        # msg_list.append(f"鍘嗗彶top20(娑ㄥ仠鏁伴噺锛歿len(top_8_record)})")
+                           yesterday_current_limit_up_codes, limit_up_record_datas, current_limit_up_block_codes_dict):
 
-        # 闇�瑕佹帓闄ょ殑鑰佸ぇ鐨勪唬鐮�
-        exclude_first_codes = HighIncreaseCodeManager().list_all()
-
-        # 鑾峰彇涓绘澘寮�1鐨勪唬鐮�
+        # 鐙嫍鍒ゆ柇
+        block_codes = current_limit_up_block_codes_dict.get(block)
+        if not block_codes:
+            return False, True, ""
+        elif len(block_codes) == 1 and code in block_codes:
+            return False, True, ""
+        # 鍙互涔扮殑鏈�澶ф帓鍚�
         open_limit_up_codes = kpl_block_util.get_shsz_open_limit_up_codes(code, block, limit_up_record_datas,
                                                                           code_limit_up_reason_dict)
+        current_open_limit_up_codes = kpl_block_util.get_shsz_open_limit_up_codes_current(code, block,
+                                                                                          current_limit_up_datas)
+
+        max_rank = 2
+        # 濡傛灉鏄己鍔挎澘鍧楋紙鏈�1涓紑1/鏈夐潪涓绘澘娑ㄥ仠/鏈夐珮浣嶆澘锛夊彲浠ヤ拱鍒拌�佷笁
+        msg_list = []
+        for bc in block_codes:
+            if bc in current_open_limit_up_codes:
+                max_rank = 3
+                msg_list.append(f"{bc}寮�1")
+                break
+            elif bc in yesterday_current_limit_up_codes:
+                max_rank = 3
+                msg_list.append(f"{bc}楂樹綅鏉�")
+                break
+            elif bc.find("00") != 0 and bc.find("60") != 0:
+                max_rank = 3
+                msg_list.append(f"{bc}鍒涗笟鏉�/绉戝垱鏉�")
+                break
+
+        # 鍒ゆ柇韬綅
+
+        # 闇�瑕佹帓闄ょ殑鑰佸ぇ鐨勪唬鐮�
+        exclude_first_codes = set()  # HighIncreaseCodeManager().list_all()
+
+        # 鑾峰彇涓绘澘寮�1鐨勪唬鐮�
+
         # 鍓旈櫎楂樹綅鏉�
         if open_limit_up_codes and yesterday_current_limit_up_codes:
             open_limit_up_codes -= yesterday_current_limit_up_codes
 
-
         # 鑾峰彇涓绘澘瀹炴椂韬綅,鍓旈櫎楂樹綅鏉�
-        current_shsz_rank, front_current_shsz_rank_codes = kpl_block_util.get_code_current_rank(code, block,
-                                                                                                current_limit_up_datas,
-                                                                                                code_limit_up_reason_dict,
-                                                                                                yesterday_current_limit_up_codes,
-                                                                                                exclude_first_codes,
-                                                                                                len(open_limit_up_codes),
-                                                                                                shsz=True)
+        # current_shsz_rank, front_current_shsz_rank_codes = kpl_block_util.get_code_current_rank(code, block,
+        #                                                                                         current_limit_up_datas,
+        #                                                                                         code_limit_up_reason_dict,
+        #                                                                                         yesterday_current_limit_up_codes,
+        #                                                                                         exclude_first_codes,
+        #                                                                                         len(
+        #                                                                                             open_limit_up_codes),
+        #                                                                                         shsz=True)
         record_shsz_rank, record_shsz_rank_codes = kpl_block_util.get_code_record_rank(code, block,
                                                                                        limit_up_record_datas,
                                                                                        code_limit_up_reason_dict,
                                                                                        yesterday_current_limit_up_codes,
                                                                                        shsz=True)
 
-        if open_limit_up_codes:
-            # 涓绘澘寮�1
-            if current_shsz_rank < len(open_limit_up_codes) + 1 and record_shsz_rank < len(open_limit_up_codes) + 2:
-                # 灞炰簬榫�1,榫�2
-                return True, f"{tool.get_now_time_str()} {block}锛歵op10娑ㄥ仠鏉垮潡锛屼富鏉垮紑1({open_limit_up_codes}),灞炰簬涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}(瀹炴椂韬綅-{current_shsz_rank}:{front_current_shsz_rank_codes}/{len(current_limit_up_datas)})"
-            else:
-                if record_shsz_rank >= len(open_limit_up_codes) + 1:
-                    cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}")
-                return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛屼富鏉垮紑1锛坽open_limit_up_codes}锛�,涓嶄负涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�"
+        if record_shsz_rank < len(open_limit_up_codes) + max_rank:
+            return True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{record_shsz_rank_codes}"
         else:
-            if current_shsz_rank == 0 and record_shsz_rank < 2:
-                return True, f"{tool.get_now_time_str()} {block}锛歵op4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1锛屽睘浜庨緳1锛屽疄鏃舵定鍋滃垪琛ㄦ暟閲�({len(current_limit_up_datas)})"
-            else:
-                if record_shsz_rank >= 2:
-                    cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}")
+            return True, False, f"銆恵block}銆戝墠鎺掍唬鐮侊細{record_shsz_rank_codes} 瓒呰繃{len(open_limit_up_codes) + max_rank}涓�"
 
-                return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1,涓嶄负涓绘澘榫�1锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�"
+        # 杩囨椂鐨勪唬鐮�
+        # if open_limit_up_codes:
+        #     # 涓绘澘寮�1
+        #     if current_shsz_rank < len(open_limit_up_codes) + 1 and record_shsz_rank < len(open_limit_up_codes) + 2:
+        #         # 灞炰簬榫�1,榫�2
+        #         return True, f"{tool.get_now_time_str()} {block}锛歵op10娑ㄥ仠鏉垮潡锛屼富鏉垮紑1({open_limit_up_codes}),灞炰簬涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}(瀹炴椂韬綅-{current_shsz_rank}:{front_current_shsz_rank_codes}/{len(current_limit_up_datas)})"
+        #     else:
+        #         if record_shsz_rank >= len(open_limit_up_codes) + 1:
+        #             cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}")
+        #         return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛屼富鏉垮紑1锛坽open_limit_up_codes}锛�,涓嶄负涓绘澘鍓嶉緳{len(open_limit_up_codes) + 1}锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�"
+        # else:
+        #     if current_shsz_rank == 0 and record_shsz_rank < 2:
+        #         return True, f"{tool.get_now_time_str()} {block}锛歵op4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1锛屽睘浜庨緳1锛屽疄鏃舵定鍋滃垪琛ㄦ暟閲�({len(current_limit_up_datas)})"
+        #     else:
+        #         if record_shsz_rank >= 2:
+        #             cls.__remove_from_l2(code, f"{code}鏍规嵁韬綅绂佹涔板叆锛氥�恵block}銆戝巻鍙茶韩浣峽record_shsz_rank}")
+        #
+        #         return False, f"鏉垮潡-{block}: top4娑ㄥ仠鏉垮潡锛岄潪涓绘澘寮�1,涓嶄负涓绘澘榫�1锛堝疄鏃惰韩浣�-{current_shsz_rank}:{front_current_shsz_rank_codes},鍘嗗彶韬綅-{record_shsz_rank}锛�"
 
     # 鑾峰彇鍙互涔扮殑鏉垮潡
     # current_limit_up_datas: 浠婃棩瀹炴椂娑ㄥ仠
@@ -516,9 +544,11 @@
     # limit_up_record_datas锛氫粖鏃ュ巻鍙叉定鍋�
     # yesterday_current_limit_up_codes 锛� 鏄ㄦ棩娑ㄥ仠浠g爜
     # before_blocks_dict锛氬巻鍙叉定鍋滃師鍥�
+    # 杩斿洖鏉垮潡鐨勮绠楃粨鏋淸(鏉垮潡鍚嶇О,鏄惁鍙拱,鏄惁鏄嫭鑻�,淇℃伅)]
+
     @classmethod
     def get_can_buy_block(cls, code, current_limit_up_datas, limit_up_record_datas, yesterday_current_limit_up_codes,
-                          before_blocks_dict):
+                          before_blocks_dict, current_limit_up_block_codes_dict):
         # 鍔犺浇娑ㄥ仠浠g爜鐨勭洰鏍囨澘鍧�
         def load_code_block():
             if limit_up_record_datas:
@@ -550,63 +580,58 @@
         # log.logger_kpl_debug.info("{}鏈�缁堝叧閿瘝锛歿}", code, keys)
 
         # 娑ㄥ仠鍒楄〃涓尮閰嶅叧閿瘝锛岃繑鍥烇紙鏉垮潡:浠g爜闆嗗悎锛夛紝浠g爜闆嗗悎涓凡缁忔帓闄よ嚜韬�
+
+        fresults = []
         if not keys:
-            return None, "灏氭湭鎵惧埌娑ㄥ仠鍘熷洜"
+            return fresults
         code_limit_up_reason_dict = {}
         load_code_block()
-        msg_list = []
-
-        can_buy_blocks = []
         for block in keys:
-
-            can_buy, msg = cls.__is_block_can_buy(code, block, current_limit_up_datas, code_limit_up_reason_dict,
-                                                  yesterday_current_limit_up_codes, limit_up_record_datas)
-            if can_buy:
-                can_buy_blocks.append((block, msg))
-            else:
-                msg_list.append(msg)
-        if len(can_buy_blocks) == len(keys):
-            blocks = [x[0] for x in can_buy_blocks]
-            blocks_msg = "\n".join([x[1] for x in can_buy_blocks])
-            return blocks, blocks_msg
-
-        return None, "\n".join(msg_list)
+            can_buy, unique, msg = cls.__is_block_can_buy(code, block, current_limit_up_datas,
+                                                          code_limit_up_reason_dict,
+                                                          yesterday_current_limit_up_codes, limit_up_record_datas,
+                                                          current_limit_up_block_codes_dict)
+            fresults.append((block, can_buy, unique, msg))
+        return fresults
 
     # 鏄惁鍙互涓嬪崟
     # 杩斿洖锛氭槸鍚﹀彲浠ヤ笅鍗�,娑堟伅,鏉垮潡绫诲瀷
     @classmethod
     def can_buy(cls, code):
         if constant.TEST:
-            return True, cls.BLOCK_TYPE_NONE
+            return ["娴嬭瘯"], True, cls.BLOCK_TYPE_NONE
         # if True:
         #     # 娴嬭瘯
         #     return True, "涓嶅垽鏂澘鍧楄韩浣�"
         return cls.__can_buy_compute_result_dict.get(code)
 
+    # 杩斿洖:(鍙互涔扮殑鏉垮潡鍒楄〃, 鏄惁鏄嫭鑻�, 娑堟伅绠�浠�)
     @classmethod
     def __compute_can_buy_blocks(cls, code, current_limit_up_datas, limit_up_record_datas,
-                                 yesterday_current_limit_up_codes, before_blocks_dict):
-
-        blocks, block_msg = cls.get_can_buy_block(code, current_limit_up_datas,
-                                                  limit_up_record_datas, yesterday_current_limit_up_codes,
-                                                  before_blocks_dict)
-        if not blocks:
-            return False, block_msg
+                                 yesterday_current_limit_up_codes, before_blocks_dict,
+                                 current_limit_up_block_codes_dict):
+        blocks_compute_results = cls.get_can_buy_block(code, current_limit_up_datas,
+                                                       limit_up_record_datas, yesterday_current_limit_up_codes,
+                                                       before_blocks_dict, current_limit_up_block_codes_dict)
+        if not blocks_compute_results:
+            return False, True, "娌℃湁鎵惧埌鏉垮潡"
         codes_delegate = set(cls.__CodesTradeStateManager.get_codes_by_trade_states_cache(
             {trade_manager.TRADE_STATE_BUY_DELEGATED, trade_manager.TRADE_STATE_BUY_PLACE_ORDER}))
         codes_success = set(cls.__CodesTradeStateManager.get_codes_by_trade_states_cache(
             {trade_manager.TRADE_STATE_BUY_SUCCESS}))
-
         codes = codes_delegate | codes_success
-
         # 缁熻鎴愪氦浠g爜鐨勬澘鍧�
         trade_codes_blocks_dict = {}
         # 宸茬粡鎴愪氦鐨勬澘鍧�
         trade_success_blocks_count = {}
+        trade_delegate_blocks_count = {}
         for c in codes:
             keys_, k1_, k11_, k2_, k3_, k4_ = cls.__TargetCodePlateKeyManager.get_plate_keys(c)
-            # 瀹炴椂娑ㄥ仠鍘熷洜
-            trade_codes_blocks_dict[c] = k1_ | k4_
+            # 瀹炴椂娑ㄥ仠鍘熷洜 + 鎺ㄨ崘鍘熷洜
+            if not k1_:
+                trade_codes_blocks_dict[c] = k4_
+            else:
+                trade_codes_blocks_dict[c] = k1_
         # 缁熻鏉垮潡涓殑浠g爜
         trade_block_codes_dict = {}
         for c in trade_codes_blocks_dict:
@@ -615,71 +640,50 @@
                     if b not in trade_success_blocks_count:
                         trade_success_blocks_count[b] = set()
                     trade_success_blocks_count[b].add(c)
+                if c in codes_delegate:
+                    if b not in trade_delegate_blocks_count:
+                        trade_delegate_blocks_count[b] = set()
+                    trade_delegate_blocks_count[b].add(c)
+
                 if b not in trade_block_codes_dict:
                     trade_block_codes_dict[b] = set()
                 trade_block_codes_dict[b].add(c)
 
         # ---------------------------------鍔犺浇宸茬粡涓嬪崟/鎴愪氦鐨勪唬鐮佷俊鎭�------------end-------------
-        msg_list = []
-        for key in blocks:
-            # 鏉垮潡涓凡缁忔湁鎴愪氦鐨勫氨涓嶄笅鍗曚簡
-            if key in trade_success_blocks_count:
-                success_codes_count = len(trade_success_blocks_count[key])
-                if success_codes_count >= 1:
-                    msg_list.append(f"銆恵key}銆戜腑宸茬粡鏈墈success_codes_count}涓垚浜や唬鐮�")
-                    log.logger_kpl_debug.debug(f"{code}锛氭澘鍧楋紙{key}锛夊凡缁忔湁鎴愪氦銆恵trade_success_blocks_count[key]}銆�")
-                    continue
-            return True, block_msg
 
-        return False, ",".join(msg_list)
+        #
+        can_buy_blocks = []
+        unique_count = 0
+        msg_list = []
+        for r in blocks_compute_results:
+            # r鐨勬暟鎹粨鏋�(鏉垮潡,鏄惁鍙互涔�,鏄惁鐙嫍,娑堟伅)
+            if r[2]:
+                unique_count += 1
+            if r[1]:
+                if r[0] in trade_success_blocks_count and len(trade_success_blocks_count[r[0]]) > 0:
+                    msg_list.append(f"銆恵r[0]}銆戞湁鎴愪氦浠g爜锛歿trade_success_blocks_count[r[0]]}")
+                    continue
+                if r[0] in trade_delegate_blocks_count and len(trade_delegate_blocks_count[r[0]]) >= 2:
+                    msg_list.append(f"銆恵r[0]}銆戝凡鎸傚崟锛歿trade_delegate_blocks_count[r[0]]}")
+                    continue
+                can_buy_blocks.append(r[0])
+                msg_list.append(r[3])
+        # 鎵�鏈夋澘鍧楅兘鏄嫭鑻�
+        if unique_count == len(blocks_compute_results):
+            return can_buy_blocks, True, ",".join(msg_list)
+        return can_buy_blocks, False, ",".join(msg_list)
 
     # 鏇存柊浠g爜鏉垮潡鍒ゆ柇鏄惁鍙互涔扮殑缁撴灉
     @classmethod
     def update_can_buy_blocks(cls, code, current_limit_up_datas, limit_up_record_datas,
                               yesterday_current_limit_up_codes,
-                              before_blocks_dict):
-        can_buy, msg = cls.__compute_can_buy_blocks(code, current_limit_up_datas, limit_up_record_datas,
-                                                    yesterday_current_limit_up_codes,
-                                                    before_blocks_dict)
+                              before_blocks_dict, current_limit_up_block_codes_dict):
+        can_buy_blocks, unique, msg = cls.__compute_can_buy_blocks(code, current_limit_up_datas, limit_up_record_datas,
+                                                                   yesterday_current_limit_up_codes,
+                                                                   before_blocks_dict,
+                                                                   current_limit_up_block_codes_dict)
         # 淇濆瓨鏉垮潡璁$畻缁撴灉
-        cls.__can_buy_compute_result_dict[code] = (can_buy, msg)
-
-    # 鍒ゆ柇鏄惁涓虹湡鑰佸ぇ
-    @classmethod
-    def __is_real_first_limit_up(cls, code, block, current_limit_up_datas, limit_up_record_datas,
-                                 yesterday_current_limit_up_codes,
-                                 before_blocks_dict):
-        # 鍔犺浇娑ㄥ仠浠g爜鐨勭洰鏍囨澘鍧�
-        def load_code_block():
-            if limit_up_record_datas:
-                for d in limit_up_record_datas:
-                    if d[2] in constant.KPL_INVALID_BLOCKS and d[3] in before_blocks_dict:
-                        code_limit_up_reason_dict[d[3]] = list(before_blocks_dict.get(d[3]))[0]
-                    else:
-                        code_limit_up_reason_dict[d[3]] = d[2]
-            return code_limit_up_reason_dict
-
-        if current_limit_up_datas is None:
-            current_limit_up_datas = []
-        if limit_up_record_datas is None:
-            limit_up_record_datas = []
-        code_limit_up_reason_dict = {}
-        load_code_block()
-        can_buy, msg = cls.__is_block_can_buy(code, block, current_limit_up_datas, code_limit_up_reason_dict,
-                                              yesterday_current_limit_up_codes, limit_up_record_datas)
-        return can_buy, msg
-
-    @classmethod
-    def is_need_cancel(cls, code, limit_up_reason, current_limit_up_datas, limit_up_record_datas,
-                       yesterday_current_limit_up_codes,
-                       before_blocks_dict):
-        can_buy, msg = cls.__is_real_first_limit_up(code, limit_up_reason, current_limit_up_datas,
-                                                    limit_up_record_datas,
-                                                    yesterday_current_limit_up_codes,
-                                                    before_blocks_dict)
-        if not can_buy:
-            logger_kpl_block_can_buy.warning(f"{code} 鏍规嵁娑ㄥ仠鍘熷洜锛坽limit_up_reason}锛夊尮閰嶄笉鑳戒拱")
-        return not can_buy
+        cls.__can_buy_compute_result_dict[code] = (can_buy_blocks, unique, msg)
 
 
 if __name__ == "__main__":

--
Gitblit v1.8.0