4.6
package com.example.baoli.service;
import com.example.baoli.entity.OutboundRecord;
import com.example.baoli.entity.SparePart;
import com.example.baoli.repository.OutboundRecordRepository;
import com.example.baoli.repository.SparePartRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Service
public class OutboundService {
    
    @Autowired
    private OutboundRecordRepository outboundRecordRepository;
    
    @Autowired
    private SparePartRepository sparePartRepository;
    
    public List<OutboundRecord> getAllOutboundRecords() {
        return outboundRecordRepository.findAll();
    }
    
    public Optional<OutboundRecord> getOutboundRecordById(Long id) {
        return outboundRecordRepository.findById(id);
    }
    
    /**
     * 创建出库记录
     */
    public OutboundRecord saveOutboundRecord(OutboundRecord outboundRecord) {
        // 生成出库单号
        if (outboundRecord.getOutboundId() == null) {
            outboundRecord.setOutboundId(generateOutboundId());
        }
        
        // 设置默认状态
        if (outboundRecord.getStatus() == null) {
            outboundRecord.setStatus("已出库");
        }
        
        // 设置出库时间
        if (outboundRecord.getOutboundDate() == null) {
            outboundRecord.setOutboundDate(LocalDateTime.now());
        }
        
        return outboundRecordRepository.save(outboundRecord);
    }
    
    /**
     * 生成出库单号
     */
    private String generateOutboundId() {
        String timestamp = String.valueOf(System.currentTimeMillis());
        String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 6);
        return "OUT" + timestamp.substring(timestamp.length() - 8) + uuid.toUpperCase();
    }
    
    /**
     * 普通出库(无需返还)
     */
    @Transactional
    public OutboundRecord processNormalOutbound(OutboundRecord outboundRecord) {
        // 检查库存
        if (!checkStockAvailability(outboundRecord.getSparePartName(), outboundRecord.getSparePartModel(), outboundRecord.getQuantity())) {
            throw new RuntimeException("库存不足,无法出库");
        }
        
        outboundRecord.setOutboundType("普通出库");
        outboundRecord.setStatus("已出库");
        
        // 更新库存
        updateStock(outboundRecord.getSparePartName(), outboundRecord.getSparePartModel(), outboundRecord.getQuantity());
        
        return saveOutboundRecord(outboundRecord);
    }
    
    /**
     * 检查库存可用性
     */
    private boolean checkStockAvailability(String partName, String partModel, Integer requiredQuantity) {
        Integer availableStock = sparePartRepository.getTotalAvailableStock(partName, partModel);
        return availableStock != null && availableStock >= requiredQuantity;
    }
    
    /**
     * 更新库存
     */
    private void updateStock(String partName, String partModel, Integer quantity) {
        List<SparePart> spareParts = sparePartRepository.findByPartNameAndPartModel(partName, partModel);
        int remainingQuantity = quantity;
        
        for (SparePart part : spareParts) {
            if (remainingQuantity <= 0) break;
            
            if (part.getQuantity() >= remainingQuantity) {
                part.setQuantity(part.getQuantity() - remainingQuantity);
                remainingQuantity = 0;
            } else {
                remainingQuantity -= part.getQuantity();
                part.setQuantity(0);
            }
            sparePartRepository.save(part);
        }
    }
    
    /**
     * 批量审核出库
     */
    @Transactional
    public List<OutboundRecord> batchApproveOutbound(List<Long> ids, String approver) {
        List<OutboundRecord> records = outboundRecordRepository.findAllById(ids);
        for (OutboundRecord record : records) {
            if ("待出库".equals(record.getStatus())) {
                try {
                    // 检查库存并更新
                    if (checkStockAvailability(record.getSparePartName(), record.getSparePartModel(), record.getQuantity())) {
                        updateStock(record.getSparePartName(), record.getSparePartModel(), record.getQuantity());
                        record.setStatus("已出库");
                        record.setOutboundPerson(approver);
                        record.setOutboundDate(LocalDateTime.now());
                    }
                } catch (Exception e) {
                    System.err.println("批量出库失败,记录ID: " + record.getId() + ", 错误: " + e.getMessage());
                }
            }
        }
        return outboundRecordRepository.saveAll(records);
    }
    
    /**
     * 归还借用的备件
     */
    @Transactional
    public OutboundRecord returnBorrowedPart(Long id, String returnPerson) {
        Optional<OutboundRecord> optionalRecord = outboundRecordRepository.findById(id);
        if (optionalRecord.isPresent()) {
            OutboundRecord record = optionalRecord.get();
            if ("维修借用".equals(record.getOutboundType()) && "已出库".equals(record.getStatus())) {
                record.setStatus("已归还");
                record.setActualReturnDate(LocalDateTime.now());
                record.setRemarks(record.getRemarks() + " [归还人: " + returnPerson + "]");
                
                // 恢复库存
                restoreStock(record.getSparePartName(), record.getSparePartModel(), record.getQuantity());
                
                return outboundRecordRepository.save(record);
            }
        }
        return null;
    }
    
    /**
     * 恢复库存
     */
    private void restoreStock(String partName, String partModel, Integer quantity) {
        List<SparePart> spareParts = sparePartRepository.findByPartNameAndPartModel(partName, partModel);
        if (!spareParts.isEmpty()) {
            SparePart part = spareParts.get(0);
            part.setQuantity(part.getQuantity() + quantity);
            sparePartRepository.save(part);
        }
    }
    
    /**
     * 获取超时的借用记录
     */
    public List<OutboundRecord> getOverdueBorrowRecords() {
        return outboundRecordRepository.findOverdueBorrowRecords(LocalDateTime.now());
    }
    
    public void deleteOutboundRecordById(Long id) {
        outboundRecordRepository.deleteById(id);
    }
    
    public List<OutboundRecord> getOutboundRecordsByStatus(String status) {
        return outboundRecordRepository.findByStatus(status);
    }
    
    public List<OutboundRecord> getOutboundRecordsByApplicant(String applicant) {
        return outboundRecordRepository.findByApplicant(applicant);
    }
    
    public List<OutboundRecord> getOutboundRecordsByType(String outboundType) {
        return outboundRecordRepository.findByOutboundType(outboundType);
    }
    
    public List<OutboundRecord> searchOutboundRecords(String keyword) {
        return outboundRecordRepository.searchByKeyword(keyword);
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号