一、需求分析
随机抽检管理是小象买菜系统中保障商品质量的重要环节,主要需求包括:
1. 自动从当日订单或商品中随机抽取一定比例进行质量检查
2. 记录抽检结果并生成报告
3. 跟踪问题商品的处理流程
4. 提供抽检数据统计分析功能
二、系统设计
1. 数据库设计
```sql
-- 抽检任务表
CREATE TABLE inspection_tasks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_name VARCHAR(100) NOT NULL,
task_type ENUM(order, product) NOT NULL,
sample_size INT NOT NULL,
status ENUM(pending, in_progress, completed, cancelled) DEFAULT pending,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
complete_time DATETIME,
operator_id BIGINT,
remark TEXT
);
-- 抽检样本表
CREATE TABLE inspection_samples (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT NOT NULL,
sample_type ENUM(order, product) NOT NULL,
sample_id VARCHAR(50) NOT NULL COMMENT 订单ID或商品ID,
sample_name VARCHAR(100) NOT NULL,
inspection_result ENUM(pass, fail, pending) DEFAULT pending,
failure_reason TEXT,
inspector_id BIGINT,
inspection_time DATETIME,
FOREIGN KEY (task_id) REFERENCES inspection_tasks(id)
);
-- 抽检问题处理表
CREATE TABLE inspection_issues (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sample_id BIGINT NOT NULL,
issue_type VARCHAR(50) NOT NULL,
issue_description TEXT NOT NULL,
severity ENUM(minor, major, critical) NOT NULL,
handler_id BIGINT,
handle_status ENUM(pending, processing, resolved, rejected) DEFAULT pending,
handle_time DATETIME,
resolution TEXT,
FOREIGN KEY (sample_id) REFERENCES inspection_samples(id)
);
```
2. 核心功能模块
2.1 随机抽检任务生成
```java
public class InspectionTaskGenerator {
@Autowired
private OrderService orderService;
@Autowired
private ProductService productService;
@Autowired
private Random random;
/
* 生成订单抽检任务
* @param sampleRate 抽检比例(0-1)
* @return 抽检任务
*/
public InspectionTask generateOrderInspectionTask(double sampleRate) {
// 获取当日订单列表
List
todayOrders = orderService.getTodayOrders();
int sampleSize = (int) Math.ceil(todayOrders.size() * sampleRate);
// 随机选择订单
List samples = selectRandomSamples(todayOrders, sampleSize);
// 创建抽检任务
InspectionTask task = new InspectionTask();
task.setTaskName("订单抽检-" + System.currentTimeMillis());
task.setTaskType("order");
task.setSampleSize(samples.size());
// 保存任务和样本到数据库...
return task;
}
/
* 生成商品抽检任务
* @param sampleSize 抽检数量
* @return 抽检任务
*/
public InspectionTask generateProductInspectionTask(int sampleSize) {
// 获取在售商品列表
List activeProducts = productService.getActiveProducts();
// 随机选择商品
List samples = selectRandomSamples(activeProducts, sampleSize);
// 创建抽检任务
InspectionTask task = new InspectionTask();
task.setTaskName("商品抽检-" + System.currentTimeMillis());
task.setTaskType("product");
task.setSampleSize(samples.size());
// 保存任务和样本到数据库...
return task;
}
private List selectRandomSamples(List list, int sampleSize) {
if (sampleSize >= list.size()) {
return new ArrayList<>(list);
}
List result = new ArrayList<>(sampleSize);
Set selectedIndices = new HashSet<>();
while (result.size() < sampleSize) {
int index = random.nextInt(list.size());
if (!selectedIndices.contains(index)) {
selectedIndices.add(index);
result.add(list.get(index));
}
}
return result;
}
}
```
2.2 抽检结果记录
```java
public class InspectionResultRecorder {
@Autowired
private InspectionSampleRepository sampleRepository;
@Autowired
private InspectionIssueRepository issueRepository;
/
* 记录抽检结果
* @param sampleId 样本ID
* @param result 抽检结果
* @param failureReason 失败原因(可选)
* @param inspectorId 检验员ID
*/
public void recordInspectionResult(Long sampleId,
InspectionResult result,
String failureReason,
Long inspectorId) {
InspectionSample sample = sampleRepository.findById(sampleId)
.orElseThrow(() -> new RuntimeException("样本不存在"));
sample.setInspectionResult(result);
sample.setInspectionTime(LocalDateTime.now());
sample.setInspectorId(inspectorId);
if (result == InspectionResult.FAIL && failureReason != null) {
sample.setFailureReason(failureReason);
// 创建问题记录
InspectionIssue issue = new InspectionIssue();
issue.setSampleId(sample.getId());
issue.setIssueType(determineIssueType(failureReason));
issue.setIssueDescription(failureReason);
issue.setSeverity(determineSeverity(failureReason));
issueRepository.save(issue);
}
sampleRepository.save(sample);
}
private String determineIssueType(String failureReason) {
// 根据失败原因确定问题类型
if (failureReason.contains("过期")) {
return "过期商品";
} else if (failureReason.contains("破损")) {
return "包装破损";
}
// 其他规则...
return "其他问题";
}
private String determineSeverity(String failureReason) {
// 根据失败原因确定严重程度
if (failureReason.contains("变质") || failureReason.contains("污染")) {
return "critical";
} else if (failureReason.contains("破损")) {
return "major";
}
return "minor";
}
}
```
2.3 抽检数据分析
```java
public class InspectionAnalysisService {
@Autowired
private InspectionTaskRepository taskRepository;
@Autowired
private InspectionSampleRepository sampleRepository;
/
* 获取抽检合格率
* @param startTime 开始时间
* @param endTime 结束时间
* @return 合格率统计
*/
public Map getPassRateByPeriod(LocalDateTime startTime, LocalDateTime endTime) {
List tasks = taskRepository.findByCreateTimeBetween(startTime, endTime);
long totalSamples = 0;
long passedSamples = 0;
for (InspectionTask task : tasks) {
List samples = sampleRepository.findByTaskId(task.getId());
totalSamples += samples.size();
passedSamples += samples.stream()
.filter(s -> s.getInspectionResult() == InspectionResult.PASS)
.count();
}
double passRate = totalSamples == 0 ? 0 : (double) passedSamples / totalSamples * 100;
return Map.of(
"period", startTime.toString() + " - " + endTime.toString(),
"totalSamples", (double) totalSamples,
"passedSamples", (double) passedSamples,
"passRate", passRate
);
}
/
* 获取问题商品分类统计
* @param startTime 开始时间
* @param endTime 结束时间
* @return 问题分类统计
*/
public Map getIssueTypeStatistics(LocalDateTime startTime, LocalDateTime endTime) {
List issues = issueRepository.findByCreateTimeBetween(startTime, endTime);
return issues.stream()
.collect(Collectors.groupingBy(
InspectionIssue::getIssueType,
Collectors.counting()
));
}
}
```
三、前端实现要点
1. 抽检任务管理页面
- 展示待处理、进行中、已完成的任务列表
- 提供创建新抽检任务的入口
- 支持按日期、类型等条件筛选任务
2. 抽检执行页面
- 显示当前任务的样本列表
- 提供抽检结果录入表单(通过/不通过)
- 不通过时需填写原因和上传照片
- 支持批量操作
3. 数据分析页面
- 合格率趋势图
- 问题分类统计
- 严重程度分布
- 抽检覆盖率统计
四、技术实现建议
1. 随机算法优化:
- 对于大数据量,考虑使用水库抽样算法提高性能
- 可以预先生成随机数种子确保可复现性
2. 定时任务:
- 使用Spring Scheduler或Quartz实现每日自动抽检任务生成
- 示例配置:
```java
@Scheduled(cron = "0 0 8 * * ?") // 每天早上8点执行
public void generateDailyInspectionTasks() {
// 生成订单和商品抽检任务
inspectionTaskGenerator.generateOrderInspectionTask(0.05); // 5%订单抽检
inspectionTaskGenerator.generateProductInspectionTask(20); // 20个商品抽检
}
```
3. 通知机制:
- 抽检任务生成时通知相关质检人员
- 发现严重问题时即时通知管理层
4. 移动端适配:
- 开发质检人员使用的移动端应用,方便现场抽检
五、扩展功能考虑
1. 智能抽检策略:
- 基于历史数据的风险评估,对高风险商品提高抽检比例
- 结合供应商评级动态调整抽检频率
2. 区块链存证:
- 将抽检结果上链,确保不可篡改
3. 与供应链系统集成:
- 抽检结果自动影响供应商评分和结算
4. 消费者端展示:
- 在商品详情页展示抽检历史和结果,增强消费者信任
六、实施步骤
1. 需求确认和细化
2. 数据库设计和初始化
3. 核心API开发
4. 前端页面开发
5. 定时任务配置
6. 测试环境部署和测试
7. 用户培训和文档编写
8. 生产环境部署
9. 持续优化和迭代
通过以上设计,小象买菜系统可以实现高效、透明的随机抽检管理,有效保障商品质量,提升消费者信任度。