DaoSales 培训手册

设计师

面向设计师:图纸、BOM、材料、设计费

今天要做什么

按节拍跑图:每天推「评审中」的图纸和当日新图,每周盘未关联的「已通过」图与待收设计费,每月核已抵订单的设计费金额与项目齐套状态。

每日

  1. 开班先扫 /dashboard/designs,按状态「评审中」(in_review)筛选,收昨日评审人批注;通过的切到「已通过」(approved)。
  2. 接销售转来的 RFQ / 项目:在「新建设计」里选项目、上传图纸文件 DWG / DXF / AI / PSD / PDF(单文件 ≤ 50MB)。
  3. 给「已通过」图纸做关联:详情点「关联」挂到「报价行」(quote_item)/「订单行」(order_item)/「产品档案」(product),下游采购与生产从此读图。
  4. /dashboard/designs/fees 核当日到账:给「待付」(pending)设计费记录收款;客户付清后系统自动推进到「已付款」(paid),随后点「开始设计」进入「设计中」(designing)。
  5. 完工出图:已交付的设计费点「完成」进入「已完成」(completed);锁定订单后做抵扣。
日常入口:/dashboard/designs(图纸画廊)、/dashboard/designs/fees(设计费单)、/dashboard/products/[id](产品 BOM)。

每周

  • 盘「已通过」但没有关联记录的图纸(approved 却无 drawing_assignments 行):未关联意味着下游没拿到图。
  • 盘「已付款」但三天还没开工的设计费(status='paid' 却未进入 designing):约客户再确认规格。
  • 盘项目齐套:项目下「图纸齐套度」未达 100% 的跟进评审人。

每月

  • 核「已抵订单」的设计费:状态为「已抵订单」(status='converted')的记录,其 amount_applied_to_order(抵扣金额)要与目标订单的 paid_amount(已收金额)对得上。
  • 清「已驳回」图纸:rejected 超一个月未修订的归档或删除。
designer/nav-overview.jpg

权限红线(先看这 5 条)

  • 图纸文件只接受 DWG / DXF / AI / PSD / PDF / PNG / JPG / GIF / SVG / WebP(这些是行业通用的设计源文件和图像格式,保留原英文缩写),单文件 ≤ 50MB——超限或扩展名不符直接被系统拒收。
  • 状态为「已通过」(approved)的图纸不能改文件本体——要改必须重新上传新一条记录并自增版本,老版保留。
  • 设计费处于「待付」(pending)状态不能直接转订单抵扣——必须先收齐款进入「已付款」(paid)/「已完成」(completed)后才允许「抵扣订单」。
  • BOM(物料清单)编辑入口在产品模块(/dashboard/products/[id]),不在 /dashboard/designs——设计师跨模块维护变体 BOM,项目 BOM 在 /dashboard/projects/[id]
  • 已「抵订单」(converted)的设计费不能退——已抵订单的款项只能在订单侧冲销,不走设计费退款流程。

系统功能缺口(3 项,培训开场必讲)

以下是设计师日常高频想用、但当前系统尚未在 UI 暴露的功能。学员先知道"哪里不能点",避免到处找入口。遇到这三类需求走替代方案,或联系 IT。

  1. ECO / 工程变更单(design_change_orders)无专用表与入口。 行业通用的"已批准图纸改动要走 ECO 流程"在本系统没有独立单据。替代方案:重新走「新建设计」上传新版(版本号 version 由设计师手工自增),状态选「评审中」(in_review)做新一轮评审;旧版保留用于追溯;下游已关联的图纸要手动切到新版 drawing_id
  2. BOM 版本无法在界面回滚。 代码里有 revertBOMVersion 这个函数(意思是"回滚 BOM 版本"),但 UI 目前没有对应按钮——改错只能在产品详情的 BOM 管理器里删行重建;需要保留历史请让管理员从 DB 侧做快照。
  3. 设计费"作废"(forfeited,即客户弃付没收的场景)UI 无触发入口。 数据库枚举已预留这个状态,但前端没暴露任何按钮;如需使用,联系 IT 走后台更新。日常不需要认识这个状态。

Quickstart — 日常核心任务

2.1 上传设计图纸

