# 项目与补贴 — 项目 — 功能需求

## 1. 文档说明

| 项 | 说明 |
| --- | --- |
| 模块名称 | 项目与补贴 — 项目 |
| 目标 | 对补贴类投资项目进行登记、查询、维护与进度状态管理，支撑项目台账与执行进展跟踪 |
| 关联系统 | 业务后台 |
| 修订依据 | 同目录 `项目与补贴-项目-草稿.md` |

本文档仅描述**功能需求与业务规则**，不涉及库表结构、接口路径、请求体字段命名及技术栈选型。

---

## 2. 术语与枚举

### 2.1 执行状态（单选）

| 取值 | 含义概要 |
| --- | --- |
| **未开始** | 当前日期早于项目开始日期，或尚未进入实施阶段 |
| **进行中** | 已开工且尚未到达预计完成节点（见 **2.2** 自动规则） |
| **已完成** | 项目已完工；选手动「已完成」时须填写实际完成日期 |

### 2.2 状态推算与手工覆盖

**日期基准：** 「当前日期」指用户操作当日（按系统时区，自然日 `YYYY-MM-DD`）。

**自动推算规则（默认，保存/提交时执行）：**

在**未**将执行状态手工固定为「已完成」的前提下，系统按下列**优先级从高到低**判断（当前日期记为 T，开始日为 S，预计完成日为 E）：

| 优先级 | 条件 | 自动执行状态 |
| --- | --- | --- |
| 1 | T &lt; S（今天早于项目开始日） | **未开始** |
| 2 | T = E（今天等于预计完成日） | **已完成** |
| 3 | T &lt; E（今天早于预计完成日，且已满足 T ≥ S） | **进行中** |
| 4 | T &gt; E（今天晚于预计完成日，草稿未单列） | **进行中**（超期未自动置为已完成，须手工确认完成） |

> 与草稿 **§1.1** 对齐：**今天 &lt; 开始日 → 未开始**；**今天 &lt; 预计完成日 → 进行中**（在已过开始日前提下）；**今天 = 预计完成日 → 已完成**。**不等于**「T ≥ E 即已完成」。

**自动变为「已完成」时：** 若按上表推算为 **已完成**（通常为 T = E），且未手工锁定，系统可将 **实际完成日期** 默认设为 **T**（当天），用户亦可事先手工填写。

**手工选择「已完成」：**

- 用户将执行状态**手工选为「已完成」**时，**实际完成日期**为**必填**；格式 `YYYY-MM-DD`。
- 实际完成日期默认不得晚于当前日期（若允许补录未来完成日须单独评审）。
- 手工标记为「已完成」后，再次保存时：若业务约定「已完成不再被自动改回进行中」，则自动推算**不再覆盖**执行状态，仅可人工修改；若允许在改期后重新推算，须在实现前与产品确认（**默认：已完成状态不被自动降级**）。

**提交后自动更新：**

- 新增、修改**保存成功**后，须按上表重新执行状态推算（受「已完成」手工锁定规则约束）。
- 列表进入、定时刷新或打开详情时，宜按同一规则展示**最新**执行状态（避免仅保存时更新、列表长期过期）。

### 2.3 发布状态（与执行状态独立）

| 取值 | 含义概要 |
| --- | --- |
| **未发布** | 新建或下架回流；可编辑、可删除、可发布 |
| **已发布** | 对外可见（与产品定义一致）；**不可修改**、**不可删除**，须先下架 |

下架后回到 **未发布**，可再编辑并再次发布，**无须新建**记录。

### 2.4 记录说明

本模块为**项目台账**，单条记录表示一个补贴类投资项目。除 **§2.1 执行状态** 外，另有 **§2.3 发布状态** 控制对外展示与后台改删权限。

---

## 3. 功能范围

