feat(基础数据): 新增油库信息/储罐信息模块(移植自新疆融邦环保分支)

客户反馈“基础数据里没有油库信息、储罐信息”,这两模块在当前分支缺失
(表 oil_depot / tank_info 已在标准库存在,本次结构已补齐)。

- 后端新增:OilDepotController、TankInfoController、OilDepotMapper、TankInfoMapper、
OilDepot、TankInfo、IOilDepotService、ITankInfoService、OilDepotServiceImpl、
TankInfoServiceImpl,以及 TankUsageTypeEnum(tank_info.usage_type 枚举)
- 接口:/basic/oilDepot/{list,all,{id},add,update,del}、/basic/tankInfo/...(与前端 api 一致)
- 同时恢复 application-jsnygcjx.yml 的线上实际配置:
DB 172.17.0.1:10000 / xd@123456..、Redis 9999、目录 /data/javaWork、
file.domain http://36.213.150.237:9009
(3306 / 6379 / /home/javaWork 是另一套环境的配置,在 36.213.150.237 上会
Communications link failure 起不来)
已修改1个文件
已添加11个文件
756 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/controller/OilDepotController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/TankInfoController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/enums/TankUsageTypeEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/OilDepotMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/TankInfoMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/OilDepot.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/TankInfo.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/IOilDepotService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/ITankInfoService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/OilDepotServiceImpl.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/TankInfoServiceImpl.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsnygcjx.yml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/OilDepotController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.OilDepot;
import com.ruoyi.basic.service.IOilDepotService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * æ²¹åº“信息Controller
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@RestController
@RequestMapping("/basic/oilDepot")
@AllArgsConstructor
public class OilDepotController {
    private IOilDepotService oilDepotService;
    /**
     * åˆ†é¡µæŸ¥è¯¢æ²¹åº“信息列表
     */
    @GetMapping("/list")
    public R list(Page<OilDepot> page, OilDepot oilDepot) {
        IPage<OilDepot> result = oilDepotService.selectOilDepotList(page, oilDepot);
        return R.ok(result);
    }
    /**
     * æŸ¥è¯¢å…¨éƒ¨æ²¹åº“信息(供下拉选择)
     */
    @GetMapping("/all")
    public R all() {
        return R.ok(oilDepotService.selectAll());
    }
    /**
     * èŽ·å–æ²¹åº“ä¿¡æ¯è¯¦ç»†ä¿¡æ¯
     */
    @GetMapping(value = "/{id}")
    public R getInfo(@PathVariable("id") Long id) {
        return R.ok(oilDepotService.selectOilDepotById(id));
    }
    /**
     * æ–°å¢žæ²¹åº“信息
     */
    @Log(title = "油库信息", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R add(@RequestBody OilDepot oilDepot) {
        return R.ok(oilDepotService.insertOilDepot(oilDepot));
    }
    /**
     * ä¿®æ”¹æ²¹åº“信息
     */
    @Log(title = "油库信息", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public R edit(@RequestBody OilDepot oilDepot) {
        return R.ok(oilDepotService.updateOilDepot(oilDepot));
    }
    /**
     * åˆ é™¤æ²¹åº“信息
     */
    @Log(title = "油库信息", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public R remove(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
            return R.fail("请传入要删除的ID");
        }
        return R.ok(oilDepotService.deleteOilDepotByIds(ids));
    }
}
src/main/java/com/ruoyi/basic/controller/TankInfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.TankInfo;
import com.ruoyi.basic.service.ITankInfoService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * å‚¨ç½ä¿¡æ¯Controller
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@RestController
@RequestMapping("/basic/tankInfo")
@AllArgsConstructor
public class TankInfoController {
    private ITankInfoService tankInfoService;
    /**
     * åˆ†é¡µæŸ¥è¯¢å‚¨ç½ä¿¡æ¯åˆ—表
     */
    @GetMapping("/list")
    public R list(Page<TankInfo> page, TankInfo tankInfo) {
        IPage<TankInfo> result = tankInfoService.selectTankInfoList(page, tankInfo);
        return R.ok(result);
    }
    /**
     * æŸ¥è¯¢å…¨éƒ¨å‚¨ç½ä¿¡æ¯ï¼ˆä¾›ä¸‹æ‹‰é€‰æ‹©ï¼‰
     */
    @GetMapping("/all")
    public R all() {
        return R.ok(tankInfoService.selectAll());
    }
    /**
     * èŽ·å–å‚¨ç½ä¿¡æ¯è¯¦ç»†ä¿¡æ¯
     */
    @GetMapping(value = "/{id}")
    public R getInfo(@PathVariable("id") Long id) {
        return R.ok(tankInfoService.selectTankInfoById(id));
    }
    /**
     * æ–°å¢žå‚¨ç½ä¿¡æ¯
     */
    @Log(title = "储罐信息", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R add(@RequestBody TankInfo tankInfo) {
        return R.ok(tankInfoService.insertTankInfo(tankInfo));
    }
    /**
     * ä¿®æ”¹å‚¨ç½ä¿¡æ¯
     */
    @Log(title = "储罐信息", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public R edit(@RequestBody TankInfo tankInfo) {
        return R.ok(tankInfoService.updateTankInfo(tankInfo));
    }
    /**
     * åˆ é™¤å‚¨ç½ä¿¡æ¯
     */
    @Log(title = "储罐信息", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public R remove(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
            return R.fail("请传入要删除的ID");
        }
        return R.ok(tankInfoService.deleteTankInfoByIds(ids));
    }
}
src/main/java/com/ruoyi/basic/enums/TankUsageTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.basic.enums;
import com.ruoyi.common.enums.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * å‚¨ç½ç”¨é€”枚举,对应 tank_info.usage_type
 */
@Getter
@AllArgsConstructor
public enum TankUsageTypeEnum implements BaseEnum<Integer> {
    LEASE(1, "租赁"),
    SELF_USE(2, "自用");
    private final Integer value;
    private final String label;
    @Override
    public Integer getCode() {
        return value;
    }
    @Override
    public String getValue() {
        return label;
    }
}
src/main/java/com/ruoyi/basic/mapper/OilDepotMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.OilDepot;
import org.apache.ibatis.annotations.Mapper;
/**
 * æ²¹åº“信息Mapper接口
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@Mapper
public interface OilDepotMapper extends BaseMapper<OilDepot> {
}
src/main/java/com/ruoyi/basic/mapper/TankInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.TankInfo;
import org.apache.ibatis.annotations.Mapper;
/**
 * å‚¨ç½ä¿¡æ¯Mapper接口
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@Mapper
public interface TankInfoMapper extends BaseMapper<TankInfo> {
}
src/main/java/com/ruoyi/basic/pojo/OilDepot.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * æ²¹åº“信息对象 oil_depot
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@TableName(value = "oil_depot")
@Data
public class OilDepot implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * æ²¹åº“id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * æ²¹åº“名称
     */
    private String depotName;
    /**
     * è´Ÿè´£äºº
     */
    private String chargePerson;
    /**
     * è”系电话
     */
    private String phone;
    /**
     * å¯ç”¨æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate enableDate;
    /**
     * æ‰€å±žå…¬å¸
     */
    private String company;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * éƒ¨é—¨id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
}
src/main/java/com/ruoyi/basic/pojo/TankInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * å‚¨ç½ä¿¡æ¯å¯¹è±¡ tank_info
 *
 * @author ruoyi
 * @date 2026-09-10
 */
@TableName(value = "tank_info")
@Data
public class TankInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * å‚¨ç½id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å‚¨ç½å·
     */
    private String tankNo;
    /**
     * å¤§ç±»
     */
    private String category;
    /**
     * æ²¹å“
     */
    private String oilProduct;
    /**
     * ç½å®¹
     */
    private BigDecimal capacity;
    /**
     * åº“存余量(m3)
     */
    private BigDecimal remaining;
    /**
     * æ˜¯å¦å¯ç”¨ 1启用 0未启用
     */
    private Integer isEnabled;
    /**
     * ç”¨é€” 1租赁 2自用,启用后才需要选
     */
    private Integer usageType;
    /**
     * ç§Ÿå®¢ä¿¡æ¯ï¼Œä»…用途=租赁时填写
     */
    private String tenantInfo;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * éƒ¨é—¨id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
}
src/main/java/com/ruoyi/basic/service/IOilDepotService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.OilDepot;
import java.util.List;
/**
 * æ²¹åº“信息Service接口
 *
 * @author ruoyi
 * @date 2026-09-10
 */
public interface IOilDepotService extends IService<OilDepot> {
    /**
     * åˆ†é¡µæŸ¥è¯¢æ²¹åº“信息列表
     *
     * @param page åˆ†é¡µå‚æ•°
     * @param oilDepot æŸ¥è¯¢æ¡ä»¶
     * @return æ²¹åº“信息集合
     */
    IPage<OilDepot> selectOilDepotList(Page<OilDepot> page, OilDepot oilDepot);
    /**
     * æŸ¥è¯¢å…¨éƒ¨æ²¹åº“信息(供下拉选择)
     *
     * @return æ²¹åº“信息集合
     */
    List<OilDepot> selectAll();
    /**
     * æŸ¥è¯¢æ²¹åº“信息
     *
     * @param id æ²¹åº“信息主键
     * @return æ²¹åº“信息
     */
    OilDepot selectOilDepotById(Long id);
    /**
     * æ–°å¢žæ²¹åº“信息
     *
     * @param oilDepot æ²¹åº“信息
     * @return ç»“æžœ
     */
    boolean insertOilDepot(OilDepot oilDepot);
    /**
     * ä¿®æ”¹æ²¹åº“信息
     *
     * @param oilDepot æ²¹åº“信息
     * @return ç»“æžœ
     */
    boolean updateOilDepot(OilDepot oilDepot);
    /**
     * æ‰¹é‡åˆ é™¤æ²¹åº“信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ²¹åº“信息主键集合
     * @return ç»“æžœ
     */
    boolean deleteOilDepotByIds(Long[] ids);
}
src/main/java/com/ruoyi/basic/service/ITankInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.TankInfo;
import java.util.List;
/**
 * å‚¨ç½ä¿¡æ¯Service接口
 *
 * @author ruoyi
 * @date 2026-09-10
 */
public interface ITankInfoService extends IService<TankInfo> {
    /**
     * åˆ†é¡µæŸ¥è¯¢å‚¨ç½ä¿¡æ¯åˆ—表
     *
     * @param page åˆ†é¡µå‚æ•°
     * @param tankInfo æŸ¥è¯¢æ¡ä»¶
     * @return å‚¨ç½ä¿¡æ¯é›†åˆ
     */
    IPage<TankInfo> selectTankInfoList(Page<TankInfo> page, TankInfo tankInfo);
    /**
     * æŸ¥è¯¢å…¨éƒ¨å‚¨ç½ä¿¡æ¯ï¼ˆä¾›ä¸‹æ‹‰é€‰æ‹©ï¼‰
     *
     * @return å‚¨ç½ä¿¡æ¯é›†åˆ
     */
    List<TankInfo> selectAll();
    /**
     * æŸ¥è¯¢å‚¨ç½ä¿¡æ¯
     *
     * @param id å‚¨ç½ä¿¡æ¯ä¸»é”®
     * @return å‚¨ç½ä¿¡æ¯
     */
    TankInfo selectTankInfoById(Long id);
    /**
     * æ–°å¢žå‚¨ç½ä¿¡æ¯
     *
     * @param tankInfo å‚¨ç½ä¿¡æ¯
     * @return ç»“æžœ
     */
    boolean insertTankInfo(TankInfo tankInfo);
    /**
     * ä¿®æ”¹å‚¨ç½ä¿¡æ¯
     *
     * @param tankInfo å‚¨ç½ä¿¡æ¯
     * @return ç»“æžœ
     */
    boolean updateTankInfo(TankInfo tankInfo);
    /**
     * æ‰¹é‡åˆ é™¤å‚¨ç½ä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„储罐信息主键集合
     * @return ç»“æžœ
     */
    boolean deleteTankInfoByIds(Long[] ids);
}
src/main/java/com/ruoyi/basic/service/impl/OilDepotServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
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.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.OilDepotMapper;
import com.ruoyi.basic.pojo.OilDepot;
import com.ruoyi.basic.service.IOilDepotService;
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 OilDepotServiceImpl extends ServiceImpl<OilDepotMapper, OilDepot> implements IOilDepotService {
    @Override
    public IPage<OilDepot> selectOilDepotList(Page<OilDepot> page, OilDepot oilDepot) {
        LambdaQueryWrapper<OilDepot> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(oilDepot.getDepotName()), OilDepot::getDepotName, oilDepot.getDepotName())
                .like(StringUtils.isNotBlank(oilDepot.getCompany()), OilDepot::getCompany, oilDepot.getCompany())
                .orderByAsc(OilDepot::getId);
        return this.page(page, queryWrapper);
    }
    @Override
    public List<OilDepot> selectAll() {
        LambdaQueryWrapper<OilDepot> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(OilDepot::getId);
        return this.list(queryWrapper);
    }
    @Override
    public OilDepot selectOilDepotById(Long id) {
        return this.getById(id);
    }
    @Override
    public boolean insertOilDepot(OilDepot oilDepot) {
        return this.save(oilDepot);
    }
    @Override
    public boolean updateOilDepot(OilDepot oilDepot) {
        return this.updateById(oilDepot);
    }
    @Override
    public boolean deleteOilDepotByIds(Long[] ids) {
        return this.removeByIds(List.of(ids));
    }
}
src/main/java/com/ruoyi/basic/service/impl/TankInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,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));
    }
}
src/main/resources/application-jsnygcjx.yml
@@ -7,7 +7,7 @@
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /home/javaWork/product-inventory-management/file
  profile: /data/javaWork/product-inventory-management/file
  # èŽ·å–ip地址开关
  addressEnabled: false
