# 實驗數(shù)據(jù)查詢接口文檔
## 接口概述
本文檔定義了實驗數(shù)據(jù)相關(guān)的查詢接口,包括經(jīng)驗數(shù)據(jù)查詢、稱量數(shù)據(jù)查詢以及兩者的組合查詢接口。接口用于獲取樣品的實驗數(shù)據(jù),支持多樣品編號批量查詢,返回結(jié)構(gòu)化的實驗結(jié)果數(shù)據(jù)。
## 基礎(chǔ)信息
- **接口命名空間**:`Me.Services.EmpiricalEdata`
- **接口名稱**:`IEmpiricalEdataServices`
- **數(shù)據(jù)傳輸對象(DTO)命名空間**:`Me.Services.SDMS.DTO`
## 數(shù)據(jù)模型定義
### 1. 經(jīng)驗數(shù)據(jù)返回實體(`EmpiricalEdataRes`)
| 屬性名 | 類型 | 說明 |
|--------|------|------|
| `Id` | `Guid` | 數(shù)據(jù)唯一標(biāo)識ID |
| `SampleNo` | `string` | 樣品編號 |
| `SampleTime` | `DateTime` | 最后修改時間 |
| `SampleType` | `string` | 實驗類別(非"稱量"類型) |
| `ItemName` | `string` | 項目名稱 |
| `SampleIndex` | `int` | 實驗次數(shù) |
| `ParamName` | `string` | 實驗參數(shù)名稱 |
| `ParamValue` | `string` | 實驗參數(shù)值 |
| `EquipmentName` | `string` | 設(shè)備名稱 |
| `EquipmentID` | `Guid` | 設(shè)備唯一標(biāo)識ID |
| `FileName` | `string` | 關(guān)聯(lián)文件名稱 |
| `SourceFilePath` | `string` | 文件在設(shè)備中的原始路徑 |
| `JumpURL` | `string` | 文件訪問跳轉(zhuǎn)路徑(已拼接基礎(chǔ)URL) |
### 2. 稱量數(shù)據(jù)返回模型(`WeightRes`)
| 屬性名 | 類型 | 說明 |
|--------|------|------|
| `Id` | `Guid` | 數(shù)據(jù)唯一標(biāo)識ID |
| `SampleNo` | `string` | 樣品編號 |
| `SampleTime` | `DateTime` | 最后修改時間 |
| `SampleType` | `string` | 實驗類別(固定為"稱量") |
| `EquipmentName` | `string` | 設(shè)備名稱 |
| `EquipmentID` | `Guid` | 設(shè)備唯一標(biāo)識ID |
| `ItemName` | `string` | 項目名稱 |
| `SampleIndex` | `int` | 實驗次數(shù)(從參數(shù)名提取的數(shù)字) |
| `ParamName` | `string` | 稱量參數(shù)名稱 |
| `ParamValue` | `string` | 稱量參數(shù)值 |
| `OperatorName` | `string` | 操作人姓名 |
### 3. 組合結(jié)果類(`SampleDataCombinedResult`)
| 屬性名 | 類型 | 說明 |
|--------|------|------|
| `EmpiricalData` | `List<EmpiricalEdataRes>` | 經(jīng)驗數(shù)據(jù)列表(非稱量類型) |
| `WeightData` | `List<WeightRes>` | 稱量數(shù)據(jù)列表 |
## 接口詳情
### 1. 經(jīng)驗數(shù)據(jù)查詢接口
#### 方法定義
```csharp
Task<List<EmpiricalEdataRes>> GetEmpiricalListAsync(string sampleNo);
```
#### 功能描述
查詢非稱量類型的實驗數(shù)據(jù),支持通過多個樣品編號批量查詢。
#### 參數(shù)說明
| 參數(shù)名 | 類型 | 必傳 | 說明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 樣品編號,多個編號以英文逗號(`,`)分隔,例如:`"S2024001,S2024002"` |
#### 返回值
`Task<List<EmpiricalEdataRes>>` - 經(jīng)驗數(shù)據(jù)列表,包含符合條件的所有非稱量類型實驗數(shù)據(jù)。
#### 篩選邏輯
- 僅返回`IsEnable=true`且`IsDelete=false`的數(shù)據(jù)
- 排除`SampleType="圖譜"`和`SampleType="稱量"`的數(shù)據(jù)
- 按樣品編號前綴匹配(`StartsWith`)查詢
- 自動關(guān)聯(lián)`CollectionFileHistory`表獲取文件路徑信息
- 結(jié)果會進(jìn)行路徑拼接(基礎(chǔ)URL+文件名)和去重處理
### 2. 稱量數(shù)據(jù)查詢接口
#### 方法定義
```csharp
Task<List<WeightRes>> GetWeightListAsync(string sampleNo);
```
#### 功能描述
專門查詢"稱量"類型的實驗數(shù)據(jù),支持通過多個樣品編號批量查詢。
#### 參數(shù)說明
| 參數(shù)名 | 類型 | 必傳 | 說明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 樣品編號,多個編號以英文逗號(`,`)分隔 |
#### 返回值
`Task<List<WeightRes>>` - 稱量數(shù)據(jù)列表,包含符合條件的所有稱量類型實驗數(shù)據(jù)。
#### 篩選邏輯
- 僅返回`IsEnable=true`且`IsDelete=false`的數(shù)據(jù)
- 僅包含`SampleType="稱量"`的數(shù)據(jù)
- 按樣品編號前綴匹配(`StartsWith`)查詢
- 自動從`ParamName`中提取數(shù)字作為`SampleIndex`(默認(rèn)值為1)
- 結(jié)果會進(jìn)行去重處理
### 3. 組合數(shù)據(jù)查詢接口
#### 方法定義
```csharp
Task<SampleDataCombinedResult> GetCombinedSampleDataAsync(string sampleNo);
```
#### 功能描述
同時查詢經(jīng)驗數(shù)據(jù)和稱量數(shù)據(jù),返回組合結(jié)果,減少重復(fù)調(diào)用開銷。
#### 參數(shù)說明
| 參數(shù)名 | 類型 | 必傳 | 說明 |
|--------|------|------|------|
| `sampleNo` | `string` | 是 | 樣品編號,多個編號以英文逗號(`,`)分隔 |
#### 返回值
`Task<SampleDataCombinedResult>` - 組合結(jié)果對象,包含經(jīng)驗數(shù)據(jù)列表和稱量數(shù)據(jù)列表。
#### 實現(xiàn)邏輯
- 內(nèi)部并行調(diào)用`GetEmpiricalListAsync`和`GetWeightListAsync`
- 等待兩個查詢都完成后合并結(jié)果
- 保持各自的篩選、去重和路徑處理邏輯
## 調(diào)用示例
### 請求示例(偽代碼)
```csharp
// 實例化服務(wù)
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結(jié)構(gòu))
```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. **參數(shù)格式**:`sampleNo`參數(shù)需嚴(yán)格使用英文逗號分隔,不可包含空格
2. **性能優(yōu)化**:批量查詢時建議樣品編號數(shù)量不超過50個,避免查詢超時
3. **去重邏輯**:返回結(jié)果已自動去重,依賴`EmpiricalEdataRes`和`WeightRes`的`Equals`和`GetHashCode`實現(xiàn)
4. **路徑處理**:`JumpURL`已自動拼接基礎(chǔ)URL并轉(zhuǎn)換為斜杠(`/`)分隔的格式,可直接用于訪問
5. **大小寫敏感**:樣品編號匹配為不區(qū)分大小寫(`StartsWith`方法使用`StringComparison.OrdinalIgnoreCase`)