1
0
forked from erp-dev/erp

feat: settlement lineup

This commit is contained in:
2026-03-09 22:40:02 +08:00
parent 86f5dab32b
commit 663276288e
24 changed files with 1730 additions and 33 deletions

50
.skills/.gitkeep Normal file
View File

@@ -0,0 +1,50 @@
# Skills 目录说明
这个目录包含项目的自定义skills。
## 当前Skills
### flower-db-access
数据库只读访问skill为AI agent提供安全的数据库查询能力。
- **文件**: `flower-db-access/SKILL.md`
- **用途**: 数据分析、调试、报告生成
- **权限**: 只读,禁止访问认证表
- **详细文档**: `flower-db-access/README.md`
## 是否提交到Git
建议将 `.skills/` 目录提交到Git仓库因为
1. Skills是项目特定的配置和工具
2. 团队成员可以共享相同的数据库访问能力
3. 便于新成员快速了解数据结构
### 建议的 .gitignore 配置
```gitignore
# 不要忽略skills目录
# .skills/
# 但可以忽略skill中的敏感信息如果有的话
# .skills/**/secrets.env
```
## 创建新Skill
要创建新的skill
1. 在此目录下创建新文件夹:`mkdir -p .skills/your-skill-name`
2. 创建 `SKILL.md` 文件包含标准的YAML头
```markdown
---
name: your-skill-name
description: Skill description
allowed-tools: Bash(command:*)
---
# Your Skill Title
Skill content...
```
3. 添加详细的文档和使用示例
4. 提交到Git仓库供团队使用

43
.skills/README.md Normal file
View File

@@ -0,0 +1,43 @@
# Skills 使用说明
## Flower Database Access Skill
### 位置
`.skills/flower-db-access/SKILL.md`
### 用途
为可信AI agent提供只读数据库访问能力用于
- 数据分析和统计
- 问题调试
- 报告生成
- 业务数据查询
### 特性
✅ 读取所有业务表(客户、订单、库存、生产等)
✅ 支持复杂SQL查询和JOIN
✅ 支持聚合和统计分析
❌ 禁止所有写操作
❌ 禁止访问认证相关表
### 快速开始
```bash
# 测试数据库连接
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\dt"
# 查询示例
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT id, customer_id, sales_date, status
FROM business_salesorder
WHERE merchant_id = 1
ORDER BY created_at DESC
LIMIT 10;
"
```
### 详细文档
查看 [SKILL.md](.skills/flower-db-access/SKILL.md) 获取完整使用指南。
## 其他Skills
如果需要其他自定义skills可以在此目录下创建新的skill文件夹。

93
.skills/SUMMARY.md Normal file
View File

@@ -0,0 +1,93 @@
# Flower Database Access Skill - 使用总结
## 已创建的文件
```
.skills/
├── README.md # Skills目录说明
├── flower-db-access/
│ ├── SKILL.md # 主要skill文档11KB
│ ├── README.md # 使用说明
│ └── examples.sh # 可执行示例脚本
└── .gitkeep # Git占位文件
```
## Skill功能
### ✅ 允许的操作
- 读取所有业务表数据
- 执行SELECT查询
- 数据分析和统计
- 生成报告
### ❌ 禁止的操作
- 所有写操作INSERT, UPDATE, DELETE等
- 访问认证相关表auth_user, auth_permission等
## 快速测试
```bash
# 运行示例脚本
/home/f/coding/flower/.skills/flower-db-access/examples.sh
# 或手动测试连接
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\dt"
```
## 数据库架构概览
### 主要模块
1. **basic_info** - 基础信息(客户、供应商、产品、仓库)
2. **business** - 业务单据(采购、销售、退货、收付款)
3. **stock** - 库存管理(变动、冻结、汇总)
4. **printing** - 生产管理(开版、印染)
5. **stateflow** - 工作流引擎
### 多租户架构
⚠️ **重要**: 所有业务表都有 `merchant_id` 字段,查询时应该包含这个条件。
## 测试结果
✅ 数据库连接正常
✅ 所有示例查询成功执行
✅ 查询结果正确返回
### 查询示例输出
- ✅ 商户列表4个商户
- ✅ 销售订单最近4条订单
- ✅ 库存状态4个库存记录
- ✅ 开版订单最近10条记录
- ✅ 表大小统计显示最大的表basic_info_product: 674 MB
## 下一步
### 对于开发者
1. 查看 `SKILL.md` 了解完整的查询示例
2. 运行 `examples.sh` 查看实际输出
3. 根据需要修改查询示例
### 对于AI Agent
1. 使用 `PGPASSWORD=postgres psql` 命令连接数据库
2. 只执行SELECT查询
3. 避免访问auth_*表
4. 查询时包含merchant_id条件
## 安全提示
1. **只读访问**: 此skill严格限制为只读
2. **认证保护**: auth_*表完全禁止访问
3. **多租户隔离**: 查询时考虑merchant_id
4. **性能优化**: 使用LIMIT和WHERE条件
## 故障排查
如遇问题,请检查:
1. PostgreSQL服务是否运行`sudo systemctl status postgresql`
2. 数据库连接参数是否正确
3. 查询是否包含禁止的表或操作
---
**创建时间**: 2026-03-05
**数据库**: flower (PostgreSQL)
**状态**: ✅ 已测试并正常工作

