From 806e1c7b2296bf615faeddb5a78512ef61b52389 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 22 八月 2025 18:20:21 +0800
Subject: [PATCH] 测试资金明细

---
 servers/data_server.py |  466 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 439 insertions(+), 27 deletions(-)

diff --git a/servers/data_server.py b/servers/data_server.py
index 20f1638..87025d5 100644
--- a/servers/data_server.py
+++ b/servers/data_server.py
@@ -8,24 +8,37 @@
 import dask
 import requests
 
-from code_attribute.gpcode_manager import BlackListCodeManager
+import constant
+import inited_data
+from api import low_suction_data_pusher
+from code_attribute.code_l1_data_manager import L1DataManager
+from code_attribute.gpcode_manager import BlackListCodeManager, HumanRemoveForbiddenManager, CodePrePriceManager, \
+    HumanForbiddenManager
+from l2.code_price_manager import CurrentPriceManager
 from l2.huaxin import huaxin_target_codes_manager
 from l2.l2_transaction_data_manager import HuaXinBuyOrderManager
-from log_module.log import logger_system, logger_debug, logger_kpl_limit_up, logger_request_api
+from l2.l2_transaction_data_processor import HuaXinTransactionDatasProcessor
+from log_module.log import logger_system, logger_debug, logger_kpl_limit_up, logger_request_api, \
+    logger_kpl_market_strong, logger_kpl_new_blocks
 from third_data.custom_block_in_money_manager import CodeInMoneyManager
 from third_data.kpl_data_constant import LimitUpCodesBlockRecordManager, LimitUpDataConstant, \
     ContainsLimitupCodesBlocksManager
 from third_data.kpl_limit_up_data_manager import LatestLimitUpBlockManager, CodeLimitUpSequenceManager
 from third_data.third_blocks_manager import BlockMapManager
-from trade.buy_radical import radical_buy_data_manager
+from trade.buy_radical import radical_buy_data_manager, new_block_processor
 from trade.buy_radical.block_special_codes_manager import BlockSpecialCodesManager
+from trade.buy_radical.new_block_processor import BeforeBlocksComputer
 from trade.buy_strategy import OpenLimitUpGoodBlocksBuyStrategy
 from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager
-from utils import global_util, tool, data_export_util
-from code_attribute import gpcode_manager
+from trade.huaxin import huaxin_trade_record_manager
+from trade.order_statistic import DealAndDelegateWithBuyModeDataManager
+from trade.trade_data_manager import RadicalBuyDealCodesManager
+from utils import global_util, tool, data_export_util, init_data_util, huaxin_util
+from code_attribute import gpcode_manager, code_nature_analyse, code_volumn_manager
 from log_module import log_analyse, log_export, async_log_util
 from l2 import code_price_manager, l2_data_util, transaction_progress
-from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager
+from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager, \
+    CancelRateHumanSettingManager, LCancelBigNumComputer
 from output.limit_up_data_filter import IgnoreCodeManager
 from third_data import kpl_util, kpl_data_manager, kpl_api, block_info
 from third_data.code_plate_key_manager import RealTimeKplMarketData, KPLPlateForbiddenManager
@@ -52,7 +65,6 @@
     __IgnoreCodeManager = IgnoreCodeManager()
     __KPLPlatManager = KPLPlatManager()
     __KPLCodeLimitUpReasonManager = KPLCodeLimitUpReasonManager()
-    __KPLPlateForbiddenManager = KPLPlateForbiddenManager()
     # 鍘嗗彶鏉垮潡
     __history_plates_dict = {}
     # 鏉垮潡
@@ -62,6 +74,8 @@
     __industry_cache_dict = {}
     __latest_limit_up_codes_set = set()
     __data_process_thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=10)
+    # 鏂伴鏉愯姹�
+    __new_blocks_codes_request_thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=5)
     # 浠g爜鐨勬定骞�
     __code_limit_rate_dict = {}
 
@@ -75,6 +89,8 @@
         records = LimitUpDataConstant.history_limit_up_datas
         if not currents:
             currents = self.__kplDataManager.get_data(KPLDataType.LIMIT_UP)
+        if currents is None:
+            currents = []
         # 鑾峰彇鍘嗗彶娑ㄥ仠
         if not records:
             KPLLimitUpDataRecordManager.load_total_datas()