客户 / 销售确认设计需求,项目已落库;把 DWG / PDF / AI 等设计文件传入系统并关联项目,供下游评审。

  1. /dashboard/designs,右上点「新建设计」。(见图 ①)
  2. 弹窗填图纸名(必填);选所属项目(必填,图纸必须挂项目)。(见图 ②)
  3. 选初始状态:默认「草稿」(draft);已和客户当面确认可直接设「评审中」(in_review)。(见图 ③)
  4. 拖拽文件或点上传区选文件——超过 50MB 或扩展名不在白名单会立即报错。(见图 ④)
  5. 填备注(可空),点「提交」——系统存入存储桶 design-drawings 并落到图纸表。
designer/gallery-list.jpg
designer/upload-dialog.jpg
何时不该做:未确认项目归属(projectId 未填)的图纸不要传——无项目归属会导致后续项目齐套度统计漏掉该图,下游采购 / 生产在 /dashboard/projects/[id]?tab=drawings 也看不到。文件 > 50MB 不要拆分后混传——走分块上传或先在外部压缩。
观测信号:
  1. 画廊顶部出现新卡片,缩略图可见,状态徽标按所选初始状态显示。
  2. 详情页「版本」= v1(新建记录);「文件大小」与本地文件一致。
  3. 项目详情「图纸」Tab 下该图出现在聚合视图里。
技术追溯:图纸表 design_drawings 新增行,file_url 指向 /object/public/design-drawings/version=1status 属于 (draft, in_review)。
系统动作:uploadDesignDrawing

2.2 图纸评审流转

草稿完成自检后送审;评审人在详情页做通过 / 驳回;驳回后修订可回退到草稿再上传新版。

  1. 在画廊点图纸卡片进详情页。
  2. 右下「操作」卡片点「提交评审」——状态由「草稿」(draft)推进到「评审中」(in_review)。(见图 ①)
  3. 评审人打开详情,点「批准」或「驳回」——状态由「评审中」推进到「已通过」(approved)或「已驳回」(rejected)。(见图 ②、③)
  4. 被驳回图纸点「回退草稿」回到「草稿」状态,然后重新上传新版(当前不支持在同一行替换文件本体)。(见图 ④)
designer/drawing-detail.jpg
designer/drawing-status-actions.jpg
何时不该做:已「已通过」(approved)的图纸不要再动状态——下游采购 / 生产可能已据此排料。确需改设计:新版上传后走新一轮评审,老版保留做追溯。已知缺口:当前系统没有独立的 ECO(工程变更单)表(代码里 design_change_orders 未实现),变更靠新版号 +「评审中」重走流程。
观测信号:
  1. 详情页顶部状态徽标按 「草稿」→「评审中」→「已通过」/「已驳回」推进。
  2. 画廊卡片的状态下拉同步变更。
  3. 项目齐套度分子 +1(项目下所有图纸都「已通过」时触发下游开工闸)。
技术追溯:图纸状态列 design_drawings.status enum: draft | in_review | approved | rejected;合法 transition(流转):draft↔in_reviewin_review→approved|rejectedapproved|rejected→draft;齐套检查函数 checkProjectDrawingsReady
系统动作:updateDrawingStatusAction

2.3 关联图纸到业务实体

