package com.ruoyi.require.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.require.mapper.FeStandardSubstanceMapper; import com.ruoyi.require.mapper.FeStandardSubstanceRecordMapper; import com.ruoyi.require.pojo.FeStandardSubstance; import com.ruoyi.require.pojo.FeStandardSubstanceRecord; import com.ruoyi.require.service.FeStandardSubstanceRecordService; import com.ruoyi.require.vo.SubstanceRecordVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.Resource; import java.util.List; /** *

* 标准物质清单借用归还记录表 服务实现类 *

* * @author * @since 2024-11-14 01:49:11 */ @Transactional(rollbackFor = Exception.class) @Service public class FeStandardSubstanceRecordServiceImpl extends ServiceImpl implements FeStandardSubstanceRecordService { @Resource private FeStandardSubstanceMapper feStandardSubstanceMapper; @Override public void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) { Long borrowQuantity = feStandardSubstanceRecord.getBorrowQuantity(); if (borrowQuantity == null || borrowQuantity <= 0) { throw new ErrorException("请填写正确的领用数量!"); } FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(feStandardSubstanceRecord.getSubstanceId()); if (ObjectUtils.isEmpty(standardSubstance)){ throw new ErrorException("该标准物质不存在!"); } long remaining = calcRemaining(standardSubstance); if (remaining <= 0) { throw new ErrorException("该标准物质已全部领用,剩余数量为0!"); } if (borrowQuantity > remaining) { throw new ErrorException("领用数量不能超过剩余数量(当前剩余" + remaining + ")!"); } long remainingAfter = remaining - borrowQuantity; feStandardSubstanceRecord.setRemainingQuantity(remainingAfter); // 记录领用当时的原始数量快照,之后清单里再改数量不影响历史领用记录 feStandardSubstanceRecord.setOriginalQuantity(standardSubstance.getQuantity()); this.baseMapper.insert(feStandardSubstanceRecord); standardSubstance.setState(remainingAfter == 0 ? 1 : 0); feStandardSubstanceMapper.updateById(standardSubstance); } @Override public Long getRemainingQuantity(Integer substanceId) { FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(substanceId); if (ObjectUtils.isEmpty(standardSubstance)) { return 0L; } return Math.max(calcRemaining(standardSubstance), 0L); } private long calcRemaining(FeStandardSubstance substance) { long total = substance.getQuantity() == null ? 0L : substance.getQuantity(); long borrowed = 0L; List records = this.baseMapper.selectList(Wrappers.lambdaQuery() .eq(FeStandardSubstanceRecord::getSubstanceId, substance.getId())); for (FeStandardSubstanceRecord record : records) { if ("1".equals(record.getStatus())) { // 历史归还记录不计入已领用 continue; } borrowed += record.getBorrowQuantity() == null ? total : record.getBorrowQuantity(); } return total - borrowed; } @Override public List getSubstanceRecord(Integer id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("substance_id",id); List list = this.baseMapper.selectList(queryWrapper); return list; } @Override public IPage getPage(Page page, SubstanceRecordVo vo) { return this.baseMapper.getPage(page,vo); } }