forked from erp-dev/erp
feat: settlement lineup
This commit is contained in:
161
.skills/flower-db-access/README.md
Normal file
161
.skills/flower-db-access/README.md
Normal 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)。
|
||||
493
.skills/flower-db-access/SKILL.md
Normal file
493
.skills/flower-db-access/SKILL.md
Normal 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.
|
||||
152
.skills/flower-db-access/examples-remote.sh
Executable file
152
.skills/flower-db-access/examples-remote.sh
Executable 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(多租户)"
|
||||
113
.skills/flower-db-access/examples.sh
Executable file
113
.skills/flower-db-access/examples.sh
Executable 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 文件"
|
||||
46
.skills/flower-db-access/query.sh
Executable file
46
.skills/flower-db-access/query.sh
Executable 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\""
|
||||
Reference in New Issue
Block a user