liding
2 天以前 2656ae9bce8544d81da66c07aaede5386d6fbebb
main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java
@@ -3,21 +3,20 @@
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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.dto.EquipmentUsageRecordDto;
import com.ruoyi.business.entity.EquipmentManagement;
import com.ruoyi.business.entity.EquipmentUsageDetail;
import com.ruoyi.business.entity.EquipmentUsageRecord;
import com.ruoyi.business.mapper.EquipmentManagementMapper;
import com.ruoyi.business.mapper.EquipmentUsageDetailMapper;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
@@ -43,6 +42,8 @@
    private final EquipmentUsageRecordMapper equipmentUsageRecordMapper;
    private final EquipmentManagementMapper equipmentManagementMapper;
    private final EquipmentUsageDetailMapper equipmentUsageDetailMapper;
    private final SysUserMapper sysUserMapper;
@@ -83,6 +84,15 @@
            if (sysUser != null) {
                dto.setUserName(sysUser.getNickName());
            }
            int totalReturnNo = equipmentUsageDetailMapper.selectList(
                            new LambdaQueryWrapper<EquipmentUsageDetail>()
                                    .eq(EquipmentUsageDetail::getUsageId, entity.getId())
                                    .eq(EquipmentUsageDetail::getOperationType,2))
                    .stream()
                    .mapToInt(EquipmentUsageDetail::getQuantity)
                    .sum();
            dto.setTotalReturnNo(totalReturnNo);
            return dto;
        }).toList();
        dtoPage.setRecords(dtoRecords);
@@ -97,13 +107,10 @@
            throw new IllegalArgumentException("设备使用记录参数不能为空");
        }
        // 复制属性到实体对象
        EquipmentUsageRecord equipmentUsageRecord = new EquipmentUsageRecord();
        BeanUtils.copyProperties(equipmentUsageRecordDto, equipmentUsageRecord);
        // 获取设备ID和领用数量
        // 获取设备ID和操作数量
        Long equipmentId = equipmentUsageRecordDto.getEquipmentId();
        Integer newUsageQuantity = equipmentUsageRecordDto.getUsageQuantity();
        Long userId = equipmentUsageRecordDto.getUserId();
        String username = sysUserMapper.selectUserById(userId).getNickName();
        // 查询设备信息
        EquipmentManagement equipment = equipmentManagementMapper.selectById(equipmentId);
