一、需求分析
商品抽检管理是美团买菜系统中保障食品安全和质量的重要环节,主要需求包括:
1. 抽检计划制定:支持按商品类别、供应商、批次等维度制定抽检计划
2. 抽检任务分配:自动或手动分配抽检任务给质检人员
3. 抽检过程记录:记录抽检时间、地点、抽检人员、抽检数量等信息
4. 检测结果管理:记录各项检测指标结果,支持图片/视频证据上传
5. 问题处理流程:对不合格商品的处理流程跟踪
6. 统计分析与报表:生成抽检合格率、问题商品分布等统计报表
二、系统架构设计
1. 整体架构
采用微服务架构,商品抽检管理作为独立服务,与其他服务(商品管理、订单管理、供应商管理等)交互。
```
┌───────────────────────────────────────────────────────┐
│ 美团买菜系统 │
├───────────────┬───────────────┬───────────────┬───────┤
│ 商品管理服务 │ 订单管理服务 │ 供应商服务 │ 抽检管理服务 │
└───────────────┴───────────────┴───────────────┴───────┘
```
2. 抽检管理服务模块划分
```
┌───────────────────────────────────────────────┐
│ 抽检管理服务 │
├───────────────┬───────────────┬───────────────┤
│ 抽检计划模块 │ 抽检执行模块 │ 统计分析模块 │
├───────────────┼───────────────┼───────────────┤
│ 问题处理模块 │ 通知预警模块 │ 系统配置模块 │
└───────────────┴───────────────┴───────────────┘
```
三、数据库设计
1. 核心数据表
```sql
-- 抽检计划表
CREATE TABLE inspection_plan (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_name VARCHAR(100) NOT NULL,
plan_type VARCHAR(50), -- 定期/不定期/专项等
frequency INT, -- 抽检频率(天)
sample_size INT, -- 每次抽检数量
criteria TEXT, -- 抽检标准
status VARCHAR(20), -- 草稿/生效/停用
creator_id BIGINT,
create_time DATETIME,
update_time DATETIME
);
-- 抽检计划商品关联表
CREATE TABLE plan_product_relation (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
supplier_id BIGINT,
priority INT,
FOREIGN KEY (plan_id) REFERENCES inspection_plan(id),
FOREIGN KEY (product_id) REFERENCES product(id)
);
-- 抽检任务表
CREATE TABLE inspection_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_id BIGINT,
task_no VARCHAR(50) NOT NULL UNIQUE,
task_date DATE NOT NULL,
assignee_id BIGINT, -- 分配的质检人员
status VARCHAR(20), -- 待执行/执行中/已完成/已取消
create_time DATETIME,
complete_time DATETIME,
FOREIGN KEY (plan_id) REFERENCES inspection_plan(id)
);
-- 抽检任务明细表
CREATE TABLE task_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
batch_no VARCHAR(50),
sample_count INT,
inspector_id BIGINT, -- 实际执行人
inspection_time DATETIME,
location VARCHAR(100), -- 抽检地点
FOREIGN KEY (task_id) REFERENCES inspection_task(id),
FOREIGN KEY (product_id) REFERENCES product(id)
);
-- 检测结果表
CREATE TABLE inspection_result (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
detail_id BIGINT NOT NULL,
item_code VARCHAR(50) NOT NULL, -- 检测项目编码
item_name VARCHAR(100) NOT NULL, -- 检测项目名称
standard_value VARCHAR(100), -- 标准值
actual_value VARCHAR(100), -- 实际检测值
is_qualified BOOLEAN, -- 是否合格
attachment_urls TEXT, -- 附件URL列表
remark TEXT,
FOREIGN KEY (detail_id) REFERENCES task_detail(id)
);
-- 问题处理表
CREATE TABLE issue_handling (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
result_id BIGINT NOT NULL,
issue_type VARCHAR(50), -- 问题类型
severity VARCHAR(20), -- 严重程度
handling_status VARCHAR(20), -- 处理状态
handler_id BIGINT, -- 处理人
handling_time DATETIME,
solution TEXT, -- 解决方案
follow_up_plan TEXT, -- 后续跟进计划
FOREIGN KEY (result_id) REFERENCES inspection_result(id)
);
```
四、核心功能实现
1. 抽检计划生成算法
```java
public class InspectionPlanGenerator {
// 根据商品风险等级和历史抽检记录生成抽检计划
public List
generatePlans(Date startDate, Date endDate) {
List plans = new ArrayList<>();
// 1. 获取所有活跃商品
List products = productService.getActiveProducts();
// 2. 按风险等级分组
Map> riskGroups = products.stream()
.collect(Collectors.groupingBy(Product::getRiskLevel));
// 3. 为不同风险等级商品设置不同抽检频率
for (Map.Entry> entry : riskGroups.entrySet()) {
RiskLevel level = entry.getKey();
List groupProducts = entry.getValue();
int frequency = getFrequencyByRiskLevel(level);
int sampleSize = getSampleSizeByRiskLevel(level);
// 4. 为每个商品生成抽检计划
for (Product product : groupProducts) {
InspectionPlan plan = new InspectionPlan();
plan.setProductId(product.getId());
plan.setFrequency(frequency);
plan.setSampleSize(sampleSize);
plan.setCriteria(getInspectionCriteria(product));
plan.setStatus("生效");
// 生成具体执行日期
generateExecutionDates(plan, startDate, endDate);
plans.add(plan);
}
}
return plans;
}
private void generateExecutionDates(InspectionPlan plan, Date start, Date end) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
while (!calendar.getTime().after(end)) {
// 按频率添加执行日期
plan.addExecutionDate(calendar.getTime());
calendar.add(Calendar.DATE, plan.getFrequency());
}
}
}
```
2. 抽检任务分配逻辑
```java
public class TaskAssignmentService {
@Autowired
private InspectorService inspectorService;
@Autowired
private TaskRepository taskRepository;
// 自动分配抽检任务
public void autoAssignTasks(Date inspectionDate) {
// 1. 获取当天所有待分配任务
List pendingTasks = taskRepository.findByDateAndStatus(
inspectionDate, "待分配");
// 2. 获取可用质检人员
List availableInspectors = inspectorService.getAvailableInspectors(
inspectionDate);
// 3. 简单轮询分配算法
int inspectorIndex = 0;
for (InspectionTask task : pendingTasks) {
if (inspectorIndex >= availableInspectors.size()) {
inspectorIndex = 0; // 循环分配
}
Inspector inspector = availableInspectors.get(inspectorIndex);
task.setAssigneeId(inspector.getId());
task.setStatus("待执行");
taskRepository.save(task);
inspectorIndex++;
}
}
}
```
3. 抽检结果处理流程
```java
public class InspectionResultHandler {
@Autowired
private IssueHandlingService issueHandlingService;
@Autowired
private NotificationService notificationService;
public void processResult(InspectionResult result) {
if (result.getIsQualified()) {
// 合格结果处理
recordQualifiedResult(result);
} else {
// 不合格结果处理
handleUnqualifiedResult(result);
}
}
private void handleUnqualifiedResult(InspectionResult result) {
// 1. 创建问题处理记录
IssueHandling issue = new IssueHandling();
issue.setResultId(result.getId());
issue.setIssueType(determineIssueType(result));
issue.setSeverity(assessSeverity(result));
issue.setHandlingStatus("待处理");
// 2. 通知相关人员
List recipients = getNotificationRecipients(result);
notificationService.sendIssueNotification(
recipients,
"检测到不合格商品: " + result.getProductName(),
generateNotificationContent(result));
// 3. 触发处理流程
issueHandlingService.startHandlingProcess(issue);
}
private IssueType determineIssueType(InspectionResult result) {
// 根据检测项目和结果确定问题类型
// ...
}
}
```
五、技术实现要点
1. 移动端支持:开发质检人员使用的移动应用,支持扫码抽检、结果录入、照片上传等功能
2. 实时通知:使用WebSocket或长轮询实现抽检任务分配、结果异常等实时通知
3. 工作流引擎:对于问题商品处理流程,可集成工作流引擎实现灵活的流程配置
4. 数据分析:使用Elasticsearch或ClickHouse实现抽检数据的实时分析和报表生成
5. 权限控制:基于RBAC模型实现细粒度的权限控制,确保数据安全
六、测试与部署
1. 单元测试:对核心业务逻辑进行单元测试,确保算法正确性
2. 集成测试:测试各模块间的交互,特别是与商品、订单等系统的集成
3. 性能测试:模拟高峰期抽检任务生成和结果处理场景
4. 灰度发布:先在部分区域或商品类别试点,逐步扩大范围
七、运维与监控
1. 日志系统:记录抽检全流程操作日志,便于问题追踪
2. 监控告警:监控抽检任务完成率、异常结果比例等关键指标
3. 数据备份:定期备份抽检记录和检测结果数据
通过以上方案,美团买菜系统可以实现高效、可靠的商品抽检管理,有效保障食品安全和质量。