4.8
package com.example.baoli.service;
import com.example.baoli.entity.InboundRecord;
import com.example.baoli.entity.SparePart;
import com.example.baoli.repository.InboundRecordRepository;
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.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Service
public class InboundService {
@Autowired
private InboundRecordRepository inboundRecordRepository;
@Autowired
private SparePartRepository sparePartRepository;
public List<InboundRecord> getAllInboundRecords() {
return inboundRecordRepository.findAll();
}
public Optional<InboundRecord> getInboundRecordById(Long id) {
return inboundRecordRepository.findById(id);
}
/**
* 创建入库记录,自动计算税额相关字段
*/
public InboundRecord saveInboundRecord(InboundRecord inboundRecord) {
// 设置默认状态
if (inboundRecord.getStatus() == null) {
inboundRecord.setStatus("待入库");
}
// 根据票据类型自动设置税率
if (inboundRecord.getInvoiceType() != null) {
BigDecimal taxRate = getDefaultTaxRate(inboundRecord.getInvoiceType());
inboundRecord.setTaxRate(taxRate);
}
// 自动计算税额相关字段
calculateTaxAmounts(inboundRecord);
// 批量生成SN号
if (inboundRecord.getQuantity() != null && inboundRecord.getQuantity() > 0) {
String snNumbers = generateSnNumbers(inboundRecord.getQuantity());
inboundRecord.setSnNumber(snNumbers);
}
return inboundRecordRepository.save(inboundRecord);
}
/**
* 根据票据类型获取默认税率
*/
private BigDecimal getDefaultTaxRate(String invoiceType) {
switch (invoiceType) {
case "专票":
return new BigDecimal("0.13"); // 13%增值税
case "普票":
return new BigDecimal("0.03"); // 3%增值税
default:
return BigDecimal.ZERO;
}
}
/**
* 自动计算税额相关字段
*/
private void calculateTaxAmounts(InboundRecord record) {
if (record.getUnitPrice() != null && record.getTaxRate() != null && record.getQuantity() != null) {
BigDecimal unitPrice = record.getUnitPrice();
BigDecimal taxRate = record.getTaxRate();
Integer quantity = record.getQuantity();
// 计算不含税单价 = 含税单价 / (1 + 税率)
BigDecimal priceExcludingTax = unitPrice.divide(BigDecimal.ONE.add(taxRate), 2, RoundingMode.HALF_UP);
record.setPriceExcludingTax(priceExcludingTax);
// 计算税额 = 含税单价 - 不含税单价
BigDecimal taxAmount = unitPrice.subtract(priceExcludingTax);
record.setTaxAmount(taxAmount);
// 计算不含税总额 = 不含税单价 * 数量
BigDecimal totalExcludingTax = priceExcludingTax.multiply(new BigDecimal(quantity));
record.setTotalExcludingTax(totalExcludingTax);
// 计算总税额 = 税额 * 数量
BigDecimal totalTaxAmount = taxAmount.multiply(new BigDecimal(quantity));
record.setTotalTaxAmount(totalTaxAmount);
// 计算总金额 = 含税单价 * 数量
BigDecimal totalAmount = unitPrice.multiply(new BigDecimal(quantity));
record.setTotalAmount(totalAmount);
}
}
/**
* 批量生成SN号
*/
private String generateSnNumbers(Integer quantity) {
StringBuilder snNumbers = new StringBuilder();
for (int i = 0; i < quantity; i++) {
if (i > 0) {
snNumbers.append(",");
}
snNumbers.append(generateUniqueSnNumber());
}
return snNumbers.toString();
}
/**
* 生成唯一SN号
*/
private String generateUniqueSnNumber() {
String timestamp = String.valueOf(System.currentTimeMillis());
String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 8);
return "SN" + timestamp.substring(timestamp.length() - 8) + uuid.toUpperCase();
}
/**
* 审核入库记录
*/
@Transactional
public InboundRecord approveInboundRecord(Long id, String approver) {
Optional<InboundRecord> optionalRecord = inboundRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
InboundRecord record = optionalRecord.get();
record.setStatus("已入库");
record.setInboundDate(LocalDateTime.now());
record.setInboundPerson(approver);
// 更新库存
updateInventory(record);
return inboundRecordRepository.save(record);
}
return null;
}
/**
* 驳回入库记录
*/
public InboundRecord rejectInboundRecord(Long id, String reason) {
Optional<InboundRecord> optionalRecord = inboundRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
InboundRecord record = optionalRecord.get();
record.setStatus("已驳回");
record.setRemarks(reason);
return inboundRecordRepository.save(record);
}
return null;
}
/**
* 更新库存
*/
private void updateInventory(InboundRecord record) {
// 查找是否已存在相同的备件
List<SparePart> existingParts = sparePartRepository.findByPartNameAndPartModel(
record.getSparePartName(), record.getSparePartModel());
if (!existingParts.isEmpty()) {
// 更新现有备件数量
SparePart existingPart = existingParts.get(0);
existingPart.setQuantity(existingPart.getQuantity() + record.getQuantity());
sparePartRepository.save(existingPart);
} else {
// 创建新的备件记录
SparePart newPart = new SparePart();
newPart.setPartName(record.getSparePartName());
newPart.setPartModel(record.getSparePartModel());
newPart.setPartCategory(record.getSparePartCategory());
newPart.setPartStatus(record.getSparePartStatus());
newPart.setPartType(record.getSparePartType());
newPart.setUnitPrice(record.getUnitPrice().doubleValue());
newPart.setQuantity(record.getQuantity());
newPart.setSnNumber(record.getSnNumber());
newPart.setLocation(record.getStorageLocation());
newPart.setManufacturer(record.getSupplier());
sparePartRepository.save(newPart);
}
}
public void deleteInboundRecordById(Long id) {
inboundRecordRepository.deleteById(id);
}
public List<InboundRecord> getInboundRecordsByStatus(String status) {
return inboundRecordRepository.findByStatus(status);
}
public List<InboundRecord> searchInboundRecords(String keyword) {
return inboundRecordRepository.searchByKeyword(keyword);
}
/**
* 批量审核入库记录
*/
@Transactional
public List<InboundRecord> batchApproveInboundRecords(List<Long> ids, String approver) {
List<InboundRecord> records = inboundRecordRepository.findAllById(ids);
for (InboundRecord record : records) {
if ("待入库".equals(record.getStatus())) {
record.setStatus("已入库");
record.setInboundDate(LocalDateTime.now());
record.setInboundPerson(approver);
updateInventory(record);
}
}
return inboundRecordRepository.saveAll(records);
}
/**
* 批量驳回入库记录
*/
public List<InboundRecord> batchRejectInboundRecords(List<Long> ids, String reason) {
List<InboundRecord> records = inboundRecordRepository.findAllById(ids);
for (InboundRecord record : records) {
if ("待入库".equals(record.getStatus())) {
record.setStatus("已驳回");
record.setRemarks(reason);
}
}
return inboundRecordRepository.saveAll(records);
}
}
浙公网安备 33010602011771号