- 项目的新增、修改、删除、分页列表查询、详情查看
- 项目投资信息、计划周期、封面及执行状态的录入与校验
- 执行状态**自动推算**与**手工完成**规则
- **发布、下架**及发布状态约束下的操作权限
- 按项目名称/简介、执行状态、**发布状态**、项目开始日期范围的组合查询
- 删除记录时联动清理封面文件（若有）
- 面向使用方的业务错误与校验提示（见第 7 章）

---

## 4. 业务流程概览

```mermaid
flowchart LR
    A[新增项目] --> B[保存并推算状态]
    B --> C[列表查询/筛选]
    C --> D[查看详情]
    C --> E[修改项目]
    C --> F[删除项目]
    E --> B
    F --> C
    B --> G[发布]
    G --> H[已发布]
    H --> I[下架]
    I --> B
```

1. **新建**：录入必填项与封面（可选）→ 初始 **未发布**；保存后按 **§2.2** 推算执行状态。  
2. **维护**：**未发布** 下可修改；保存后重新推算执行状态。  
3. **发布**：**未发布** 且校验通过 → **已发布**。  
4. **下架**：**已发布** → **未发布**，可再编辑、再发布。  
5. **查询**：按名称/简介、执行状态、发布状态、开始日期范围筛选。  
6. **删除**：仅 **未发布** 可删（须先下架已发布记录）。

---

## 5. 详细功能需求

### 5.1 新增项目

| 字段 | 规则 |
| --- | --- |
| 项目名称 | **必填**；长度 **1～20** 个字符 |
| 项目简介 | **选填**；若有内容，长度不超过 **50 字** |
| 投资金额 | **必填**；须为**大于 0** 的数值；小数位数与项目金额规范一致（建议最多 **2** 位小数） |
| 项目开始日期 | **必填**；格式 `YYYY-MM-DD` |
| 预计完成日期 | **必填**；格式 `YYYY-MM-DD`；须 **≥ 项目开始日期** |
| 封面 | **选填**；**单个**图片上传；允许后缀 `jpg`、`jpeg`、`png`（可扩展 `webp`）；单文件 ≤ **10 MB** |
| 执行状态 | **必填**；单选，取值 **§2.1**；保存时与 **§2.2** 自动规则协同（见下） |
| 实际完成日期 | **条件必填**；当执行状态为 **已完成** 时必填；否则须为空或不提交 |

**保存时状态处理（摘要）：**

1. 校验日期、金额等字段。  
2. 若用户选择 **已完成** → 校验实际完成日期已填。  
3. 若用户**未**手工锁定为「已完成」→ 按 **§2.2** 自动写入执行状态。  
4. 若自动推算为 **已完成**（T = E）且用户未填实际完成日期 → **实际完成日期默认取当天（T）**；若用户已填则以用户值为准（须 ≤ 当天）。

**必填字段汇总：** 项目名称、投资金额、项目开始日期、预计完成日期、执行状态。

---

### 5.2 查询项目列表

- **关键字：** 对「项目名称」或「项目简介」**模糊**匹配（**OR**）；为空则不过滤。  
- **执行状态：** **精确**匹配；未选择则不过滤。  
- **发布状态：** **精确**匹配（未发布 / 已发布）；未选择则不过滤。  
- **项目开始日期范围：** 支持 **开始日期（startDate）**、**结束日期（endDate）** 闭区间筛选（针对「项目开始日期」字段）；仅填其一则按 ≥ / ≤ 处理；均未填则不过滤。  
  - **区间合法性：** 同时填写时 `startDate` ≤ `endDate`，否则提示错误且不查询。  
- **分页：** 默认 **每页 20 条**，首页为第一页。  
- **排序：** 默认按 **项目开始日期倒序**（最近开始在前）；相同则按 **创建时间倒序**。

**列表宜展示：** 项目名称、简介、投资金额、开始/预计完成日、**执行状态**、**发布状态**、发布时间、封面缩略图、实际完成日期（已完成时），及操作列。

---

### 5.3 修改项目

