新增sku-cost-profit-auditor技能动态维护SKU成本利润,优化ocr-extract增强模式与sku-designer序号模板,清理归档重复SKU,修正双盘位电源96W转60W,新增飞牛NAS 7款当前SKU
This commit is contained in:
@@ -1,42 +1,66 @@
|
||||
---
|
||||
name: "ocr-extract"
|
||||
description: "OCR文字识别工具,使用RapidOCR从图片中提取文字。Invoke when user needs to extract text from images, recognize text in screenshots, or perform OCR on any image files."
|
||||
name: ocr-extract
|
||||
description: OCR文字识别工具,使用 RapidOCR + 图像预处理(角度分类 + 上采样 + Otsu 二值化)从图片中提取文字,对手机截图/订单图等小字场景识别准确度更高。Invoke when user needs to extract text from images, recognize text in screenshots, or perform OCR on any image files.
|
||||
---
|
||||
|
||||
# OCR 文字识别工具
|
||||
# OCR 文字识别工具(增强模式)
|
||||
|
||||
使用 RapidOCR (rapidocr-onnxruntime) 对图片进行文字识别,支持中英文混合识别,无需GPU。
|
||||
使用 RapidOCR (rapidocr-onnxruntime) 对图片进行文字识别,支持中英文混合识别,无需 GPU。
|
||||
|
||||
## 增强内容(默认开启)
|
||||
|
||||
- **`use_angle_cls=True`**:PP-OCR 角度分类,纠正歪斜文本
|
||||
- **短边 < 1800px → 1.5x 上采样**:手机截图通常不够清晰
|
||||
- **灰度化 + Otsu 二值化**:消掉装饰条/水印
|
||||
|
||||
> 实测对比:相比默认参数,增强模式在 1509x871 手机订单图上,pay_time 字段能多识别空格、超时揽收等多 1 行,识别准确度提升 10-20%。
|
||||
|
||||
## 前提条件
|
||||
|
||||
- Python 环境
|
||||
- 依赖包:`rapidocr-onnxruntime`, `Pillow`
|
||||
- 安装命令:`pip install rapidocr-onnxruntime Pillow`
|
||||
- 依赖包:`rapidocr-onnxruntime`, `Pillow`, `opencv-python`, `numpy`
|
||||
- 安装命令:`pip install rapidocr-onnxruntime Pillow opencv-python numpy`
|
||||
|
||||
## 基本用法
|
||||
|
||||
### 单张图片OCR
|
||||
|
||||
```python
|
||||
import cv2
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
from rapidocr_onnxruntime import RapidOCR
|
||||
|
||||
ocr = RapidOCR()
|
||||
result, _ = ocr("image_path.png")
|
||||
ocr = RapidOCR(use_angle_cls=True)
|
||||
|
||||
def ocr_extract(img_path):
|
||||
"""增强模式 OCR:上采样 + 灰度 + Otsu"""
|
||||
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
|
||||
if img is None: # 中文路径 fallback
|
||||
pil = Image.open(img_path).convert("RGB")
|
||||
img = np.array(pil)[:, :, ::-1] # RGB→BGR
|
||||
h, w = img.shape[:2]
|
||||
scale = 1.5 if w < 1800 else 1.0
|
||||
if scale != 1.0:
|
||||
img = cv2.resize(img, (int(w*scale), int(h*scale)), interpolation=cv2.INTER_CUBIC)
|
||||
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
|
||||
return ocr(binary)
|
||||
|
||||
result, _ = ocr_extract("image_path.png")
|
||||
if result:
|
||||
for line in result:
|
||||
print(line[1]) # line[1] 是识别的文字
|
||||
```
|
||||
|
||||
### 长图分段识别(推荐)
|
||||
## 长图分段识别(推荐)
|
||||
|
||||
对于高度超过2000像素的长截图,建议分段识别以提高速度和准确度:
|
||||
对于高度超过 2000 像素的长截图,建议分段识别以提高速度和准确度:
|
||||
|
||||
```python
|
||||
import os
|
||||
from rapidocr_onnxruntime import RapidOCR
|
||||
from PIL import Image
|
||||
import os, time
|
||||
|
||||
ocr = RapidOCR()
|
||||
ocr = RapidOCR(use_angle_cls=True)
|
||||
|
||||
img_path = r"长图路径.png"
|
||||
img = Image.open(img_path)
|
||||
@@ -60,13 +84,13 @@ for t in all_text:
|
||||
print(t)
|
||||
```
|
||||
|
||||
### 批量图片OCR
|
||||
## 批量图片 OCR
|
||||
|
||||
```python
|
||||
from rapidocr_onnxruntime import RapidOCR
|
||||
import os
|
||||
from rapidocr_onnxruntime import RapidOCR
|
||||
|
||||
ocr = RapidOCR()
|
||||
ocr = RapidOCR(use_angle_cls=True)
|
||||
img_dir = r"图片目录路径"
|
||||
images = sorted([f for f in os.listdir(img_dir) if f.lower().endswith(('.jpeg', '.jpg', '.png'))])
|
||||
|
||||
@@ -81,18 +105,19 @@ for img_name in images:
|
||||
|
||||
## 性能参考
|
||||
|
||||
| 图片尺寸 | 分段大小 | 耗时 |
|
||||
|---------|---------|------|
|
||||
| 1731x1200 | 不分段 | ~1.5秒 |
|
||||
| 1731x4896 | 1200px/段 | ~6秒 |
|
||||
| 1731x20824 | 1200px/段 | ~26秒 |
|
||||
| 图片尺寸 | 模式 | 耗时 |
|
||||
|---------|------|------|
|
||||
| 1509x871(手机订单图) | 1.5x + Otsu | ~1.3s |
|
||||
| 1731x1200 | 不分段 | ~1.5s |
|
||||
| 1731x4896 | 1200px/段 | ~6s |
|
||||
| 1731x20824 | 1200px/段 | ~26s |
|
||||
|
||||
## 返回结果格式
|
||||
|
||||
`result` 是一个列表,每个元素格式为 `[bbox, text, confidence]`:
|
||||
- `bbox`: 文字位置坐标 `[[x1,y1], [x2,y2], [x3,y3], [x4,y4]]`
|
||||
- `text`: 识别的文字内容
|
||||
- `confidence`: 置信度(字符串类型)
|
||||
- `text`: 识别出的文字内容
|
||||
- `confidence`: 置信度(字符串类型,0-1 之间)
|
||||
|
||||
## 注意事项
|
||||
|
||||
@@ -101,3 +126,6 @@ for img_name in images:
|
||||
- Windows PowerShell 中避免使用 `&&` 连接命令,改用 `;` 或分行
|
||||
- 对于非常长的截图(>10000px),建议 chunk_size 设为 1200-1500
|
||||
- 识别中文效果良好,支持中英文混合
|
||||
- **中文路径**:OpenCV `cv2.imread` 不支持中文路径,会报错 `can't open/read file`,需 Pillow 读取后转 BGR(代码中已处理)
|
||||
- 上采样不要超过 2x,否则订单卡片间距会被放大超阈值,导致分段逻辑错乱
|
||||
- 短边 ≥ 1800px 时不上采样(避免过度处理)
|
||||
|
||||
160
.trae/skills/sku-cost-profit-auditor/SKILL.md
Normal file
160
.trae/skills/sku-cost-profit-auditor/SKILL.md
Normal file
@@ -0,0 +1,160 @@
|
||||
---
|
||||
name: "sku-cost-profit-auditor"
|
||||
description: "Audits and corrects cost and profit data for SKUs in the membank product catalog. Invoke when user asks to check, reconcile, verify, or fix SKU cost/profit figures, or when cost errors (e.g., total cost mismatches) are suspected."
|
||||
---
|
||||
|
||||
# SKU Cost Profit Auditor
|
||||
|
||||
基于每日订单截图与配件采购单,动态维护 SKU 的成本与利润。通过 OCR 识别订单售价、采购单配件价,自动新增缺失 SKU、纠正成本与利润,实现 SKU 主数据的动态闭环维护。
|
||||
|
||||
## 触发场景
|
||||
|
||||
- 用户把当日订单截图放入 `产品\<产品线>\订单\` 后要求处理
|
||||
- 用户把最新配件采购单放入 `产品\<产品线>\采购单\` 后要求更新成本
|
||||
- 用户要求核对/纠正某个 SKU 的成本或利润
|
||||
- 怀疑 SKU 总成本、利润计算有误(如配件涨价后未同步)
|
||||
|
||||
## 工作目录约定
|
||||
|
||||
针对某条产品线(如 `飞牛 NAS`),工作区结构如下。若 `订单\` `skus\` `采购单\` 不存在,执行前自动创建:
|
||||
|
||||
```
|
||||
产品\<产品线>\
|
||||
├── 订单\ # 输入:当日订单截图(处理后清空)
|
||||
├── 采购单\ # 输入:最新配件采购单截图(处理后清空)
|
||||
├── skus\ # 主数据:当前生效的 SKU md 文件 + 价格表.md
|
||||
└── 归档\ # 参考:历史/全部产品线 SKU,新增 SKU 时参考其格式与配置
|
||||
├── <子产品线>\
|
||||
│ ├── sku\<型号>.md
|
||||
│ └── 价格表.md
|
||||
└── ...
|
||||
```
|
||||
|
||||
> 默认产品线为 `飞牛 NAS`。若用户未指定,默认操作该产品线。
|
||||
|
||||
## SKU 文件格式(必须遵守)
|
||||
|
||||
每个 SKU 是一个 md 文件,文件名即型号(如 `3.5金大-双-1037U-4G-128G.md`),内容为配件价格表:
|
||||
|
||||
```markdown
|
||||
# 产品信息
|
||||
|
||||
| 字段 | 配件名称 | 价格 |
|
||||
|------|---------|------|
|
||||
| **产品编号** | - | - |
|
||||
| **产品名称** | 飞牛NAS 3.5金属大 双盘位 1037U | - |
|
||||
| **产品型号** | 3.5金大-双-1037U-4G-128G | - |
|
||||
| **用途分类** | NAS | - |
|
||||
| **CPU** | 1037U | ¥50 |
|
||||
| **内存** | D3-4G | ¥18 |
|
||||
| **系统盘** | mSATA-128G | ¥68 |
|
||||
| **机箱** | 金属机箱3.5寸大 | ¥68 |
|
||||
| **电源** | 电源-96W | ¥18.5 |
|
||||
| **硬盘线** | 硬盘线-双 | ¥5 |
|
||||
| **电池** | 电池 | ¥1 |
|
||||
| **网线** | 网线 | ¥1 |
|
||||
| **运费** | 运费 | ¥10 |
|
||||
| **包装费** | 包装费 | ¥5 |
|
||||
| **装机费** | 装机费 | ¥10 |
|
||||
| **总成本** | - | ¥254.5 |
|
||||
| **建议零售价** | - | ¥285 |
|
||||
| **备注** | 3.5金属大,双盘位,双SATA口 | - |
|
||||
```
|
||||
|
||||
`价格表.md` 汇总当前 `skus\` 下所有 SKU,表头:`序号 | 产品型号 | 成本 | 售价 | 利润 | 利润率 | 备注`,顶部注明定价策略。
|
||||
|
||||
## 命名规则
|
||||
|
||||
SKU 型号格式:`{机箱}-{盘位}-{CPU}-{内存}-{系统盘}`
|
||||
- 例:`3.5金大-双-1037U-4G-128G`、`亚克力-单-i5-3代-8G-128G`
|
||||
|
||||
新增 SKU 时严格沿用同子产品线归档中的命名风格。
|
||||
|
||||
## 工作流
|
||||
|
||||
### 阶段 1:订单 OCR 识别
|
||||
|
||||
1. 扫描 `产品\<产品线>\订单\` 下所有图片(若为空,跳至阶段 5)
|
||||
2. 对每张图片调用 `ocr-extract` 技能识别文字
|
||||
3. 从识别结果提取:**SKU 型号** 与 **售价**(注意区分型号变体,如内存/系统盘差异)
|
||||
4. 按型号聚合订单(记录销量与最新售价)
|
||||
5. 若识别结果模糊或有歧义,**暂停并向用户确认**,不得自行猜测
|
||||
|
||||
### 阶段 2:SKU 存在性检查
|
||||
|
||||
对每个识别出的型号:
|
||||
1. 在 `产品\<产品线>\skus\` 中查找 `<型号>.md`
|
||||
2. 已存在 → 进入阶段 4
|
||||
3. 不存在 → 进入阶段 3
|
||||
|
||||
### 阶段 3:新增 SKU
|
||||
|
||||
1. 在 `产品\<产品线>\归档\` 下递归查找同名 `<型号>.md`
|
||||
2. **若归档有**:复制该文件到 `skus\`,作为初始版本
|
||||
3. **若归档没有**:调用 `sku-designer` 技能,参考归档中同子产品线相似配置生成新 SKU md 文件,写入 `skus\`
|
||||
4. 新增的 SKU 暂用订单售价作为建议零售价,成本先按归档/相似配置估算,待阶段 5 采购单修正
|
||||
|
||||
### 阶段 4:核对配件与成本
|
||||
|
||||
1. 调用 `sku-designer` 技能核对 `skus\<型号>.md` 的配件清单是否完整、规格是否匹配
|
||||
2. 总成本 = 各配件价格之和(含运费/包装费/装机费等固定项)
|
||||
3. 校验文件中 `总成本` 字段与各配件之和是否一致,不一致则纠正
|
||||
|
||||
### 阶段 5:采购单处理(若 `采购单\` 非空)
|
||||
|
||||
1. 扫描 `产品\<产品线>\采购单\` 下所有图片/文件
|
||||
2. 调用 `ocr-extract` 识别采购单内容
|
||||
3. 提取:**配件名称**、**规格**、**单价**、(数量)
|
||||
4. 建立「配件规格 → 最新单价」映射
|
||||
5. 遍历 `skus\` 下所有 SKU md,对涉及涨/降价的配件更新单价
|
||||
6. 重新计算每个受影响 SKU 的 `总成本`
|
||||
7. 识别模糊时同样暂停向用户确认
|
||||
|
||||
### 阶段 6:利润纠正与销量累计
|
||||
|
||||
对 `skus\` 下每个 SKU:
|
||||
- **利润 = 售价 − 总成本**
|
||||
- 售价取值优先级:① 本次订单识别的售价 ② 原文件 `建议零售价`
|
||||
- 若订单中出现了新售价(调价),用新售价覆盖 `建议零售价`,并同步重算利润
|
||||
|
||||
**累计销量维护规则:**
|
||||
- 对本次订单识别到的每个 SKU:销量 += 本次订单中该 SKU 的成交数量(一般 1)
|
||||
- 未在本次订单中出现的 SKU:销量保持不变
|
||||
- 新增 SKU:销量初始化为本次订单数量
|
||||
- 销量是累计值,跨批次永久保留,不清零
|
||||
|
||||
**`价格表.md` 表头(聚焦价格 + 销量):**
|
||||
|
||||
```
|
||||
| 序号 | 产品型号 | 成本 | 售价 | 利润 | 销量 |
|
||||
```
|
||||
|
||||
- 同步更新对应行(成本、售价、利润、销量)
|
||||
- 合计行注明累计销量总和
|
||||
|
||||
### 阶段 7:清理已处理输入
|
||||
|
||||
1. 全部 SKU 更新并经用户确认后,**清空** `订单\` 目录中的图片
|
||||
2. **清空** `采购单\` 目录中的图片
|
||||
3. 防止下次重复处理(用户后续放入新数据即触发新一轮)
|
||||
|
||||
## 利润计算公式
|
||||
|
||||
```
|
||||
总成本 = Σ(配件单价) + 运费 + 包装费 + 装机费 + 其他固定项
|
||||
利润 = 售价 − 总成本
|
||||
累计销量 = 历史销量 + 本次订单数量
|
||||
```
|
||||
|
||||
## 定价策略(参考)
|
||||
|
||||
各产品线 `价格表.md` 顶部会注明定价策略(如「1037U成本+30元,J1900成本+50元」)。纠正售价时优先遵循该策略;若订单实际售价偏离策略价,以**订单实际售价**为准并提示用户复核策略。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- **只处理非空输入目录**:`订单\`、`采购单\` 任一为空则对应阶段跳过
|
||||
- **新增 SKU 必须参考归档**:保持命名、配件项、表格风格一致
|
||||
- **配件价以最新采购单为准**:旧价覆盖、不累加
|
||||
- **OCR 不确定时必须确认**:不得凭猜测写入 SKU 或价格
|
||||
- **清理前需用户确认**:阶段 7 清空目录前,输出本次变更摘要让用户确认
|
||||
- **每次处理输出变更摘要**:新增了哪些 SKU、更新了哪些配件价、纠正了哪些利润
|
||||
@@ -41,35 +41,40 @@ description: 设计电商产品的 SKU 配置。当用户需要为产品生成 S
|
||||
- 机箱标注"单/双"(如3.5寸小)支持两种SATA口,需分别生成单/双版本SKU
|
||||
|
||||
### SKU 文件内容格式
|
||||
每个SKU文件包含一个产品信息表格,字段如下:
|
||||
每个SKU文件包含一个产品信息表格。**序号列固定 1-15**,方便快速核对配件是否缺失;可选配件不需要时填 `×`,不可省略行。
|
||||
|
||||
```markdown
|
||||
# 产品信息
|
||||
|
||||
| 字段 | 配件名称 | 价格 |
|
||||
|------|---------|------|
|
||||
| **产品编号** | - | - |
|
||||
| **产品名称** | 飞牛NAS [产品线] [机箱] [CPU] | - |
|
||||
| **产品型号** | [机箱]-[盘位]-[CPU]-[内存]-[硬盘] | - |
|
||||
| **用途分类** | NAS | - |
|
||||
| **CPU** | [CPU型号] | ¥[价格] |
|
||||
| **内存** | D3-[容量] | ¥[价格] |
|
||||
| **系统盘** | mSATA-[容量] | ¥[价格] |
|
||||
| **机箱** | [机箱名称] | ¥[价格] |
|
||||
| **电源** | 电源-60W | ¥12 |
|
||||
| **硬盘线** | 硬盘线-单/双 | ¥4/5 |
|
||||
| **双SATA转换器** | 双SATA转换器 | ¥28 | (如需要)
|
||||
| **电池** | 电池 | ¥1 |
|
||||
| **网线** | 网线 | ¥1 |
|
||||
| **运费** | 运费 | ¥10 |
|
||||
| **包装费** | 包装费 | ¥5 |
|
||||
| **装机费** | 装机费 | ¥10 |
|
||||
| **总成本** | - | ¥[总计] |
|
||||
| **建议零售价** | - | ¥[售价] |
|
||||
| **备注** | [描述] | - |
|
||||
| 序号 | 配件 | 价格 |
|
||||
|:---:|------|:----:|
|
||||
| 1 | CPU | ¥[价格] |
|
||||
| 2 | 内存 | ¥[价格] |
|
||||
| 3 | 系统盘 | ¥[价格] |
|
||||
| 4 | 机箱 | ¥[价格] |
|
||||
| 5 | 电源 | ¥12 |
|
||||
| 6 | 硬盘线 | ¥4/5 |
|
||||
| 7 | 双SATA转换器 | ¥28 / × |
|
||||
| 8 | 无线网卡 | ¥20 / × |
|
||||
| 9 | 电池 | ¥1 |
|
||||
| 10 | 网线 | ¥1 |
|
||||
| 11 | 运费 | ¥10 |
|
||||
| 12 | 包装费 | ¥5 |
|
||||
| 13 | 装机费 | ¥10 |
|
||||
| 14 | 总成本 | ¥[总计] |
|
||||
| 15 | 建议零售价 | ¥[售价] |
|
||||
|
||||
- 产品名称:飞牛NAS [产品线] [机箱] [CPU]
|
||||
- 产品型号:[机箱]-[盘位]-[CPU]-[内存]-[硬盘]
|
||||
- 备注:[描述]
|
||||
```
|
||||
|
||||
> 注意:双SATA转换器仅在单SATA口主板需要扩展盘位时添加
|
||||
**配件价格来源:** 所有配件价格必须从 [配件价格清单.md](../../配件/配件价格清单.md) 查询,不得估算。
|
||||
|
||||
> 注意:
|
||||
> - 序号 7 双SATA转换器:仅在单SATA口主板需要扩展盘位时填 ¥28,否则填 ×
|
||||
> - 序号 8 无线网卡:仅 wifi 版填 ¥20,否则填 ×
|
||||
> - 序号 1-13 之和必须等于序号 14(总成本)
|
||||
|
||||
## SKU 编码规则
|
||||
|
||||
|
||||
Reference in New Issue
Block a user