图纸「已通过」(approved)后必须挂到具体的报价行 / 订单行 / 产品档案,否则采购和生产读不到。

  1. 在图纸详情右上点「关联」打开关联对话框。
  2. 弹窗选关联实体类型:「报价行」(quote_item)/「订单行」(order_item)/「产品档案」(product,即产品变体层)。
  3. 填目标实体 ID(从报价 / 订单 / 产品详情页复制 UUID)。(见图 ①)
  4. 填备注(例如「对应卧室衣柜 3#」),便于下游识别。(见图 ②)
  5. 点「关联」——数据落入「图纸关联表」(drawing_assignments),详情页右下关联卡片出现新行。
designer/assignment-dialog.jpg
何时不该做:关联实体类型 entity_type 只允许三种值:quote_item / order_item / product——填其他值会被拒。未「已通过」的图就挂生产订单会让生产照草稿开料,出错只能返工。同一图纸挂多个实体要分别做一次关联(不是批量)。
观测信号:
  1. 图纸详情的关联卡片出现新行,实体类型徽标 + 前 8 位实体 ID 可见。
  2. 下游模块按实体 ID 反查:订单详情会显示图纸链接;产品详情图纸页面亦显示。
技术追溯:图纸关联表 drawing_assignments 新增行(drawing_identity_typeentity_idnotescreated_by)。
系统动作:assignDrawingToEntityActiongetDrawingAssignments

2.4 编辑图纸元数据

图纸名 / 描述录错或要补充说明,元数据可改;文件本体不能原地替换。

  1. 图纸详情右上点「编辑」。(见图 ①)
  2. 改名称 / 描述(注意:文件上传区在此弹窗无效——这是元数据编辑,不是新版上传)。(见图 ②)
  3. 点「保存」——版本号(version)不变,也不触发评审重置。
designer/edit-drawing-dialog.jpg
何时不该做:要换文件内容不要在这里改——此入口只动名称(name)/ 描述(description)。换文件走「新建设计」传新版并自增版本号,老版保留用于追溯。
观测信号:
  1. 详情页标题同步刷新为新名称。
  2. 画廊卡片标题同步变更。
  3. 版本号不变。
技术追溯:图纸表 design_drawingsname / description 更新;version 不变;updated_at(更新时间)刷新。
系统动作:updateDrawingMetadataAction

2.5 创建设计费单

客户确认设计委托后,在收款前落一张「设计费单」以便跟踪到账、开票和后期抵扣。

  1. /dashboard/designs/fees,右上点「新建设计费」。(见图 ①)
  2. 填客户(必填,从客户列表复制客户 ID)。
  3. 填金额(必填);币种默认人民币(CNY),外币项目需改。(见图 ②、③)
  4. 关联项目(可选);填设计描述、交付期限、条款、备注。(见图 ④)
  5. 点「提交」——系统自动生成设计费编号(格式 DF-YYYY-NNNN,例如 DF-2026-0007),初始状态为「待付」(pending)。
designer/fees-list.jpg
designer/fee-create-dialog.jpg
何时不该做:未经客户书面 / 邮件确认设计委托禁止建单——「待付」的单出现在财务应收预期列表里,无效单会污染回款预测。币种填错必须删单重建,不能直接改(影响下游汇率换算)。
观测信号:
  1. 设计费列表顶部出现新行,编号 DF-YYYY-NNNN
  2. 状态徽标显示「待付」(pending)。
  3. 详情页「已付金额」= 0、「可抵扣余额」= 0。
技术追溯:设计费单表 design_feesdesign_fee_number 自增;status='pending'amount(总额)写入、paid_amount(已收金额)= 0。
系统动作:createDesignFeeAction

2.6 记录设计费收款 + 状态流

客户转账到账,按实际到账金额累加「已收金额」;付清后流转状态到「设计中」再到「已完成」。

  1. 设计费详情页核对金额与客户匹配。
  2. 出纳 / 销售确认银行到账后,在设计费详情触发收款记录(累加已收金额 paid_amount)。
  3. 付清后状态自动进入「已付款」(paid);点「开始设计」进入「设计中」(designing)。
  4. 设计交付后点「完成」进入「已完成」(completed)——此时可抵订单。
  5. 全程未开工可点「退款」进入「已退款」(refunded)。
designer/fees-list.jpg
何时不该做:未收到银行回单禁止预录收款——错录需走删除回滚,且会误导「已付 / 未付」仪表盘。状态未到「已付款」前不要点「开始设计」——系统硬校验收款完成才允许进入「设计中」。处于「已抵订单」(converted)/「已退款」(refunded)状态下点任何动作都会被拒。
观测信号:
  1. 详情页「已付金额」按收款额增长;付清后「剩余未付」= 0。
  2. 状态徽标按「待付」→「已付款」→「设计中」→「已完成」推进。
  3. 列表页徽标色变化(待付 灰、已付款 蓝、设计中 黄、已完成 绿)。
技术追溯:设计费表 design_feespaid_amount 累加、paid_at(付款时间)落时间戳;status 枚举:pending | paid | designing | completed | converted | refunded | forfeitedforfeited = 作废,仅数据库预留,目前无 UI 入口)。
系统动作:recordPaymentActionupdateFeeStatusAction

2.7 设计费抵扣订单