- **可修改项：** 全部字段（同 **5.1**）；**仅发布状态为未发布** 时允许进入修改并保存。  
- **已发布：** 不可修改（须先下架）。  
- **保存约束：** 校验规则与新增一致；保存成功后重新执行 **§2.2** 状态推算。  
- **封面替换：** 更换封面并保存成功后，删除旧封面文件，避免存储残留。  
- **已完成锁定：** 若记录已为「已完成」且产品采用「不自动降级」策略，修改计划日期时仍保持「已完成」，除非用户主动改状态。

---

### 5.4 删除项目

- **允许删除：** 发布状态为 **未发布** 且具备删除权限。  
- **不允许删除：** **已发布** 记录；须先 **下架**（**§5.6**）。  
- **删除后果：** 删除记录同时删除关联封面存储文件。  
- **确认：** 删除前宜二次确认。

---

### 5.5 查看项目详情

- **展示内容：** 项目名称、简介、投资金额、开始/预计完成日、执行状态、实际完成日期、封面、**发布状态**、发布时间、下架时间；宜含审计字段。  
- **状态展示：** 执行状态按 **§2.2** 与列表一致。  
- **交互：** **未发布** 可编辑；**已发布** 只读，可提供下架入口。

---

### 5.6 发布与下架

#### 发布

- **前置：** 当前 **未发布**；必填项满足 **§5.1**。  
- **结果：** 变为 **已发布**；记录发布时间。

#### 下架

- **前置：** 当前 **已发布**。  
- **结果：** 变为 **未发布**；结束对外展示；**不删**记录与封面；可再编辑、再发布。

---

## 6. 状态与操作矩阵（汇总）

| 当前发布状态 | 查看 | 修改 | 发布 | 下架 | 删除 |
| --- | --- | --- | --- | --- | --- |
| 未发布 | ✓ | ✓ | ✓ | — | ✓ |
| 已发布 | ✓ | ✗ | — | ✓ | ✗ |

下架后按「未发布」行权限执行。

---

## 7. 错误与提示约定

- 业务与校验错误采用项目统一 **`code`、`msg`、`data`** 结构。  
- 宜可区分：必填缺失、字段超长、投资金额非法、开始日晚于完成日、封面格式/大小不符、已完成未填实际完成日期、查询日期区间非法、状态与日期矛盾等。

---

## 8. 非功能需求（建议）

| 类别 | 建议 |
| --- | --- |
| 权限 | 菜单与按钮：查询、新增、修改、删除、发布、下架、导出（若需要） |
| 审计 | 新增、修改、删除记操作日志 |
| 安全 | 上传封面类型与大小校验；下载/预览鉴权 |
| 性能 | 列表按开始日期、执行状态筛选满足通用体验 |
| 双语 | 字段标签与提示符合项目 i18n（汉语 + 藏文） |

---

## 9. 修订说明（相对草稿）

| 草稿问题 | 优化处理 |
| --- | --- |
| 标题写「新增补贴发放记录」 | 更正为 **新增项目** |
| 查询条件为姓名/补贴类型/发放日期 | 更正为 **项目名称或简介、执行状态、项目开始日期范围** |
| 「修改/删除/查看补贴发放记录宣传」 | 更正为 **项目** |
| 执行状态自动规则表述不清 | 整理为 **§2.2** 优先级表；**T=E→已完成**（非 T≥E）；超期 T&gt;E 默认仍为进行中 |
| 草稿查询条仍为发放记录字段 | 正式需求仍校正为 **项目名称/简介、执行状态、项目开始日范围**（见 §5.2） |
| 提交后自动更新 | 明确保存成功及列表/详情展示时刷新推算 |
| 投资金额、日期先后关系 | 补充金额 &gt;0、预计完成 ≥ 开始 |
| 第 6、7 条技术栈与接口 | 技术栈移除；错误约定保留于 **§7** |
| 草稿 §6 发布/下架 | 新增 **§2.3、§5.6** 与 **§6** 矩阵；已发布不可改删 |
| 「产互」 | 更正为 **删除** |
