# 数据资产服务中心 — 技术方案

> 依据：同目录 `数据资产服务中心功能需求.md`。数据发送记录 **CRUD** + **逻辑删除**；本期无对外真实发送、无附件。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 若依 Vue2（本方案不展开页面实现） |

**分层**：`Controller` → `Service`（`DataSendRecordValidation` 校验）→ `Mapper`/XML → `domain`。

**代码位置（建议）**：`baqing-admin` → `com.ruoyi.web.modules.datahub`（`BizDataSendRecord`、Mapper、Service、Controller）。

**业务摘要**

| 场景 | 行为 |
| --- | --- |
| 新增/修改 | 校验必填与长度；`del_flag='0'` |
| 列表/详情 | 仅 `del_flag='0'`；排序 `send_time DESC, id DESC` |
| 列表筛选 | `send_time` **日期部分**闭区间；`receiver_name` **精确**匹配（**不区分大小写**） |
| 删除 | **逻辑删除**：`del_flag` 置 `'2'` |

---

## 2. 数据库设计

### 2.1 表 `biz_data_send_record`（数据发送记录）

| 字段 | 类型 | 非空 | 说明 |
| --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 主键 |
| `send_time` | `datetime` | Y | 发送时间 |
| `send_content` | `varchar(2000)` | Y | 发送内容 |
| `receiver_name` | `varchar(128)` | Y | 接收方名称 |
| `receiver_address` | `varchar(512)` | Y | 接收方地址 |
| `del_flag` | `char(1)` | Y | `0` 存在 `2` 删除 |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | 审计 |
| `remark` | `varchar(500)` | N | 备注（可选） |

**索引**：`PRIMARY KEY (id)`；`KEY idx_send_time (send_time)`；`KEY idx_receiver_name (receiver_name)`；`KEY idx_del_flag (del_flag)`。

**DDL（MySQL 5.7）**

```sql
CREATE TABLE `biz_data_send_record` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `send_time` datetime NOT NULL COMMENT '发送时间',
  `send_content` varchar(2000) NOT NULL COMMENT '发送内容',
  `receiver_name` varchar(128) NOT NULL COMMENT '接收方名称',
  `receiver_address` varchar(512) NOT NULL COMMENT '接收方地址',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在 2删除',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_send_time` (`send_time`),
  KEY `idx_receiver_name` (`receiver_name`),
  KEY `idx_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据发送记录';
```

### 2.2 枚举

| 字段 | 值 | 含义 |
| --- | --- | --- |
| `del_flag` | `0` | 正常 |
| | `2` | 已逻辑删除 |

---

## 3. 接口设计

**统一响应**：`AjaxResult`（`code` / `msg` / `data`）或分页 `TableDataInfo`（`rows`、`total`）。

**权限标识**：`dataHub:dataSendRecord:list|query|add|edit|remove`

**Base Path**：`/dataHub/dataSendRecord`

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/dataHub/dataSendRecord/list` | `list` |
| 3.2 | 详情 | GET | `/dataHub/dataSendRecord/{id}` | `query` |
| 3.3 | 新增 | POST | `/dataHub/dataSendRecord` | `add` |
| 3.4 | 修改 | PUT | `/dataHub/dataSendRecord` | `edit` |
| 3.5 | 删除 | DELETE | `/dataHub/dataSendRecord/{ids}` | `remove` |

> 删除接口沿用若依 `{ids}` 形式；**本期前端仅单条删除**，传单个 id 即可。

#### 3.1.1 列表 Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `startDate` | string | N | 发送日期起 `yyyy-MM-dd`（界面 daterange 起） |
| `endDate` | string | N | 发送日期止 `yyyy-MM-dd`；`DATE(send_time)` **闭区间** |
| `receiverName` | string | N | 接收方名称**精确**匹配；比较时 **不区分大小写**（`LOWER` 或 `utf8mb4_general_ci`） |

**区间校验**：`startDate`、`endDate` 均非空且 `startDate > endDate` 时抛业务异常。

#### 3.2.1 详情响应 `data`（驼峰）

| 字段 | 说明 |
| --- | --- |
| `id` | 主键 |
| `sendTime` | `yyyy-MM-dd HH:mm:ss` |
| `sendContent` | 发送内容 |
| `receiverName` | 接收方名称 |
| `receiverAddress` | 接收方地址 |
| `createBy` / `createTime` / `updateBy` / `updateTime` | 审计 |
| `remark` | 备注 |

#### 3.3.1 新增 / 修改 Body（驼峰）

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `id` | 修改 Y | 主键 |
| `sendTime` | Y | `yyyy-MM-dd HH:mm:ss` |
| `sendContent` | Y | 去首尾空白后非空；≤ 2000 字 |
| `receiverName` | Y | 1～128 字 |
| `receiverAddress` | Y | 1～512 字 |
| `remark` | N | ≤ 500 字 |

#### 3.5.1 删除

- `DELETE /dataHub/dataSendRecord/{ids}`，`ids` 逗号分隔。  
- 逻辑删除：`del_flag='2'`，仅更新 `del_flag='0'` 的记录。  
- 详情/修改前须校验记录存在且未删除。

### 3.3 Mapper 约定

- 列表、详情、更新条件均带 `del_flag = '0'`。  
- 列表排序：`ORDER BY send_time DESC, id DESC`。  
- 发送日期筛选：`DATE(send_time) >= #{startDate} AND DATE(send_time) <= #{endDate}`（参数非空时生效）。  
- 接收方名称：`LOWER(receiver_name) = LOWER(#{receiverName})`（参数非空时）。

### 3.4 服务端校验（`DataSendRecordValidation`）

| 项 | 规则 |
| --- | --- |
| `sendTime` | 非空 |
| `sendContent` | trim 后非空；长度 ≤ 2000 |
| `receiverName` | trim 后非空；长度 1～128 |
| `receiverAddress` | trim 后非空；长度 1～512 |
| 列表日期区间 | `startDate ≤ endDate`（均填时） |
| 修改/删除 | `id` 对应记录存在且 `del_flag='0'` |

常量类建议：`DataSendRecordRules`（长度上限、`del_flag` 取值）。

---

## 4. 菜单与权限（示例）

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 菜单 | 数据资产服务中心 | `dataHub:dataSendRecord:list` |
| 按钮 | 查询 | `dataHub:dataSendRecord:query` |
| 按钮 | 新增 | `dataHub:dataSendRecord:add` |
| 按钮 | 修改 | `dataHub:dataSendRecord:edit` |
| 按钮 | 删除 | `dataHub:dataSendRecord:remove` |

组件路径：`dataHub/dataSendRecord/index`（挂载「牧业产业数据中枢」目录下）。

---

## 5. 交付清单

- [ ] `sql/biz_data_send_record.sql`、菜单与按钮权限 SQL  
- [ ] `BizDataSendRecord` Domain / Mapper / Service / Controller  
- [ ] `DataSendRecordRules`、`DataSendRecordValidation`  
- [ ] 逻辑删除；列表日期区间与接收方精确匹配  
- [ ] 单元测试 / MockMvc（list 筛选、CRUD、校验失败）  

---

## 6. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：`biz_data_send_record`；CRUD + 逻辑删除；发送日期按 `send_time` 日期筛选；接收方名称不区分大小写精确匹配 |
