| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | if (!userIds.isEmpty()) { |
| | | List<SysUser> sysUsers = sysUserMapper.selectList(userIds); |
| | | userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); |
| | | }else { |
| | | } else { |
| | | userMap = new HashMap<>(); |
| | | } |
| | | //匹配数据 |
| | |
| | | } |
| | | return dto; |
| | | }).toList(); |
| | | |
| | | dtoPage.setRecords(dtoRecords); |
| | | return dtoPage; |
| | | } |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto) { |
| | | // 参数校验 |
| | | if (equipmentUsageRecordDto == null) { |
| | | throw new IllegalArgumentException("设备使用记录参数不能为空"); |
| | | } |
| | | |
| | | // 复制属性到实体对象 |
| | | EquipmentUsageRecord equipmentUsageRecord = new EquipmentUsageRecord(); |
| | | BeanUtils.copyProperties(equipmentUsageRecordDto, equipmentUsageRecord); |
| | | |
| | |
| | | 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) { |
| | |
| | | equipment.setQuantity(equipment.getQuantity() - newUsageQuantity); |
| | | equipmentManagementMapper.updateById(equipment); |
| | | |
| | | // 创建领用记录 |
| | | // 设置使用开始时间为当前时间 |
| | | equipmentUsageRecord.setUsageStartTime(LocalDate.now()); |
| | | 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 (equipmentUsageRecordDto.getEquipmentStatus() == 2) { |
| | | // 检查归还数量是否合法 |
| | | if (newUsageQuantity > originalRecord.getUsageQuantity()) { |
| | | throw new RuntimeException("归还数量不能超过原领用数量"); |
| | | } |
| | | |
| | | if (quantityDelta != 0) { |
| | | // 3. 检查调整后库存是否充足(考虑增加和减少两种情况) |
| | | int newInventory = equipment.getQuantity() - quantityDelta; |
| | | // 计算实际归还数量(原领用数量 - 新领用数量) |
| | | int returnedQuantity = originalRecord.getUsageQuantity() - newUsageQuantity; |
| | | |
| | | // 恢复部分库存 |
| | | equipment.setQuantity(equipment.getQuantity() + returnedQuantity); |
| | | equipmentManagementMapper.updateById(equipment); |
| | | |
| | | // 如果全部归还,设置归还时间 |
| | | if (newUsageQuantity == 0) { |
| | | equipmentUsageRecord.setUsageEndTime(LocalDate.now()); |
| | | } |
| | | return equipmentUsageRecordMapper.updateById(equipmentUsageRecord); |
| | | } |
| | | |
| | | // 处理普通编辑逻辑(非归还状态) |
| | | if (!newUsageQuantity.equals(originalRecord.getUsageQuantity())) { |
| | | // 计算库存变化量(旧数量 - 新数量) |
| | | int quantityDelta = originalRecord.getUsageQuantity() - newUsageQuantity; |
| | | |
| | | // 检查调整后库存是否充足 |
| | | 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); |
| | | } |
| | | } |