@@ -76,9 +76,9 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jsnygcjxkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:10000/product-inventory-management-jsnygcjxkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: jsnygcjxkj@123456..
        password: xd@123456..
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
@@ -152,7 +152,7 @@
      #      host: localhost
      host: 172.17.0.1
      # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
      port: 6379
      port: 9999
      # æ•°æ®åº“索引
      database: 12
      # å¯†ç 
@@ -255,11 +255,11 @@
# æ–‡ä»¶ä¸Šä¼ é…ç½®
file:
  temp-dir: /home/javaWork/product-inventory-management/file/temp/uploads   # ä¸´æ—¶ç›®å½• åŽæœŸåˆ é™¤
  upload-dir: /home/javaWork/product-inventory-management/file/prod/uploads # æ­£å¼ç›®å½• åŽæœŸåˆ é™¤
  path: /home/javaWork/product-inventory-management/file/path/uploads # ä¸Šä¼ ç›®å½•
  temp-dir: /data/javaWork/product-inventory-management/file/temp/uploads   # ä¸´æ—¶ç›®å½• åŽæœŸåˆ é™¤
  upload-dir: /data/javaWork/product-inventory-management/file/prod/uploads # æ­£å¼ç›®å½• åŽæœŸåˆ é™¤
  path: /data/javaWork/product-inventory-management/file/path/uploads # ä¸Šä¼ ç›®å½•
  urlPrefix: /prod-api/common # é“¾æŽ¥å‰ç¼€
  domain: http://localhost:8080 # åŸŸåå‰ç¼€
  domain: http://36.213.150.237:9009 # åŸŸåå‰ç¼€
  expired: 120 # è¿‡æœŸæ—¶é—´(单位:分钟)
  useLimit: 10 # ä½¿ç”¨æ¬¡æ•°
  compress: true # æ˜¯å¦åŽ‹ç¼©