Files
hzhub/hzhub-erp/fix_sql_final.py
大壮 c2513849b4 feat: 添加ERP服务和系统服务,完善员工门户功能
## 新增服务模块

### 1. ERP服务 (hzhub-erp)
- 新增独立的ERP数据适配服务
- 支持SQL Server 2008 R2数据源
- 提供动态API配置管理系统
- 包含客户管理、销售数据等业务接口

### 2. 系统服务 (hzhub-system)
- 新增独立的系统管理服务
- 用户、角色、权限、部门、菜单管理
- 租户管理、操作日志、在线用户监控
- 工作流引擎(warm-flow)集成
- 企业微信审批同步功能

### 3. API网关 (hzhub-gateway)
- 新增Spring Cloud Gateway网关服务
- JWT认证、路由分发、限流熔断
- XSS防护、请求日志记录
- 统一入口端口8080

## 后台管理功能增强

### ERP动态API管理
- 新增动态API配置管理界面
- API测试、文档预览、统计监控
- 错误日志查看、缓存管理
- 从数据库表自动导入API配置

### 系统管理增强
- 企业微信配置管理
- 企业微信审批同步配置
- 部门和用户管理优化

## 员工门户功能完善

### 业务页面
- 审批中心:工作流审批、待办任务
- CRM管理:客户关系管理
- 经销商管理:经销商数据展示
- 供应链管理:采购、库存、销售
- BI报表:数据可视化分析
- ERP数据探索:SQL Server数据查询

### 个人中心
- 基本设置:个人信息管理
- 安全设置:密码修改、登录日志
- 锁屏功能:自动锁屏、手动锁屏

### 其他功能
- 标签页管理:多标签页导航
- 页面缓存:keepAlive缓存机制
- 会话超时:自动检测并提示

## 经销商门户

### 页面路由
- 新增经销商管理页面路由
- AI聊天界面完善

## 文档更新

- ERP API数据库初始化指南
- ERP API前端完整实现文档
- ERP API测试和验证指南
- Gateway路由迁移计划
- 项目配置文档更新

## 部署脚本

- 统一启动/停止/重启脚本
- Docker Compose配置优化
- Nginx配置文件更新

## 技术栈

- 后端: Spring Boot 3.5.8, Java 17
- 前端: Vue 3, TypeScript, Element Plus, Vben Admin
- 工作流: warm-flow 1.8.2
- 网关: Spring Cloud Gateway
- 数据库: MySQL 8.0, SQL Server 2008 R2
- 缓存: Redis 7
- 向量库: Weaviate 1.25.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 08:00:19 +00:00

