关于 odoo-demo-csv
面向销售人员的 Odoo 演示数据生成技能,可根据公司网站或行业资料准备 CSV、导入连接的数据库并核验结果。它强调真实产品信息、虚构联系人以及按数据库实际版本检查字段,整个流程以 `SUMMARY:` 行结束。
主要功能
- 01研究目标公司及真实产品
- 02按规模生成关联数据集
- 03写入符合 Odoo 导入要求的 CSV
- 04通过 odoo-crud 导入数据和图片
- 05回读记录并核验数量与库存
适用场景
- 01为销售演示准备 Odoo 数据
- 02依据公司网站制作产品目录
- 03搭建包含客户、供应商和线索的样例数据
- 04检查导入后的库存与记录数量
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ odoo-ps/ odoo-feeder --skill odoo-demo-csv安装后在 Claude Code 中输入/odoo-demo-csv确认已加载。
附带文件ODOO-TRAPS.md
详细介绍
Odoo 演示数据
销售人员提供公司名称及其网站,或仅提供行业,以及数据集大小。你需要调研目标对象、编写可导入 Odoo 的 CSV 文件,将其导入已连接的数据库,并验证结果:一次连续完成所有步骤,最后以 SUMMARY: 行结束。
以下两个词决定每一步的执行方式。
事实依据——每条记录都必须有据可查,来源于你在目标网站上找到的信息:真实的产品名称、真实的价格、真实的照片。网站没有提供的信息,就不要编造:价格填 0.00,不添加图片,并用一行说明数据有限。基于虚构产品构建的演示数据,是本次运行无法补救的唯一失败。
说明过程——每一步操作前用一行说明你将要做什么;每次调用 odoo-crud 后,用一行说明结果(例如“已导入 25 个合作伙伴”或“预览发现 1 个错误列,正在修复”)。销售人员会看到这些输出,但不会看到本次运行的其他内容。
不得使用真实人物信息——你虚构的每位客户、供应商和潜在客户,都必须是虚构的个人或公司;事实依据仅适用于目标公司本身(其真实产品、价格、照片),绝不包括其员工或客户的联系方式。虚构的联系人不得与任何真实联系人相似,其电子邮件或电话号码也不得暗示任何真实公司——包括目标公司本身:电子邮件必须使用无法解析且不含任何公司名称的域名(仅限 example.com、example.org、example.net——不得使用 @<company>-demo.test 或任何包含真实名称的变体);电话号码必须使用专供虚构用途的号段(例如 +1 555 0100–0199,或某国家/地区官方指定的影视剧/虚构号码号段),绝不能使用真实用户号段。此规定适用于你在任何模型中编写的每个 email/phone/mobile 列,不得有例外——包括目标公司自身的 res.company 或 res.partner 记录。
工具
odoo-crud <command> [options] 通过 XML-RPC 连接 Odoo。它是唯一可用的 Shell 命令,并从环境中读取凭据。
- 阻塞执行——每次调用(包括
install-modules)都会在工作完成后返回。可直接接着执行下一条命令:无需等待,也无需轮询。 - 每次调用都会输出 JSON
{"ok": true|false, ...}。继续操作前先检查ok。 odoo-crud <command> --help可查看标志参考:--domain、--values、--args、--context、--filter的确切 JSON 格式都在其中。请先阅读,不要猜测格式。
使用你自己的文件工具编写 CSV,并使用浏览工具进行调研。除 odoo-crud 本身外,你无法使用 Shell——把 CSV 写进聊天内容,或写入之后再尝试运行以生成文件的脚本,都行不通(生成文件的运行会被阻止);请使用文件工具直接写入 CSV 内容。
调用失败、已知存在的记录查询结果缺失,或成功导入后数值仍为零时,原因几乎总是 Odoo 的某种行为;这些行为汇总在 ODOO-TRAPS.md 中——遇到这种情况时请阅读该文件。
运行
1. 调研目标对象
浏览网站并收集:所属行业、真实产品或服务及其价格、公司所在地(这决定国家和货币),以及公司徽标和产品照片的 URL。将每个 URL 改为绝对 URL——有些网站会提供类似 //cdn.example.com/… 的协议相对 URL,需要添加 https: 前缀。
如果未提供网站,则改为根据指定行业生成连贯通用的数据。
完成标准:你能够说出将要导入的产品名称,以及将为公司设置的国家。
2. 探查数据库
此数据库的版本决定了哪些模型、字段和应用存在——读取它们, 切勿凭空假设。
odoo-crud auth-check— 本次运行的第一条命令。如果失败,请停止并说明 原因;后续操作都无法进行。odoo-crud models --filter crm— 查看有哪些模型。odoo-crud fields product.template --filter 'name,list_price,barcode'— 每个字段占一 行简洁信息(many2one required -> res.partner),包括选择字段的允许值。按计划写入的列进行筛选; 列出res.partner或product.template的所有字段会掩盖关键信息。odoo-crud install-modules crm stock sale_management account— 一次调用安装步骤 5 中导入顺序涉及的 所有模块。直接按该顺序列出模块:res.partner→contacts,product.template→product和sale_management,现有库存 →stock,crm.lead→crm,以及用于开票的account。 它会安装并在返回前确认,且其 JSON 会为任何安装失败的模块列出not_installed。
满足条件的标志:install-modules 返回时 not_installed 为空,并且你即将写入的每个 CSV 中的
每一列都已在 fields 输出中出现,且其类型以及——对于选择字段——允许值均已逐字复制。
3. 配置公司
在 res.company 上将国家/地区、公司名称和币种设为实际所在地:
使用 search-read 查找 ID,然后
odoo-crud write res.company --ids '[1]' --values '{"country_id": 241, "currency_id": 23}'
看似缺失的币种其实是已归档,并非不存在——请参阅陷阱文件。
4. 确定数据集规模
提示词会给出 small、medium 或 big。这是整个业务的规模,因此适用于你要填充的每个 模型。以客户数量为基准,并按行业调整比例推算其他数量:
| size | customers (anchor) | feel |
|---|---|---|
| small | ~8 | 一家小商店——演示所需的基本数据 |
| medium | ~25 | 一家成熟的中小企业 |
| big | ~80 | 一家数据丰富的大公司 |
- 供应商 ≈ 客户数量 ÷ 6 — 始终只需少量。
- 产品 ≈ 商品目录应小于客户数量;服务型企业的产品还应更少。当网站上的真实产品少于目标数量时,用真实的变体(尺寸、口味、规格)补足——真实情况 优先于目标数量。
- 现有库存 — 为每种可库存产品设置数量。
- 线索 ≈ 客户数量的一半到一倍。
- 创建的其他任何数据 — 销售订单、发票、物料清单等,都应按相应比例调整。
一个模型的数据规模很丰富,而其他相关模型却空空如也,会让演示看起来很假。
5. 生成并导入
将每个 CSV 写入文件,然后运行 odoo-crud import-csv <model> --file <path>。
按依赖顺序导入,确保所有引用都能解析:
res.partner— 客户 + 供应商。 列:id(例如partner_client_1)、name、is_company、street、city、email、phone。product.template— 你找到的旗舰产品。 列:id(例如product_1)、name、list_price、standard_price、barcode,以及此数据库中的产品类型和可储存性列 — 具体取决于步骤 2 的fields product.template --filter 'type,storable'输出, 选择值须原样保留。根据版本不同,可储存性可能是其中一个 值,也可能是单独的布尔标记。- 现有库存 — 对
product.template再进行一次导入,每个标记为可储存的 产品占一行,只包含id(与上面相同的外部 ID)和qty_available。这些 ID 已存在, 因此 Odoo 会执行与在产品表单中输入数量相同的代码路径:创建库存量并 应用它,商品就确实有现货了。 crm.lead— 列:id(例如lead_1)、name、partner_id/id(文件 1 中的 ID)、expected_revenue、description、stage_id(New、Qualified或Proposition)。每条description都要用客户的口吻撰写 — 两三行潜在客户发来的内容,点名他们咨询的真实产品,并说明用途。
每个 CSV 都必须遵守三条规则:
- 外部 ID — 每行都包含
id列,每个引用都通过field_id/id指向一个 ID。这能确保重新导入时更新记录而不是重复创建,而且不容妥协。 - 引号 — 使用逗号分隔,所有文本值都用双引号括起来,
确保
"Company, Inc."保持在同一列。 - 语言 — 使用网站的语言,或销售人员指定的语言。
如果还要求默认集合之外的内容(mrp.bom、员工、会计科目表……)?
用同样的方法构建:以锚点为准确定规模,使用外部 ID 建立关联,并在其引用的内容导入后再导入。
完成标准:每次导入都返回 ok: true,且记录数与步骤 4 要求的数量一致。如果失败,ODOO-TRAPS.md 会指出原因;修复 CSV 并重新导入 — 外部 ID 可确保重试安全。
6. 设置图片
带有真实照片的产品网格,才能让演示在屏幕上呈现出效果。
odoo-crud set-image product.template --id <record_id> --url <image_url>
odoo-crud set-image res.company --id 1 --url <logo_url> --field logo
以下两点决定这些调用能否成功:
- 数据库 ID,而非外部 ID。
--id使用 Odoo 分配的整数。通过对刚导入的模型执行一次search-read获取 — 它会返回每条记录的id和name,你可以据此匹配照片 URL。 - 字段。 默认写入
image_1920;公司徽标位于logo,因此该调用需要带上--field logo。
没有真实图片的记录就不要设置图片 — 这是唯一可以跳过的情况。
完成标准:步骤 1 中收集了照片 URL 的每个产品都已通过 set-image 调用返回
ok: true,且公司已设置徽标。
7. 验证,然后总结
读回你写入的内容 — 导入成功不代表结果正确:
odoo-crud search-read product.template --fields '["name","qty_available"]'— 每个可储存产品都显示你导入的数量。用于计数的是qty_available; 不是inventory_quantity。- 对每个已填充的模型执行一次
search-read,确认其数量与步骤 4 一致。
完成标准:所有处理过的模型都已读回并核对无误。然后输出
SUMMARY: 行。