@@ -321,6 +337,7 @@
                 date = ps_dict.get('date')
                 time_str = ps_dict.get('time')
                 end_index = ps_dict.get('end_index')
+                fast = ps_dict.get('fast', 0)
                 if end_index:
                     end_index = int(end_index)
                 total_datas = l2_data_util.local_today_datas.get(code)
@@ -330,14 +347,30 @@
                     total_datas = None
                 else:
                     date = tool.get_now_date_str()
-                delegate_datas = data_export_util.get_l2_datas(code, total_datas, date=date, end_index=end_index)
-                transaction_datas = data_export_util.get_l2_transaction_datas(code, date=date)
+                delegate_datas = data_export_util.get_l2_datas(code, total_datas, date=date, end_index=end_index,
+                                                               fast_mode=int(fast))
                 code_name = gpcode_manager.get_code_name(code)
                 response_data = json.dumps({"code": 0, "data": {"code": code, "code_name": code_name,
                                                                 "data": {"delegates": delegate_datas,
+                                                                         "transactions": []}}})
+            except Exception as e:
+                logger_debug.exception(e)
+        elif url.path == "/get_l2_datas_of_sell_orders":
+            try:
+                # 鑾峰彇L2鍗栧崟鏁版嵁
+                ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
+                code = ps_dict['code']
+                date = ps_dict.get('date')
+                if not date:
+                    date = tool.get_now_date_str()
+                transaction_datas = data_export_util.get_l2_transaction_datas(code, date=date)
+                code_name = gpcode_manager.get_code_name(code)
+                response_data = json.dumps({"code": 0, "data": {"code": code, "code_name": code_name,
+                                                                "data": {"delegates": [],
                                                                          "transactions": transaction_datas}}})
             except Exception as e:
                 logger_debug.exception(e)
+
         elif url.path == "/get_trade_progress":
             # 鑾峰彇浜ゆ槗杩涘害
             ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
@@ -436,7 +469,7 @@
                 # 绮鹃�夛紝涓诲姏鍑�棰濋『搴�
                 result = kpl_api.getMarketJingXuanRealRankingInfo(False)
                 result = kpl_util.parseMarketJingXuan(result)
-            forbidden_plates = self.__KPLPlateForbiddenManager.list_all()
+            forbidden_plates = KPLPlateForbiddenManager().list_all()
             fresult = []
             for d in result:
                 if type_ == 2 or type_ == 3:
@@ -454,11 +487,30 @@
             self.__IgnoreCodeManager.ignore_code(type_, code)
             response_data = json.dumps({"code": 0})
         elif url.path == "/kpl/forbidden_plate":
+            # 娣诲姞涓嶈兘涔扮殑鏉垮潡
             ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
             plate = ps_dict["plate"]
             # 鍔犲叆绂佹
-            self.__KPLPlateForbiddenManager.save_plate(plate)
+            KPLPlateForbiddenManager().save_plate(plate)
             response_data = json.dumps({"code": 0})
+        elif url.path == "/kpl/del_forbidden_plate":
+            # 鍒犻櫎涓嶈兘涔扮殑鏉垮潡
+            ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
+            plate = ps_dict["plate"]
+            # 鍔犲叆绂佹
+            KPLPlateForbiddenManager().delete_plate(plate)
+            response_data = json.dumps({"code": 0})
+        elif url.path == "/kpl/list_forbidden_plate":
+            # 涓嶈兘涔扮殑鏉垮潡鍒楄〃
+            results = KPLPlateForbiddenManager().list_all_cache()
+            response_data = json.dumps({"code": 0, "data": list(results)})
+        elif url.path == "/kpl/list_deleted_forbidden_plate":
+            # 鑾峰彇宸茬粡鍒犻櫎鐨勬澘鍧�
+            results = KPLPlateForbiddenManager().list_all_deleted_cache()
+            if results:
+                results -= KPLPlateForbiddenManager().list_all_cache()
+            response_data = json.dumps({"code": 0, "data": list(results)})
+
         elif url.path == "/kpl/get_plate_codes":
             # 鑾峰彇娑ㄥ仠鍘熷洜涓嬮潰鐨勪唬鐮�
             ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
@@ -574,7 +626,15 @@
                         code_info[0]) != trade_constant.TRADE_STATE_NOT_TRADE:
                     code_info[5] = 1
 
