Blame view

scripts/py/generate_november_customer_excel.py 4.71 KB
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
1
2
3
  #!/usr/bin/env python3
  # -*- coding: utf-8 -*-
  """
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
4
  生成202512月客户开单数据Excel文件
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  包含字段:客户档案号、姓名、注册时间、来源、开单业绩、时间、归属门店
  """
  
  import pymysql
  import pandas as pd
  from datetime import datetime
  import os
  
  # 数据库配置(从appsettings.json读取)
  DB_CONFIG = {
      'host': 'rm-2vccze142rc9a8f58bo.mysql.cn-chengdu.rds.aliyuncs.com',
      'port': 3306,
      'user': 'lvqiansql',
      'password': 'LvQ1@n!20251211',
      'database': 'lqerp_dev',
      'charset': 'utf8mb4'
  }
  
  def query_data():
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
24
      """查询2025年12月的客户开单数据"""
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
      connection = None
      try:
          connection = pymysql.connect(**DB_CONFIG)
          
          sql = """
          SELECT 
              COALESCE(kh.dah, '') AS 客户档案号,
              COALESCE(kh.khmc, '') AS 姓名,
              kh.zcsj AS 注册时间,
              COALESCE(kd.khly, '') AS 来源,
              CAST(kd.sfyj AS DECIMAL(18,2)) AS 开单业绩,
              kd.kdrq AS 时间,
              COALESCE(md.dm, '') AS 归属门店
          FROM lq_kd_kdjlb kd
          INNER JOIN lq_khxx kh ON kd.kdhy = kh.F_Id
          LEFT JOIN lq_mdxx md ON kh.gsmd = md.F_Id
          WHERE kd.F_IsEffective = 1
              AND kh.F_IsEffective = 1
              AND YEAR(kd.kdrq) = 2025
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
44
              AND MONTH(kd.kdrq) = 12
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
          ORDER BY kd.kdrq DESC
          """
          
          df = pd.read_sql(sql, connection)
          
          # 格式化时间字段
          if '注册时间' in df.columns:
              df['注册时间'] = pd.to_datetime(df['注册时间']).dt.strftime('%Y-%m-%d %H:%M:%S')
              df['注册时间'] = df['注册时间'].replace('NaT', '')
          
          if '时间' in df.columns:
              df['时间'] = pd.to_datetime(df['时间']).dt.strftime('%Y-%m-%d %H:%M:%S')
          
          # 确保开单业绩为数值类型
          df['开单业绩'] = pd.to_numeric(df['开单业绩'], errors='coerce').fillna(0)
          
          return df
          
      except Exception as e:
          print(f"查询数据时发生错误: {e}")
          raise
      finally:
          if connection:
              connection.close()
  
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
70
  def generate_excel(df, output_file='2025年12月客户开单数据.xlsx'):
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
      """生成Excel文件"""
      try:
          # 创建Excel写入器
          with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
              df.to_excel(writer, sheet_name='客户开单数据', index=False)
              
              # 获取工作表对象进行格式设置
              worksheet = writer.sheets['客户开单数据']
              
              # 设置列宽
              column_widths = {
                  'A': 20,  # 客户档案号
                  'B': 15,  # 姓名
                  'C': 20,  # 注册时间
                  'D': 15,  # 来源
                  'E': 15,  # 开单业绩
                  'F': 20,  # 时间
                  'G': 20   # 归属门店
              }
              
              for col, width in column_widths.items():
                  worksheet.column_dimensions[col].width = width
              
              # 设置表头样式
              from openpyxl.styles import Font, Alignment, PatternFill
              
              header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
              header_font = Font(bold=True, color='FFFFFF', size=11)
              
              for cell in worksheet[1]:
                  cell.fill = header_fill
                  cell.font = header_font
                  cell.alignment = Alignment(horizontal='center', vertical='center')
              
              # 设置数据对齐方式
              for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row):
                  for cell in row:
                      if cell.column_letter == 'E':  # 开单业绩列右对齐
                          cell.alignment = Alignment(horizontal='right', vertical='center')
                      else:
                          cell.alignment = Alignment(horizontal='left', vertical='center')
          
          print(f"Excel文件已生成: {output_file}")
          print(f"共 {len(df)} 条记录")
          return output_file
          
      except Exception as e:
          print(f"生成Excel文件时发生错误: {e}")
          raise
  
  def main():
      """主函数"""
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
123
      print("开始查询2025年12月客户开单数据...")
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
124
125
126
127
128
129
130
131
132
133
134
      df = query_data()
      
      if df.empty:
          print("未查询到数据")
          return
      
      print(f"查询到 {len(df)} 条记录")
      print("\n前5条数据预览:")
      print(df.head())
      
      # 生成Excel文件
a2653749   “wangming”   整理项目文件结构:将md、sh、p...
135
      output_file = f"2025年12月客户开单数据_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
104e4d2f   “wangming”   feat: 增强门店数据分析功能,...
136
137
138
139
140
141
      generate_excel(df, output_file)
      
      print(f"\n文件保存路径: {os.path.abspath(output_file)}")
  
  if __name__ == '__main__':
      main()