Files
shanxia2.0/openspec/changes/void-cancel-reason-required/specs/void-cancel-reason/spec.md
T
2026-10-02 09:28:00 +08:00

68 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ADDED Requirements
### Requirement: 作废须持久化独立原因字段
系统 SHALL 为下列实体提供独立作废/取消原因三元组,且不得仅将原因拼入通用 `remark` 作为唯一存储:
- `crm_quote`:`invalid_reason`、`invalid_time`、`invalid_by`
- `pl_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_by`
- `db_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 并完成作废