客户由设计进入定做,销售已转订单(单号前缀 SO-);把已完成的设计费作为订单预收款抵扣首付。

  1. 确保设计费状态为「已完成」(completed)、客户与目标订单客户一致。
  2. 设计费详情「操作」卡片填目标订单 ID(从 /dashboard/sales/orders 复制 UUID)。
  3. 点「抵扣订单」——系统写入「抵扣目标订单 ID」(converted_to_order_id)和「抵扣金额」(amount_applied_to_order),目标订单的已收金额 paid_amount 自动加上。
  4. 会计在预付款表 prepayments 里看到一条类型为「设计费」(type='design_fee')的记录。
designer/fees-list.jpg
何时不该做:客户不一致的订单不能抵——系统会校验设计费与订单的客户 ID 是否相同。状态不是「已完成」(处于「设计中」/「已付款」时)不允许抵。已「已抵订单」(converted)的设计费不能再抵第二单——一笔设计费只能抵一单;要拆分抵给多单需事先在抵扣金额里控制。
观测信号:
  1. 设计费状态变「已抵订单」(converted),详情页显示关联订单号与抵扣金额。
  2. 目标订单「已收 / 合计」数字增长;付款 Tab 出现预收款记录。
  3. 会计 AR(应收账款)看到对应订单应收减少。
技术追溯:设计费 design_fees.status='converted'converted_to_order_id / amount_applied_to_order / converted_at(抵扣时间)填充;销售订单 sales_orders.paid_amountrecalculateOrderPaidAmount()(订单已收金额重算函数)刷新;预付款表 prepayments 新增一行,类型为『设计费』(type='design_fee')。
系统动作:convertFeeToOrderAction

2.8 跨模块查看 / 维护产品 BOM

定制产品需要挂 BOM(物料清单)供采购下单、生产备料;BOM 编辑不在设计模块,切到产品详情。

  1. /dashboard/products,在列表找到目标产品点进详情。
  2. 滚到 BOM 管理卡片。
  3. 新增行:选物料、填数量、选单位(默认「件」pcs,可选「米」m / 「平方米」m2 / 「千克」kg)。(见图 ①、②)
  4. 选用途类型:「柜体」(cabinet_body)/「门板」(door)/「台面」(countertop)/「五金」(hardware)/「其他」(other)。(见图 ③)
  5. 点新增按钮保存。(见图 ④)项目 BOM 走 /dashboard/projects/[id]?tab=bom,是另一套入口。
designer/product-bom-tab.jpg
何时不该做:不要把材料直接填到图纸描述里代替 BOM——采购看不到、成本核算也拿不到。产品 BOM 和项目 BOM 是两套表(产品 BOM 表 bom_items vs 项目 BOM 表 project_bom),不要混用;定制件一般先在项目 BOM 草拟,定稿后同步到产品 BOM。已知缺口:BOM 版本目前不在用户界面暴露回滚按钮(代码里有 revertBOMVersion 函数但未挂 UI)——改错只能删行重建。
观测信号:
  1. BOM 表格出现新行,物料名 / 数量 / 用途徽标可见。
  2. 产品详情的成本摘要按新 BOM 重算。
  3. 采购端在采购订单创建时能读到 BOM 展开。
技术追溯:产品 BOM 表 bom_items 新增行(product_idmaterial_idquantityunitusage_typeposition);成本重算函数 computeBomCostSummary
系统动作:BOM 的增删改查在产品模块(非设计师 actions.ts 范围)。

上下游交接契约

设计师产出「图纸 + BOM + 设计费」三类成品,全部靠关联 / 状态流触达下游。契约缺失下游读不到图 / 排不了产 / 对不了账。

设计师 → 销售:图纸挂到报价行

我做什么:图纸状态「已通过」后在详情页点「关联」,选「报价行」(quote_item),填目标报价行 ID。

销售看到什么:报价详情行级图纸区出现图纸链接 / 缩略图;客户看到的 PDF 报价也会带图。

缺失会回来找我:没关联 → 销售发给客户的报价没图,客户要补发。实体 ID 填错 → 挂到别的行,下游采购按错图下单。

技术字段(给 IT/销售交叉核对)

触发动作:assignDrawingToEntityAction

必传字段:drawingId, entityType='quote_item', entityId, notes?

设计师 → 采购:图纸 + BOM 交付下单

我做什么:图纸关联到「产品档案」(product)或「订单行」(order_item);产品 BOM 在 /dashboard/products/[id] 挂齐物料和数量。

采购看到什么:采购在采购订单 / 询价单里读「图纸关联表」取图;读「产品 BOM 表」展开需采物料清单。