-            response_data = json.dumps({"code": 0, "data": codes_info})
+            # 娑ㄥ仠鏁版嵁
+            fdatas = {"limit_up_list": codes_info}
+            # 杈ㄨ瘑搴︾エ
+            fdatas["speical_codes"] = [(x, gpcode_manager.get_code_name(x)) for x in special_codes]
+            forbidden_refer_codes = KPLPlateForbiddenManager().get_watch_high_codes_by_block(plate)
+            if forbidden_refer_codes is None:
+                forbidden_refer_codes = set()
+            fdatas["forbidden_refer_codes"] = [(x, gpcode_manager.get_code_name(x)) for x in forbidden_refer_codes]
+            response_data = json.dumps({"code": 0, "data": fdatas})
         elif url.path == "/kpl/get_open_limit_up_count_rank":
             # 鑾峰彇鐐告澘娆℃暟鎺掕
             ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
@@ -776,7 +836,9 @@
                 deals_month = trade_data_manager.AccountMoneyManager().get_deal_count_info(start_date, end_date)
                 cost_month = sum([round(0.1 * x[1], 2) for x in delegates_month])
                 make_month = 0
-                make_month += 5 * deals_month[0][1] + 1 * deals_month[1][1] + 0 * deals_month[2][1]
+                make_month += max(1 * deals_month[0][1] if deals_month[0][1] else 0,
+                                  deals_month[0][2] * 1.854 / 10000 if deals_month[0][2] else 0) + 1 * deals_month[1][
+                                  1] + 0 * deals_month[2][1]
                 fdata["month_commission"] = round(make_month - cost_month, 2)
                 # 璁$畻褰撴棩鎵嬬画璐硅鎯�
                 delegates = trade_data_manager.AccountMoneyManager().get_delegated_count_info()
@@ -787,7 +849,7 @@
                 fdata["delegates"]["sell"] = delegates[3]
                 deals = trade_data_manager.AccountMoneyManager().get_deal_count_info()
                 fdata["deals"] = {}
-                fdata["deals"]["stock"] = {"count": deals[0][1], "price": 5, "money": round(5 * deals[0][1], 2)}
+                fdata["deals"]["stock"] = {"count": deals[0][1], "price": 1, "money": round(1 * deals[0][1], 2)}
                 fdata["deals"]["sh_cb"] = {"count": deals[1][1], "price": 1, "money": round(1 * deals[1][1], 2)}
                 fdata["deals"]["sz_cb"] = {"count": deals[2][1], "price": 0, "money": round(0 * deals[2][1], 2)}
                 fdata["commission"] = trade_data_manager.AccountMoneyManager().get_commission_cache()
@@ -893,30 +955,312 @@
         elif url.path == "/get_l2_subscript_codes":
             # 鑾峰彇L2璁㈤槄鐨勪唬鐮�
             ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
-            code = ps_dict.get('code')
+            single_code = ps_dict.get('code')
             fresults = []
             try:
-                if code:
-                    codes = [code]
+                if single_code:
+                    codes = [single_code]
                 else:
                     codes = huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.get_subscript_codes()
                 if codes:
+                    current_rate_dict = CurrentPriceManager.get_current_rate_dict()
+                    current_price_dict = CurrentPriceManager.get_current_price_dict()
                     for code in codes:
+                        deal_big_order_detail_info = None
                         try:
-                            # 鑾峰彇鎴愪氦澶у崟锛�(鍙傝�冨ぇ鍗曢噾棰�,宸叉垚浜ゅぇ鍗曢噾棰�,澶у崟瑕佹眰閲戦)
-                            th = BeforeSubDealBigOrderManager().get_big_order_threshold(code)
+                            # 鑾峰彇鎴愪氦澶у崟锛�(鍙傝�冨ぇ鍗曢噾棰�,宸叉垚浜ゅぇ鍗曢噾棰�,澶у崟瑕佹眰閲戦, 宸叉垚浜ゆ定鍋滀拱閲戦, 宸叉垚浜ゆ定鍋滃崠閲戦)
+                            th_temp_buy_info = BeforeSubDealBigOrderManager().get_temp_deal_big_order_threshold_info(
+                                code)
+                            th_buy, th_buy_default = BeforeSubDealBigOrderManager().get_big_order_threshold(code)
+                            try:
+                                th_sell = BeforeSubDealBigOrderManager().get_big_sell_order_threshold(code)
+                            except:
+                                th_sell = 0
+                            # (缂哄皯鐨勮祫閲�, 鍑�鎴愪氦閲戦, 瑕佹眰鐨勫ぇ鍗曢噾棰�, 璁$畻寰楀埌鐨勫ぇ鍗曢槇鍊奸噾棰�, 浜轰负璁剧疆鐨勫ぇ鍗�)
                             deal_big_money_info = radical_buy_data_manager.get_total_deal_big_order_info(
                                 code, gpcode_manager.get_limit_up_price_as_num(code))
