检测管理模块开发文档
1. 模块概述
1.1 模块定位
检测管理模块是LIMS系统的核心业务模块,负责管理实验室检测工作的全流程,包括检测任务分配、原始记录管理、数据采集、结果计算、质量控制等核心功能。该模块与样品管理、报告管理、设备管理等模块紧密协作,共同构成实验室检测业务的完整闭环。
1.2 核心功能架构
检测管理模块
├── 任务管理
│ ├── 任务分配
│ ├── 任务领取
│ ├── 任务执行
│ └── 任务审核
├── 检测项目管理
│ ├── 项目定义
│ ├── 项目关联方法
│ └── 项目计价规则
├── 原始记录管理
│ ├── 记录模板
│ ├── 记录填写
│ ├── 记录计算
│ └── 记录审核
├── 数据采集管理
│ ├── 仪器数据采集
│ ├── 自动计算
│ └── 数据修约
├── 质控管理
│ ├── 质控样品
│ ├── 质控规则
│ └── 质控判定
└── 结果管理
├── 结果录入
├── 结果判定
└── 结果发布2. 功能需求详解
2.1 任务管理
2.1.1 功能描述
任务管理负责将检测任务分配给具体的检测人员,支持任务领取、任务执行、任务审核等完整的业务流程。
2.1.2 业务流程
任务生成 → 任务分配 → 任务领取 → 任务执行 → 任务审核 → 结果录入 → 任务完成2.1.3 核心实体
- DetectionTask:检测任务主表
- TaskAssignment:任务分配记录
- TaskExecution:任务执行记录
- TaskAudit:任务审核记录
2.1.4 关键字段
| 字段名 | 类型 | 说明 |
|---|---|---|
| TaskId | long | 任务ID |
| SampleId | long | 样品ID |
| ProjectId | long | 检测项目ID |
| AssigneeId | long | 执行人ID |
| AuditorId | long | 审核人ID |
| Status | int | 任务状态 |
| StartTime | DateTime | 开始时间 |
| EndTime | DateTime | 完成时间 |
| Result | string | 检测结果 |
| Remark | string | 备注 |
2.1.5 状态机设计
待分配(0) → 已分配(1) → 已领取(2) → 执行中(3) → 待审核(4) → 已完成(5) → 已归档(6)
↓
已退回(7)2.2 检测项目管理
2.2.1 功能描述
检测项目管理用于定义和管理实验室开展的检测项目,包括项目名称、检测标准、方法依据、设备要求等信息。
2.2.2 核心实体
- DetectionProject:检测项目主表
- ProjectMethod:项目关联的检测方法
- ProjectParameter:项目参数定义
- ProjectStandard:项目计价标准
2.2.3 关键字段
| 字段名 | 类型 | 说明 |
|---|---|---|
| ProjectId | long | 项目ID |
| ProjectCode | string | 项目编号 |
| ProjectName | string | 项目名称 |
| CategoryId | long | 项目分类ID |
| MethodStandard | string | 方法依据 |
| DetectionRange | string | 检测范围 |
| Precision | string | 精度要求 |
| Unit | string | 结果单位 |
| Price | decimal | 项目单价 |
| TurnaroundTime | int | turnaround时间(天) |
| Status | int | 状态 |
2.3 原始记录管理
2.3.1 功能描述
原始记录管理是检测工作的核心,涵盖记录模板、记录填写、自动计算、记录审核等全流程。
2.3.2 记录模板设计
json
{
"templateId": "R001",
"templateName": "重金属含量检测原始记录",
"projectCode": "PB-001",
"sections": [
{
"sectionName": "基本信息",
"fields": [
{"fieldName": "样品编号", "fieldType": "text", "required": true},
{"fieldName": "检测日期", "fieldType": "date", "required": true},
{"fieldName": "检测人员", "fieldType": "user", "required": true}
]
},
{
"sectionName": "仪器信息",
"fields": [
{"fieldName": "仪器编号", "fieldType": "instrument", "required": true},
{"fieldName": "仪器型号", "fieldType": "text", "readonly": true}
]
},
{
"sectionName": "检测数据",
"fields": [
{"fieldName": "平行样1", "fieldType": "number", "required": true},
{"fieldName": "平行样2", "fieldType": "number", "required": true},
{"fieldName": "平行样3", "fieldType": "number", "required": true},
{"fieldName": "平均值", "fieldType": "formula", "formula": "AVG(A1:A3)", "readonly": true},
{"fieldName": "标准偏差", "fieldType": "formula", "formula": "STDEV(A1:A3)", "readonly": true},
{"fieldName": "相对偏差", "fieldType": "formula", "formula": "RSD(A1:A3)", "readonly": true}
]
},
{
"sectionName": "质控信息",
"fields": [
{"fieldName": "质控样品", "fieldType": "qc_sample", "required": false},
{"fieldName": "质控结果", "fieldType": "text", "readonly": true},
{"fieldName": "质控判定", "fieldType": "text", "readonly": true}
]
}
]
}2.3.3 核心实体
- RecordTemplate:记录模板表
- RecordTemplateSection:模板段落表
- TemplateField:模板字段表
- OriginalRecord:原始记录表
- RecordValue:记录值表
2.4 数据采集管理
2.4.1 功能描述
支持从检测仪器自动采集数据,减少人工录入,提高数据准确性和工作效率。
2.4.2 数据采集方式
- 仪器直连采集:通过仪器通信协议(RS232、TCP/IP等)直接获取数据
- 文件解析采集:解析仪器输出的数据文件(CSV、EXCEL、TXT等)
- 手工录入:人工录入检测数据
2.4.3 仪器通信协议
csharp
// 仪器通信接口
public interface IInstrumentCommunicator
{
// 连接仪器
bool Connect(string port, int baudRate);
// 断开连接
void Disconnect();
// 发送命令
string SendCommand(string command);
// 读取数据
byte[] ReadData();
// 解析数据
object ParseData(byte[] rawData);
}2.4.4 数据采集配置
| 配置项 | 说明 |
|---|---|
| InstrumentType | 仪器类型 |
| CommunicationType | 通信方式(串口/网络/文件) |
| Port | 端口号 |
| BaudRate | 波特率 |
| DataFormat | 数据格式 |
| ParseRule | 解析规则 |
| CollectionInterval | 采集间隔 |
| IsAutoCollect | 是否自动采集 |
2.5 质控管理
2.5.1 功能描述
质控管理用于监控检测过程的准确性和精密度,确保检测结果的可靠性。
2.5.2 质控类型
- 空白样品:检验整个检测流程是否有污染
- 标准样品:使用已知浓度的标准物质验证准确性
- 加标回收:在样品中加入已知量标准物质验证回收率
- 平行样品:同一样品多次检测验证精密度
- 人员比对:不同检测人员检测同一样品验证一致性
- 仪器比对:不同仪器检测同一样品验证一致性
2.5.3 质控规则配置
json
{
"qcRules": [
{
"ruleName": "标准样品规则",
"qcType": "StandardSample",
"condition": "浓度值在参考值±10%范围内",
"action": "警告",
"allowNext": true
},
{
"ruleName": "加标回收率规则",
"qcType": "SpikeRecovery",
"condition": "回收率在80%-120%范围内",
"action": "警告",
"allowNext": true
},
{
"ruleName": "平行样品规则",
"qcType": "ParallelSample",
"condition": "相对偏差≤10%",
"action": "警告",
"allowNext": false
}
]
}2.5.4 质控判定流程
检测数据 → 质控样品检测 → 质控规则匹配 → 质控判定 → 判定通过 → 结果发布
↓
判定不通过 → 重新检测 → 重新检测
↓
超限处理 → 报告异常2.6 结果管理
2.6.1 功能描述
结果管理包括检测结果的录入、计算、判定和发布,支持单人录入+双人审核模式。
2.6.2 结果计算规则
csharp
// 结果计算配置
public class ResultCalculationRule
{
public string Formula { get; set; } // 计算公式
public int DecimalPlaces { get; set; } // 小数位数
public string RoundingRule { get; set; } // 修约规则
public string Unit { get; set; } // 结果单位
}
// 示例配置
{
"formula": "(A+B)*C/D",
"decimalPlaces": 2,
"roundingRule": "四舍六入五成双",
"unit": "mg/kg"
}2.6.3 结果判定规则
json
{
"judgmentRules": [
{
"ruleName": "单项判定",
"ruleType": "Single",
"conditions": [
{"operator": ">=", "limitValue": 0, "result": "合格"},
{"operator": "<", "limitValue": 0, "result": "不合格"}
]
},
{
"ruleName": "综合判定",
"ruleType": "Comprehensive",
"allPass": true, // 全部项目合格才合格
"conditions": []
}
]
}3. 数据库设计
3.1 核心表结构
3.1.1 检测任务表
sql
CREATE TABLE [dbo].[DetectionTask](
[Id] BIGINT IDENTITY(1,1) NOT NULL,
[TaskNo] VARCHAR(50) NOT NULL, -- 任务编号
[SampleId] BIGINT NOT NULL, -- 样品ID
[ProjectId] BIGINT NOT NULL, -- 检测项目ID
[AssigneeId] BIGINT NULL, -- 执行人ID
[AuditorId] BIGINT NULL, -- 审核人ID
[Status] INT NOT NULL DEFAULT 0, -- 任务状态
[Priority] INT NOT NULL DEFAULT 1, -- 优先级
[StartTime] DATETIME NULL, -- 开始时间
[EndTime] DATETIME NULL, -- 完成时间
[Result] NVARCHAR(MAX) NULL, -- 检测结果
[Remark] NVARCHAR(500) NULL, -- 备注
[CreateTime] DATETIME NOT NULL, -- 创建时间
[CreateUserId] BIGINT NULL, -- 创建人ID
[UpdateTime] DATETIME NULL, -- 更新时间
[UpdateUserId] BIGINT NULL, -- 更新人ID
[IsDeleted] BIT NOT NULL DEFAULT 0, -- 是否删除
CONSTRAINT [PK_DetectionTask] PRIMARY KEY ([Id]),
CONSTRAINT [UK_DetectionTask_TaskNo] UNIQUE ([TaskNo])
)3.1.2 检测项目表
sql
CREATE TABLE [dbo].[DetectionProject](
[Id] BIGINT IDENTITY(1,1) NOT NULL,
[ProjectCode] VARCHAR(50) NOT NULL, -- 项目编号
[ProjectName] NVARCHAR(200) NOT NULL, -- 项目名称
[CategoryId] BIGINT NULL, -- 项目分类ID
[MethodStandard] NVARCHAR(500) NULL, -- 方法依据
[DetectionRange] NVARCHAR(200) NULL, -- 检测范围
[Precision] NVARCHAR(100) NULL, -- 精度要求
[Unit] VARCHAR(50) NULL, -- 结果单位
[Price] DECIMAL(18,2) NULL, -- 项目单价
[TurnaroundDays] INT NULL, -- turnaround时间
[RecordTemplateId] BIGINT NULL, -- 原始记录模板ID
[Status] INT NOT NULL DEFAULT 1, -- 状态
[Remark] NVARCHAR(500) NULL, -- 备注
[CreateTime] DATETIME NOT NULL, -- 创建时间
[CreateUserId] BIGINT NULL, -- 创建人ID
[UpdateTime] DATETIME NULL, -- 更新时间
[UpdateUserId] BIGINT NULL, -- 更新人ID
[IsDeleted] BIT NOT NULL DEFAULT 0, -- 是否删除
CONSTRAINT [PK_DetectionProject] PRIMARY KEY ([Id]),
CONSTRAINT [UK_DetectionProject_ProjectCode] UNIQUE ([ProjectCode])
)3.1.3 原始记录表
sql
CREATE TABLE [dbo].[OriginalRecord](
[Id] BIGINT IDENTITY(1,1) NOT NULL,
[RecordNo] VARCHAR(50) NOT NULL, -- 记录编号
[TaskId] BIGINT NOT NULL, -- 任务ID
[TemplateId] BIGINT NOT NULL, -- 模板ID
[RecordData] NVARCHAR(MAX) NULL, -- 记录数据(JSON)
[CalculationResult] NVARCHAR(MAX) NULL, -- 计算结果(JSON)
[QcResult] NVARCHAR(500) NULL, -- 质控结果
[Status] INT NOT NULL DEFAULT 0, -- 记录状态
[IsAutoCalculate] BIT NOT NULL DEFAULT 1,-- 是否自动计算
[CompleteTime] DATETIME NULL, -- 完成时间
[AuditTime] DATETIME NULL, -- 审核时间
[AuditorId] BIGINT NULL, -- 审核人ID
[AuditRemark] NVARCHAR(500) NULL, -- 审核备注
[CreateTime] DATETIME NOT NULL, -- 创建时间
[CreateUserId] BIGINT NULL, -- 创建人ID
[UpdateTime] DATETIME NULL, -- 更新时间
[UpdateUserId] BIGINT NULL, -- 更新人ID
[IsDeleted] BIT NOT NULL DEFAULT 0, -- 是否删除
CONSTRAINT [PK_OriginalRecord] PRIMARY KEY ([Id]),
CONSTRAINT [UK_OriginalRecord_RecordNo] UNIQUE ([RecordNo])
)3.1.4 质控记录表
sql
CREATE TABLE [dbo].[QualityControlRecord](
[Id] BIGINT IDENTITY(1,1) NOT NULL,
[QcNo] VARCHAR(50) NOT NULL, -- 质控编号
[QcType] INT NOT NULL, -- 质控类型
[SampleId] BIGINT NULL, -- 关联样品ID
[TaskId] BIGINT NULL, -- 关联任务ID
[StandardValue] DECIMAL(18,6) NULL, -- 标准值
[MeasuredValue] DECIMAL(18,6) NULL, -- 实测值
[Tolerance] DECIMAL(18,4) NULL, -- 允许误差
[QcResult] INT NOT NULL, -- 质控结果(0未判定,1合格,2不合格)
[Remark] NVARCHAR(500) NULL, -- 备注
[CreateTime] DATETIME NOT NULL, -- 创建时间
[CreateUserId] BIGINT NULL, -- 创建人ID
[IsDeleted] BIT NOT NULL DEFAULT 0, -- 是否删除
CONSTRAINT [PK_QualityControlRecord] PRIMARY KEY ([Id]),
CONSTRAINT [UK_QualityControlRecord_QcNo] UNIQUE ([QcNo])
)4. 接口设计
4.1 任务管理接口
4.1.1 获取任务列表
GET /api/detection/task/list
Query: pageIndex, pageSize, status, assigneeId, sampleId, startDate, endDate
Response: { code: 200, data: { list: [], total: 0 } }4.1.2 创建检测任务
POST /api/detection/task/create
Body: { sampleId, projectId, assigneeId, priority, remark }
Response: { code: 200, data: { taskId } }4.1.3 分配任务
POST /api/detection/task/assign
Body: { taskId, assigneeId }
Response: { code: 200, message: "分配成功" }4.1.4 领取任务
POST /api/detection/task/claim/{taskId}
Response: { code: 200, message: "领取成功" }4.1.5 提交任务
POST /api/detection/task/submit/{taskId}
Body: { result, remark }
Response: { code: 200, message: "提交成功" }4.1.6 审核任务
POST /api/detection/task/audit/{taskId}
Body: { auditResult, auditRemark }
Response: { code: 200, message: "审核完成" }4.2 检测项目管理接口
4.2.1 获取项目列表
GET /api/detection/project/list
Query: categoryId, keyword, status
Response: { code: 200, data: { list: [] } }4.2.2 获取项目详情
GET /api/detection/project/{projectId}
Response: { code: 200, data: { projectDetail } }4.2.3 创建检测项目
POST /api/detection/project/create
Body: { projectCode, projectName, categoryId, methodStandard, detectionRange, unit, price }
Response: { code: 200, data: { projectId } }4.3 原始记录接口
4.3.1 获取记录模板
GET /api/detection/record/template/{templateId}
Response: { code: 200, data: { template } }4.3.2 保存原始记录
POST /api/detection/record/save
Body: { taskId, recordData }
Response: { code: 200, message: "保存成功" }4.3.3 计算检测结果
POST /api/detection/record/calculate
Body: { templateId, recordData }
Response: { code: 200, data: { calculationResult } }4.3.4 提交记录审核
POST /api/detection/record/submit/{recordId}
Response: { code: 200, message: "提交成功" }4.4 数据采集接口
4.4.1 获取仪器列表
GET /api/detection/instrument/list
Response: { code: 200, data: { list: [] } }4.4.2 连接仪器
POST /api/detection/instrument/connect/{instrumentId}
Response: { code: 200, message: "连接成功" }4.4.3 采集数据
POST /api/detection/instrument/collect/{instrumentId}
Response: { code: 200, data: { rawData, parsedData } }4.5 质控接口
4.5.1 添加质控记录
POST /api/detection/qc/add
Body: { qcType, sampleId, taskId, standardValue, measuredValue }
Response: { code: 200, data: { qcResult } }4.5.2 质控判定
POST /api/detection/qc/judge/{qcId}
Response: { code: 200, data: { qcResult, qcMessage } }5. 关键技术实现
5.1 公式计算引擎
csharp
public class FormulaCalculator
{
private readonly Dictionary<string, Func<double[], double>> _functions;
public FormulaCalculator()
{
_functions = new Dictionary<string, Func<double[], double>>
{
["SUM"] = arr => arr.Sum(),
["AVG"] = arr => arr.Average(),
["MAX"] = arr => arr.Max(),
["MIN"] = arr => arr.Min(),
["STDEV"] = arr => CalculateStdev(arr),
["RSD"] = arr => CalculateRsd(arr)
};
}
public double Calculate(string formula, Dictionary<string, double> variables)
{
// 解析公式并计算
// 支持四则运算、函数调用、条件判断等
return result;
}
}5.2 数据修约规则
csharp
public enum RoundingRule
{
Four舍六入五成双, // GB/T 8170
四舍五入, // 常规
向上取整, // ceil
向下取整 // floor
}
public double RoundValue(double value, int decimalPlaces, RoundingRule rule)
{
switch (rule)
{
case RoundingRule.Four舍六入五成双:
return RoundToEven(value, decimalPlaces);
case RoundingRule.四舍五入:
return Math.Round(value, decimalPlaces);
default:
return value;
}
}5.3 仪器数据采集
csharp
public class InstrumentCollector
{
private readonly IInstrumentCommunicator _communicator;
private readonly IDataParser _parser;
public async Task<CollectedData> CollectDataAsync(string instrumentId)
{
var instrument = await GetInstrumentConfig(instrumentId);
// 建立连接
_communicator.Connect(instrument.Port, instrument.BaudRate);
try
{
// 发送采集命令
var command = instrument.CollectionCommand;
var response = await _communicator.SendCommandAsync(command);
// 解析数据
var rawData = _communicator.ReadData();
var parsedData = _parser.Parse(rawData, instrument.ParseRule);
return new CollectedData
{
InstrumentId = instrumentId,
RawData = rawData,
ParsedData = parsedData,
CollectionTime = DateTime.Now
};
}
finally
{
_communicator.Disconnect();
}
}
}6. 业务规则
6.1 任务分配规则
- 系统支持自动分配和手动分配两种模式
- 自动分配根据检测人员的当前任务量和专业领域进行智能分配
- 支持按区域、按项目、按紧急程度等维度分配
- 任务分配时可设置提醒规则,自动通知执行人
6.2 结果判定规则
- 单项结果判定:根据检测项目的限量标准进行判定
- 综合结果判定:所有单项合格才判定综合合格
- 支持自定义判定规则,可配置复杂的判定逻辑
- 判定结果自动标注,无需人工判断
6.3 质控规则
- 每批次检测必须包含足够数量的质控样品
- 质控样品结果必须在控制限内才算合格
- 质控不合格时自动报警,阻止结果发布
- 支持配置质控规则,适应不同检测项目的要求
7. 性能优化
7.1 数据库优化
- 对高频查询字段建立索引(TaskNo, SampleId, ProjectId, Status)
- 使用分区表处理历史数据归档
- 定期清理过期数据,保持数据库性能
7.2 缓存策略
- 检测项目信息缓存在Redis中,减少数据库查询
- 用户信息、权限信息使用本地缓存
- 记录模板配置使用应用级缓存
7.3 异步处理
- 仪器数据采集使用异步方式,不阻塞主线程
- 批量任务处理使用消息队列
- 邮件、短信通知使用异步发送
8. 安全控制
8.1 权限控制
- 任务分配权限:仅管理员和组长可操作
- 任务执行权限:分配给当前用户的任务才能执行
- 结果审核权限:仅审核员和管理员可操作
- 数据修改权限:记录提交前可修改,提交后需撤销审核才能修改
8.2 数据安全
- 检测结果数据不允许物理删除,只做逻辑删除
- 所有数据操作记录审计日志
- 敏感数据加密存储
- 定期备份数据库
9. 扩展功能
9.1 移动端支持
- 支持移动端查看任务、填写记录
- 支持扫码枪快速录入样品信息
- 支持离线数据采集,网络恢复后自动同步
9.2 智能提醒
- 任务超时提醒
- 质控超标提醒
- 设备校准提醒
- 报告到期提醒
9.3 统计分析
- 检测工作量统计(按人员、按项目、按时间)
- 质控合格率统计
- turnaround时间统计
- 返工率统计