Topics

我需要一份采购订单,所以我使用 Claude Code 创建了一个采购订单生成工具(桌面应用程序)。

  • column

每当我们日常工作中遇到一些过于繁琐而无法继续手动完成的事情时,使用 Claude Code 创建一个小型系统就成了司空见惯的做法!

这个故事就是个完美的例子,而这一切都始于我们增加了公司的资本。

我们的财政年度从二月份开始,此次增资也发生在二月份。然而,随着资金的增加,我们现在需要更加细致地组织与外部合作伙伴和协作公司的订购流程。

这部分内容被称为《分包法》,根据现行制度,从2026年1月起将更名为《分包法》。订购方将需要处理更多事项,例如明确说明订单详情、创建和保存交易文件以及设定付款期限。

当然,这不仅仅是“我们必须这样做,因为这是法律规定”的问题!

将工作外包给外部合作伙伴时,客户和服务提供商都必须明确定义订单详情、价格、日期以及与报价单的往来。

该功能并非会计工具自带的功能。

我公司使用 MoneyForward(以下简称 MoneyForward)工具进行会计核算、报价和开票。
它很适合日常的会计和账单处理工作,但我这次想做的事情略有不同。

根据从外部合作伙伴处收到的报价 PDF,我们为 Liberogic 创建采购订单 PDF。

至少就我们公司的使用范围而言,MoneyForward 的功能并不完全符合我们的需求,仅仅为了这个目的而订阅该服务是浪费钱。

如果要手动完成,

  • 创建采购订单格式
  • 手动将报价单上的信息誊写成采购订单格式。
  • 请填写订单日期。
  • 抄录引号。
  • 转录细节
  • 请核对总金额及其他详情。
  • 格式化文件名。
  • 其他杂项……

这项额外的任务很麻烦……所以我决定把它创建出来。

使用克劳德代码,不到一个小时即可将其投入实际应用。

时机也恰到好处。

2 月份是财政年度的开始,2 月份是资本增加的月份,同时发布的还有 Claude Code,以及我们的员工对该准则的采纳,所有这些时间点都恰好相同。

当时,公司内部正兴起一场类似黑客马拉松的运动,人们使用 Claude Code 等工具来创建业务改进工具、小型内部应用程序,甚至部署一些自发的想法!

从最基本的规格概述到 Claude Code 的使用说明,包括微调……

不到一个小时,我就把它修好了,达到了可以使用的状态。

当然,你不能把所有事情都交给人工智能,然后指望它完成,但是如果你把它正确地转换成提示,它就能快速便捷地完成!

桌面应用程序已完成

这是一个简单的采购订单生成工具,可以在您可能已经使用的操作系统上运行。

请将报价单PDF文件发送至指定联系人。.app当您拖放文件时,将执行一个 Python 脚本,该脚本将读取报价单 PDF 的内容,并在同一文件夹中生成采购订单 PDF。
完成后,整个过程很简单,macOS 上会显示通知,并自动打开生成的采购订单 PDF。

结构如下:

~/Desktop/生成采购订单/

删除报价单 → 生成采购订单.app

_lib/

generate_purchase_order.py

liberogic_logo.png

liberogic_seal.png

purchase_order_counter.json

为了方便会计和行政人员在不打开终端的情况下使用它,我们使用 AppleScript droplet 作为入口点,实际的 PDF 生成过程由 Python 处理。

简而言之,只需将报价单 PDF 文件放入即可。一款桌面应用程序,可通过拖放操作生成 PDF 采购订单。无需打开终端即可使用,即使是内部管理任务也易于操作。

采购订单 PDF 的外观设计与我们公司使用的发票和报价单 PDF 格式相似。
以下文字包含在备注栏中:

本采购订单构成正式订单。该订单依据报价单号XXX下达。

订单号格式如下:

{会社略称}様 発注書{YYYY}{MM}{3桁連番}

例如,如果这是 XX 先生/女士在 2026 年 2 月的第一件物品,

尊敬的XX先生/女士:采购订单202602001

它看起来会像这样。

按公司和月份排列的顺序编号是purchase_order_counter.json系统会自动处理订单,订单日期将自动计算为报价单日期后的5个工作日。(这只是一个临时规定!管理层稍后会进行更改!)
为了排除周六、周日以及日本的公共假日,Pythonjpholiday我用过。

只有几个稍微有点难度的部分。

采购订单所依据的报价来自外部合作伙伴和合作公司,因此格式因公司而异。
仅仅假设“公司名称位于此坐标”或“总金额位于此位置”是不够的。

最终,该过程涉及使用正则表达式尽可能灵活地提取供应商名称、地址、电话号码、报价单号、报价日期、主题、详细信息、小计、消费税和总计,将带有“Attn:”的公司视为我们自己的公司,将其他公司视为供应商,并处理诸如在从 PDF 中提取文本时,视觉上看起来分开的信息合并到文本中之类的问题。

由于有些邮件主题行后面会包含建筑物名称或楼层号,我们增加了一个流程,使用“建筑物”和“楼层”等词语作为线索来过滤掉不必要的地址信息。

无论是人工智能还是其他什么技术,这仍然是PDF处理中常见的问题。

提示已传递给克劳德·科德

与其提出模糊的请求,不如尽可能具体地使用令牌,包括文件夹结构、处理流程、布局、编号规则、工作日计算、PDF 提取项目等,这样更经济。
我们还要让他们阅读一下示例 PDF 文件!

以下の条件で、見積書PDFを発注書PDFに自動変換するツールをmacOS向けに作ってください。

## 環境

- macOS / Python3(pip可)
- フォント:`~/Library/Fonts/NotoSansJP-Regular.ttf` / `NotoSansJP-Bold.ttf`