@@ -111,20 +118,10 @@
            throw new RuntimeException("设备不存在");
        }
        int result;
        // 新增记录逻辑
        if (Objects.isNull(equipmentUsageRecordDto.getId())) {
            // 检查库存是否充足
            if (equipment.getQuantity() < newUsageQuantity) {
                throw new RuntimeException("库存不足,当前库存:" + equipment.getQuantity());
            }
            // 扣减库存
            equipment.setQuantity(equipment.getQuantity() - newUsageQuantity);
            equipmentManagementMapper.updateById(equipment);
            // 设置使用开始时间为当前时间
            equipmentUsageRecord.setUsageStartTime(LocalDate.now());
            return equipmentUsageRecordMapper.insert(equipmentUsageRecord);
            result = handleNewUsage(equipmentUsageRecordDto, equipment, userId, username);
        } else {
            // 编辑记录逻辑
            EquipmentUsageRecord originalRecord = equipmentUsageRecordMapper.selectById(equipmentUsageRecordDto.getId());
@@ -133,46 +130,127 @@
            }
            // 处理归还逻辑
            if (equipmentUsageRecordDto.getEquipmentStatus() == 2) {
                // 检查归还数量是否合法
                if (newUsageQuantity > originalRecord.getUsageQuantity()) {
                    throw new RuntimeException("归还数量不能超过原领用数量");
                }
                // 计算实际归还数量(原领用数量 - 新领用数量)
                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 (equipmentUsageRecordDto.getEquipmentStatus() != 1) {
                result = handleReturnOperation(equipmentUsageRecordDto, equipment, originalRecord, userId, username);
            } else {
                // 处理普通编辑逻辑(非归还状态)
                result = handleEditOperation(equipmentUsageRecordDto, equipment, originalRecord, userId, username);
            }
            // 处理普通编辑逻辑(非归还状态)
            if (!newUsageQuantity.equals(originalRecord.getUsageQuantity())) {
                // 计算库存变化量(旧数量 - 新数量)
                int quantityDelta = originalRecord.getUsageQuantity() - newUsageQuantity;
                // 检查调整后库存是否充足
                int newInventory = equipment.getQuantity() + quantityDelta;
                if (newInventory < 0) {
                    throw new RuntimeException("库存不足,调整后库存将为:" + newInventory);
                }
                // 调整库存
                equipment.setQuantity(newInventory);
                if (equipmentManagementMapper.updateById(equipment) == 0) {
                    throw new RuntimeException("库存更新失败,可能已被其他操作修改");
                }
            }
            // 更新领用记录
            return equipmentUsageRecordMapper.updateById(equipmentUsageRecord);
        }
        return result;
    }
    private int handleNewUsage(EquipmentUsageRecordDto dto, EquipmentManagement equipment, Long userId, String username) {
        // 检查库存
        if (equipment.getQuantity() < dto.getUsageQuantity()) {
            throw new RuntimeException("库存不足,当前库存:" + equipment.getQuantity());
        }
        // 创建主记录
        EquipmentUsageRecord record = new EquipmentUsageRecord();
        BeanUtils.copyProperties(dto, record);
        record.setUsageStartTime(LocalDate.now());
        record.setEquipmentStatus(1); // 使用中状态
        record.setReturnQuantity(0);
        // 扣减库存
        equipment.setQuantity(equipment.getQuantity() - dto.getUsageQuantity());
        equipmentManagementMapper.updateById(equipment);
        // 保存主记录
        int result = equipmentUsageRecordMapper.insert(record);
        // 保存领用明细记录
        if (result > 0) {
            saveUsageDetail(record.getId(), record.getEquipmentId(), 1, dto.getUsageQuantity(), userId, username, "设备领用");
        }
        return result;
    }
    private int handleReturnOperation(EquipmentUsageRecordDto dto, EquipmentManagement equipment,
                                      EquipmentUsageRecord originalRecord, Long userId, String username) {
        // 校验归还数量
        Integer returnQuantity = dto.getReturnQuantity();
        if (returnQuantity == null || returnQuantity <= 0) {
            throw new RuntimeException("归还数量必须大于0");
        }
        // 计算剩余未归还数量
        int remainingQuantity = originalRecord.getUsageQuantity() - originalRecord.getReturnQuantity();
        if (returnQuantity > remainingQuantity) {
            throw new RuntimeException("归还数量不能超过未归还数量,剩余未归还数量:" + remainingQuantity);
        }
        // 准备更新记录
        EquipmentUsageRecord updateRecord = new EquipmentUsageRecord();
        updateRecord.setId(originalRecord.getId());
        int newReturnQuantity = originalRecord.getReturnQuantity() + returnQuantity;
        updateRecord.setReturnQuantity(newReturnQuantity);
        // 判断是否全部归还
        boolean isFullReturn = newReturnQuantity == originalRecord.getUsageQuantity();
        int newStatus = isFullReturn ? 3 : 2; // 3表示全部归还,2表示部分归还
        updateRecord.setEquipmentStatus(newStatus);
        updateRecord.setUsageEndTime(LocalDate.now());
        // 恢复库存数量
        equipment.setQuantity(equipment.getQuantity() + returnQuantity);
        equipmentManagementMapper.updateById(equipment);
        // 更新主记录
        int result = equipmentUsageRecordMapper.updateById(updateRecord);
        // 保存归还明细记录
        if (result > 0) {
            String remark = isFullReturn ? "设备归还(全部归还)" : "设备归还(部分归还)";
            int operationType = isFullReturn ? 3 : 2; // 与主记录状态保持一致
            saveUsageDetail(originalRecord.getId(), originalRecord.getEquipmentId(),
                    operationType, returnQuantity, userId, username, remark);
        }
        return result;
    }
    private int handleEditOperation(EquipmentUsageRecordDto dto, EquipmentManagement equipment,
                                    EquipmentUsageRecord originalRecord, Long userId, String username) {
        // 检查领用数量是否有变化
        if (!dto.getUsageQuantity().equals(originalRecord.getUsageQuantity())) {
            // 计算库存变化量(旧数量 - 新数量)
            int quantityDelta = originalRecord.getUsageQuantity() - dto.getUsageQuantity();
            // 检查调整后库存是否充足
            int newInventory = equipment.getQuantity() + quantityDelta;
            if (newInventory < 0) {
                throw new RuntimeException("库存不足,调整后库存将为:" + newInventory);
            }
            // 调整库存
            equipment.setQuantity(newInventory);
            if (equipmentManagementMapper.updateById(equipment) == 0) {
                throw new RuntimeException("库存更新失败,可能已被其他操作修改");
            }
            // 记录数量变更明细
            saveUsageDetail(originalRecord.getId(), originalRecord.getEquipmentId(), 3, dto.getUsageQuantity(), userId, username,
                    "领用数量变更:" + originalRecord.getUsageQuantity() + "→" + dto.getUsageQuantity());
        }
        // 更新领用记录
        EquipmentUsageRecord updateRecord = new EquipmentUsageRecord();
        BeanUtils.copyProperties(dto, updateRecord);
        return equipmentUsageRecordMapper.updateById(updateRecord);
    }
    private void saveUsageDetail(Long usageId, Long equipmentId, Integer operationType, Integer quantity,
                                 Long operatorId, String operator, String remark) {
        EquipmentUsageDetail detail = new EquipmentUsageDetail();
        detail.setUsageId(usageId);
        detail.setEquipmentId(equipmentId);
        detail.setOperationType(operationType);
        detail.setQuantity(quantity);
        detail.setOperatorId(operatorId);
        detail.setOperator(operator);
        detail.setRemark(remark);
        equipmentUsageDetailMapper.insert(detail);
    }
}