|
@@ -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处理完成")
|