4.3
package com.example.baoli.service;
import com.example.baoli.entity.ProcurementRecord;
import com.example.baoli.entity.SparePart;
import com.example.baoli.repository.ProcurementRecordRepository;
import com.example.baoli.repository.SparePartRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
@Service
public class ProcurementService {
@Autowired
private ProcurementRecordRepository procurementRecordRepository;
@Autowired
private SparePartRepository sparePartRepository;
public List<ProcurementRecord> getAllProcurementRecords() {
return procurementRecordRepository.findAll();
}
public Optional<ProcurementRecord> getProcurementRecordById(Long id) {
return procurementRecordRepository.findById(id);
}
/**
* 创建采购记录,自动查询当前库存量
*/
public ProcurementRecord saveProcurementRecord(ProcurementRecord procurementRecord) {
if (procurementRecord.getStatus() == null) {
procurementRecord.setStatus("待上会");
}
// 自动查询当前库存量
if (procurementRecord.getPartName() != null && procurementRecord.getPartModel() != null) {
Integer currentStock = getCurrentStock(procurementRecord.getPartName(), procurementRecord.getPartModel());
procurementRecord.setCurrentStock(currentStock);
}
return procurementRecordRepository.save(procurementRecord);
}
public void deleteProcurementRecordById(Long id) {
procurementRecordRepository.deleteById(id);
}
public List<ProcurementRecord> getProcurementRecordsByStatus(String status) {
return procurementRecordRepository.findByStatus(status);
}
/**
* 更新采购状态,支持状态流转
*/
public ProcurementRecord updateProcurementStatus(Long id, String status) {
Optional<ProcurementRecord> optionalRecord = procurementRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
ProcurementRecord record = optionalRecord.get();
// 验证状态流转的合法性
if (isValidStatusTransition(record.getStatus(), status)) {
record.setStatus(status);
record.setUpdatedAt(LocalDateTime.now());
return procurementRecordRepository.save(record);
} else {
throw new IllegalArgumentException("无效的状态流转: " + record.getStatus() + " -> " + status);
}
}
return null;
}
/**
* 验证状态流转的合法性
* 状态流程:待上会→待招标→采购中→待发货→待收货→已完成
*/
private boolean isValidStatusTransition(String currentStatus, String newStatus) {
if (currentStatus == null) return true;
switch (currentStatus) {
case "待上会":
return "待招标".equals(newStatus) || "已驳回".equals(newStatus);
case "待招标":
return "采购中".equals(newStatus) || "已驳回".equals(newStatus);
case "采购中":
return "待发货".equals(newStatus) || "已取消".equals(newStatus);
case "待发货":
return "待收货".equals(newStatus);
case "待收货":
return "已完成".equals(newStatus);
case "已完成":
return false; // 已完成状态不能再变更
default:
return true;
}
}
/**
* 获取当前库存量
*/
public Integer getCurrentStock(String partName, String partModel) {
List<SparePart> spareParts = sparePartRepository.findByPartNameAndPartModel(partName, partModel);
return spareParts.stream()
.mapToInt(SparePart::getQuantity)
.sum();
}
/**
* 根据备件名称搜索采购记录
*/
public List<ProcurementRecord> searchProcurementRecords(String keyword) {
return procurementRecordRepository.findByPartNameContaining(keyword);
}
/**
* 根据申请人查询采购记录
*/
public List<ProcurementRecord> getProcurementRecordsByApplicant(String applicant) {
return procurementRecordRepository.findByApplicant(applicant);
}
/**
* 根据工区查询采购记录
*/
public List<ProcurementRecord> getProcurementRecordsByWorkArea(String workArea) {
return procurementRecordRepository.findByWorkArea(workArea);
}
/**
* 获取采购状态统计
*/
public java.util.Map<String, Long> getProcurementStatusStatistics() {
List<ProcurementRecord> allRecords = procurementRecordRepository.findAll();
return allRecords.stream()
.collect(java.util.stream.Collectors.groupingBy(
ProcurementRecord::getStatus,
java.util.stream.Collectors.counting()
));
}
/**
* 批量更新采购状态
*/
public List<ProcurementRecord> batchUpdateStatus(List<Long> ids, String status) {
List<ProcurementRecord> records = procurementRecordRepository.findAllById(ids);
for (ProcurementRecord record : records) {
if (isValidStatusTransition(record.getStatus(), status)) {
record.setStatus(status);
record.setUpdatedAt(LocalDateTime.now());
}
}
return procurementRecordRepository.saveAll(records);
}
}