缺失会回来找我:图纸没关联「产品档案」→ 采购按旧图下单。BOM 缺物料 ID → 采购凑合选,物料错。数量 / 单位空 → 采购量算错。

技术字段(给 IT/采购交叉核对)

触发动作:assignDrawingToEntityAction(图纸侧)+ 产品模块的 BOM 增删改查(产品侧)

必传字段:drawingId, entityType in (product|order_item), entityId;BOM 行需 product_id, material_id, quantity, unit, usage_type

设计师 → 生产:全部「已通过」开工闸

我做什么:把项目下每张图纸推到「已通过」(approved);图纸关联到「订单行」(order_item)。

生产看到什么:生产端调「项目齐套检查」函数,只有当项目下全部图纸都「已通过」才允许建工单开工;工单里读「图纸关联表」拉图和 BOM。

缺失会回来找我:任一图纸停在「评审中」→ 生产无法开工,PMC 打电话催。未关联「订单行」→ 工单拿不到图,排产只能凭描述推测。

技术字段(给 IT/生产交叉核对)

触发动作:updateDrawingStatusAction(推到 approved)+ assignDrawingToEntityAction(关 order_item

齐套检查:checkProjectDrawingsReady(projectId){approved, total, isReady}

设计师 → 会计:设计费收入确认

我做什么:设计费推到「已完成」后选目标订单做抵扣;或直接退款流转到「已退款」。

会计看到什么:抵扣触发订单已收金额重算函数刷新订单已收金额;预付款表出现一条类型为「设计费」的记录;凭证按预收款 → 订单应收挂账。

缺失会回来找我:客户不一致被拒 → 会计在订单里看不到预收款;需要销售先核对客户。已收金额与实际银行到账不符 → 会计对账对不上回来追。

技术字段(给 IT/会计交叉核对)

触发动作:convertFeeToOrderAction

必传字段:feeId, orderId, amountToApply?;校验 design_fees.customer_id = sales_orders.customer_id

异常回滚

图纸 / 设计费 / 关联 / BOM 误操作走下表规则回滚。不要直接改 DB。

症状 做什么 前置条件 / 后果
图纸传错文件或传错项目 详情页「操作」卡片点「删除」并确认 同时清存储对象 + 数据库行;若已有关联需先逐条移除
图纸被误审批 / 误拒绝 详情页点「回退草稿」 下游生产若已据此开工则需先协调停工;状态回「草稿」后重新评审
图纸关联挂错(错挂实体 / 错行) 详情「关联」卡片点对应行的删除图标 仅移除关联行,不动图纸本体;下游已读图则需同步通知
设计费金额 / 客户录错 状态还是「待付」(pending)时联系管理员删单重建 仅「待付」可删;已进入「已付款」(paid)及以上状态必须走退款流
设计费已收款但客户取消委托 详情点「退款」,填退款原因 状态必须不是「已抵订单」也不是「已退款」;可退额 = 已收金额 - 已抵订单金额 - 已退款金额;全退后状态变「已退款」(refunded),部分退保留原状态
设计费抵订单抵错了 不走设计费侧回滚——在订单付款 Tab 删除对应预收款行;再联系会计手动复位设计费字段 已「已抵订单」(converted)的设计费无「反向抵扣」动作;强行撤销会破坏预付款表一致性
要对「已通过」图纸做变更(ECO) 重新「新建设计」上传新版 + 选「评审中」;旧版保留供追溯 已知缺口:当前系统无独立的 ECO(变更单)表 design_change_orders,变更靠新版号 + 评审;下游需手动替换关联到新图 ID
BOM 行录错数量 / 物料 产品详情 BOM 管理器点对应行删除图标再重建 已知缺口:BOM 版本回滚按钮(revertBOMVersion)目前不在 UI 暴露;改完通知采购同步
对应系统动作(IT 追溯)
  • deleteDrawingAction — 删图纸,同步清存储;若有关联行需先走 removeDrawingAssignmentAction
  • updateDrawingStatusAction(id, 'draft') — 回退「评审中」/「已通过」/「已驳回」到「草稿」
  • removeDrawingAssignmentAction — 清单条关联,不动图纸本体
  • updateFeeStatusAction(feeId, 'refund', refundReason) — 设计费退款,校验状态非「已抵订单」/「已退款」
  • 已「已抵订单」的设计费无反向动作——在订单侧冲销预收款
  • ECO 无独立动作——靠「uploadDesignDrawing 新版 + updateDrawingStatusAction」组合(已知缺口
  • BOM 无 revertBOMVersion 用户动作——走产品模块的 BOM 行删除(已知缺口

进阶功能

项目齐套闸(全「已通过」才能开工)

生产端在建工单前调项目齐套检查函数,返回 {approved, total, isReady}isReady=true(即允许开工)仅当项目下所有图纸都「已通过」(status='approved')。设计师在 /dashboard/projects/[id]?tab=drawings 看到齐套度,把挂起的图推过去。

技术定义:src/services/design-drawings.tscheckProjectDrawingsReady

图纸版本管理(手工自增)

同一图纸新版上传时版本字段(version)递增(目前手工——上传时指定,历史版本保留不会覆盖)。老版作为追溯留档;下游关联需手动切到新版本的图纸 ID。

技术追溯:design_drawings.version 整数型;默认从 1 开始。

项目 BOM(与产品 BOM 区分)

项目级 BOM 使用独立表 project_bom,由 project-bom.ts 服务管理,绑到项目 ID,入口 /dashboard/projects/[id]?tab=bom。用于项目拆单阶段草拟;定稿后同步到产品 BOM 表 bom_items。两表互不干扰。

画廊视图切换 / 搜索 / 筛选

画廊支持网格 / 列表视图切换(右上按钮),搜索按名字匹配;筛选按项目 + 状态。超过分页时底部有翻页。批量操作目前未开放。

设计费「作废」状态(数据库预留,无 UI 入口)

设计费状态枚举里包含「作废」(forfeited,用于客户弃付没收的场景),但 UI 目前没暴露触发动作——只能由后台人工标记。这是已知缺口之一;如需使用,联系 IT 走数据库更新。日常培训不展开。

相关业务场景

设计师是场景 2(定制家具项目流)的主角;场景 1(标品)和场景 4(采购付款)不参与;场景 3 作为抵订单 / 退款的触发方参与尾段。

  1. 标准成单流(询盘 → 报价 → 订单 → 发货 → 开票): 标品流设计师不参与——若报价行含定制件,销售会把项目 / 图纸请求转给设计师走场景 2 分支。 → 场景(了解即可)
  2. 定制家具项目流: 设计师主导:接项目 → 上传草图(「草稿」)→ 收设计费 → 推到「设计中」→ 多轮评审 → 所有图「已通过」→ 关联到「订单行」/「产品档案」→ 订单签约后把设计费抵扣订单首款。 → 场景详解
  3. 回款流: 设计师在设计费抵扣入口触发抵扣,走预付款表(类型『设计费』)挂订单预收款;退款走设计费状态流转到「已退款」。 → 场景详解
  4. 采购付款流:设计师不参与付款——只负责给采购交付图纸关联 + BOM,下单 / 付款由采购 / 出纳做。 → 场景(了解即可)
  5. 月结流: 设计师有限参与——月初清「已驳回」图、核「已抵订单」设计费金额对得上订单已收金额;会计端结账不参与。 → 场景详解
  6. 报销审批流:设计师作为申请人走 /dashboard/expenses(外勤 / 打样耗材报销),非核心动作——不在 Quickstart 范围。 → 场景(作为申请人)

外部协作入口

权限与范围

看得到什么(行级安全边界)

  • 当前组织(organization_id)下的所有图纸(design_drawings)/ 图纸关联(drawing_assignments)/ 设计费单(design_fees)。
  • 产品 BOM(bom_items)与项目 BOM(project_bom)按组织隔离。
  • 图纸存储对象落在 design-drawings 存储桶(公开桶 + 路径隔离);URL 自带组织前缀。

核心概念

  • organization_id(组织 ID)— 租户隔离键。设计师只看本组织图纸 / BOM / 设计费。
  • book_id(账套 ID)— 账套隔离键,设计费属财务数据受账套隔离;切账套后看到的设计费集合变。
  • 图纸关联表 drawing_assignments — 图纸到业务实体的多对多桥表,是下游读图的唯一正式入口。
  • 工作流引擎(src/services/workflow-engine.ts)——图纸状态由代码硬编码流转规则(非 PostgreSQL enum),设计费状态同理。

术语表

设计图纸(图纸表)
design_drawingsname + version
图纸状态枚举
draft 草稿 | in_review 评审中 | approved 已通过 | rejected 已驳回
图纸版本
design_drawings.version(整数,手工自增)
文件 URL
design_drawings.file_url(指向 /object/public/design-drawings/
文件大小限制
50MB(uploadDesignDrawing 硬校验)
允许文件类型
png / jpg / gif / svg / webp / pdf / dwg / dxf / ai / psd(设计行业通用格式)
图纸关联(图纸关联表)
drawing_assignmentsdrawing_id × entity_type × entity_id
关联实体类型枚举
quote_item 报价行 | order_item 订单行 | product 产品档案
项目齐套检查
checkProjectDrawingsReady(projectId)(全部图纸「已通过」才 ready
设计费单(设计费表)
design_fees;编号 design_fee_number 格式 DF-YYYY-NNNN
设计费状态枚举
pending 待付 | paid 已付款 | designing 设计中 | completed 已完成 | converted 已抵订单 | refunded 已退款 | forfeited 作废(目前无 UI 入口)
设计费抵订单
design_fees.amount_applied_to_order(抵扣金额)+ converted_to_order_id(目标订单 ID)
预收款桥(预付款表)
prepayments(类型 type='design_fee' = 设计费)
产品 BOM(物料清单)
bom_itemsproduct_id × material_id
BOM 用途枚举
cabinet_body 柜体 | door 门板 | countertop 台面 | hardware 五金 | other 其他
BOM 单位
pcs 件 | m 米 | m2 平方米 | kg 千克(默认 pcs
项目 BOM
project_bom(独立表,绑项目 ID)
图纸上传核心动作
uploadDesignDrawing
图纸关联核心动作
assignDrawingToEntityAction
设计费抵订单核心动作
convertFeeToOrderAction

常见问题

ECO / 变更单在哪里提?

已知缺口:系统没有独立的 ECO(工程变更单)表或动作(代码里 design_change_orders 未实现)。要对「已通过」(approved)的图纸做变更:重新「新建设计」上传新版(版本号手工自增),选「评审中」(in_review)走评审;旧版保留用于追溯。下游已有的图纸关联需手动替换到新图纸 ID。

BOM 版本在哪改?能回滚吗?

BOM 编辑入口在 /dashboard/products/[id](产品 BOM)或 /dashboard/projects/[id]?tab=bom(项目 BOM),不在 /dashboard/designs已知缺口:当前用户界面不暴露 BOM 版本回滚动作(代码里有 revertBOMVersion 函数但没挂 UI)——改错只能删行重建。需要保留历史请让管理员从数据库侧做快照。

设计费收款后客户反悔能退多少?

可退额 = 已收金额 - 已抵订单金额 - 已退款金额(即 paid_amount - amount_applied_to_order - refunded_amount)。状态必须不是「已抵订单」(converted)也不是「已退款」(refunded)。全退后状态变「已退款」;部分退保留原状态并累加已退款金额。已抵订单的不能退——只能在订单侧冲销预收款。

为什么关联对话框里只有 3 种实体?

关联实体类型(entity_type)是代码硬编码的 3 值枚举:quote_item(报价行)/ order_item(订单行)/ product(产品档案 / 产品变体)。其他场景(如直接挂到项目)目前无桥接——用「上传时选项目」方式,图纸自动进入项目聚合视图。

上传 DWG 预览不出来怎么办?

预览组件只对图像文件(PNG / JPG / GIF / SVG / WebP)渲染缩略图,DWG / DXF / AI / PSD / PDF 这类设计源文件显示图标占位,需点「下载」用本地软件打开。这是预期行为,不是 Bug。

为什么设计费抵扣被拒「客户不一致」?

系统硬校验设计费的客户 ID 与订单的客户 ID 必须相同。检查客户 UUID 是否一致;若客户同名但在 CRM 是两条记录(合并遗漏),联系销售合并客户后重试。

为什么会看到「作废」(forfeited)这个状态?能自己触发吗?

已知缺口:「作废」是数据库预留的状态,用于客户弃付没收的场景。但 UI 目前没有暴露任何按钮触发它——只能由后台人工更新数据库。日常操作不需要理会;如果真的遇到弃付没收场景,联系 IT。