## フォルダ構成

`~/Desktop/発注書生成/
  見積書をドロップ→発注書生成.app
  _lib/
    generate_purchase_order.py
    liberogic_logo.png
    liberogic_seal.png
    purchase_order_counter.json`

## 処理フロー

1. `.app` に見積書PDFをドラッグ&ドロップ
2. Pythonスクリプトを実行し発注書PDFを生成
3. 完了通知(macOS通知)を出して発注書PDFを自動で開く
4. 発注書PDFは見積書と同じフォルダに保存

## 発注書の仕様

出力フォーマットは添付のMoneyForward形式のPDFに合わせること。

このPDFから以下を抽出して使う:

- ロゴ画像
- 押印画像
- レイアウト座標
- 列幅
- 余白
- フォントサイズ

## 自社情報

リベロジック株式会社
登録番号:T2010401081132
〒108-0073 東京都港区三田1-3-37 板金会館2F
TEL: 03-6809-4366 / FAX: 03-6809-4367

## 発注書番号

- 形式:`{会社略称}様 発注書{YYYY}{MM}{3桁連番}`
- 会社別・月別の連番を `purchase_order_counter.json` で管理
- 出力ファイル名もこの発注書番号に揃える

## 発注日

- 見積書の日付から5営業日後
- 土日と日本の祝日を除外する

## 見積書からの情報抽出

- どんな会社のフォーマットでも対応できる柔軟な正規表現で抽出
- 抽出項目:ベンダー名・住所・TEL、見積書番号、見積日、件名、明細、小計・消費税・合計
- ベンダー判定:「御中」の付いた会社=自社、それ以外=発注先
- 件名に住所の建物名が混入するケースに対応

## 発注書レイアウト

- タイトル「発注書」中央大文字
- 左:発注先の社名・住所・TEL
- 右:自社情報+ロゴ+押印+発注書番号・発注日・見積書番号・見積日
- 件名・発注金額を大きく表示
- 明細テーブル:品目/単価/数量/単位/価格
- 交互グレー背景
- 最低8行
- 合計エリア:小計・消費税・合計のみ
- 備考欄を枠付きで表示
- ページ番号なし

虽然它本质上是一份简化的规范文件,但重要的是要尽可能详细地说明业务限制和所需的最终产品,而是简单地说“让它看起来漂亮”。
最后,当我尝试让它读取不同的格式时,它失败了,所以我需要克劳德更加努力地工作,但它仍然很快,所以我想还不错。
(我们合作的外部员工和合作伙伴人数甚至不到两位数,所以这没什么大不了的!)

因为它非常方便,所以我们也需要关注它的安全性。

另一方面,在使用人工智能开发支持时,不仅需要考虑便利性,还需要考虑安全性。

在您按照流程操作并向 Claude Code 发出指令的过程中,将会在您的本地环境中执行几个操作。

- 读取和写入 ~/Desktop 目录下的文件

- 考虑访问 ~/Library/Services/ 目录

- 使用 pip install 添加 Python 库

- 使用 osacompile 生成 AppleScript 应用程序

- 读取位于 ~/Library/Fonts/ 目录下的字体文件

这虽然不是什么特别重要的事,但赋予人工智能在本地环境中执行权限还是有点让人担心,不是吗?😨

当将终端操作或文件操作委托给系统时,可能会出现意外的文件创建/覆盖/删除的情况。

  • 检查一下你允许了什么!
  • 请务必备份!
  • 凡是可以用 Git 管理的东西,都要检查一下区别!
  • 让我们创建单独的工作文件夹!

这些基本措施很重要。如果您将其用于开发工作,最好通过 1Password 加载 .env 文件。虽然有点麻烦,但效果显著。(作者)我们的首席技术官

另一方面,就像本案一样。如果仅供本地环境使用,风险相对较小。在大多数情况下,这种影响很少会通过网络向外扩散,最坏的情况也只是影响到自身的环境。

还有很多其他需要注意的地方,但“快速创建”和“安全使用”是两回事。在使用人工智能进行开发时,务必随时检查执行权限、文件操作、外部库以及输入数据的处理方式!

接下来,我们将专注于人员共享以及与 Supabase 的整合。

所以,这次我创建的是一个简单的采购订单生成工具,它可以在本地环境中运行。

在初始阶段,purchase_order_counter.json我们已经建立了一个系统,用于按公司和月份管理顺序编号,但考虑到将来我们会与员工共享此系统,仅使用本地 JSON 文件管理顺序编号自然会导致采购订单号重复等问题。

因此,我计划在 Supabase 端实现公司特定和月度计数器,这样即使多人使用也不会出现重复的顺序编号,并且还会添加采购订单签发历史记录、供应商、报价单号、订单金额、订单日期和 PDF 保存位置等功能!

撰稿人

尽管身为首席执行官,他始终保持着平易近人的姿态。他乐于了解新技术,并享受科技带来的便利,他是一个亲力亲为、全身心投入的人。他对未来科技充满热情,并希望无论年龄多大都能继续体验新鲜事物。

Morimoto

项目经理/总监/成立于2007年

查看这位员工的文章

我们以可靠的团队结构和快速的响应能力而自豪。

在 Liberogic,我们经验丰富的员工积极推动项目进展,这也是我们受到客户高度评价的原因。
我们确保项目经理和主管得到合理分配,以确保整个项目的顺利进行。 我们避免因全额承诺而导致不必要的成本增加,并将资源分配给合适的人员和合适的岗位,并以快速掌握工作内容、创建和提交预算而闻名。

请注意,我们不积极参与SES式的现场工作。

我们支持几乎所有主流的项目管理和聊天工具,包括 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom 和 Webex。

如果您有任何与网络相关的问题,请联系我们。

案例研究