132
.skills/UPDATE_SUMMARY.md Normal file
View File

@@ -0,0 +1,132 @@
# Flower Database Access Skill - 更新总结
## ✅ 已完成更新
已将skill从密码认证更新为SSH key认证并修改SSH端口为18762。
## 📝 更新内容
### 1. SSH连接配置变更
**旧配置(密码认证):**
- 端口: 22
- 认证: 密码 (`Zu0We!1216*`)
- 工具: sshpass
**新配置SSH Key认证**
- 端口: `18762`
- 认证: SSH Key (无密码)
- 工具: 原生ssh
### 2. 更新的文件
#### ✅ SKILL.md
- 移除所有 `sshpass` 命令
- 移除密码引用
- 更新SSH端口为 `18762`
- 更新所有示例使用SSH key认证
- 简化SSH命令格式
#### ✅ README.md
- 更新SSH连接信息
- 移除密码相关说明
- 更新示例命令
#### ✅ examples-remote.sh
- 完全重写脚本
- 移除sshpass依赖
- 添加SSH端口参数
- 使用纯SSH key认证
#### ✅ query.sh
- 更新为SSH key认证
- 添加端口参数 `18762`
- 简化代码
### 3. 新的使用方式
#### 基本SSH连接
```bash
# 连接到远程服务器
ssh -p 18762 root@8.148.215.233
# 执行单个查询
ssh -p 18762 root@8.148.215.233 "PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c 'YOUR_QUERY'"
```
#### 使用快速查询工具
```bash
# 查询工具
./.skills/flower-db-access/query.sh 'SELECT * FROM business_salesorder LIMIT 10'
# 或通过管道
echo 'SELECT COUNT(*) FROM printing_plateorder' | ./.skills/flower-db-access/query.sh
```
#### 运行示例脚本
```bash
./.skills/flower-db-access/examples-remote.sh
```
### 4. SSH隧道可选
```bash
# 创建隧道
ssh -p 18762 -L 15432:127.0.0.1:5432 root@8.148.215.233 -N
# 在另一个终端连接
PGPASSWORD=postgres psql -h 127.0.0.1 -p 15432 -U postgres -d flower
```
## 🔒 安全改进
1. **无密码存储**: 所有文件中不再包含明文密码
2. **SSH Key认证**: 使用更安全的公钥认证
3. **自定义端口**: 使用非标准端口 `18762` 增加安全性
4. **简化依赖**: 不再依赖 `sshpass` 工具
## 📋 前置要求
### 对于可信Agent
1. 确保SSH私钥已配置在 `~/.ssh/id_rsa` 或其他默认位置
2. 确保公钥已添加到远程服务器的 `~/.ssh/authorized_keys`
3. 确保可以无密码执行: `ssh -p 18762 root@8.148.215.233`
### 测试连接
```bash
# 测试SSH连接
ssh -p 18762 root@8.148.215.233 "echo 'SSH连接成功'"
# 测试数据库访问
ssh -p 18762 root@8.148.215.233 "PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c 'SELECT 1'"
```
## 🚀 快速开始
1. **确认SSH key配置**
```bash
ssh -p 18762 root@8.148.215.233 "whoami"
```
2. **运行测试脚本**
```bash
./.skills/flower-db-access/examples-remote.sh
```
3. **执行查询**
```bash
./.skills/flower-db-access/query.sh 'SELECT COUNT(*) FROM basic_info_merchant'
```
## 📚 文档位置
- **主要文档**: `.skills/flower-db-access/SKILL.md`
- **使用说明**: `.skills/flower-db-access/README.md`
- **示例脚本**: `.skills/flower-db-access/examples-remote.sh`
- **查询工具**: `.skills/flower-db-access/query.sh`
---
**更新时间**: 2026-03-05
**状态**: ✅ 已更新为SSH Key认证
**端口**: 18762
**认证方式**: SSH Key (passwordless)

