4.12
package com.example.baoli.service;
import com.example.baoli.entity.ApprovalRecord;
import com.example.baoli.entity.SparePart;
import com.example.baoli.entity.OutboundRecord;
import com.example.baoli.repository.ApprovalRecordRepository;
import com.example.baoli.repository.SparePartRepository;
import com.example.baoli.repository.OutboundRecordRepository;
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 ApprovalService {
@Autowired
private ApprovalRecordRepository approvalRecordRepository;
@Autowired
private SparePartRepository sparePartRepository;
@Autowired
private OutboundRecordRepository outboundRecordRepository;
public List<ApprovalRecord> getAllApprovalRecords() {
return approvalRecordRepository.findAll();
}
public Optional<ApprovalRecord> getApprovalRecordById(Long id) {
return approvalRecordRepository.findById(id);
}
/**
* 创建领用申请记录
*/
public ApprovalRecord saveApprovalRecord(ApprovalRecord approvalRecord) {
// 生成申请单号
if (approvalRecord.getApplicationId() == null) {
approvalRecord.setApplicationId(generateApplicationId());
}
// 设置默认状态
if (approvalRecord.getStatus() == null) {
approvalRecord.setStatus("待审核");
}
// 设置申请时间
if (approvalRecord.getApplicationDate() == null) {
approvalRecord.setApplicationDate(LocalDateTime.now());
}
// 如果是维修借用,设置预计归还时间(48小时后)
if ("维修借用".equals(approvalRecord.getApplicationType()) && approvalRecord.getExpectedReturnDate() == null) {
approvalRecord.setExpectedReturnDate(LocalDateTime.now().plusHours(48));
}
return approvalRecordRepository.save(approvalRecord);
}
/**
* 生成申请单号
*/
private String generateApplicationId() {
String timestamp = String.valueOf(System.currentTimeMillis());
String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 6);
return "APP" + timestamp.substring(timestamp.length() - 8) + uuid.toUpperCase();
}
/**
* 获取统计信息
*/
public List<Object[]> getStatistics() {
return approvalRecordRepository.getStatusStatistics();
}
/**
* 搜索审批记录
*/
public List<ApprovalRecord> searchApprovalRecords(String applicant, String sparePartName, String status, String applicationType, String urgencyLevel) {
return approvalRecordRepository.searchApprovalRecords(applicant, sparePartName, status, applicationType, urgencyLevel);
}
/**
* 获取不重复的操作人列表(从申请人中提取)
*/
public List<String> getDistinctOperators() {
return approvalRecordRepository.findDistinctApplicants();
}
/**
* 获取不重复的申请人列表
*/
public List<String> getDistinctApplicants() {
return approvalRecordRepository.findDistinctApplicants();
}
/**
* 获取不重复的审核人列表
*/
public List<String> getDistinctApprovers() {
return approvalRecordRepository.findDistinctApprovers();
}
/**
* 获取不重复的部门列表
*/
public List<String> getDistinctDepartments() {
return approvalRecordRepository.findDistinctDepartments();
}
/**
* 审核通过申请
*/
@Transactional
public ApprovalRecord approveApplication(Long id, String approver, String comments) {
Optional<ApprovalRecord> optionalRecord = approvalRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
ApprovalRecord record = optionalRecord.get();
// 检查库存是否充足
if (!checkStockAvailability(record.getSparePartName(), record.getSparePartModel(), record.getQuantity())) {
throw new RuntimeException("库存不足,无法审核通过");
}
record.setStatus("已通过");
record.setApprover(approver);
record.setApprovalDate(LocalDateTime.now());
record.setApprovalComments(comments);
// 创建出库记录
createOutboundRecord(record);
// 更新库存
updateStock(record.getSparePartName(), record.getSparePartModel(), record.getQuantity());
return approvalRecordRepository.save(record);
}
return null;
}
/**
* 驳回申请
*/
public ApprovalRecord rejectApplication(Long id, String approver, String comments) {
Optional<ApprovalRecord> optionalRecord = approvalRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
ApprovalRecord record = optionalRecord.get();
record.setStatus("已驳回");
record.setApprover(approver);
record.setApprovalDate(LocalDateTime.now());
record.setApprovalComments(comments);
return approvalRecordRepository.save(record);
}
return null;
}
/**
* 检查库存可用性
*/
private boolean checkStockAvailability(String partName, String partModel, Integer requiredQuantity) {
Integer availableStock = sparePartRepository.getTotalAvailableStock(partName, partModel);
return availableStock != null && availableStock >= requiredQuantity;
}
/**
* 创建出库记录
*/
private void createOutboundRecord(ApprovalRecord approvalRecord) {
OutboundRecord outboundRecord = new OutboundRecord();
outboundRecord.setApplicationId(approvalRecord.getApplicationId());
outboundRecord.setApplicant(approvalRecord.getApplicant());
outboundRecord.setDepartment(approvalRecord.getDepartment());
outboundRecord.setSparePartName(approvalRecord.getSparePartName());
outboundRecord.setSparePartModel(approvalRecord.getSparePartModel());
outboundRecord.setQuantity(approvalRecord.getQuantity());
outboundRecord.setOutboundType(approvalRecord.getApplicationType());
outboundRecord.setStatus("已出库");
outboundRecord.setOutboundDate(LocalDateTime.now());
outboundRecord.setExpectedReturnDate(approvalRecord.getExpectedReturnDate());
outboundRecordRepository.save(outboundRecord);
}
/**
* 更新库存
*/
private void updateStock(String partName, String partModel, Integer quantity) {
List<SparePart> spareParts = sparePartRepository.findByPartNameAndPartModel(partName, partModel);
for (SparePart part : spareParts) {
if (part.getQuantity() >= quantity) {
part.setQuantity(part.getQuantity() - quantity);
sparePartRepository.save(part);
break;
}
}
}
/**
* 检查超时的维修借用记录
*/
public List<ApprovalRecord> checkOverdueRecords() {
LocalDateTime now = LocalDateTime.now();
return approvalRecordRepository.findOverdueRecords(now);
}
/**
* 发送超时提醒
*/
public void sendTimeoutReminder(Long id) {
Optional<ApprovalRecord> optionalRecord = approvalRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
ApprovalRecord record = optionalRecord.get();
if (!record.getTimeoutReminderSent()) {
// 这里可以集成短信、邮件等通知服务
// 暂时只更新提醒状态
record.setTimeoutReminderSent(true);
record.setStatus("已超时");
approvalRecordRepository.save(record);
// TODO: 实际的消息弹窗、短信通知、待办任务逻辑
System.out.println("发送超时提醒给: " + record.getApplicant() + ", 申请单号: " + record.getApplicationId());
}
}
}
/**
* 维修借用转为维修申领
*/
@Transactional
public ApprovalRecord convertBorrowToApplication(Long id, String reason) {
Optional<ApprovalRecord> optionalRecord = approvalRecordRepository.findById(id);
if (optionalRecord.isPresent()) {
ApprovalRecord record = optionalRecord.get();
if ("维修借用".equals(record.getApplicationType()) && "已通过".equals(record.getStatus())) {
record.setApplicationType("维修申领");
record.setApplicationReason(record.getApplicationReason() + " [已使用,转为申领: " + reason + "]");
return approvalRecordRepository.save(record);
}
}
return null;
}
public void deleteApprovalRecordById(Long id) {
approvalRecordRepository.deleteById(id);
}
public List<ApprovalRecord> getApprovalRecordsByStatus(String status) {
return approvalRecordRepository.findByStatus(status);
}
public List<ApprovalRecord> getApprovalRecordsByApplicant(String applicant) {
return approvalRecordRepository.findByApplicant(applicant);
}
public List<ApprovalRecord> getApprovalRecordsByApplicationType(String applicationType) {
return approvalRecordRepository.findByApplicationType(applicationType);
}
public List<ApprovalRecord> searchApprovalRecords(String keyword) {
return approvalRecordRepository.searchByKeyword(keyword);
}
/**
* 批量审核
*/
@Transactional
public List<ApprovalRecord> batchApprove(List<Long> ids, String approver, String comments) {
List<ApprovalRecord> records = approvalRecordRepository.findAllById(ids);
for (ApprovalRecord record : records) {
if ("待审核".equals(record.getStatus())) {
try {
approveApplication(record.getId(), approver, comments);
} catch (Exception e) {
// 记录失败的审核,但不影响其他记录
System.err.println("批量审核失败,记录ID: " + record.getId() + ", 错误: " + e.getMessage());
}
}
}
return approvalRecordRepository.findAllById(ids);
}
/**
* 批量驳回
*/
public List<ApprovalRecord> batchReject(List<Long> ids, String approver, String comments) {
List<ApprovalRecord> records = approvalRecordRepository.findAllById(ids);
for (ApprovalRecord record : records) {
if ("待审核".equals(record.getStatus())) {
record.setStatus("已驳回");
record.setApprover(approver);
record.setApprovalDate(LocalDateTime.now());
record.setApprovalComments(comments);
}
}
return approvalRecordRepository.saveAll(records);
}
}
浙公网安备 33010602011771号