Sisyphus
|
d6ad7e02c5
|
chore: gitignore 排除 .omo/.zcode 本地工具目录
|
2026-09-30 09:35:16 +08:00 |
|
Sisyphus
|
5a49a37235
|
docs: 项目交接文档 + 比价功能PRD + 数据维护脚本
- HANDOVER.md: 完整交接文档(架构/数据模型/API/业务流/已知坑/工作区状态/待办)
- PRD-智能比价助手.md: 比价功能产品需求文档(供外部平台参考)
- 数据维护脚本: 清理AI垃圾品类SQL、修复损坏标题SQL、线索重分类/重抓脚本
|
2026-09-30 09:35:05 +08:00 |
|
Sisyphus
|
eb15849168
|
feat: 询价标题AI压缩 + 采集器品类化 + 询价搜索与品类多选框
- TitleCompressorService: 发布前超长标题(>50字)调 MiniMax 压缩(保留公司名+物料+采购类型), JSON结构化输出对抗推理模型思考噪音, 失败硬截断兜底
- publishToDirev 集成标题压缩, 保留原50字预校验作为防御
- crawler resolveKeywords: 采集器配置优先按关联品类展开关键词库, 中电建每关键词独立状态文件
- InquiryPage: 新增关键词搜索(fSearch → GET /api/leads?search=)
- RuleCenterPage: 采集器配置由 keywords 改为品类多选框(categories JSON数组)
|
2026-09-30 09:34:58 +08:00 |
|
Sisyphus
|
f12722eed9
|
feat: 关键词库管理UI + 品类CRUD完善
|
2026-07-23 14:45:46 +08:00 |
|
Sisyphus
|
fd8b197853
|
feat(xkgroup): 加 3 个新过滤规则 (类型+多次询价标题+组织白名单)
【新规则】
1. DEFAULT_TYPES 增加 D (流标公告), 现在抓寻源(C) + 流标(D)
2. RETRY_PATTERN: 标题含 二次/三次/四次/.../九次
3. ORG_WHITELIST: 新疆宝地矿业股份有限公司 + 新疆火烧云铅锌矿有限责任公司
【触发时机】
这三个条件作为附加过滤层, 在原有 --keyword (DB CrawlerConfig.keywords) 之后生效
【验证(生产)】
累计 168 条历史状态命中:
- 单 RETRY: 49 条
- 单 ORG: 10 条
- RETRY + ORG: 3 条 (火烧云绿色矿山, 宝地审计二次/三次)
⚠️ 注意: 加上 DB 关键词 (电缆/钢材/阀门/管材/设备/机械/矿业) 后只剩 2 条命中
关键词是为电力工程领域配的, 新规则聚焦宝地/火烧云的多次询价,
两者交集很小. 建议清掉新矿 DB 的 keywords 让新规则单独生效.
|
2026-07-22 15:13:00 +08:00 |
|
Sisyphus
|
587a09774e
|
fix(crawler): runGenericScript 支持 DB keywords, 跟 runPowerChina 对齐
【问题】
runGenericScript() 直接 execSync 没拼 --keyword, 导致 DB CrawlerConfig.keywords
对新矿/中核等 generic python 脚本完全失效. 之前 7 月份排查中电建入库少时确认过:
- 中电建: runPowerChina() 会逐 keyword 调用 → DB 关键词生效
- 新矿/中核: runGenericScript() 只调用一次不传 keyword → DB 关键词沦为摆设,
新矿实际是全量抓"寻源公告", 入库量看起来正常但跟 DB 配置不一致
【修复】
照搬 runPowerChina() 的 keyword 循环+去重模式:
- 解析 config.keywords (JSON), 为空默认 ['']
- 逐个 keyword 调用 execSync, 失败继续下一个
- 用 seen Set 跨 keyword 去重
- 只处理 downloaded_at 是今天的记录 (避免历史重复入库)
【验证(生产)】
- 部署后 health 200 OK
- 手动跑 fetch-xkgroup.py --keyword 电缆/钢材/阀门/管材, 4 个全部 0 命中
(新矿寻源公告确实没有电缆/钢材等关键词)
- 关键词确认生效, 新矿后续入库量会大幅下降 (按 DB 关键词配置真实反映)
|
2026-07-22 12:31:23 +08:00 |
|
Sisyphus
|
fc4a4e81d4
|
fix(中电建): 跨天首次运行回溯 3 天, 补抓前一天后半天发布的公告
bug 复现: state 文件按日期存放, 跨天首次运行 sinceDate=今天,
漏掉前一天 8:00 CST 之后才发布的公告 (用户实例: 2409490555 中电建水电十四局橡胶电缆, 7/21 22:45 发布).
修复: 新增 BACKFILL_DAYS=3 配置, state 为空时 sinceDate = today - 3 天,
新增'跨天补抓'日志分支.
验证: 删 state 后重跑拉到 80 条 / 28 条招采公告, 全部下载成功.
本地 + 生产 scp 同步部署, 4 个关键词全流程测试通过.
|
2026-07-22 11:41:49 +08:00 |
|
Sisyphus
|
072696321e
|
fix(cron): 统一为 6 字段格式兼容 cron@4.4.0
【事故修复】
REPLACE(schedule, ' 1-5', '') 把 '0 8 * * 1-5' 损坏为 '0 8 * *'(4 字段,少 2 段),
cron v4.4.0 解析时报 Too few fields → API 崩溃循环重启 533 次。
【修复】
- 生产 DB: 中电建 0 0 8 * * * / 新矿 0 5 8 * * * (6 字段,含秒位)
- seed.ts: 同步修正
- CRON_PRESETS: 前端预设值也改为 6 字段格式
- 生产 API 已重启(pid 2325762, health OK)
|
2026-07-16 16:54:00 +08:00 |
|
Sisyphus
|
6964380de5
|
chore(crawler): 去掉「每4小时」选项,保留每6小时/每天早晚/手动
|
2026-07-16 16:35:06 +08:00 |
|
Sisyphus
|
1dfe5ede67
|
fix(crawler): 修复 cron 表达式工作日限制(1-5),改为每天执行
- 生产 DB: 中电建 0 8 * * 1-5 → 0 8 * * * (每天早8点,含周末)
- 生产 DB: 新矿 5 8 * * 1-5 → 5 8 * * * (每天早8:05,含周末)
- 生产 DB: 重激活新矿采集器(paused→active)
- seed.ts: 同步修正, 避免未来 db:init 再次写入 1-5
- PM2 已重启使新 cron 生效
说明: 1-5 = 周一至周五, 去掉后变为每天执行。
用户可在前端「采集器配置」下拉框自由切换:
每4小时 / 每6小时 / 每天早8点/晚7点 / 手动
|
2026-07-16 16:31:42 +08:00 |
|
Sisyphus
|
68f6fc5c16
|
feat(ui): 前端 UI 组件化重构 + 发布表单增强
【新组件】
- ErrorBoundary: 全局错误边界,渲染崩溃时显示重试/刷新按钮
- ui/Toast: 全局 Toast 通知系统 (success/error/warning/info),Context Provider 模式
- ui/Modal: 统一弹窗 (ESC关闭 + loading遮罩 + 自定义footer)
- ui/Skeleton: 骨架屏 (SkeletonTable / SkeletonCard)
- ui/Lightbox: 图片放大灯箱
【页面迁移】
- InquiryPage: useToast + Modal + SkeletonTable 替换手写代码,新增 pubForm
发布前预填联系人/电话/地址 + 发布时传 body 给后端
- LeadDetailPage: 迁移到 Toast + Modal
- ProductPage: 迁移到 Toast + Modal + SkeletonTable
- AdminPage: 迁移到 useToast
- ComparisonPage: 迁移到 Toast + SkeletonTable
- ImagePage: 迁移到 Toast + SkeletonCard
【基础设施】
- globals.css: 新增 fadeIn/slideUp 动画
- page.tsx: SPA 根接入 ToastProvider + ErrorBoundary
- tailwind.config.ts: 新增 animate keyframes
【后端】
- integration.service.ts: MCP session 管理 + charset 修复
- lead.controller.ts/lead.service.ts: 发布端点增强 + 物料提取服务注入
|
2026-07-16 15:46:37 +08:00 |
|
Sisyphus
|
4d5521e365
|
docs: 更正生产服务器 IP(124→172) + 补充一键部署入口说明
- 旧 IP 124.222.182.242 的 SSH 22 端口已超时失效,实际为 172.81.241.109
- deploy.sh 一直是正确 IP,AGENTS.md 与之不一致导致首次排查踩坑
- 补充 SSH 连接方式和一键部署命令,IP 以 deploy.sh SSH_HOST 为单一信源
|
2026-07-14 14:23:23 +08:00 |
|
Sisyphus
|
ad7e739b83
|
fix(lead): 列表排序改为最新入库优先 — 修复新数据沉底被误判为"老信息"
原排序 deadline desc 在前、createdAt desc 在后,导致:
- 截止日期远的旧线索排在首屏,最新采集的数据沉到 700+ 名开外
- deadline 为空的新线索在降序排序里直接沉底
改为 createdAt desc 为主排序键,deadline 降为同批次内次序参考。
验证(生产 802 条数据模拟):今天 08:05 采集的线索从第 702 位升到第 1 位。
|
2026-07-14 14:15:14 +08:00 |
|
Sisyphus
|
9702d4b8ae
|
chore: 忽略 tsbuildinfo 构建缓存文件
apps/web/tsconfig.tsbuildinfo 是增量编译缓存,不应纳入版本控制。
|
2026-07-14 11:57:43 +08:00 |
|
Sisyphus
|
0d2dce6b73
|
fix(admin): MCP 对接弹窗防误关 — 屏蔽遮罩点击 + 加关闭按钮 + ESC 支持
填表期间误点遮罩会丢失已填内容(apiKey/appSecret 等),改为只能用右上角 ×
或 ESC 键关闭。
|
2026-07-14 11:56:56 +08:00 |
|
Sisyphus
|
8a3c96598b
|
feat(lead): 一键发布增强 — 物料清单提取 + 标题预校验 + 错误诊断
- 新增 MaterialExtractorService:发布前实时从公告正文/标题提取结构化物料(items),
三层降级(正文 AI → 标题 AI → 整标题兜底),全程不阻断发布
- publishToDirev 接入物料提取,items 传给产业平台 publish_rfq
- 新增 B2B 标题 50 字预校验,提前报错避免拿到通用"服务器内部异常"
- 新增 diagnosePublishError():把产业平台原始错误翻译成明确指引
(标题超长/数量异常/身份校验/必填缺失)
|
2026-07-14 11:56:43 +08:00 |
|
Sisyphus
|
a822d7782b
|
feat(ui): 品类筛选框升级为可输入关键词过滤的 Combobox
【问题】
询价发布助手筛选工具栏的品类下拉框有 53+ 个选项,用户难以快速定位。
【改动】
- 把品类 filter 从统一 .map(select) 里拆出,改成自定义 Combobox:
- input + 浮动下拉面板 (z-30)
- 关键词过滤 (toLowerCase + includes 模糊匹配,中文友好)
- 键盘导航: ↓/↑ 高亮 / Enter 选中 / Esc 关闭 / Backspace 空时清空筛选
- 鼠标: hover 高亮 / click 选中 / click outside 关闭 (useEffect + ref)
- 选中项右侧显示 ✓
- 已选非默认时显示 × 清空按钮
- 其他 5 个 filter (公告日期/星级/甲方级别/来源平台/负责人) 保持原生 select 不变
- 状态: catInput / catOpen / catHighlightIdx / catRef,useMemo 缓存过滤结果
【体验】
- 输入'钢' → 立即显示 钢材/钢格栅 等候选
- 输入'电缆' → 显示 电线电缆
- 空 input + Enter → 选中'全部品类' 等价清空筛选
- 已选'钢材'显示在 placeholder + 右侧 × 按钮
【部署】
web 重新构建 + sync .next 到生产 + PM2 重启 pingtai-web
|
2026-07-01 14:18:13 +08:00 |
|
Sisyphus
|
1a92a3c095
|
fix(categories): 硬化 AI 分类输出过滤,防止下拉框再次被 AI 推理文本污染
【问题】
AdminPage / InquiryPage 品类下拉框显示 414 条 AI 推理文本 (例: '**合金铝线采购** - 这是**电线电缆**的一种'),
源头: CategoryInferenceService 把 MiniMax (M2.7) 响应的整段 markdown/think 文本写到了 ProductCategory.name。
【根因】
原代码对 MiniMax 返回值没有任何后处理,直接信任模型输出。
-prompt 只说'只输出品类名', M2.7 推理模型仍会输出 think 标签 + 解释 + **加粗**;
-isValidCategoryName 黑名单里错误地把钢材/管材等 15 核心也当作 noise,导致合法品类被丢弃回退。
【修复】
1. src/product-category/category-inference.service.ts:
- 新增 isValidCategoryName + sanitizeOne 后处理链,强制规则:
* 长度 1-6 字符
* 只允许纯中文 (无 ** / → / - / 中文标点 / 连续英文字母)
* 排除项目词 (采购/项目/公司/工程/设备/材料/招标 等)
* 排除推理噪声前缀 (让我分析/根据/考虑 等)
- SYSTEM_RULES 系统提示明确禁止思考/解释/Markdown/标点/项目词/英文
- 单条调用 max_tokens: 50 → 60 (留余量防截断)
2. scripts/restore_categories.js: 恢复 27 品类(15核心+12扩展),upsert 幂等,关键词来自 scripts/expand_keywords.js
3. scripts/sanitize_smoke.js: 11 case 回归测试,验证 sanitizeOne 拒绝所有已知污染样本
【生产验证】
/api/categories 返回 53 个品类,最长 6 字符,无 ** / → / - 。PM2 已重启加载新版。
|
2026-07-01 12:12:19 +08:00 |
|
Sisyphus
|
4896453dfb
|
feat: 扩展关键词完成 68 条空品类线索分类 (100% 覆盖率)
- scripts/expand_keywords.js: 扩展 15 品类关键词至 27 个,匹配 58 条
- scripts/assign_remaining.js: 10 条剩余线索合理分配 (消毒剂→涂料, 重水→仪表, 光伏支架→钢材等)
- scripts/CATEGORY_CLEANUP.md: AdminPage 品类清理建议 (保留核心 15 + 7 个扩展, 合并/删除 24 个 AI 新建细分类)
最终状态: 761 条线索 100% 已分配品类, 42 个品类 (15 主类目 + 27 扩展/AI 新建)
|
2026-07-01 11:51:38 +08:00 |
|
Sisyphus
|
a9ef6e952f
|
docs: 记录品类方案 C + DeepSeek→MiniMax 迁移 + 停止 AI 回填决策
- ProductCategory 表/CRUD/AI 分类/关键词反哺完整流程
- LLM 配置 (MiniMax-M2.7, env MINIMAX_API_KEY)
- 重要决策:停止用 AI 回填历史空品类线索 (91% 已分配,剩余 68 条 + AI 新建 25 个细分类 交人工 review)
|
2026-07-01 11:45:36 +08:00 |
|
Sisyphus
|
ab764bbc6c
|
refactor: DeepSeek → MiniMax (M2.7 推理模型) 迁移
- notes-extractor 和 category-inference 都改用 MiniMax API
- endpoint: https://api.minimaxi.com/v1/chat/completions
- model: MiniMax-M2.7 (env 可覆盖 MINIMAX_MODEL)
- 提示词明确禁止 <think> 标签和解释文字
- 新增 scripts/backfill_category.js (单条请求 + 严格清洗)
- 新增 scripts/clean_category.js (清理 <think>/**加粗/解释行/破折号 等脏值)
- 生产 .env 已写入 MINIMAX_API_KEY
- 实际回填: 693/761 (91%) 已分配品类, 68 条空品类待后续处理
|
2026-07-01 11:31:17 +08:00 |
|
Sisyphus
|
f625dd0de1
|
refactor: 移动 CategoryInferenceService 到 product-category 模块,修复循环依赖
- 移动 category-inference.service.ts 从 lead/ 到 product-category/
- 修复所有 import 路径
- InquiryPage 品类筛选改为动态 API 加载
|
2026-07-01 02:38:30 +08:00 |
|
Sisyphus
|
58ac140802
|
feat: 品类方案C - AI分类 + 关键词表反哺
- 新增 ProductCategory 表(schema + migration + seed 15个品类)
- 新增 product-category CRUD API(GET/POST/PUT/DELETE /api/categories)
- 新增 CategoryInferenceService:关键词匹配优先,失败时调 DeepSeek AI 分类,结果反写品类表
- 更新 CrawlerService:采集入库时使用 batchInfer 替代硬编码 inferCategory
- 更新 LeadService:品类筛选改为 DB 关键词匹配,移除硬编码 CATEGORY_KEYWORDS
- 修复 LeadModule/CrawlerModule 依赖关系,避免循环依赖
|
2026-06-30 18:37:23 +08:00 |
|
Sisyphus
|
761200a70c
|
feat: 询价发布助手去掉状态筛选,列表状态列替换为品类
|
2026-06-30 17:43:56 +08:00 |
|
Sisyphus
|
c1c7342621
|
feat: 询价发布助手详情面板增加发布按钮
|
2026-06-30 17:20:03 +08:00 |
|
Sisyphus
|
3a72d6396c
|
feat: 入库时写入 category 字段 + 导出 inferCategory + apiBase ?? 修复
|
2026-06-29 17:34:27 +08:00 |
|
Sisyphus
|
785db9277d
|
fix: 商品生图助手容错 — API 返回非数组时设空数组避免崩溃
|
2026-06-29 17:33:21 +08:00 |
|
Sisyphus
|
d8d49f7e88
|
fix: 修复生产环境登录双/api路径问题
API_BASE为空时用||替代??,确保fallback到localhost:4000
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 17:12:19 +08:00 |
|
Sisyphus
|
481d01c89f
|
feat: 简化侧栏 - 移除冗余的线索详情菜单项,扁平化线索池入口
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 17:05:41 +08:00 |
|
Sisyphus
|
209f2e3d05
|
chore: 添加一键部署脚本 scripts/deploy.sh
自动构建 + rsync 编译产物和源码 + pm2 restart
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:55:40 +08:00 |
|
Sisyphus
|
8d8945f92b
|
docs: 更新 AGENTS.md、gitignore(排除上传文件)、开发文档
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:25:24 +08:00 |
|
Sisyphus
|
44609be8c7
|
feat: 线索池品类选项扩展、隐藏数量列、采集器按钮样式优化
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:25:06 +08:00 |
|
Sisyphus
|
0a423af4d2
|
feat: 商品导入修复 brand 字段命名 + 添加 unit 和错误日志
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:24:54 +08:00 |
|
Sisyphus
|
ae72966766
|
feat: 线索池品类筛选改为按标题关键词匹配
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:24:43 +08:00 |
|
Sisyphus
|
bd213eb5ec
|
feat: 采集器地址提取优化 - 省份关键词匹配、标题兜底、跨天去重
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-26 16:24:32 +08:00 |
|
Sisyphus
|
49f922444a
|
feat(F002-P1): 调试期累积修复
- 商品上架 MCP: 简化 batchPublish, price=0 默认 0.01, sku 用 spec/name
- 集成 service: 完善 import_products 调用链
- 前端 ProductPage: 调整按钮与列表
- 文档: 本地开发工作流 + devbox F002 升级需求
- 脚本: rotate-mcp-key.sh (一键密钥轮换)
|
2026-06-25 10:01:45 +08:00 |
|
Sisyphus
|
672a4b41b2
|
feat(F002-P0-A): 商品上架 - Mac 端 publish-to-direv API + web 按钮
- product.service.ts: 新增 publishToDirev() 调 MCP import_products
- product.controller.ts: 新增 POST /api/products/publish-to-direv
- product.module.ts: 引入 IntegrationModule
- ProductPage.tsx: 工具栏加 '上架 B2B' 按钮 (绿色)
- 字段映射: Product(category/price/brand) → MCP(category_id/price/brandName)
|
2026-06-24 12:20:22 +08:00 |
|
Sisyphus
|
4ab0040e55
|
feat(F002-P1): Lead 加 notes 字段 + crawler 提取 PDF 6 条要点 (老 GUI 同款)
- Lead 模型加 3 字段: notes (5000 字) / notesExtractedAt / notesSource
- 新增 NotesExtractorService (crawler 模块): PDF/HTML/URL → text → DeepSeek → 6 条要点
- 新增 LeadNotesController: POST /api/lead-notes/extract/:leadId (24h 缓存 + forceRefresh)
- lead.service.ts publishToDirev 优先用 notes 填 publishArgs.description + 同步传 notes
- Java publish() 已有逻辑: notes 优先 → description, 不需要改
- 端到端验证: Lead.notes=6 条要点 → publishToDirev → B2B tb_inquiry.note 正确落地
依赖: pdf-parse (新加, 1 个 npm 包, 25KB)
API 端点:
- POST /api/lead-notes/extract/:leadId?sourcePath=<URL|路径>&forceRefresh=false
- 返 { notes: string, source: 'pdf'|'html'|'url', cached: boolean }
环境变量: DEEPSEEK_API_KEY (从 .env 读, 缺时报错)
关联: F002-W31-交接文档.md §4 P1
本地备份: ~/projects/_meta/f002-fix/w31-platform-assistant-2026-06-23/
|
2026-06-24 11:52:59 +08:00 |
|
Sisyphus
|
afac18e843
|
feat(F002): W26 + W29.x + W30 + W31 平台助手全部改动首次 commit
- W26: NestJS API + Next.js Web + Prisma + SQLite scaffold
- W26: Lead 模型 + Crawler + 询价发布助手 (线索池 + 一键发布)
- W29.x: MCP 集成 (Integration 模型 + connectMcp + publish_rfq 5 工具端到端跑通)
- W30: 3 字段补充 (notes / quotationType / quotationDemand)
- W31 P1: 自动填 enterpriseId / userId (Prisma companyUserId 字段 + get_app_identity tool + lead.service.ts publishArgs)
- W31: detail 详情页 + admin UI 集成管理 (OpenAppListView + AuditLogListView)
关联: ~/Documents/02-平台开发/产品开发/F002-W31-交接文档.md
GIT-AUDIT-REPORT-2026-06-24.md
|
2026-06-24 11:07:11 +08:00 |
|