package com.ruoyi.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.entity.Supply; import com.ruoyi.basic.mapper.CoalInfoMapper; import com.ruoyi.business.dto.EquipmentManagementDto; import com.ruoyi.business.dto.EquipmentUsageRecordDto; import com.ruoyi.business.entity.EquipmentManagement; import com.ruoyi.business.entity.EquipmentUsageRecord; import com.ruoyi.business.mapper.EquipmentManagementMapper; import com.ruoyi.business.mapper.EquipmentUsageRecordMapper; import com.ruoyi.business.service.EquipmentUsageRecordService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.system.mapper.SysUserMapper; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; /** *

* 设备使用记录表 服务实现类 *

* * @author ld * @since 2025-07-07 */ @Service @RequiredArgsConstructor public class EquipmentUsageRecordServiceImpl extends ServiceImpl implements EquipmentUsageRecordService { private final EquipmentUsageRecordMapper equipmentUsageRecordMapper; private final EquipmentManagementMapper equipmentManagementMapper; private final SysUserMapper sysUserMapper; @Override public IPage selectUsageRecordList(Page page, EquipmentUsageRecordDto equipmentUsageRecordDto) { Page entityPage = equipmentUsageRecordMapper.selectPage(page, null); IPage dtoPage = new Page<>(); BeanUtils.copyProperties(entityPage, dtoPage); List eqIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getEquipmentId).toList(); List userIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getUserId).toList(); //批量查询设备 Map equipmentManagementMap; if (!eqIds.isEmpty()) { List infos = equipmentManagementMapper.selectList(new LambdaQueryWrapper().in(EquipmentManagement::getId, eqIds)); equipmentManagementMap = infos.stream().collect(Collectors.toMap(EquipmentManagement::getId, Function.identity())); } else { equipmentManagementMap = new HashMap<>(); } //人员查询 Map userMap; if (!userIds.isEmpty()) { List sysUsers = sysUserMapper.selectList(userIds); userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); }else { userMap = new HashMap<>(); } //匹配数据 List dtoRecords = entityPage.getRecords().stream().map(entity -> { EquipmentUsageRecordDto dto = new EquipmentUsageRecordDto(); BeanUtils.copyProperties(entity, dto); EquipmentManagement equipment = equipmentManagementMap.get(entity.getEquipmentId()); if (equipment != null) { dto.setEquipmentNo(equipment.getEquipmentNo()); dto.setEquipmentName(equipment.getEquipmentName()); } SysUser sysUser = userMap.get(entity.getUserId()); if (sysUser != null) { dto.setUserName(sysUser.getNickName()); } return dto; }).toList(); dtoPage.setRecords(dtoRecords); return dtoPage; } @Override @Transactional(rollbackFor = Exception.class) public int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto) { EquipmentUsageRecord equipmentUsageRecord = new EquipmentUsageRecord(); BeanUtils.copyProperties(equipmentUsageRecordDto, equipmentUsageRecord); // 获取设备ID和领用数量 Long equipmentId = equipmentUsageRecordDto.getEquipmentId(); Integer newUsageQuantity = equipmentUsageRecordDto.getUsageQuantity(); // 查询设备信息(带乐观锁版本号) EquipmentManagement equipment = equipmentManagementMapper.selectById(equipmentId); if (equipment == null) { throw new RuntimeException("设备不存在"); } if (Objects.isNull(equipmentUsageRecordDto.getId())) { // 检查库存是否充足 if (equipment.getQuantity() < newUsageQuantity) { throw new RuntimeException("库存不足,当前库存:" + equipment.getQuantity()); } // 扣减库存 equipment.setQuantity(equipment.getQuantity() - newUsageQuantity); equipmentManagementMapper.updateById(equipment); // 创建领用记录 return equipmentUsageRecordMapper.insert(equipmentUsageRecord); } else { // 1. 查询原领用记录 EquipmentUsageRecord originalRecord = equipmentUsageRecordMapper.selectById(equipmentUsageRecordDto.getId()); if (originalRecord == null) { throw new RuntimeException("领用记录不存在"); } // 2. 计算库存变化量(新数量 - 旧数量) int quantityDelta = newUsageQuantity - originalRecord.getUsageQuantity(); if (quantityDelta != 0) { // 3. 检查调整后库存是否充足(考虑增加和减少两种情况) int newInventory = equipment.getQuantity() - quantityDelta; if (newInventory < 0) { throw new RuntimeException("库存不足,调整后库存将为:" + newInventory); } // 4. 调整库存 equipment.setQuantity(newInventory); if (equipmentManagementMapper.updateById(equipment) == 0) { throw new RuntimeException("库存更新失败,可能已被其他操作修改"); } } // 5. 更新领用记录 return equipmentUsageRecordMapper.updateById(equipmentUsageRecord); } } }