一、需求分析
随机抽检管理是小象买菜系统中重要的质量控制环节,主要需求包括:
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, supplier) NOT NULL,
sample_size INT NOT NULL,
create_time DATETIME NOT NULL,
status ENUM(pending, in_progress, completed) DEFAULT pending,
creator_id BIGINT NOT NULL,
remark VARCHAR(500)
);
-- 抽检样本表
CREATE TABLE inspection_samples (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT NOT NULL,
sample_id VARCHAR(50) NOT NULL, -- 可能是订单号或商品ID
sample_type ENUM(order, product) NOT NULL,
inspector_id BIGINT,
inspection_time DATETIME,
result ENUM(pass, fail, pending) DEFAULT pending,
problem_description VARCHAR(500),
handle_measure VARCHAR(500),
FOREIGN KEY (task_id) REFERENCES inspection_tasks(id)
);
-- 抽检规则表
CREATE TABLE inspection_rules (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
rule_name VARCHAR(100) NOT NULL,
rule_type ENUM(order, product, supplier) NOT NULL,
frequency ENUM(daily, weekly, monthly) NOT NULL,
sample_ratio DECIMAL(5,2) NOT NULL, -- 抽检比例
criteria TEXT NOT NULL, -- 抽检标准
is_active BOOLEAN DEFAULT TRUE,
create_time DATETIME NOT NULL
);
```
2. 核心功能模块
2.1 随机抽检算法
```java
public class RandomInspectionService {
// 从订单中随机抽检
public List
randomSelectOrders(Date inspectionDate, int sampleSize) {
// 1. 获取当日所有订单
List allOrders = orderRepository.findByCreateDate(inspectionDate);
// 2. 随机打乱顺序
Collections.shuffle(allOrders);
// 3. 返回指定数量的样本
return allOrders.stream()
.limit(sampleSize)
.collect(Collectors.toList());
}
// 按商品类别抽检
public List randomSelectProductsByCategory(String category, int sampleSize) {
List products = productRepository.findByCategory(category);
Collections.shuffle(products);
return products.stream()
.limit(sampleSize)
.collect(Collectors.toList());
}
// 加权随机抽检(根据风险等级)
public List weightedRandomSelectSuppliers(int sampleSize) {
List allSuppliers = supplierRepository.findAll();
// 根据供应商风险等级分配权重
Map weightedSuppliers = allSuppliers.stream()
.collect(Collectors.toMap(
s -> s,
s -> calculateSupplierWeight(s) // 根据历史质量数据计算权重
));
// 实现加权随机选择算法
return weightedRandomSelection(weightedSuppliers, sampleSize);
}
}
```
2.2 抽检任务管理
```java
public class InspectionTaskService {
@Transactional
public InspectionTask createDailyInspectionTask() {
// 1. 获取当日抽检规则
InspectionRule rule = inspectionRuleRepository.findActiveDailyRule();
// 2. 计算样本数量
int totalOrders = orderRepository.countTodayOrders();
int sampleSize = calculateSampleSize(rule.getSampleRatio(), totalOrders);
// 3. 创建抽检任务
InspectionTask task = new InspectionTask();
task.setTaskName("每日订单抽检-" + LocalDate.now());
task.setTaskType(InspectionTaskType.ORDER);
task.setSampleSize(sampleSize);
task.setStatus(InspectionTaskStatus.PENDING);
task.setCreatorId(SystemUser.SYSTEM_ID);
inspectionTaskRepository.save(task);
// 4. 随机选择样本
List samples = randomInspectionService.randomSelectOrders(
LocalDate.now(), sampleSize);
// 5. 保存样本
samples.forEach(order -> {
InspectionSample sample = new InspectionSample();
sample.setTaskId(task.getId());
sample.setSampleId(order.getOrderNo());
sample.setSampleType(InspectionSampleType.ORDER);
inspectionSampleRepository.save(sample);
});
return task;
}
// 更新抽检结果
public void updateInspectionResult(Long sampleId, InspectionResult result,
String problemDesc, String handleMeasure) {
InspectionSample sample = inspectionSampleRepository.findById(sampleId)
.orElseThrow(() -> new RuntimeException("样本不存在"));
sample.setResult(result);
sample.setProblemDescription(problemDesc);
sample.setHandleMeasure(handleMeasure);
sample.setInspectionTime(LocalDateTime.now());
inspectionSampleRepository.save(sample);
// 如果抽检任务所有样本都已完成,更新任务状态
if (inspectionSampleRepository.countPendingSamplesByTask(sample.getTaskId()) == 0) {
InspectionTask task = inspectionTaskRepository.findById(sample.getTaskId())
.orElseThrow(() -> new RuntimeException("任务不存在"));
task.setStatus(InspectionTaskStatus.COMPLETED);
inspectionTaskRepository.save(task);
}
}
}
```
3. 定时任务配置
```java
@Configuration
@EnableScheduling
public class InspectionScheduler {
@Autowired
private InspectionTaskService inspectionTaskService;
// 每天凌晨1点创建当日抽检任务
@Scheduled(cron = "0 0 1 * * ?")
public void createDailyInspectionTasks() {
inspectionTaskService.createDailyInspectionTask();
}
// 每周一生成供应商抽检任务
@Scheduled(cron = "0 0 8 ? * MON")
public void createWeeklySupplierInspection() {
inspectionTaskService.createSupplierInspectionTask();
}
}
```
三、前端实现要点
1. 抽检任务列表:
- 显示任务状态、创建时间、样本数量等
- 支持按状态、时间范围筛选
2. 抽检操作界面:
- 显示样本详情(订单信息/商品信息)
- 提供抽检结果选择(通过/不通过)
- 问题描述输入框
- 处理措施选择/输入
3. 统计报表:
- 抽检合格率趋势图
- 不合格问题分类统计
- 供应商质量排名
四、关键业务逻辑
1. 抽检比例计算:
- 根据订单量动态调整抽检数量
- 高风险商品提高抽检比例
2. 问题处理流程:
- 不合格品隔离
- 供应商通知与整改
- 复检机制
3. 权重计算:
```java
private double calculateSupplierWeight(Supplier supplier) {
// 历史不合格率占比60%
double historyFailureRate = supplier.getFailureRate() * 0.6;
// 投诉率占比30%
double complaintRate = supplier.getComplaintRate() * 0.3;
// 合作时长占比10%(新供应商加大抽检)
double cooperationFactor = 1.0 - (supplier.getCooperationDays() / 365.0 * 0.1);
return 1.0 + historyFailureRate + complaintRate + cooperationFactor;
}
```
五、扩展功能建议
1. 移动端支持:
- 抽检人员使用移动设备现场操作
- 拍照上传功能
2. 智能预警:
- 当连续抽检不合格时自动触发预警
- 质量异常波动检测
3. 区块链存证:
- 抽检结果上链,确保不可篡改
4. 与供应链系统集成:
- 自动触发供应商整改流程
- 质量数据影响供应商评级
六、实施步骤
1. 需求确认与系统设计评审
2. 数据库搭建与基础代码开发
3. 核心抽检算法实现与测试
4. 前端界面开发与联调
5. 定时任务配置与压力测试
6. 用户培训与上线部署
通过以上设计,小象买菜系统可以实现科学、高效的随机抽检管理,有效保障生鲜商品的质量安全。