2025-12-20 16:53:57 +08:00
|
|
|
|
# 许可管理单位权限优化 - 部署指南
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 第一步:执行数据库迁移
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 进入项目目录
|
|
|
|
|
|
cd /path/to/市监局-lawRisk-backend
|
|
|
|
|
|
|
|
|
|
|
|
# 执行迁移
|
|
|
|
|
|
python lawrisk/utils/migrate_unit_permission.py
|
|
|
|
|
|
|
|
|
|
|
|
# 验证迁移结果
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 第二步:重启应用
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 停止现有应用
|
|
|
|
|
|
pkill -f "python app.py"
|
|
|
|
|
|
|
|
|
|
|
|
# 启动应用
|
|
|
|
|
|
python app.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 第三步:验证功能
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查服务状态
|
|
|
|
|
|
curl http://localhost:8000/healthz
|
|
|
|
|
|
|
|
|
|
|
|
# 测试权限控制
|
|
|
|
|
|
curl -X POST http://localhost:8000/fs-ai-asistant/api/workflow/lawrisk/getPermits \
|
|
|
|
|
|
-d "region=禅城区"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 详细部署步骤
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 环境准备
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.1 检查Python环境
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python --version
|
|
|
|
|
|
# 需要 Python 3.10+
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.2 检查依赖
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pip list | grep -E "Flask|pg8000"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.3 检查数据库连接
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 确认数据库服务可访问
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks -c "SELECT 1;"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 备份数据(生产环境)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建备份
|
|
|
|
|
|
pg_dump -h 8.138.196.105 -U postgres -d licensing_risks > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
|
|
|
|
|
|
|
|
# 备份fs_law_risk数据库
|
|
|
|
|
|
pg_dump -h 8.138.196.105 -U postgres -d fs_law_risk > backup_fs_law_risk_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 执行数据库迁移
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.1 检查迁移状态
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python lawrisk/utils/migrate_unit_permission.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
输出示例:
|
|
|
|
|
|
```
|
|
|
|
|
|
============================================================
|
|
|
|
|
|
许可管理单位权限优化 - 数据库迁移工具
|
|
|
|
|
|
============================================================
|
|
|
|
|
|
|
|
|
|
|
|
检查当前迁移状态...
|
|
|
|
|
|
|
|
|
|
|
|
迁移状态: 未完成
|
|
|
|
|
|
|
|
|
|
|
|
service_departments表字段数量: 8
|
|
|
|
|
|
permit_sources表字段数量: 7
|
|
|
|
|
|
|
|
|
|
|
|
单位级别分布:
|
|
|
|
|
|
- admin: 1 个
|
|
|
|
|
|
- district: 5 个
|
|
|
|
|
|
- unit: 0 个
|
|
|
|
|
|
|
|
|
|
|
|
============================================================
|
|
|
|
|
|
数据库尚未完全迁移,是否执行迁移?(y/N):
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.2 执行迁移
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 输入 'y' 执行迁移
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.3 验证迁移结果
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python -c "
|
|
|
|
|
|
from lawrisk.utils.migrate_unit_permission import check_migration_status
|
|
|
|
|
|
status = check_migration_status()
|
|
|
|
|
|
print(f\"迁移完成: {status['migration_complete']}\")
|
|
|
|
|
|
print(f\"单位级别分布: {status['unit_level_distribution']}\")
|
|
|
|
|
|
"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 验证功能
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.1 检查表结构
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- 连接到数据库
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks
|
|
|
|
|
|
|
|
|
|
|
|
-- 检查service_departments表是否包含unit_level字段
|
|
|
|
|
|
\d service_departments
|
|
|
|
|
|
|
|
|
|
|
|
-- 检查permit_sources表是否包含uploader_department_id和bound_department_id字段
|
|
|
|
|
|
\d permit_sources
|
|
|
|
|
|
|
|
|
|
|
|
-- 检查索引
|
|
|
|
|
|
\di | grep -E "unit_level|bound_dept|uploader"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.2 检查数据迁移
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- 检查现有单位的unit_level设置
|
|
|
|
|
|
SELECT id, name, code, unit_level, grade
|
|
|
|
|
|
FROM service_departments
|
|
|
|
|
|
ORDER BY unit_level, grade;
|
|
|
|
|
|
|
|
|
|
|
|
-- 预期结果:
|
|
|
|
|
|
-- unit_level = 'admin' 对应 grade >= 90
|
|
|
|
|
|
-- unit_level = 'district' 对应 parent_id IS NULL AND grade < 90
|
|
|
|
|
|
-- unit_level = 'unit' 对应 parent_id IS NOT NULL AND grade < 90
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.3 测试API
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 测试健康检查
|
|
|
|
|
|
curl -s http://localhost:8000/healthz | jq
|
|
|
|
|
|
|
|
|
|
|
|
# 测试获取许可列表(向后兼容)
|
|
|
|
|
|
curl -X POST http://localhost:8000/fs-ai-asistant/api/workflow/lawrisk/getPermits \
|
|
|
|
|
|
-d "region=禅城区" \
|
|
|
|
|
|
| jq
|
|
|
|
|
|
|
|
|
|
|
|
# 测试获取服务部门列表
|
|
|
|
|
|
curl -X GET http://localhost:8000/fs-ai-asistant/api/workflow/lawrisk/admin/departments \
|
|
|
|
|
|
| jq '.data[] | {id, name, unit_level}'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 配置说明
|
|
|
|
|
|
|
|
|
|
|
|
### 单位级别说明
|
|
|
|
|
|
|
|
|
|
|
|
| 级别 | 创建方式 | 示例 | 权限范围 |
|
|
|
|
|
|
|------|---------|------|----------|
|
|
|
|
|
|
| admin | 自动设置(市局账号) | FSSJSJ | 全部许可 |
|
|
|
|
|
|
| municipal | 手动创建 | 市监局、卫健局 | 自身 + 下属区级单位 |
|
|
|
|
|
|
| district | 自动设置(区局账号) | 禅城区、南海区 | 下属所有单位 |
|
|
|
|
|
|
| unit | 手动创建 | 具体科室 | 仅自身 |
|
|
|
|
|
|
|
|
|
|
|
|
### 创建市级单位
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from lawrisk.services.licensing_repo import create_service_department
|
|
|
|
|
|
|
|
|
|
|
|
# 创建市级单位
|
|
|
|
|
|
municipal_unit = create_service_department(
|
|
|
|
|
|
name="佛山市市场监督管理局",
|
|
|
|
|
|
code="FS_AMR",
|
|
|
|
|
|
unit_level="municipal",
|
|
|
|
|
|
region_id="市级区域ID",
|
|
|
|
|
|
description="市级市场监督管理局"
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 创建区级单位
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from lawrisk.services.licensing_repo import create_service_department
|
|
|
|
|
|
|
|
|
|
|
|
# 创建区级单位(绑定到市级单位)
|
|
|
|
|
|
district_unit = create_service_department(
|
|
|
|
|
|
name="禅城区市场监督管理局",
|
|
|
|
|
|
code="CC_AMR",
|
|
|
|
|
|
unit_level="unit",
|
|
|
|
|
|
parent_id="市级单位ID",
|
|
|
|
|
|
region_id="禅城区ID",
|
|
|
|
|
|
description="禅城区市场监督管理局"
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 监控和维护
|
|
|
|
|
|
|
|
|
|
|
|
### 检查权限配置
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查所有单位的unit_level配置
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks -c "
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
unit_level,
|
|
|
|
|
|
COUNT(*) as count,
|
|
|
|
|
|
STRING_AGG(name, ', ') as departments
|
|
|
|
|
|
FROM service_departments
|
|
|
|
|
|
GROUP BY unit_level
|
|
|
|
|
|
ORDER BY unit_level;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 检查索引使用情况
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查索引使用
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks -c "
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
schemaname,
|
|
|
|
|
|
tablename,
|
|
|
|
|
|
indexname,
|
|
|
|
|
|
idx_scan
|
|
|
|
|
|
FROM pg_stat_user_indexes
|
|
|
|
|
|
WHERE indexname LIKE '%unit_level%' OR indexname LIKE '%bound_dept%'
|
|
|
|
|
|
ORDER BY idx_scan DESC;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 查看权限日志
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 查看应用日志中的权限相关记录
|
|
|
|
|
|
tail -f /tmp/flask.log | grep -i "permission\|unit_level"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ❗ 故障排除
|
|
|
|
|
|
|
|
|
|
|
|
### 问题1:迁移失败
|
|
|
|
|
|
|
|
|
|
|
|
**症状**:
|
|
|
|
|
|
```
|
|
|
|
|
|
Error: column "unit_level" does not exist
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 手动执行迁移SQL
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks -f docs/sql/006_add_unit_level_and_binding_fields.sql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 问题2:权限验证失败
|
|
|
|
|
|
|
|
|
|
|
|
**症状**:
|
|
|
|
|
|
```
|
|
|
|
|
|
Permission denied: User has no valid department assignment
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- 检查用户是否有有效的department_id
|
|
|
|
|
|
SELECT au.username, au.service_department_id, sd.unit_level
|
|
|
|
|
|
FROM auth_users au
|
|
|
|
|
|
LEFT JOIN service_departments sd ON sd.id = au.service_department_id
|
|
|
|
|
|
WHERE au.username = '用户名';
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 问题3:API返回空结果
|
|
|
|
|
|
|
|
|
|
|
|
**症状**:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
"permits": []
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
1. 检查用户unit_level配置
|
|
|
|
|
|
2. 检查用户region_id设置
|
|
|
|
|
|
3. 查看应用日志中的权限日志
|
|
|
|
|
|
|
|
|
|
|
|
### 问题4:数据库连接错误
|
|
|
|
|
|
|
|
|
|
|
|
**症状**:
|
|
|
|
|
|
```
|
|
|
|
|
|
pg8000.dbapi.Error: connection failed
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查数据库服务状态
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -c "SELECT version();"
|
|
|
|
|
|
|
|
|
|
|
|
# 检查.env配置
|
|
|
|
|
|
cat .env | grep -E "PG_|LIC_PG_"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 回滚方案
|
|
|
|
|
|
|
|
|
|
|
|
如果迁移后发现问题,可以执行回滚:
|
|
|
|
|
|
|
|
|
|
|
|
### 回滚数据库变更
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- 注意:这会丢失数据,请在测试环境充分验证
|
|
|
|
|
|
|
|
|
|
|
|
-- 删除新增的列
|
|
|
|
|
|
ALTER TABLE service_departments DROP COLUMN IF EXISTS unit_level;
|
|
|
|
|
|
ALTER TABLE service_departments DROP COLUMN IF EXISTS allowed_regions;
|
|
|
|
|
|
|
|
|
|
|
|
ALTER TABLE permit_sources DROP COLUMN IF EXISTS uploader_department_id;
|
|
|
|
|
|
ALTER TABLE permit_sources DROP COLUMN IF EXISTS bound_department_id;
|
|
|
|
|
|
|
|
|
|
|
|
-- 删除索引
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_service_dept_unit_level;
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_service_dept_parent_level;
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_permit_sources_bound_dept;
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_permit_sources_uploader;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 恢复备份
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 恢复数据备份
|
|
|
|
|
|
psql -h 8.138.196.105 -U postgres -d licensing_risks < backup_YYYYMMDD_HHMMSS.sql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 支持
|
|
|
|
|
|
|
|
|
|
|
|
如果遇到问题,请:
|
|
|
|
|
|
|
|
|
|
|
|
1. 查看应用日志:`/tmp/flask.log`
|
|
|
|
|
|
2. 检查数据库日志
|
|
|
|
|
|
3. 运行诊断脚本:`python lawrisk/utils/migrate_unit_permission.py`
|
|
|
|
|
|
4. 联系技术支持团队
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**文档版本**: v1.0
|
|
|
|
|
|
**更新日期**: 2025-11-19
|