一、需求分析
随机抽检管理是小象买菜系统中保障商品质量的重要环节,主要需求包括:
1. 随机性:确保抽检过程公平公正,避免人为干预
2. 可配置性:支持不同商品类别、供应商设置不同抽检比例
3. 流程管理:覆盖从抽检计划制定到结果处理的完整流程
4. 数据追溯:完整记录抽检过程和结果,便于追溯和审计
二、系统设计
1. 数据库设计
```sql
-- 抽检计划表
CREATE TABLE inspection_plan (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_name VARCHAR(100) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
status TINYINT DEFAULT 0 COMMENT 0-未开始 1-进行中 2-已完成,
creator_id BIGINT NOT NULL,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL
);
-- 抽检规则表
CREATE TABLE inspection_rule (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_id BIGINT NOT NULL,
category_id BIGINT COMMENT 商品分类ID,
supplier_id BIGINT COMMENT 供应商ID,
sample_rate DECIMAL(5,2) NOT NULL COMMENT 抽检比例(0-100),
inspection_items VARCHAR(500) COMMENT 抽检项目,JSON格式,
FOREIGN KEY (plan_id) REFERENCES inspection_plan(id)
);
-- 抽检任务表
CREATE TABLE inspection_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
plan_id BIGINT NOT NULL,
rule_id BIGINT NOT NULL,
batch_no VARCHAR(50) NOT NULL COMMENT 批次号,
product_id BIGINT NOT NULL,
supplier_id BIGINT NOT NULL,
inspector_id BIGINT COMMENT 抽检人员ID,
inspection_time DATETIME,
status TINYINT DEFAULT 0 COMMENT 0-待抽检 1-抽检中 2-已完成 3-异常,
FOREIGN KEY (plan_id) REFERENCES inspection_plan(id),
FOREIGN KEY (rule_id) REFERENCES inspection_rule(id)
);
-- 抽检结果表
CREATE TABLE inspection_result (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT NOT NULL,
item_code VARCHAR(50) NOT NULL COMMENT 检测项目代码,
item_name VARCHAR(100) NOT NULL COMMENT 检测项目名称,
standard_value VARCHAR(200) COMMENT 标准值,
actual_value VARCHAR(200) COMMENT 实际值,
is_qualified BOOLEAN NOT NULL COMMENT 是否合格,
description VARCHAR(500) COMMENT 检测描述,
image_urls VARCHAR(1000) COMMENT 图片URL,JSON格式,
FOREIGN KEY (task_id) REFERENCES inspection_task(id)
);
```
2. 核心算法设计
随机抽检算法
```java
public class RandomInspectionService {
/
* 根据抽检规则生成抽检任务
* @param planId 抽检计划ID
* @return 生成的抽检任务列表
*/
public List
generateInspectionTasks(Long planId) {
// 1. 获取抽检计划
InspectionPlan plan = inspectionPlanRepository.findById(planId)
.orElseThrow(() -> new RuntimeException("抽检计划不存在"));
// 2. 获取所有抽检规则
List rules = inspectionRuleRepository.findByPlanId(planId);
List tasks = new ArrayList<>();
for (InspectionRule rule : rules) {
// 3. 获取符合规则的商品批次
List batches = productBatchRepository.findByConditions(
rule.getCategoryId(),
rule.getSupplierId(),
plan.getStartDate(),
plan.getEndDate()
);
// 4. 计算需要抽检的数量
int totalBatches = batches.size();
int sampleSize = calculateSampleSize(totalBatches, rule.getSampleRate());
// 5. 随机选择批次
Collections.shuffle(batches);
List selectedBatches = batches.subList(0, Math.min(sampleSize, totalBatches));
// 6. 创建抽检任务
for (ProductBatch batch : selectedBatches) {
InspectionTask task = new InspectionTask();
task.setPlanId(planId);
task.setRuleId(rule.getId());
task.setBatchNo(batch.getBatchNo());
task.setProductId(batch.getProductId());
task.setSupplierId(batch.getSupplierId());
task.setStatus(InspectionStatus.PENDING);
tasks.add(task);
}
}
// 7. 保存任务到数据库
return inspectionTaskRepository.saveAll(tasks);
}
/
* 计算样本量
* @param populationSize 总体数量
* @param sampleRate 抽检比例
* @return 样本量
*/
private int calculateSampleSize(int populationSize, double sampleRate) {
// 简单实现:直接按比例计算,最小为1
int sampleSize = (int) Math.round(populationSize * sampleRate / 100);
return Math.max(1, sampleSize);
}
}
```
3. 系统架构
采用微服务架构,主要组件包括:
1. 抽检管理服务:核心业务逻辑
2. 商品服务:提供商品和批次信息
3. 用户服务:提供抽检人员信息
4. 通知服务:抽检任务分配通知
5. 报表服务:生成抽检统计报表
三、功能实现
1. 抽检计划管理
- 创建/编辑/删除抽检计划
- 设置抽检时间范围
- 配置抽检规则(按商品类别、供应商等)
- 设置抽检比例和检测项目
2. 抽检任务生成
```java
// 定时任务每天凌晨执行
@Scheduled(cron = "0 0 0 * * ?")
public void generateDailyInspectionTasks() {
List activePlans = inspectionPlanRepository.findByStatusAndDate(
InspectionPlanStatus.ACTIVE, LocalDate.now());
for (InspectionPlan plan : activePlans) {
randomInspectionService.generateInspectionTasks(plan.getId());
}
}
```
3. 抽检任务分配
- 自动分配:系统根据规则自动分配给质检人员
- 手动分配:管理员可以手动调整分配
- 移动端支持:质检人员通过APP查看和执行任务
4. 抽检执行与记录
```java
// 质检人员提交抽检结果
public InspectionTask submitInspectionResult(Long taskId,
List resultItems,
List imageUrls) {
InspectionTask task = inspectionTaskRepository.findById(taskId)
.orElseThrow(() -> new RuntimeException("任务不存在"));
if (task.getStatus() != InspectionStatus.IN_PROGRESS) {
throw new RuntimeException("任务状态不正确");
}
// 保存检测结果
List results = new ArrayList<>();
for (InspectionResultItem item : resultItems) {
InspectionResult result = new InspectionResult();
result.setTaskId(taskId);
result.setItemCode(item.getItemCode());
result.setItemName(item.getItemName());
result.setStandardValue(item.getStandardValue());
result.setActualValue(item.getActualValue());
result.setIsQualified(item.getIsQualified());
result.setDescription(item.getDescription());
results.add(result);
}
inspectionResultRepository.saveAll(results);
// 更新任务状态
task.setStatus(allResultsQualified(resultItems) ?
InspectionStatus.COMPLETED : InspectionStatus.UNQUALIFIED);
task.setInspectionTime(LocalDateTime.now());
return inspectionTaskRepository.save(task);
}
```
5. 异常处理与预警
- 不合格商品自动锁定,禁止销售
- 通知供应商和采购部门
- 触发复检流程
- 记录质量问题等级
6. 报表与分析
- 抽检完成率统计
- 不合格率趋势分析
- 供应商质量排名
- 商品类别质量分析
四、技术实现要点
1. 随机性保证:
- 使用Java的`Collections.shuffle()`方法实现真正随机
- 记录随机种子以便审计(如需可复现的随机性)
2. 分布式锁:
- 防止并发生成抽检任务时重复抽检
- 使用Redis实现分布式锁
3. 数据一致性:
- 抽检任务生成时使用数据库事务
- 状态变更采用最终一致性模型
4. 移动端适配:
- 开发质检人员使用的移动应用
- 支持离线提交结果,网络恢复后同步
五、测试方案
1. 单元测试:
- 随机算法正确性测试
- 边界条件测试(如0%或100%抽检比例)
- 异常情况测试
2. 集成测试:
- 抽检计划到任务生成的完整流程
- 与商品系统的数据交互
- 通知系统集成
3. 性能测试:
- 大批量商品抽检时的系统响应
- 高并发场景下的稳定性
4. 用户验收测试:
- 质检人员操作流程测试
- 报表数据准确性验证
六、部署与运维
1. 容器化部署:
- 使用Docker部署抽检管理服务
- Kubernetes进行编排管理
2. 监控告警:
- 抽检任务生成失败告警
- 抽检结果提交延迟告警
- 系统资源使用监控
3. 日志管理:
- 完整记录抽检操作日志
- 支持按条件查询和导出
七、扩展功能
1. 智能抽检:
- 基于历史数据的风险预测
- 对高风险商品提高抽检比例
2. 区块链存证:
- 抽检结果上链,确保不可篡改
- 供应商和消费者可查询
3. AI辅助检测:
- 图像识别辅助外观检测
- 自然语言处理分析检测描述
通过以上设计,小象买菜系统的随机抽检管理模块能够实现公平、高效、可追溯的商品质量抽检流程,有效保障生鲜商品的质量安全。