| 
					
				 | 
			
			
				@@ -4,6 +4,18 @@ from urllib.parse import quote_plus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from utils.log import log 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+provinces = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "北京市", "天津市", "上海市", "重庆市", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "河北省", "山西省", "辽宁省", "吉林省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "黑龙江省", "江苏省", "浙江省", "安徽省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "福建省", "江西省", "山东省", "河南省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "湖北省", "湖南省", "广东省", "海南省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "四川省", "贵州省", "云南省", "陕西省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "甘肃省", "青海省", "台湾省", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "内蒙古自治区", "广西壮族自治区", "西藏自治区", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "宁夏回族自治区", "新疆维吾尔自治区" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # 数据库配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 DB_CONFIG = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     'host': '10.130.75.149', 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -257,12 +269,142 @@ def _update_shandong_new_yoy(prov_name): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log.info(f"{prov_name} 新数据更新数: {result.rowcount}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return result.rowcount 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def update_january_yoy_origin(region_name): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    更新指定省份1月份同比数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    :param region_name: 省份名称,默认为福建省 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    update_sql = text(""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      UPDATE t_yujin_crossborder_region_trade AS curr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          INNER JOIN t_yujin_crossborder_region_trade AS prev 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      ON curr.region_code = prev.region_code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          AND prev.year_month = DATE_FORMAT( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          DATE_SUB( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          STR_TO_DATE(CONCAT(curr.year_month, '-01'), '%Y-%m-%d'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          INTERVAL 1 YEAR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          '%Y-01' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          SET 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              curr.ytd_total = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ROUND( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              (curr.monthly_total - prev.monthly_total) / NULLIF (prev.monthly_total, 0) * 100, 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ), 0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ), curr.ytd_import = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ROUND( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              (curr.monthly_import - prev.monthly_import) / NULLIF (prev.monthly_import, 0) * 100, 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ), 0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ), curr.ytd_export = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ROUND( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              (curr.monthly_export - prev.monthly_export) / NULLIF (prev.monthly_export, 0) * 100, 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ), 0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      WHERE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          curr.region_name = :region_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        AND curr.year_month LIKE '%-01' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        AND curr.year_month 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          > '2023-01' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      """) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with engine.begin() as conn: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result = conn.execute(update_sql, {'region_name': region_name}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(f"Updated {result.rowcount} rows for {region_name}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result.rowcount 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info(f"Update failed: {str(e)}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise RuntimeError(f"同比数据更新失败: {str(e)}") from e 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def clear_old_shandong_yoy_origin(region_name): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    清理山东省2024年前数据的同比指标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    clear_sql = text(""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     UPDATE t_yujin_crossborder_region_trade 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     SET ytd_total = 0.0000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         ytd_export        = 0.0000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         ytd_import        = 0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     WHERE region_name = :region_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       AND `year_month` < '2024-01' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       AND (ytd_total != 0  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           OR ytd_export != 0  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           OR ytd_import != 0) -- 优化:仅更新非零记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     """) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with engine.begin() as conn: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result = conn.execute(clear_sql, {'region_name': region_name}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(f"{region_name} 旧数据清零记录数: {result.rowcount}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result.rowcount 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info(f"旧数据清零失败: {str(e)}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def update_shandong_yoy_origin(region_name): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    完整更新山东省同比数据(包含新旧数据处理) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 步骤1:清理旧数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cleared = clear_old_shandong_yoy_origin(region_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 步骤2:计算新数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        updated = _update_shandong_new_yoy_origin(region_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info(f"{region_name} 同比处理完成 | 清零:{cleared} 更新:{updated}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'cleared': cleared, 'updated': updated} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("{region_name} 数据处理失败", exc_info=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def _update_shandong_new_yoy_origin(region_name): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    处理2024年及之后的山东省数据(内部方法) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    update_sql = text("""UPDATE t_yujin_crossborder_region_trade AS curr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                INNER JOIN t_yujin_crossborder_region_trade AS prev 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ON curr.region_code = prev.region_code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                AND prev.year_month = DATE_FORMAT( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    DATE_SUB( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        STR_TO_DATE(CONCAT(curr.year_month, '-01'), '%Y-%m-%d'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        INTERVAL 1 YEAR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    '%Y-%m' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            SET 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                curr.ytd_total = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    TRUNCATE((curr.monthly_total - prev.monthly_total) / NULLIF (prev.monthly_total, 0) * 100, 4), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                curr.ytd_import = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    TRUNCATE((curr.monthly_import - prev.monthly_import) / NULLIF (prev.monthly_import, 0) * 100, 4), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                curr.ytd_export = COALESCE ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    TRUNCATE((curr.monthly_export - prev.monthly_export) / NULLIF (prev.monthly_export, 0) * 100, 4), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    0.0000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            WHERE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                curr.region_name = :region_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              AND curr.year_month >= '2024-01' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              AND prev.monthly_total IS NOT NULL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        """) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with engine.begin() as conn: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = conn.execute(update_sql, {'region_name': region_name}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info(f"{region_name} 新数据更新数: {result.rowcount}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result.rowcount 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 if __name__ == '__main__': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    check_year, check_month = 2024, 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    count = get_code_exist(f'{check_year}-{check_month:02d}', "340000") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print(count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # check_year, check_month = 2024, 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # count = get_code_exist(f'{check_year}-{check_month:02d}', "340000") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # print(count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # update_january_yoy('浙江省') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # update_shandong_yoy('浙江省') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # log.info("同比sql处理完成") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for province in provinces: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        update_january_yoy_origin(province) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        update_shandong_yoy_origin(province) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.info("同比sql处理完成") 
			 |