-                            deal_big_order_info = (
-                                output_util.money_desc(th), output_util.money_desc(deal_big_money_info[1]),
-                                output_util.money_desc(deal_big_money_info[2]))
-                        except:
+                            if deal_big_money_info[1] == 0 and len(codes) == 1:
+                                # 鎬绘垚浜ら噾棰濅负0
+                                deal_big_money_info = list(deal_big_money_info)
+                                # 娌℃湁璁㈤槄L2浼氬嚭鐜版病鏈夊�肩殑鎯呭喌锛屽鏋滄定鍋滆繃灏辨媺鍙栦箣鍓嶇殑娑ㄥ仠涔�/鍗栧ぇ鍗�
+                                deal_big_orders_result = radical_buy_data_manager.request_deal_big_orders(code)
+                                if deal_big_orders_result:
+                                    buy_datas, sell_datas = deal_big_orders_result[0], deal_big_orders_result[1]
+                                    limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
+                                    limit_up_price_money_list = [x[0] for x in buy_datas if x[1] == limit_up_price]
+                                    if limit_up_price_money_list:
+                                        threshold_money = BeforeSubDealBigOrderManager().compute_re_limit_up_big_money_threshold(
+                                            limit_up_price_money_list)
+                                    else:
+                                        threshold_money = 299e4
+                                    logger_debug.info(f"{code}-涓存椂鍥炲皝鍧囧ぇ鍗曪細{threshold_money}")
+                                    # 璁剧疆涔板崟闃堝��
+                                    th_buy = threshold_money
+                                    buy_money = sum(limit_up_price_money_list)
+                                    sell_money = sum([x[0] for x in sell_datas if x[1] == limit_up_price])
+                                    # 娑ㄥ仠涔板噣鎴愪氦閲戦鍑�涔伴
+                                    deal_big_money_info[1] = buy_money - sell_money
+                                    # 瑕佹眰鐨勫ぇ鍗曠疮璁¢噾棰�
+                                    deal_big_money_info[
+                                        2] = radical_buy_data_manager.compute_total_deal_big_order_threshold_money(code,
+                                                                                                                   limit_up_price,
+                                                                                                                   threshold_money)
+                                    # logger_debug.info(f"{code}-绱澶у崟闃堝�硷細{deal_big_money_info[2]}")
+                                    # logger_debug.info(f"{code}闈炶闃呭ぇ鍗曪紝 buy_money-{buy_money}, sell_money-{sell_money}")
+
+                            big_money_rate = radical_buy_data_manager.TotalDealBigOrderInfoManager.get_big_order_rate(
+                                code)
+                            if not big_money_rate:
+                                big_money_rate = 0
+
+                            # 璁$畻娑ㄥ仠鎴愪氦澶у崟鍗犵疮璁″ぇ鍗曢槇鍊肩殑姣斾緥
+                            if deal_big_money_info:
+                                big_deal_rate_of_threashold_total_money = round(
+                                    deal_big_money_info[1] / deal_big_money_info[3], 2)
+                            else:
+                                big_deal_rate_of_threashold_total_money = 0
+
+                            # 澶у崟鎴愪氦淇℃伅
+                            deal_big_order_info = [
+                                (output_util.money_desc(th_temp_buy_info[0] if th_temp_buy_info else 0),  # 涓存椂涔板ぇ鍗曢槇鍊�
+                                 output_util.money_desc(th_buy),  # 涔板ぇ鍗曢槇鍊�
+                                 output_util.money_desc(th_sell),  # 鍗栧崟闃堝��
+                                 big_money_rate * 100,  # 澶у崟鎴愪氦姣�(鎴愪氦澶у崟鍗犳暣浣撴垚浜ら鐨勬瘮渚�)
+                                 big_deal_rate_of_threashold_total_money  # 娑ㄥ仠鎴愪氦澶у崟鍗犵疮璁″ぇ鍗曢槇鍊肩殑姣斾緥
+                                 ),
+                                # 娑ㄥ仠澶у崟鍑�涔板叆
+                                output_util.money_desc(deal_big_money_info[1]),
+                                # 绱鎬诲ぇ鍗曢槇鍊�
+                                output_util.money_desc(deal_big_money_info[2]),
+                                # 鍘熺疮璁″ぇ鍗曢槇鍊硷紙闈炰汉涓鸿缃級
+                                output_util.money_desc(deal_big_money_info[3]),
+                                # 浜轰负璁剧疆鐨勫ぇ鍗�, 鍘熷璁$畻鍊�
+                                (output_util.money_desc(deal_big_money_info[4]) if deal_big_money_info[4] else '',
+                                 output_util.money_desc(deal_big_money_info[5]) if deal_big_money_info[5] else '')
+                            ]
+                            if single_code:
+                                # 鍔犺浇澶у崟璇︽儏
+                                deal_big_order_detail_info = radical_buy_data_manager.get_l2_big_order_deal_info(code)
+                                # 鍔犺浇娑ㄥ仠澶у崟璇︽儏
+                                # 涔板ぇ鍗�, 涓婃澘鍓嶄拱澶у崟, 鍗栧ぇ鍗�, 涓婃澘鍓嶅崠澶у崟
+                                limit_up_big_order_detail = radical_buy_data_manager.get_total_detal_big_order_details(
+                                    code)
+                                # 绱娑ㄥ仠涔伴噾棰�
+                                buy_money = output_util.money_desc(
+                                    limit_up_big_order_detail[0] + limit_up_big_order_detail[1])
+                                sell_money = output_util.money_desc(
+                                    limit_up_big_order_detail[2] + limit_up_big_order_detail[3])
+                                deal_big_order_info.append(buy_money)
+                                # 绱娑ㄥ仠鍗栭噾棰�
+                                deal_big_order_info.append(sell_money)
+                                deal_big_order_info.append(
+                                    radical_buy_data_manager.TotalDealBigOrderInfoManager().get_big_order_rate(code))
+
+                        except Exception as e:
+                            logger_debug.error(f"鍙兘娌℃湁鑾峰彇鍒版定鍋滀环锛歿code}")
+                            if not gpcode_manager.get_limit_up_price(code):
+                                init_data_util.re_set_price_pre(code)
+                            logger_debug.exception(e)
                             deal_big_order_info = None
                         code_name = gpcode_manager.get_code_name(code)