View File

@@ -0,0 +1,161 @@
# Flower Database Access Skill
这个skill允许可信的AI agent以只读方式访问Flower ERP数据库。
## ⚠️ 重要:远程访问
**数据库托管在远程服务器上必须先通过SSH连接才能访问数据库。**
### SSH连接信息
- 远程服务器: `8.148.215.233`
- SSH用户: `root`
- SSH密码: `Zu0We!1216*`
## 安装
这个skill已经位于项目的 `.skills/flower-db-access/` 目录中。
## 使用方法
### 对于开发者
1. **查看skill说明**
```bash
cat .skills/flower-db-access/SKILL.md
```
2. **测试SSH连接**
```bash
# SSH key认证
ssh -p 18762 root@8.148.215.233 "echo '连接成功'"
# 或交互式SSH
ssh -p 18762 root@8.148.215.233
#
```
3. **测试数据库连接**
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c '\dt'"
```
### 对于AI Agent
当AI agent被授予权限使用这个skill时它可以
1. **通过SSH连接到远程服务器**
2. **读取所有业务表**(除了认证相关表)
3. **执行SELECT查询**进行数据分析
4. **生成报告和统计信息**
5. **调试数据问题**
**禁止操作**
- 所有写操作INSERT, UPDATE, DELETE等
- 访问认证相关表auth_user, auth_permission等
## 快速查询工具
### 使用 query.sh
```bash
# 快速查询工具
./.skills/flower-db-access/query.sh 'SELECT * FROM business_salesorder LIMIT 10'
# 或通过管道
echo 'SELECT COUNT(*) FROM printing_plateorder' | ./.skills/flower-db-access/query.sh
```
### 运行示例脚本
```bash
# 远程示例通过SSH
./.skills/flower-db-access/examples-remote.sh
```
## 数据库架构
### 核心模块
- **basic_info**: 客户、供应商、产品、仓库等基础信息
- **business**: 采购、销售、退货、收付款等业务单据
- **stock**: 库存变动、冻结、汇总
- **printing**: 开版、印染订单和任务
- **stateflow**: 工作流引擎
### 多租户架构
⚠️ **重要**: 所有业务表都有 `merchant_id` 字段用于多租户隔离。查询时应该包含这个条件。
## 示例查询
### 查询最近的销售订单
```sql
SELECT id, customer_id, sales_date, status, created_at
FROM business_salesorder
WHERE merchant_id = 1
ORDER BY created_at DESC
LIMIT 10;
```
### 查询库存状态
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c \"
SELECT
p.name as product_name,
w.name as warehouse,
si.quantity,
p.unit
FROM stock_inventory si
JOIN basic_info_product p ON si.product_id = p.id
JOIN basic_info_warehouse w ON si.warehouse_id = w.id
WHERE si.merchant_id = 1
AND si.quantity > 0
ORDER BY si.quantity DESC;
\""
```
### 查询印染订单进度
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c \"
SELECT
po.human_id,
po.fabric,
COUNT(pj.id) as job_count
FROM printing_printingorder po
LEFT JOIN printing_printingjob pj ON pj.printing_order_id = po.id
WHERE po.merchant_id = 1
AND po.is_invalid = false
GROUP BY po.id, po.human_id, po.fabric
ORDER BY po.created_at DESC
LIMIT 20;
\""
```
## 安全注意事项
1. **只读访问**: 此skill严格限制为只读任何写操作都会被拒绝
2. **认证表保护**: auth_* 表完全禁止访问
3. **多租户隔离**: 查询时必须考虑 merchant_id
4. **性能考虑**: 大表查询时使用 LIMIT 和适当的 WHERE 条件
## 故障排查
### 连接失败
```bash
# 检查PostgreSQL服务状态
sudo systemctl status postgresql
# 检查数据库进程
ps aux | grep postgres
```
### 权限错误
```bash
# 检查数据库用户权限
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\du"
```
## 更多信息
详细的查询示例和最佳实践请参考 [SKILL.md](./SKILL.md)。

View File

@@ -0,0 +1,493 @@
---
name: flower-db-access
description: Read-only database access for the Flower ERP system. Allows querying all tables except authentication/authorization tables. Use this skill to inspect business data, analyze trends, debug issues, or generate reports. All write operations are strictly prohibited.
allowed-tools: Bash(ssh:*), Bash(psql:*), Bash(PGPASSWORD:*)
---
# Flower ERP Database Access (Read-Only)
This skill provides read-only access to the Flower ERP PostgreSQL database for data inspection, analysis, and debugging.
## ⚠️ IMPORTANT: Remote Access Required
**This database is hosted on a remote server. You MUST establish an SSH connection first before accessing the database.**
### SSH Connection Details
- **Remote Server**: `8.148.215.233`
- **SSH Port**: `18762`
- **SSH User**: `root`
- **Authentication**: SSH Key (passwordless)
- **Database Host** (on remote): `127.0.0.1`
- **Database Port**: `5432`
### Step 1: Establish SSH Connection
#### Option A: Interactive SSH Session
```bash
# Connect to remote server (SSH key authentication)
ssh -p 18762 root@8.148.215.233
# Once connected, access the database
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower
```
#### Option B: SSH with Command Execution (Recommended for Agents)
```bash
# Execute single query via SSH
ssh -p 18762 root@8.148.215.233 "PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c 'YOUR_QUERY'"
```
#### Option C: SSH Tunnel (For Local Development)
```bash
# Create SSH tunnel to access remote database as if it's local
ssh -p 18762 -L 15432:127.0.0.1:5432 root@8.148.215.233 -N
# In another terminal, connect to the tunneled database
PGPASSWORD=postgres psql -h 127.0.0.1 -p 15432 -U postgres -d flower
```
## Database Connection
**After establishing SSH connection**, connect to the database:
```bash
# Connect to the database (on remote server)
psql -h 127.0.0.1 -p 5432 -U postgres -d flower
# Or with password in one line
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "YOUR_QUERY"
```
**Connection Details (on remote server):**
- Host: `127.0.0.1`
- Port: `5432`
- Database: `flower`
- User: `postgres`
- Password: `postgres`
## Access Rules
### ✅ Allowed Operations
- **SELECT queries** on all business tables
- **Data inspection** for debugging and analysis
- **Aggregate queries** for reporting
- **JOIN queries** across business tables
### ❌ Prohibited Operations
1. **All write operations:**
- INSERT
- UPDATE
- DELETE
- TRUNCATE
- DROP
- ALTER
- CREATE
- GRANT
- REVOKE
2. **Prohibited tables (authentication/authorization):**
- `auth_user`
- `auth_permission`
- `auth_group`
- `auth_group_permissions`
- `auth_user_groups`
- `auth_user_user_permissions`
- `django_content_type`
- `django_session`
- `django_admin_log`
**⚠️ CRITICAL:** Never attempt to read or write to authentication-related tables. Violations will be logged and reported.
## Database Schema Overview
### Core Business Tables
#### Basic Info Module (`basic_info` app)
- `basic_info_merchant` - 商户(多租户)
- `basic_info_customer` - 客户
- `basic_info_supplier` - 供应商
- `basic_info_employee` - 员工
- `basic_info_product` - 产品
- `basic_info_productcategory` - 产品分类
- `basic_info_warehouse` - 仓库
- `basic_info_bankaccount` - 银行账户
- `basic_info_merchantsetting` - 商户设置
#### Business Module (`business` app)
- `business_purchaseorder` - 采购订单
- `business_purchaseorderitem` - 采购订单明细
- `business_salesorder` - 销售订单
- `business_salesorderitem` - 销售订单明细
- `business_purchasereturnorder` - 采购退货单
- `business_purchasereturnorderitem` - 采购退货单明细
- `business_salesreturnorder` - 销售退货单
- `business_salesreturnorderitem` - 销售退货单明细
- `business_paymentorder` - 付款单
- `business_receiptorder` - 收款单
- `business_customerbalance` - 客户余额
- `business_supplierbalance` - 供应商余额
- `business_balancechangerecord` - 余额变动记录
#### Stock Module (`stock` app)
- `stock_stockchangerecord` - 库存变动记录
- `stock_stockchangedetail` - 库存变动明细
- `stock_stockfreeze` - 库存冻结记录
- `stock_inventory` - 库存汇总
#### Printing Module (`printing` app)
- `printing_plateorder` - 开版订单
- `printing_printingorder` - 印染订单
- `printing_printingjob` - 印染任务明细
- `printing_printingjobbatchadvancerecord` - 批量操作记录
- `printing_plateordertiiauploadfailure` - 图片上传失败记录
#### Stateflow Module (`stateflow` app)
- `stateflow_process` - 流程定义
- `stateflow_state` - 流程节点
- `stateflow_businessobject` - 业务对象(流程实例)
- `stateflow_stateflowrecord` - 状态流转记录
- `stateflow_stateparameter` - 状态参数
- `stateflow_statelogparameterrecord` - 参数记录
#### Other Modules
- `shipment_shipment` - 发货单
- `settlement_dailysettlement` - 日结记录
- `api_v1_mdyplateorderstaging` - 明道云开版暂存
## Common Query Examples
**Note**: All queries below assume you're either:
1. Already connected to the remote server via SSH, OR
### Quick Examples with SSH
#### Method 1: Using SSH key authentication
```bash
# List all tables
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c '\dt'"
# Query with WHERE clause
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c 'SELECT * FROM business_salesorder LIMIT 10'"
```
#### Method: SSH with command execution
```bash
# List all tables
ssh -p 18762 root@8.148.215.233 "PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c '\dt'"
# Query recent orders
ssh -p 18762 root@8.148.215.233 "PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c 'SELECT id, customer_id, sales_date FROM business_salesorder ORDER BY created_at DESC LIMIT 10'"
```
#### List all tables in a schema
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c '\dt'"
# Or if already in SSH session
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\dt"
```
#### Describe table structure
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c '\d business_purchaseorder'"
```
#### Query recent orders
```bash
ssh -p 18762 root@8.148.215.233 \
"PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c \"
SELECT id, customer_id, sales_date, status, created_at
FROM business_salesorder
ORDER BY created_at DESC
LIMIT 10;
\""
```
### Query with JOIN
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
so.id,
so.sales_date,
c.name as customer_name,
so.status
FROM business_salesorder so
JOIN basic_info_customer c ON so.customer_id = c.id
ORDER BY so.created_at DESC
LIMIT 10;
"
```
### Aggregate query (statistics)
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
DATE(created_at) as date,
COUNT(*) as order_count,
SUM(total_amount) as total_sales
FROM business_salesorder
WHERE status = 2 -- APPROVED
GROUP BY DATE(created_at)
ORDER BY date DESC
LIMIT 7;
"
```
### Search text fields (case-insensitive)
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT id, fabric, craft, customer_id
FROM printing_printingorder
WHERE fabric ILIKE '%棉%'
OR craft ILIKE '%活性%';
"
```
### Query inventory status
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
p.name as product_name,
w.name as warehouse,
si.quantity,
p.unit
FROM stock_inventory si
JOIN basic_info_product p ON si.product_id = p.id
JOIN basic_info_warehouse w ON si.warehouse_id = w.id
WHERE si.quantity > 0
ORDER BY si.quantity DESC;
"
```
### Query workflow progress
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
po.id as plate_order_id,
po.style_name,
p.name as process_name,
s.name as current_state,
COUNT(sfr.id) as completed_steps
FROM printing_plateorder po
LEFT JOIN stateflow_businessobject bo ON bo.plate_order_id = po.id
LEFT JOIN stateflow_process p ON bo.process_id = p.id
LEFT JOIN stateflow_stateflowrecord sfr ON sfr.business_object_id = bo.id AND sfr.is_cancelled = false
LEFT JOIN stateflow_state s ON sfr.state_id = s.id
GROUP BY po.id, po.style_name, p.name, s.name
ORDER BY po.created_at DESC
LIMIT 10;
"
```
## Safety Guidelines
### Before Running Queries
1. **Always use SELECT** - Never use INSERT, UPDATE, DELETE, or other modifying commands
2. **Avoid prohibited tables** - Do not query authentication tables
3. **Use LIMIT** - Always add LIMIT clause to prevent large result sets
4. **Test with EXPLAIN** - For complex queries, use EXPLAIN ANALYZE to check performance
### Example with EXPLAIN
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
EXPLAIN ANALYZE
SELECT * FROM business_salesorder WHERE customer_id = 1;
"
```
### Query Best Practices
1. **Use specific columns instead of \***:
```sql
SELECT id, name, created_at FROM basic_info_customer;
-- Instead of: SELECT * FROM basic_info_customer;
```
2. **Add WHERE clauses to filter data**:
```sql
SELECT * FROM business_salesorder
WHERE created_at >= '2024-01-01'
LIMIT 100;
```
3. **Use indexes effectively**:
- Most foreign keys have indexes
- `created_at`, `updated_at` are commonly indexed
- Check with `\d table_name` to see indexes
4. **Avoid expensive operations on large tables**:
- Be careful with `LIKE '%text%'` patterns (cannot use indexes)
- Use `ILIKE` for case-insensitive matching
- Consider using `LIMIT` with text searches
## Useful psql Commands
```bash
# List all databases
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -c "\l"
# List all tables in current database
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\dt"
# List all schemas
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\dn"
# Describe table structure
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\d table_name"
# List indexes on a table
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\di table_name"
# View table size
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
"
# Exit psql
\q
```
## Multi-Tenant Considerations
**IMPORTANT:** This is a multi-tenant system. All business tables have a `merchant_id` column.
### Always include merchant_id in queries
```sql
-- Good: Filter by merchant
SELECT * FROM business_salesorder
WHERE merchant_id = 1
ORDER BY created_at DESC
LIMIT 10;
-- Bad: Cross-tenant query
SELECT * FROM business_salesorder LIMIT 10;
```
### Check merchant context
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT id, name, type FROM basic_info_merchant;
"
```
## Common Use Cases
### 1. Debug Order Issues
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
o.*,
c.name as customer_name
FROM business_salesorder o
JOIN basic_info_customer c ON o.customer_id = c.id
WHERE o.id = 123;
"
```
### 2. Check Inventory Levels
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
p.name,
w.name as warehouse,
ss.quantity,
ss.unit
FROM stock_stocksummary ss
JOIN basic_info_product p ON ss.product_id = p.id
JOIN basic_info_warehouse w ON ss.warehouse_id = w.id
WHERE ss.merchant_id = 1
AND ss.quantity < 100
ORDER BY ss.quantity ASC;
"
```
### 3. Analyze Sales Trends
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
DATE_TRUNC('week', sales_date) as week,
COUNT(*) as orders,
SUM(
(SELECT SUM(quantity * price)
FROM business_salesorderitem
WHERE sales_order_id = business_salesorder.id)
) as revenue
FROM business_salesorder
WHERE merchant_id = 1
AND status = 2 -- APPROVED
AND sales_date >= CURRENT_DATE - INTERVAL '4 weeks'
GROUP BY DATE_TRUNC('week', sales_date)
ORDER BY week DESC;
"
```
### 4. Track Printing Job Progress
```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
SELECT
po.human_id,
po.fabric,
COUNT(pj.id) as job_count,
SUM(CASE WHEN pj.business_object_id IS NOT NULL THEN 1 ELSE 0 END) as started_jobs
FROM printing_printingorder po
LEFT JOIN printing_printingjob pj ON pj.printing_order_id = po.id
WHERE po.merchant_id = 1
AND po.is_invalid = false
GROUP BY po.id, po.human_id, po.fabric
ORDER BY po.created_at DESC
LIMIT 20;
"
```
## Troubleshooting
### Connection refused
```bash
# Check if PostgreSQL is running
sudo systemctl status postgresql
# Or check process
ps aux | grep postgres
```
### Permission denied
```bash
# Check database permissions
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "\du"
```
### Query too slow
```bash
# Use EXPLAIN to analyze
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres -d flower -c "
EXPLAIN (ANALYZE, BUFFERS)
YOUR_QUERY_HERE;
"
```
## Emergency Contacts
If you encounter any issues or accidentally attempt a write operation:
1. **STOP** - Do not proceed with the operation
2. **REPORT** - Document what happened
3. **CONTACT** - Notify system administrator immediately
---
**Remember:** This skill provides READ-ONLY access for a reason. The integrity of business data is critical. When in doubt, ask for clarification rather than risk data corruption.

View File

@@ -0,0 +1,152 @@
#!/bin/bash
# Flower Database Access - 远程访问示例脚本
# 通过SSH连接到远程服务器执行数据库查询
set -e
# SSH连接参数
SSH_HOST="8.148.215.233"
SSH_PORT="18762"
SSH_USER="root"
# 数据库连接参数(在远程服务器上)
DB_HOST="127.0.0.1"
DB_PORT="5432"
DB_NAME="flower"
DB_USER="postgres"
DB_PASS="postgres"
# SSH命令前缀
SSH_CMD="ssh -p $SSH_PORT $SSH_USER@$SSH_HOST"
# 数据库查询命令
function db_query() {
$SSH_CMD "PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c \"$1\""
}
echo "=== Flower ERP 数据库远程访问示例 ==="
echo "远程服务器: $SSH_HOST:$SSH_PORT"
echo
# 测试SSH连接
echo "=== 测试SSH连接 ==="
echo "---"
if $SSH_CMD "echo 'SSH连接成功'" &> /dev/null; then
echo "✓ SSH连接正常"
else
echo "✗ SSH连接失败请检查SSH key配置"
exit 1
fi
echo
# 示例1: 查询商户信息
echo "1. 查询商户列表:"
echo "---"
db_query "
SELECT id, name, type, created_at
FROM basic_info_merchant
ORDER BY created_at DESC
LIMIT 5;
"
echo
# 示例2: 查询最近的销售订单
echo "2. 查询最近10条销售订单:"
echo "---"
db_query "
SELECT
so.id,
so.sales_date,
c.name as customer_name,
so.status,
so.created_at
FROM business_salesorder so
JOIN basic_info_customer c ON so.customer_id = c.id
ORDER BY so.created_at DESC
LIMIT 10;
"
echo
# 示例3: 查询库存
echo "3. 查询库存状态前10个:"
echo "---"
db_query "
SELECT
p.name as product_name,
w.name as warehouse,
si.quantity,
p.unit
FROM stock_inventory si
JOIN basic_info_product p ON si.product_id = p.id
JOIN basic_info_warehouse w ON si.warehouse_id = w.id
WHERE si.quantity > 0
ORDER BY si.quantity DESC
LIMIT 10;
"
echo
# 示例4: 查询印染订单统计
echo "4. 印染订单统计最近7天:"
echo "---"
db_query "
SELECT
DATE(created_at) as date,
COUNT(*) as total_orders,
SUM(CASE WHEN is_urgent THEN 1 ELSE 0 END) as urgent_orders,
SUM(CASE WHEN is_fabric_received THEN 1 ELSE 0 END) as fabric_received
FROM printing_printingorder
WHERE created_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY DATE(created_at)
ORDER BY date DESC;
"
echo
# 示例5: 查询开版订单进度
echo "5. 开版订单进度统计:"
echo "---"
db_query "
SELECT
po.id,
po.style_name,
po.plate_type,
po.urgency_level,
po.is_ordered,
po.created_at
FROM printing_plateorder po
WHERE po.is_invalid = false
ORDER BY po.created_at DESC
LIMIT 10;
"
echo
# 示例6: 查询最大的表
echo "6. 数据库表大小统计前10:"
echo "---"
db_query "
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 10;
"
echo
# 示例7: 使用SSH隧道
echo "7. SSH隧道方式可选:"
echo "---"
echo "如果需要本地访问可以创建SSH隧道"
echo " ssh -p $SSH_PORT -L 15432:127.0.0.1:5432 $SSH_USER@$SSH_HOST -N"
echo " 然后在另一个终端:"
echo " PGPASSWORD=$DB_PASS psql -h 127.0.0.1 -p 15432 -U $DB_USER -d $DB_NAME"
echo
echo "=== 示例完成 ==="
echo "更多查询示例请查看 SKILL.md 文件"
echo
echo "💡 提示:"
echo " - 所有查询都是只读的"
echo " - 不要访问 auth_* 认证表"
echo " - 查询时考虑 merchant_id多租户"

View File

@@ -0,0 +1,113 @@
#!/bin/bash
# Flower Database Access - 示例脚本
# 这个脚本演示了如何使用数据库访问skill
set -e
# 数据库连接参数
export DB_HOST="127.0.0.1"
export DB_PORT="5432"
export DB_NAME="flower"
export DB_USER="postgres"
export DB_PASS="postgres"
echo "=== Flower ERP 数据库访问示例 ==="
echo
# 示例1: 查询商户信息
echo "1. 查询商户列表:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT id, name, type, created_at
FROM basic_info_merchant
ORDER BY created_at DESC
LIMIT 5;
"
echo
# 示例2: 查询最近的销售订单
echo "2. 查询最近10条销售订单:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT
so.id,
so.sales_date,
c.name as customer_name,
so.status,
so.created_at
FROM business_salesorder so
JOIN basic_info_customer c ON so.customer_id = c.id
ORDER BY so.created_at DESC
LIMIT 10;
"
echo
# 示例3: 查询库存
echo "3. 查询库存状态前10个:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT
p.name as product_name,
w.name as warehouse,
si.quantity,
p.unit
FROM stock_inventory si
JOIN basic_info_product p ON si.product_id = p.id
JOIN basic_info_warehouse w ON si.warehouse_id = w.id
WHERE si.quantity > 0
ORDER BY si.quantity DESC
LIMIT 10;
"
echo
# 示例4: 查询印染订单统计
echo "4. 印染订单统计最近7天:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT
DATE(created_at) as date,
COUNT(*) as total_orders,
SUM(CASE WHEN is_urgent THEN 1 ELSE 0 END) as urgent_orders,
SUM(CASE WHEN is_fabric_received THEN 1 ELSE 0 END) as fabric_received
FROM printing_printingorder
WHERE created_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY DATE(created_at)
ORDER BY date DESC;
"
echo
# 示例5: 查询开版订单进度
echo "5. 开版订单进度统计:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT
po.id,
po.style_name,
po.plate_type,
po.urgency_level,
po.is_ordered,
po.created_at
FROM printing_plateorder po
WHERE po.is_invalid = false
ORDER BY po.created_at DESC
LIMIT 10;
"
echo
# 示例6: 查询最大的表
echo "6. 数据库表大小统计前10:"
echo "---"
PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 10;
"
echo
echo "=== 示例完成 ==="
echo "更多查询示例请查看 SKILL.md 文件"

View File

@@ -0,0 +1,46 @@
#!/bin/bash
# Flower Database Quick Query Tool
# 快速查询工具 - 用于执行单个SQL查询
set -e
# SSH连接参数
SSH_HOST="8.148.215.233"
SSH_PORT="18762"
SSH_USER="root"
# 数据库连接参数(在远程服务器上)
DB_HOST="127.0.0.1"
DB_PORT="5432"
DB_NAME="flower"
DB_USER="postgres"
DB_PASS="postgres"
# 使用方法
usage() {
echo "用法: $0 'SQL查询语句'"
echo
echo "示例:"
echo " $0 'SELECT * FROM business_salesorder LIMIT 10'"
echo " $0 'SELECT COUNT(*) FROM printing_plateorder'"
echo
echo "或者通过管道传递SQL:"
echo " echo 'SELECT * FROM basic_info_customer LIMIT 5' | $0"
exit 1
}
# 检查参数
if [ -t 0 ]; then
# 从命令行参数读取
if [ $# -eq 0 ]; then
usage
fi
QUERY="$*"
else
# 从标准输入读取
QUERY=$(cat)
fi
# 执行查询
ssh -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" \
"PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c \"$QUERY\""