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