-                        fresults.append((code, code_name, deal_big_order_info))
+
+                        # 0 - 涓嶅  1-鍗冲皢澶�  2-瓒冲
+                        big_order_enough_type = 0
+                        try:
+                            total_deal_big_order_result = radical_buy_data_manager.get_total_deal_big_order_info(code,
+                                                                                                                 gpcode_manager.get_limit_up_price_as_num(
+                                                                                                                     code))
+                            # 鍙栬姹傚ぇ鍗曠殑10%
+                            threshold_lack_money = int(round(total_deal_big_order_result[2] / 10))
+                            if total_deal_big_order_result:
+                                if total_deal_big_order_result[0] <= 0:
+                                    big_order_enough_type = 2
+                                elif total_deal_big_order_result[0] <= threshold_lack_money:
+                                    big_order_enough_type = 1
+                        except:
+                            pass
+                        try:
+                            is_limit_up = 1 if abs(
+                                current_price_dict.get(code, 0) - gpcode_manager.get_limit_up_price_as_num(
+                                    code)) < 0.001 else 0
+                        except:
+                            is_limit_up = 0
+                            pass
+
+                        # 鑾峰彇L鍚庝汉涓鸿缃殑鎾ゅ崟姣斾緥
+                        l_down_human_rate = None
+                        if single_code:
+                            # 鑾峰彇鎸傚崟
+                            try:
+                                current_delegates = huaxin_trade_record_manager.DelegateRecordManager().list_current_delegates()
+                                codes_set = set()
+                                if current_delegates:
+                                    for c in current_delegates:
+                                        if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy:
+                                            continue
+                                        codes_set.add(c["securityID"])
+                                if code not in codes_set:
+                                    # 娌℃湁鎸傚崟
+                                    l_down_human_rate = CancelRateHumanSettingManager().get_l_down(code)
+                            except:
+                                pass
+                        fresults.append(
+                            (code, code_name, deal_big_order_info, deal_big_order_detail_info, big_order_enough_type,
+                             current_rate_dict.get(code, 0), is_limit_up, l_down_human_rate))
                 response_data = json.dumps({"code": 0, "data": fresults})
