一、需求分析
随机抽检管理是小象买菜系统中重要的质量控制环节,主要功能包括:
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, processing, completed, cancelled) 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_type ENUM(order, product, batch) NOT NULL,
sample_id VARCHAR(50) NOT NULL,
sample_name VARCHAR(100) NOT NULL,
inspection_status ENUM(pending, passed, failed, processing) DEFAULT pending,
FOREIGN KEY (task_id) REFERENCES inspection_tasks(id)
);
-- 抽检结果表
CREATE TABLE inspection_results (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sample_id BIGINT NOT NULL,
inspector_id BIGINT NOT NULL,
inspection_time DATETIME NOT NULL,
result ENUM(passed, failed) NOT NULL,
failure_reason VARCHAR(500),
attachment_url VARCHAR(255),
remark VARCHAR(500),
FOREIGN KEY (sample_id) REFERENCES inspection_samples(id)
);
-- 抽检规则配置表
CREATE TABLE inspection_rules (
id INT PRIMARY KEY AUTO_INCREMENT,
rule_name VARCHAR(100) NOT NULL,
rule_type ENUM(order, product, supplier) NOT NULL,
sample_rate DECIMAL(5,2) NOT NULL COMMENT 抽检比例(0-100),
frequency ENUM(daily, weekly, monthly, per_order) NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
create_time DATETIME NOT NULL
);
```
2. 核心功能模块
2.1 随机抽检算法
```java
public class RandomInspectionService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private ProductRepository productRepository;
/
* 根据规则随机选择订单进行抽检
*/
public List
selectOrdersForInspection(InspectionRule rule) {
// 获取当天所有订单
List allOrders = orderRepository.findByOrderDate(LocalDate.now());
// 计算抽样数量
int sampleSize = (int) Math.ceil(allOrders.size() * (rule.getSampleRate() / 100.0));
// 随机打乱顺序
Collections.shuffle(allOrders);
// 返回前sampleSize个订单
return allOrders.subList(0, Math.min(sampleSize, allOrders.size()));
}
/
* 随机选择商品进行抽检
*/
public List selectProductsForInspection(InspectionRule rule) {
// 类似订单抽检逻辑
// ...
}
}
```
3. 定时任务配置
使用Spring的@Scheduled注解实现定时抽检:
```java
@Component
public class InspectionScheduler {
@Autowired
private InspectionTaskService inspectionTaskService;
@Autowired
private InspectionRuleRepository ruleRepository;
// 每天凌晨1点执行抽检任务
@Scheduled(cron = "0 0 1 * * ?")
public void executeDailyInspection() {
List activeRules = ruleRepository.findByIsActiveTrue();
for (InspectionRule rule : activeRules) {
InspectionTask task = new InspectionTask();
task.setTaskName("每日抽检-" + LocalDate.now());
task.setTaskType(rule.getRuleType());
// 根据规则类型执行不同抽检逻辑
switch (rule.getRuleType()) {
case "order":
List selectedOrders = selectOrdersForInspection(rule);
// 保存抽检样本
break;
case "product":
// 商品抽检逻辑
break;
// 其他类型...
}
inspectionTaskService.save(task);
}
}
}
```
三、关键功能实现
1. 抽检任务创建
```java
@Service
public class InspectionTaskService {
@Autowired
private InspectionTaskRepository taskRepository;
@Autowired
private InspectionSampleRepository sampleRepository;
public InspectionTask createTask(InspectionRule rule, int sampleSize) {
InspectionTask task = new InspectionTask();
task.setTaskName("抽检任务-" + System.currentTimeMillis());
task.setTaskType(rule.getRuleType());
task.setSampleSize(sampleSize);
task.setStatus("pending");
task.setCreateTime(LocalDateTime.now());
InspectionTask savedTask = taskRepository.save(task);
// 创建抽检样本
List samples = generateSamples(savedTask, rule);
sampleRepository.saveAll(samples);
return savedTask;
}
private List generateSamples(InspectionTask task, InspectionRule rule) {
List samples = new ArrayList<>();
// 根据规则类型获取候选列表
List<?> candidates = getCandidates(rule);
// 随机选择样本
Collections.shuffle(candidates);
int actualSize = Math.min(task.getSampleSize(), candidates.size());
for (int i = 0; i < actualSize; i++) {
Object candidate = candidates.get(i);
InspectionSample sample = new InspectionSample();
sample.setTaskId(task.getId());
sample.setSampleId(getCandidateId(candidate));
sample.setSampleName(getCandidateName(candidate));
sample.setSampleType(rule.getRuleType());
samples.add(sample);
}
return samples;
}
}
```
2. 抽检结果处理
```java
@RestController
@RequestMapping("/api/inspections")
public class InspectionController {
@Autowired
private InspectionResultService resultService;
@PostMapping("/{sampleId}/results")
public ResponseEntity<?> submitInspectionResult(
@PathVariable Long sampleId,
@RequestBody InspectionResultDto resultDto) {
InspectionResult result = new InspectionResult();
// 映射DTO到实体
BeanUtils.copyProperties(resultDto, result);
result.setSampleId(sampleId);
result.setInspectionTime(LocalDateTime.now());
InspectionResult savedResult = resultService.save(result);
// 如果不合格,触发预警
if ("failed".equals(result.getResult())) {
triggerAlert(savedResult);
}
return ResponseEntity.ok(savedResult);
}
private void triggerAlert(InspectionResult result) {
// 实现预警逻辑,如发送通知、创建工单等
}
}
```
四、前端界面设计
1. 抽检任务列表页
- 显示所有抽检任务及其状态
- 提供筛选和搜索功能
- 任务详情查看入口
2. 抽检结果录入页
- 显示抽检样本信息
- 提供通过/不通过选择
- 不合格原因输入框
- 图片上传功能(如有需要)
3. 统计分析页
- 抽检合格率趋势图
- 不合格原因分布图
- 按商品/供应商分类的抽检结果
五、扩展功能建议
1. 智能抽检算法:基于历史数据和风险评估,动态调整抽检比例
2. 移动端支持:开发移动应用方便现场抽检人员操作
3. 区块链存证:将抽检结果上链,确保不可篡改
4. AI辅助检测:集成图像识别等技术辅助质量判断
5. 供应商协同:允许供应商查看自身产品的抽检结果
六、实施路线图
1. 第一阶段(1个月):完成核心数据库设计和基础抽检流程
2. 第二阶段(1个月):实现定时抽检任务和结果录入
3. 第三阶段(1个月):开发统计分析和预警功能
4. 第四阶段(持续):优化算法和增加移动端支持
七、注意事项
1. 确保抽检过程的随机性和公正性
2. 考虑系统性能,特别是大数据量时的抽样效率
3. 实现完善的权限管理,确保抽检数据安全
4. 考虑与现有系统的集成,如订单系统、商品管理系统等
通过以上方案,小象买菜系统可以实现高效、公正的随机抽检管理,有效提升产品质量控制水平。