昨天 684e4306a08feeae188070f264148e6765da8dcf
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
package com.ruoyi.basic.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.enums.TankUsageTypeEnum;
import com.ruoyi.basic.mapper.TankInfoMapper;
import com.ruoyi.basic.pojo.TankInfo;
import com.ruoyi.basic.service.ITankInfoService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
/**
 * 储罐信息Service业务层处理
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@Service
public class TankInfoServiceImpl extends ServiceImpl<TankInfoMapper, TankInfo> implements ITankInfoService {
 
    /**
     * 是否启用:启用。与 tank_info.is_enabled 的默认值一致
     */
    private static final Integer TANK_ENABLED = 1;
 
    @Override
    public IPage<TankInfo> selectTankInfoList(Page<TankInfo> page, TankInfo tankInfo) {
        LambdaQueryWrapper<TankInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(tankInfo.getTankNo()), TankInfo::getTankNo, tankInfo.getTankNo())
                .like(StringUtils.isNotBlank(tankInfo.getCategory()), TankInfo::getCategory, tankInfo.getCategory())
                .eq(tankInfo.getIsEnabled() != null, TankInfo::getIsEnabled, tankInfo.getIsEnabled())
                .eq(tankInfo.getUsageType() != null, TankInfo::getUsageType, tankInfo.getUsageType())
                .orderByAsc(TankInfo::getId);
        return this.page(page, queryWrapper);
    }
 
    /**
     * 下拉用:只返回已启用的储罐。未启用表示还没投用,不应被入库等业务选中
     */
    @Override
    public List<TankInfo> selectAll() {
        LambdaQueryWrapper<TankInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(TankInfo::getIsEnabled, TANK_ENABLED)
                .orderByAsc(TankInfo::getId);
        return this.list(queryWrapper);
    }
 
    @Override
    public TankInfo selectTankInfoById(Long id) {
        return this.getById(id);
    }
 
    @Override
    public boolean insertTankInfo(TankInfo tankInfo) {
        normalizeUsage(tankInfo);
        return this.save(tankInfo);
    }
 
    @Override
    public boolean updateTankInfo(TankInfo tankInfo) {
        if (tankInfo.getId() == null) {
            throw new ServiceException("缺少储罐id");
        }
        normalizeUsage(tankInfo);
        boolean updated = this.updateById(tankInfo);
        if (updated) {
            // usageType / tenantInfo 是允许被清空的,而 updateById 默认跳过 null 字段(FieldStrategy.NOT_NULL),
            // 清空动作根本写不进库,所以这两列单独补一条更新
            updated = this.update(Wrappers.<TankInfo>lambdaUpdate()
                    .eq(TankInfo::getId, tankInfo.getId())
                    .set(TankInfo::getUsageType, tankInfo.getUsageType())
                    .set(TankInfo::getTenantInfo, tankInfo.getTenantInfo()));
        }
        return updated;
    }
 
    /**
     * 归一化「是否启用 / 用途 / 租客信息」三者的关系:
     * <ul>
     *     <li>未启用:用途与租客信息一律清空 —— 启用之后才谈租赁/自用</li>
     *     <li>启用 + 租赁:租客信息必填</li>
     *     <li>启用 + 自用:租客信息清空</li>
     *     <li>启用 + 用途为空:视为未选择,既不校验也不清空。迁移后的存量储罐就是这个状态,
     *         这样老前端不改也不会被拦,更不会把已有的租客信息抹掉</li>
     * </ul>
     */
    private void normalizeUsage(TankInfo tankInfo) {
        if (tankInfo.getIsEnabled() == null) {
            tankInfo.setIsEnabled(TANK_ENABLED);
        }
        if (!TANK_ENABLED.equals(tankInfo.getIsEnabled())) {
            tankInfo.setUsageType(null);
            tankInfo.setTenantInfo(null);
            return;
        }
        Integer usageType = tankInfo.getUsageType();
        if (usageType == null) {
            return;
        }
        if (TankUsageTypeEnum.LEASE.getCode().equals(usageType)) {
            if (StringUtils.isBlank(tankInfo.getTenantInfo())) {
                throw new ServiceException("租赁的储罐必须填写租客信息");
            }
            return;
        }
        if (TankUsageTypeEnum.SELF_USE.getCode().equals(usageType)) {
            tankInfo.setTenantInfo(null);
            return;
        }
        throw new ServiceException("储罐用途只能是租赁或自用");
    }
 
    @Override
    public boolean deleteTankInfoByIds(Long[] ids) {
        return this.removeByIds(List.of(ids));
    }
}