-            except  Exception as e:
+            except Exception as e:
                 response_data = json.dumps({"code": 1, "data": str(1)})
+
+        elif url.path == "/get_all_special_codes":
+            # 鑾峰彇鎵�鏈夎鲸璇嗗害鐨勪唬鐮�
+            code_blocks_dict = BlockSpecialCodesManager().get_code_blocks_dict()
+            fdata = {}
+            for k in code_blocks_dict:
+                fdata[k] = list(code_blocks_dict[k])
+            response_data = json.dumps({"code": 0, "data": fdata})
+        elif url.path == "/get_new_blocks_special_codes":
+            # 鑾峰彇鎵�鏈夎鲸璇嗗害鐨勪唬鐮�
+            code_blocks_dict = BlockSpecialCodesManager().get_temp_code_blocks_dict()
+            fdata = {}
+            for k in code_blocks_dict:
+                fdata[k] = list(code_blocks_dict[k])
+            response_data = json.dumps({"code": 0, "data": fdata})
+        elif url.path == "/get_want_buy_detail_list":
+            # 鑾峰彇鎯充拱鍗曡缁嗕俊鎭�
+            try:
+                history_limit_up_datas = LimitUpDataConstant.history_limit_up_datas
+                codes = set()
+                if history_limit_up_datas:
+                    codes |= set([x[3] for x in history_limit_up_datas])
+                want_codes = gpcode_manager.WantBuyCodesManager().list_code_cache()
+                if want_codes:
+                    codes |= want_codes
+                # 鎷夊彇娑ㄥ仠鏃堕棿
+                # 鎷夊彇鏈�杩戞垚浜や俊鎭�
+                fdatas = []
+                yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
+                deal_codes = DealAndDelegateWithBuyModeDataManager().get_deal_codes()
+                for code in codes:
+                    try:
+                        if code in yesterday_codes:
+                            continue
+
+                        if l2_trade_util.is_in_forbidden_trade_codes(code) and code not in deal_codes:
+                            # 鎷夐粦浣嗘槸娌℃垚浜�
+                            continue
+
+                        # 浜轰负鎷夐粦鐨勯渶瑕佺Щ闄�
+                        if HumanForbiddenManager().is_in_cache(code):
+                            continue
+
+                        if not tool.is_can_buy_code(code):
+                            continue
+                        # (浠g爜,鍚嶇О,娑ㄥ仠鏃堕棿,娑ㄥ箙,鐜版墜,鑷敱甯傚��,鐜颁环)
+                        data = [code, gpcode_manager.get_code_name(code)]
+                        limit_up_time = LimitUpDataConstant.get_first_limit_up_time(code)
+                        limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
+                        data.append(limit_up_time)
+                        pre_close_price = CodePrePriceManager().get_price_pre_cache(code)
+                        latest_transaction_data = HuaXinTransactionDatasProcessor.get_latest_transaction_data(code)
+                        # 鑾峰彇L1鏁版嵁
+                        price = L1DataManager.get_l1_current_price(code)
+                        if price:
+                            data.append(round((price - pre_close_price) * 100 / pre_close_price, 2))
+                        else:
+                            data.append("--")
+                        zylt_volume = global_util.zylt_volume_map.get(code)
+                        if limit_up_price and zylt_volume:
+                            zyltgb = zylt_volume * limit_up_price
+                        else:
+                            zyltgb = None
+                        if latest_transaction_data:
+                            data.append(
+                                (latest_transaction_data[2] // 100,
+                                 latest_transaction_data[6] - latest_transaction_data[7]))
+                        else:
+                            data.append(("--", 0))
+                        data.append(output_util.money_desc(zyltgb) if zyltgb else '--')
+                        if price:
+                            data.append(price)
+                        else:
+                            data.append("--")
+                        # 鏄惁鏄兂涔板崟
+                        data.append(1 if code in want_codes else 0)
+                        # 鏄剧ず浠g爜鏉垮潡韬綅
+                        block_rank_info = None
+                        # 鑾峰彇褰撳墠鏉垮潡
+                        blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code)
+                        try:
+                            if limit_up_time:
+                                # 娑ㄥ仠杩囩殑鏁版嵁鎵嶆湁韬綅
+
+                                if blocks:
+                                    blocks_info = []
+                                    for b in blocks:
+                                        info = radical_buy_data_manager.RadicalBuyBlockManager.get_history_index(code,
+                                                                                                                 b,
+                                                                                                                 yesterday_codes)
+                                        blocks_info.append((b, info[0], info[2]))
+                                    max_info = max(blocks_info, key=lambda x: x[2])
+                                    block_rank_info = max_info
+                        except:
+                            pass
+                        # 鏉垮潡淇℃伅锛�(鏉垮潡韬綅, 鏈�鎬绘澘鍧�, 寮�鐩樺暒娑ㄥ仠鍘熷洜, 寮�鐩樺暒鎺ㄨ崘鍘熷洜)
+                        history_limit_up_data = LimitUpDataConstant.get_history_limit_up_data(code)
+                        data.append((block_rank_info, list(blocks) if blocks else [],
+                                     history_limit_up_data[2] if history_limit_up_data else '',
+                                     history_limit_up_data[6] if history_limit_up_data else ''))
+
+                        # 浜ゆ槗鐘舵�侊細
+                        trade_state = trade_manager.CodesTradeStateManager().get_trade_state(code)
+                        data.append(trade_state)
+                        # 鍙傝�冮噺淇℃伅
+                        refer_volume_info = code_volumn_manager.CodeVolumeManager().get_radical_buy_refer_volume_info(
+                            code, limit_up_price)
+                        if refer_volume_info:
+                            data.append(refer_volume_info[1])
+                        else:
+                            data.append("--")
+                        # L鍚庢挙鍗曟瘮渚�
+                        rate_info = LCancelRateManager.get_cancel_rate(code)
+                        if rate_info:
+                            data.append(rate_info[0])
+                        else:
+                            data.append("--")
+                        fdatas.append(data)
+                    except Exception as e1:
+                        logger_debug.exception(e1)
+                fdatas.sort(key=lambda x: x[2] if x[2] else time.time())
+                response_data = json.dumps({"code": 0, "data": fdatas})
+            except Exception as e:
+                logger_debug.exception(e)
+        elif url.path == "/get_l_down_watch_index_overview":
+            try:
+                ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
+                code = ps_dict.get('code')
+                # 澶у崟姒傝
+                l2_down_data = LCancelBigNumComputer().statistic_l_down_watch_indexes_of_big_order_info(code)
+                # total_big_order_info = LCancelBigNumComputer().statistic_total_big_order_info(code)
+                response_data = json.dumps({"code": 0, "data": l2_down_data})
+            except Exception as e:
+                logger_debug.exception(e)
+        elif url.path == "/get_all_delegate_list":
+            # 鑾峰彇鎵�鏈夌殑濮旀墭鍒楄〃
+            try:
+                ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()])
+                update_time = ps_dict.get('update_time')
+                if not update_time:
+                    update_time = 0
+                else:
+                    update_time = int(update_time)
+                record_dict = huaxin_trade_record_manager.DelegateRecordManager().get_all_delegate_records_dict()
+                datas = [v for k, v in record_dict.items() if v['localUpdateTime'] > update_time]
+                if datas:
+                    datas.sort(key=lambda x: x['insertTime'])
+                    update_time = max(datas, key=lambda x: x['localUpdateTime'])['localUpdateTime']
+                response_data = json.dumps({"code": 0, "data": {'list': datas, 'update_time': update_time}})
+            except Exception as e:
+                logger_debug.exception(e)
 
         async_log_util.info(logger_request_api, f"缁撴潫璇锋眰{tool.get_thread_id()}-{url}")
         self.send_response(200)
