3.5 KiB
3.5 KiB
ADDED Requirements
Requirement: 作废须持久化独立原因字段
系统 SHALL 为下列实体提供独立作废/取消原因三元组,且不得仅将原因拼入通用 remark 作为唯一存储:
crm_quote:invalid_reason、invalid_time、invalid_bypl_plan、pl_vehicle_fuel_register、pl_vehicle_recharge_apply、pl_vehicle_maintenance_apply、pl_vehicle_urea_apply、pl_freight_settlement:cancel_reason、cancel_time、cancel_bydb_weighing_slip:void_reason、void_time、void_by
原因字段长度 SHALL 为 varchar(500) 且允许 NULL。合同与调价函既有 invalid_* 行为 SHALL 保持不变。
Scenario: Schema includes dedicated columns
- WHEN 查询上述表结构
- THEN 对应三元组列存在且允许 NULL
Requirement: 作废接口支持可选原因
对报价单 invalid、运输计划 cancel、加油/充值/维保/尿素申请 cancel、运费结算 cancel、地磅 void,系统 SHALL 接受可选原因(请求体字段可缺省或为空)。原因 trim 后为空时 SHALL 将原因列置为 NULL,且 SHALL NOT 因此拒绝作废。无论原因是否填写,作废成功时 SHALL 写入作废时间与操作人,并按既有规则更新作废/取消状态。
Scenario: Allow void without reason
- WHEN 调用上述作废/取消接口且未提供原因或原因为空白
- THEN 单据仍进入已作废/已取消(或地磅
is_voided=1),原因列为 NULL,时间与操作人已落库
Scenario: Persist reason when provided
- WHEN 调用上述接口且提供非空原因
- THEN 单据作废成功,且原因/时间/操作人已落库
Requirement: 报价单不再写入备注拼接原因
报价单作废若提供原因,SHALL 写入 invalid_reason(及时间、操作人);SHALL NOT 再向 remark 追加「【作废原因】」前缀文本作为主存储。未提供原因时 SHALL 仍写入 invalid_time 与 invalid_by,invalid_reason 为 NULL。
Scenario: Quote void uses invalid fields
- WHEN 用户作废报价单并提交非空原因
- THEN
invalid_reason等于提交原因,且不以「【作废原因】」形式追加为remark的唯一来源
Scenario: Quote void without reason
- WHEN 用户作废报价单且不填原因
- THEN 报价单状态为已作废,
invalid_reason为空,invalid_time与invalid_by已写入
Requirement: 加油登记作废恢复清空原因
加油登记从已作废恢复为正常时,系统 SHALL 清空 cancel_reason、cancel_time、cancel_by。
Scenario: Restore clears cancel triad
- WHEN 用户对已作废加油登记执行作废恢复
- THEN 状态为正常且三个 cancel 字段均为空
Requirement: Web 与小程序作废可采集原因
web-admin 中上述业务的作废操作 SHALL 提供作废原因输入(选填),允许不填直接确认作废。miniprogram 中充值申请、加油登记、地磅单的作废操作 SHALL 同样允许选填原因。已作废单据的查看态:若有已保存原因则 SHALL 展示;有作废时间/操作人时一并展示。
Scenario: Web allows submit without reason
- WHEN 用户在 Web 打开作废对话框且未填原因点击确认
- THEN 仍可调用作废 API 并完成作废
Scenario: Miniprogram optional reason
- WHEN 用户在小程序对充值申请、加油登记或地磅单作废且不填原因
- THEN 仍可调用对应 cancel/void API 并完成作废