# 实验数据查询接口文档
## 接口概述
本文档定义了实验数据相关的查询接口,包括经验数据查询、称量数据查询以及两者的组合查询接口。接口用于获取样品的实验数据,支持多样品编号批量查询,返回结构化的实验结果数据。
## 基础信息
- **接口命名空间**:`Me.Services.EmpiricalEdata`
- **接口名称**:`IEmpiricalEdataServices`
- **数据传输对象(DTO)命名空间**:`Me.Services.SDMS.DTO`
## 数据模型定义
### 1. 经验数据返回实体(`EmpiricalEdataRes`)
| 属性名 | 类型 | 说明 |
|--------|------|------|
| `Id` | `Guid` | 数据唯一标识ID |
| `SampleNo` | `string` | 样品编号 |
| `SampleTime` | `DateTime` | 最后修改时间 |
| `SampleType` | `string` | 实验类别(非"称量"类型) |
| `ItemName` | `string` | 项目名称 |
| `SampleIndex` | `int` | 实验次数 |
| `ParamName` | `string` | 实验参数名称 |
| `ParamValue` | `string` | 实验参数值 |
| `EquipmentName` | `string` | 设备名称 |
| `EquipmentID` | `Guid` | 设备唯一标识ID |
| `FileName` | `string` | 关联文件名称 |
| `SourceFilePath` | `string` | 文件在设备中的原始路径 |
| `JumpURL` | `string` | 文件访问跳转路径(已拼接基础URL) |
### 2. 称量数据返回模型(`WeightRes`)
| 属性名 | 类型 | 说明 |
|--------|------|------|
| `Id` | `Guid` | 数据唯一标识ID |
| `SampleNo` | `string` | 样品编号 |
| `SampleTime` | `DateTime` | 最后修改时间 |
| `SampleType` | `string` | 实验类别(固定为"称量") |
| `EquipmentName` | `string` | 设备名称 |
| `EquipmentID` | `Guid` | 设备唯一标识ID |
| `ItemName` | `string` | 项目名称 |
| `SampleIndex` | `int` | 实验次数(从参数名提取的数字) |
| `ParamName` | `string` | 称量参数名称 |
| `ParamValue` | `string` | 称量参数值 |
| `OperatorName` | `string` | 操作人姓名 |
### 3. 组合结果类(`SampleDataCombinedResult`)
| 属性名 | 类型 | 说明 |
|--------|------|------|
| `EmpiricalData` | `List<EmpiricalEdataRes>` | 经验数据列表(非称量类型) |
| `WeightData` | `List<WeightRes>` | 称量数据列表 |
## 接口详情
### 1. 经验数据查询接口
#### 方法定义
```csharp
Task<List<EmpiricalEdataRes>> GetEmpiricalListAsync(string sampleNo);
```
#### 功能描述
查询非称量类型的实验数据,支持通过多个样品编号批量查询。
#### 参数说明
| 参数名 | 类型 | 必传 | 说明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 样品编号,多个编号以英文逗号(`,`)分隔,例如:`"S2024001,S2024002"` |
#### 返回值
`Task<List<EmpiricalEdataRes>>` - 经验数据列表,包含符合条件的所有非称量类型实验数据。
#### 筛选逻辑
- 仅返回`IsEnable=true`且`IsDelete=false`的数据
- 排除`SampleType="图谱"`和`SampleType="称量"`的数据
- 按样品编号前缀匹配(`StartsWith`)查询
- 自动关联`CollectionFileHistory`表获取文件路径信息
- 结果会进行路径拼接(基础URL+文件名)和去重处理
### 2. 称量数据查询接口
#### 方法定义
```csharp
Task<List<WeightRes>> GetWeightListAsync(string sampleNo);
```
#### 功能描述
专门查询"称量"类型的实验数据,支持通过多个样品编号批量查询。
#### 参数说明
| 参数名 | 类型 | 必传 | 说明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 样品编号,多个编号以英文逗号(`,`)分隔 |
#### 返回值
`Task<List<WeightRes>>` - 称量数据列表,包含符合条件的所有称量类型实验数据。
#### 筛选逻辑
- 仅返回`IsEnable=true`且`IsDelete=false`的数据
- 仅包含`SampleType="称量"`的数据
- 按样品编号前缀匹配(`StartsWith`)查询
- 自动从`ParamName`中提取数字作为`SampleIndex`(默认值为1)
- 结果会进行去重处理
### 3. 组合数据查询接口
#### 方法定义
```csharp
Task<SampleDataCombinedResult> GetCombinedSampleDataAsync(string sampleNo);
```
#### 功能描述
同时查询经验数据和称量数据,返回组合结果,减少重复调用开销。
#### 参数说明
| 参数名 | 类型 | 必传 | 说明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 样品编号,多个编号以英文逗号(`,`)分隔 |
#### 返回值
`Task<SampleDataCombinedResult>` - 组合结果对象,包含经验数据列表和称量数据列表。
#### 实现逻辑
- 内部并行调用`GetEmpiricalListAsync`和`GetWeightListAsync`
- 等待两个查询都完成后合并结果
- 保持各自的筛选、去重和路径处理逻辑
## 调用示例
### 请求示例(伪代码)
```csharp
// 实例化服务
IEmpiricalEdataServices service = new EmpiricalEdataServices();
// 单个样品查询
var empiricalData = await service.GetEmpiricalListAsync("(2024)SPXW0776001");
var weightData = await service.GetWeightListAsync("(2024)SPXW0776001");
// 多个样品查询
var combinedData = await service.GetCombinedSampleDataAsync("(2024)SPXW0776001,(2024)SPXW0776002");
```
### 返回示例(JSON结构)
```json
{
"EmpiricalData": [
{
"Id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"SampleNo": "(2024)SPXW0776001",
"SampleTime": "2024-08-13T10:00:00",
"SampleType": "光谱分析",
"ItemName": "成分检测",
"SampleIndex": 1,
"ParamName": "浓度",
"ParamValue": "0.5mg/L",
"EquipmentName": "光谱仪A",
"EquipmentID": "3fa85f64-5717-4562-b3fc-2c963f66afa7",
"FileName": "result.csv",
"SourceFilePath": "C:\\data\\result.csv",
"JumpURL": "http://file-server/result.csv"
}
],
"WeightData": [
{
"Id": "3fa85f64-5717-4562-b3fc-2c963f66afa8",
"SampleNo": "(2024)SPXW0776001",
"SampleTime": "2024-08-13T09:30:00",
"SampleType": "称量",
"EquipmentName": "电子天平B",
"EquipmentID": "3fa85f64-5717-4562-b3fc-2c963f66afa9",
"ItemName": "样品称量",
"SampleIndex": 2,
"ParamName": "重量_2",
"ParamValue": "2.5g",
"OperatorName": "张三"
}
]
}
```
## 注意事项
1. **参数格式**:`sampleNo`参数需严格使用英文逗号分隔,不可包含空格
2. **性能优化**:批量查询时建议样品编号数量不超过50个,避免查询超时
3. **去重逻辑**:返回结果已自动去重,依赖`EmpiricalEdataRes`和`WeightRes`的`Equals`和`GetHashCode`实现
4. **路径处理**:`JumpURL`已自动拼接基础URL并转换为斜杠(`/`)分隔的格式,可直接用于访问
5. **大小写敏感**:样品编号匹配为不区分大小写(`StartsWith`方法使用`StringComparison.OrdinalIgnoreCase`)