@@ -947,7 +1291,42 @@
             self.__send_response(result_str)
 
     def __process_kpl_data(self, data_origin):
+
         def do_limit_up(result_list_):
+
+            def request_new_blocks_codes(blocks_info, all_new_blocks):
+                """
+                璇锋眰鏂版澘鍧楃殑浠g爜
+                @param blocks_info:[(鏉垮潡鍚嶇О,鏉垮潡浠g爜)]
+                @return:
+                """
+                yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
+                blocks = set()
+                for bi in blocks_info:
+                    if bi[0] in blocks:
+                        continue
+                    blocks.add(bi[0])
+                    result = kpl_api.getCodesByPlate(bi[1])
+                    result = json.loads(result)
+                    code_info_list = []
+                    for d in result["list"]:
+                        if d[0] in yesterday_codes:
+                            continue
+                        # 娑ㄥ箙瑕佸ぇ浜�5%
+                        rate = d[6] / int(round((tool.get_limit_up_rate(d[0]) - 1) * 10))
+                        if rate / ((tool.get_limit_up_rate(d[0]) - 1) * 10) < 5:
+                            continue
+                        # 鏍煎紡锛�(浠g爜,娑ㄥ箙)
+                        code_info_list.append((d[0], d[6]))
+                    # 淇濆瓨鏂伴鏉�
+                    datas = [(d[0], d[6]) for d in result["list"]]
+                    async_log_util.info(logger_kpl_new_blocks, f"{(tool.get_thread_id(), bi, datas)}")
+                    if code_info_list:
+                        # 灏嗕唬鐮佸姞鍏ユ柊棰樻潗
+                        new_block_processor.process_new_block_by_component_codes(bi[0],
+                                                                                 set([x[0] for x in code_info_list]),
+                                                                                 all_new_blocks)
+
             try:
                 if result_list_:
                     # 淇濆瓨娑ㄥ仠鏃堕棿
