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.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.transaction.annotation.Transactional;
|
|
import java.time.LocalDate;
|
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;
|
|
/**
|
* <p>
|
* 设备使用记录表 服务实现类
|
* </p>
|
*
|
* @author ld
|
* @since 2025-07-07
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class EquipmentUsageRecordServiceImpl extends ServiceImpl<EquipmentUsageRecordMapper, EquipmentUsageRecord> implements EquipmentUsageRecordService {
|
|
private final EquipmentUsageRecordMapper equipmentUsageRecordMapper;
|
|
private final EquipmentManagementMapper equipmentManagementMapper;
|
|
private final EquipmentUsageDetailMapper equipmentUsageDetailMapper;
|
|
private final SysUserMapper sysUserMapper;
|
|
@Override
|
public IPage<EquipmentUsageRecordDto> selectUsageRecordList(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto) {
|
Page<EquipmentUsageRecord> entityPage = equipmentUsageRecordMapper.selectPage(page, null);
|
IPage<EquipmentUsageRecordDto> dtoPage = new Page<>();
|
BeanUtils.copyProperties(entityPage, dtoPage);
|
|
List<Long> eqIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getEquipmentId).toList();
|
List<Long> userIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getUserId).toList();
|
//批量查询设备
|
Map<Long, EquipmentManagement> equipmentManagementMap;
|
if (!eqIds.isEmpty()) {
|
List<EquipmentManagement> infos = equipmentManagementMapper.selectList(new LambdaQueryWrapper<EquipmentManagement>().in(EquipmentManagement::getId, eqIds));
|
equipmentManagementMap = infos.stream().collect(Collectors.toMap(EquipmentManagement::getId, Function.identity()));
|
} else {
|
equipmentManagementMap = new HashMap<>();
|
}
|
//人员查询
|
Map<Long, SysUser> userMap;
|
if (!userIds.isEmpty()) {
|
List<SysUser> sysUsers = sysUserMapper.selectList(userIds);
|
userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
|
} else {
|
userMap = new HashMap<>();
|
}
|
//匹配数据
|
List<EquipmentUsageRecordDto> 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());
|
}
|
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);
|
return dtoPage;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto) {
|
// 参数校验
|
if (equipmentUsageRecordDto == null) {
|
throw new IllegalArgumentException("设备使用记录参数不能为空");
|
}
|
|
// 获取设备ID和操作数量
|
Long equipmentId = equipmentUsageRecordDto.getEquipmentId();
|
Long userId = equipmentUsageRecordDto.getUserId();
|
String username = sysUserMapper.selectUserById(userId).getNickName();
|
|
// 查询设备信息
|
EquipmentManagement equipment = equipmentManagementMapper.selectById(equipmentId);
|
if (equipment == null) {
|
throw new RuntimeException("设备不存在");
|
}
|
|
int result;
|
// 新增记录逻辑
|
if (Objects.isNull(equipmentUsageRecordDto.getId())) {
|
result = handleNewUsage(equipmentUsageRecordDto, equipment, userId, username);
|
} else {
|
// 编辑记录逻辑
|
EquipmentUsageRecord originalRecord = equipmentUsageRecordMapper.selectById(equipmentUsageRecordDto.getId());
|
if (originalRecord == null) {
|
throw new RuntimeException("领用记录不存在");
|
}
|
|
// 处理归还逻辑
|
if (equipmentUsageRecordDto.getEquipmentStatus() == 2) {
|
result = handleReturnOperation(equipmentUsageRecordDto, equipment, originalRecord, userId, username);
|
} else {
|
// 处理普通编辑逻辑(非归还状态)
|
result = handleEditOperation(equipmentUsageRecordDto, equipment, originalRecord, userId, username);
|
}
|
}
|
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());
|
updateRecord.setReturnQuantity(originalRecord.getReturnQuantity() + returnQuantity);
|
updateRecord.setEquipmentStatus(2); // 已归还状态
|
updateRecord.setUsageEndTime(LocalDate.now());
|
// 如果全部归还,更新状态和时间
|
// if (updateRecord.getReturnQuantity().equals(originalRecord.getUsageQuantity())) {
|
//
|
// }
|
|
// 恢复库存
|
equipment.setQuantity(equipment.getQuantity() + returnQuantity);
|
equipmentManagementMapper.updateById(equipment);
|
|
// 更新主记录
|
int result = equipmentUsageRecordMapper.updateById(updateRecord);
|
|
// 保存归还明细记录
|
if (result > 0) {
|
String remark = "设备归还" + (updateRecord.getEquipmentStatus() == 2 ? "(全部归还)" : "(部分归还)");
|
saveUsageDetail(originalRecord.getId(), originalRecord.getEquipmentId(), 2, 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);
|
}
|
}
|