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);
}
}

 

posted @ 2025-04-06 23:34  混沌武士丞  阅读(11)  评论(0)    收藏  举报