@@ -1017,6 +1396,39 @@
                     try:
                         OpenLimitUpGoodBlocksBuyStrategy.set_current_limit_up_data(result_list_)
                         RadicalBuyBlockManager.set_current_limit_up_datas(result_list_)
+                    except:
+                        pass
+
+                    try:
+                        # 鏂伴鏉�
+                        new_block_processor.process_limit_up_list({x[0]: x[5] for x in result_list_})
+                        new_block_codes = new_block_processor.screen_new_blocks_with_limit_up_datas(
+                            [(x[0], x[5]) for x in result_list_])
+                        if new_block_codes:
+                            # 缁熻鏉垮潡鐨勪唬鐮�
+                            records = KPLLimitUpDataRecordManager.total_datas
+                            block_plate_code_dict = {}
+                            for x in records:
+                                block_plate_code_dict[kpl_util.filter_block(x[2])] = x[15]
+                            # 鏂版澘鍧�
+                            update_new_block_plates = []
+                            for b in new_block_codes:
+                                for c in new_block_codes[b]:
+                                    new_block_processor.process_new_block_by_limit_up_list(c, b)
+
+                            for r in new_block_codes:
+                                if r in block_plate_code_dict:
+                                    update_new_block_plates.append((r, block_plate_code_dict[r]))
+                            if update_new_block_plates:
+                                # 闇�瑕佽幏鍙栨澘鍧椾笅鐨勪唬鐮�
+                                self.__new_blocks_codes_request_thread_pool.submit(
+                                    lambda: request_new_blocks_codes(update_new_block_plates, new_block_codes.keys()))
+                    except Exception as e:
+                        logger_debug.exception(e)
+
+                    # 灏嗘暟鎹帹閫佽嚦鍏朵粬椤圭洰
+                    try:
+                        low_suction_data_pusher.push_limit_up_list(result_list_)
                     except:
                         pass
 
@@ -1099,11 +1511,10 @@
                 RealTimeKplMarketData.set_market_jingxuan_out_blocks(result_list)
         elif type_ == KPLDataType.MARKET_STRONG.value:
             strong = data["data"]
-            logger_debug.debug("寮�鐩樺暒甯傚満寮哄害锛歿}", strong)
+            logger_kpl_market_strong.info(strong)
             # 淇濆瓨甯傚満鐑害
             if strong is not None:
                 RealTimeKplMarketData.set_market_strong(strong)
-
         return json.dumps({"code": 0})
 
     def __send_response(self, data):
@@ -1144,3 +1555,4 @@
 
 if __name__ == "__main__":
     run("", 9004)
+    print("娴嬭瘯123123123")

--
Gitblit v1.8.0