liding
11 小时以前 c8fbeff3b07f96ffb4624dd64344ac00ec0c8ef8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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.business.dto.EquipmentManagementDto;
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.EquipmentManagementService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.vo.EquipmentManagementVo;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
 
import java.beans.Transient;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
 
/**
 * <p>
 * 设备管理表  服务实现类
 * </p>
 *
 * @author ld
 * @since 2025-07-01
 */
@Service
@RequiredArgsConstructor
public class EquipmentManagementServiceImpl extends ServiceImpl<EquipmentManagementMapper, EquipmentManagement> implements EquipmentManagementService {
 
    private final EquipmentManagementMapper equipmentManagementMapper;
 
    private final EquipmentUsageRecordMapper equipmentUsageRecordMapper;
 
    public IPage<EquipmentManagementDto> selectProductionList(Page<EquipmentManagement> page, EquipmentManagementDto equipmentManagementDto) {
        // 1. 构建查询条件(searchAll 模糊查询)
        LambdaQueryWrapper<EquipmentManagement> queryWrapper = new LambdaQueryWrapper<>();
 
        if (StringUtils.isNotBlank(equipmentManagementDto.getSearchAll())) {
            String searchValue = equipmentManagementDto.getSearchAll();
            queryWrapper.and(wrapper ->
                    wrapper.like(EquipmentManagement::getEquipmentNo, searchValue)
                            .or()
                            .like(EquipmentManagement::getEquipmentName, searchValue)
                            .or()
                            .like(EquipmentManagement::getSpecification, searchValue)
            );
        }
 
        // 2. 执行分页查询
        Page<EquipmentManagement> entityPage = equipmentManagementMapper.selectPage(page, queryWrapper);
 
        // 3. 转换为 DTO 分页
        IPage<EquipmentManagementDto> dtoPage = new Page<>();
        BeanUtils.copyProperties(entityPage, dtoPage, "records");
 
        // 4. 查询每个设备的使用总量(usageQuantity)并设置到 DTO
        List<EquipmentManagementDto> dtoRecords = entityPage.getRecords().stream()
                .map(entity -> {
                    EquipmentManagementDto dto = new EquipmentManagementDto();
                    BeanUtils.copyProperties(entity, dto);
 
                    // 查询该设备的使用总量(usageQuantity)
                    LambdaQueryWrapper<EquipmentUsageRecord> usageQueryWrapper = new LambdaQueryWrapper<>();
                    usageQueryWrapper.eq(EquipmentUsageRecord::getEquipmentId, entity.getId());
 
                    // 计算总使用量
                    Integer totalUsage = equipmentUsageRecordMapper.selectList(usageQueryWrapper).stream()
                            .mapToInt(EquipmentUsageRecord::getUsageQuantity)
                            .sum();
 
                    // 设置使用总量
                    dto.setUsedNo(totalUsage);
                    return dto;
                })
                .toList();
 
        dtoPage.setRecords(dtoRecords);
        return dtoPage;
    }
 
    @Override
    public int addOrEditEquipment(EquipmentManagementDto equipmentManagementDto) {
        EquipmentManagement equipmentManagement = new EquipmentManagement();
        BeanUtils.copyProperties(equipmentManagementDto, equipmentManagement);
        if (Objects.isNull(equipmentManagementDto.getId())) {
            return equipmentManagementMapper.insert(equipmentManagement);
        } else {
            return equipmentManagementMapper.updateById(equipmentManagement);
        }
    }
 
    @Override
    public List<EquipmentManagementVo> selectEquipmentList() {
        List<EquipmentManagement> equipmentManagements = equipmentManagementMapper.selectList(null);
        return equipmentManagements.stream()
                .map(equipment -> {
                    EquipmentManagementVo vo = new EquipmentManagementVo();
                    vo.setId(equipment.getId());               // 设备id
                    vo.setEquipmentName(equipment.getEquipmentName()); // 设备名称
                    vo.setQuantity(equipment.getQuantity());    // 数量
                    return vo;
                })
                .toList();
    }
 
    @Override
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public int delByIds(Long[] ids) {
        // 1. 检查设备是否正在使用(添加行锁 for update)
        List<EquipmentUsageRecord> records = equipmentUsageRecordMapper.selectList(
                new LambdaQueryWrapper<EquipmentUsageRecord>()
                        .in(EquipmentUsageRecord::getEquipmentId, Arrays.asList(ids))
                        .last("FOR UPDATE") // 添加行锁,锁定查询结果
        );
        if (!records.isEmpty()) {
            throw new BaseException("设备正在使用中,请核对!");
        } else {
            return equipmentManagementMapper.deleteByIds(Arrays.asList(ids));
        }
    }
}