196 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
完整修复ERP动态API SQL模板 - 最终版本
使用实际存在的字段和正确的SQL语法
"""
import pymysql
import os
MYSQL_HOST = os.getenv('MYSQL_HOST', '192.168.120.60')
MYSQL_PORT = int(os.getenv('MYSQL_PORT', '3306'))
MYSQL_DB = os.getenv('MYSQL_DB', 'hzhub')
MYSQL_USER = os.getenv('MYSQL_USERNAME', 'root')
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD', 'hzhub123')
print(f"连接MySQL: {MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DB}")
conn = pymysql.connect(
host=MYSQL_HOST,
port=MYSQL_PORT,
database=MYSQL_DB,
user=MYSQL_USER,
password=MYSQL_PASSWORD,
charset='utf8mb4'
)
cursor = conn.cursor()
# 完整修复的SQL模板使用实际存在的字段
fixed_configs = {
1: { # api_id = 1 (客户列表查询) - 简化版本,不支持筛选
'api_name': '客户列表查询(基础版)',
'api_desc': '查询客户档案列表(基础分页查询,暂不支持筛选)',
'sql_template': '''
SELECT CLTCODE AS customerCode,
CLTNAME AS customerName,
COMPANY_ID AS companyCode,
COMPANY_NAME AS companyName,
BRAND AS brand,
BRANDNAME AS brandName,
LINKMAN AS contactName,
AREAID AS salesAreaCode,
AREANAME AS salesAreaName,
SALESID_T AS salesPersonCode,
SALESNAME_T AS salesPersonName,
TEL1 AS phone,
EMAIL AS email,
ISSTOP AS isStop
FROM SCLTGENERAL
''',
'result_type': 'LIST',
'support_pagination': 1,
},
2: { # api_id = 2 (客户详情查询)
'sql_template': '''
SELECT CLTCODE AS customerCode,
CLTNAME AS customerName,
COMPANY_ID AS companyCode,
COMPANY_NAME AS companyName,
BRAND AS brand,
BRANDNAME AS brandName,
LINKMAN AS contactName,
AREAID AS salesAreaCode,
AREANAME AS salesAreaName,
SALESID_T AS salesPersonCode,
SALESNAME_T AS salesPersonName,
SALEDOCID AS saleDocCode,
SALEDOCNAME AS saleDocName,
CLTPRICENO AS pricePlanCode,
CLTPRICENAME AS pricePlanName,
CLTTYPE AS customerType,
STREET AS address,
TEL1 AS phone,
EMAIL AS email,
SDORGID AS sdOrgCode,
SDORGNAME AS sdOrgName,
province,
city,
ISSTOP AS isStop
FROM SCLTGENERAL
WHERE CLTCODE = #{customerCode}
''',
},
3: { # api_id = 3 (销区列表) - 使用Customer表的AREAID字段
'api_name': '销区列表查询',
'api_desc': '从客户档案表提取销区列表',
'sql_template': '''
SELECT DISTINCT AREAID AS salesAreaCode,
AREANAME AS salesAreaName
FROM SCLTGENERAL
WHERE AREAID IS NOT NULL
AND AREANAME IS NOT NULL
ORDER BY AREAID
''',
'source_table': 'SCLTGENERAL',
'source_table_comment': '客户档案主表',
},
}
print("\n开始完整修复SQL模板...")
for api_id, updates in fixed_configs.items():
print(f"\n修复API ID {api_id}:")
# 构建UPDATE语句
update_fields = []
update_values = []
if 'api_name' in updates:
update_fields.append('api_name = %s')
update_values.append(updates['api_name'])
print(f" ✓ API名称: {updates['api_name']}")
if 'api_desc' in updates:
update_fields.append('api_desc = %s')
update_values.append(updates['api_desc'])
print(f" ✓ API描述: {updates['api_desc']}")
if 'sql_template' in updates:
update_fields.append('sql_template = %s')
update_values.append(updates['sql_template'].strip())
print(f" ✓ SQL模板已更新")
if 'source_table' in updates:
update_fields.append('source_table = %s')
update_values.append(updates['source_table'])
if 'source_table_comment' in updates:
update_fields.append('source_table_comment = %s')
update_values.append(updates['source_table_comment'])
# 添加更新时间
update_fields.append('update_time = NOW()')
# 执行UPDATE
sql = f"UPDATE erp_api_config SET {', '.join(update_fields)} WHERE api_id = %s"
cursor.execute(sql, update_values + [api_id])
conn.commit()
# 清理参数表api_id=1的客户列表参数太多简化
print("\n清理冗余参数...")
cursor.execute("DELETE FROM erp_api_param WHERE api_id = 1")
print(" ✓ 已清空客户列表的旧参数")
# 重新插入简化参数(只保留分页参数)
simplified_params = [
(1, 'pageNum', '页码', 'Integer', 'QUERY', 0, '1', 1),
(1, 'pageSize', '页大小', 'Integer', 'QUERY', 0, '10', 2),
]
for api_id, param_name, param_desc, param_type, param_position, is_required, default_value, sort in simplified_params:
cursor.execute("""
INSERT INTO erp_api_param (
api_id, param_name, param_desc, param_type,
param_position, is_required, default_value, sort,
create_time
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, NOW())
""", (api_id, param_name, param_desc, param_type, param_position, is_required, default_value, sort))
print(" ✓ 已插入2个简化参数分页参数")
conn.commit()
# 显示修复后的配置
print("\n验证修复结果:")
cursor.execute("""
SELECT api_id, api_name, api_path, result_type, support_pagination, source_table
FROM erp_api_config
ORDER BY api_id
""")
for row in cursor.fetchall():
api_id, name, path, result_type, pagination, source_table = row
print(f" [{api_id}] {name} - {path} ({result_type}, 分页={pagination}, 表={source_table or 'N/A'})")
# 统计参数
cursor.execute("SELECT api_id, COUNT(*) FROM erp_api_param GROUP BY api_id ORDER BY api_id")
params_count = cursor.fetchall()
print("\n参数统计:")
for api_id, count in params_count:
print(f" API {api_id}: {count}个参数")
cursor.close()
conn.close()
print("\n✅ ERP动态API完整修复完成")
print("\n下一步测试:")
print(" 1. 重启ERP服务SQL模板已更新立即生效")
print(" 2. 测试所有API:")
print(" curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/brands'")
print(" curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/sales-areas'")
print(" curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/list?pageNum=1&pageSize=10'")
print(" curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/detail?customerCode=C00001'")
print(" 3. 验证前端管理界面:")
print(" http://192.168.120.60:5666/erp/api")