一、需求分析
商品抽检管理是美团买菜保障食品安全和质量的重要环节,主要需求包括:
1. 抽检计划制定:按品类、供应商、风险等级制定抽检计划
2. 抽检任务分配:自动或手动分配抽检任务给质检人员
3. 抽检过程记录:记录抽检时间、地点、样品信息、检测结果等
4. 问题商品处理:对不合格商品进行下架、召回等处理
5. 数据分析与报告:生成抽检统计报告,分析质量问题趋势
6. 预警机制:对高风险商品或供应商自动预警
二、系统架构设计
1. 整体架构
采用微服务架构,主要分为:
- 抽检计划服务
- 抽检任务服务
- 检测记录服务
- 数据分析服务
- 预警服务
2. 技术栈
- 后端:Spring Cloud + MyBatis Plus
- 前端:Vue.js + Element UI
- 数据库:MySQL + Redis
- 消息队列:RabbitMQ
- 大数据分析:Hive + Spark
三、核心功能实现
1. 抽检计划管理
```java
// 抽检计划实体类
@Data
public class InspectionPlan {
private Long id;
private String planName;
private String categoryId; // 商品品类
private String supplierId; // 供应商
private Integer riskLevel; // 风险等级
private Date startTime;
private Date endTime;
private Integer frequency; // 抽检频率(次/周)
private Integer sampleSize; // 抽样数量
private Integer status; // 状态
}
// 抽检计划服务接口
public interface InspectionPlanService {
// 创建抽检计划
Result createPlan(InspectionPlanDTO planDTO);
// 获取待执行计划
List getPendingPlans();
// 更新计划状态
Result updatePlanStatus(Long planId, Integer status);
}
```
2. 抽检任务分配
```java
// 抽检任务实体类
@Data
public class InspectionTask {
private Long id;
private Long planId;
private String inspectorId; // 质检员ID
private String warehouseId; // 仓库ID
private Date assignTime;
private Date completeTime;
private Integer status; // 任务状态
}
// 任务分配算法示例
public class TaskAllocator {
public List allocateTasks(List plans) {
// 1. 获取可用质检员列表
List inspectors = inspectorService.getAvailableInspectors();
// 2. 根据计划优先级和质检员负载分配任务
List tasks = new ArrayList<>();
for (InspectionPlan plan : plans) {
Inspector inspector = selectBestInspector(inspectors, plan);
if (inspector != null) {
InspectionTask task = new InspectionTask();
task.setPlanId(plan.getId());
task.setInspectorId(inspector.getId());
// 设置其他任务属性...
tasks.add(task);
// 更新质检员负载
updateInspectorLoad(inspector);
}
}
return tasks;
}
}
```
3. 抽检过程记录
```java
// 检测记录实体类
@Data
public class InspectionRecord {
private Long id;
private Long taskId;
private String productId; // 商品ID
private String batchNo; // 批次号
private String inspectionItems; // 检测项目(JSON格式)
private String results; // 检测结果(JSON格式)
private Integer isQualified; // 是否合格
private String inspectorId;
private Date inspectionTime;
private String remarks;
}
// 检测记录服务
public interface InspectionRecordService {
// 提交检测记录
Result submitRecord(InspectionRecordDTO recordDTO);
// 获取商品检测历史
List getProductHistory(String productId);
// 获取供应商检测统计
SupplierInspectionStats getSupplierStats(String supplierId);
}
```
4. 不合格商品处理
```java
// 不合格商品处理流程
public class UnqualifiedProcessor {
public void processUnqualified(InspectionRecord record) {
// 1. 锁定商品库存
inventoryService.lockProduct(record.getProductId(), record.getBatchNo());
// 2. 生成处理工单
WorkOrder workOrder = generateWorkOrder(record);
workOrderService.createWorkOrder(workOrder);
// 3. 通知相关人员
notificationService.sendUnqualifiedNotice(record);
// 4. 更新商品状态
productService.updateProductStatus(record.getProductId(),
ProductStatus.UNQUALIFIED);
}
private WorkOrder generateWorkOrder(InspectionRecord record) {
// 生成处理工单逻辑
// 包括下架、召回、销毁等处理方式
}
}
```
5. 数据分析与预警
```java
// 数据分析服务
public interface InspectionAnalysisService {
// 获取各类商品合格率
Map getCategoryPassRates(Date startDate, Date endDate);
// 获取供应商质量排名
List getSupplierQualityRanking();
// 风险预警
List generateRiskWarnings();
}
// 风险预警实现示例
public class RiskWarningGenerator {
public List generateWarnings() {
// 1. 获取近期检测数据
List recentRecords = getRecentRecords();
// 2. 分析不合格趋势
Map trendMap = analyzeTrend(recentRecords);
// 3. 生成预警
List warnings = new ArrayList<>();
trendMap.forEach((key, value) -> {
if (value > THRESHOLD) {
warnings.add(new RiskWarning(key, value, "不合格率超标"));
}
});
return warnings;
}
}
```
四、数据库设计
1. 主要表结构
```sql
-- 抽检计划表
CREATE TABLE inspection_plan (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_name VARCHAR(100) NOT NULL,
category_id VARCHAR(50),
supplier_id VARCHAR(50),
risk_level TINYINT,
start_time DATETIME,
end_time DATETIME,
frequency INT,
sample_size INT,
status TINYINT,
create_time DATETIME,
update_time DATETIME
);
-- 抽检任务表
CREATE TABLE inspection_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_id BIGINT,
inspector_id VARCHAR(50),
warehouse_id VARCHAR(50),
assign_time DATETIME,
complete_time DATETIME,
status TINYINT,
FOREIGN KEY (plan_id) REFERENCES inspection_plan(id)
);
-- 检测记录表
CREATE TABLE inspection_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT,
product_id VARCHAR(50),
batch_no VARCHAR(50),
inspection_items TEXT,
results TEXT,
is_qualified TINYINT,
inspector_id VARCHAR(50),
inspection_time DATETIME,
remarks TEXT,
FOREIGN KEY (task_id) REFERENCES inspection_task(id)
);
-- 不合格商品处理表
CREATE TABLE unqualified_product (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
record_id BIGINT,
product_id VARCHAR(50),
batch_no VARCHAR(50),
handle_type TINYINT, -- 1:下架 2:召回 3:销毁
handle_status TINYINT,
handle_time DATETIME,
handler_id VARCHAR(50),
FOREIGN KEY (record_id) REFERENCES inspection_record(id)
);
```
五、前端实现要点
1. 抽检计划管理页面:
- 计划列表展示(含筛选和排序)
- 计划创建/编辑表单
- 计划状态可视化
2. 任务分配看板:
- 任务卡片展示
- 拖拽分配功能
- 任务进度跟踪
3. 检测记录录入:
- 商品信息自动填充
- 检测项目模板
- 结果快速录入
4. 数据分析仪表盘:
- 合格率趋势图
- 供应商质量排名
- 风险预警提示
六、关键技术实现
1. 定时任务调度:
- 使用Quartz或Spring Scheduler实现抽检计划自动生成
- 每日/每周定时生成抽检任务
2. 工作流引擎:
- 使用Activiti或Flowable实现不合格商品处理流程
- 支持自定义处理流程
3. 大数据分析:
- 使用Hive存储历史检测数据
- 使用Spark进行质量趋势分析
- 定时生成质量报告
4. 移动端适配:
- 开发质检员APP,支持现场检测记录
- 离线数据采集功能
七、测试与部署
1. 测试策略:
- 单元测试:JUnit + Mockito
- 接口测试:Postman + Newman
- 性能测试:JMeter
- 自动化测试:Selenium
2. 部署方案:
- 容器化部署:Docker + Kubernetes
- 灰度发布策略
- 监控告警:Prometheus + Grafana
八、安全与合规
1. 数据安全:
- 检测记录加密存储
- 操作日志审计
- 权限分级控制
2. 合规要求:
- 符合《食品安全法》要求
- 检测数据可追溯
- 保留完整处理记录
通过以上方案实现,美团买菜系统可以构建一个完善的商品抽检管理体系,有效保障商品质量安全,提升消费者信任度。