Forráskód Böngészése

租户新增数据库

xgb 2 hete
szülő
commit
e6afadc00f

+ 41 - 50
fs-admin/src/main/java/com/fs/admin/controller/CompanyAdminController.java

@@ -7,35 +7,35 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.company.domain.Company;
-import com.fs.company.service.ICompanyService;
+import com.fs.tenant.domain.TenantInfo;
+import com.fs.tenant.service.TenantInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
- * 总后台租户管理控制器
- * 管理所有租户,包括禁用启用租户
+ * 总后台租户管理控制器(SaaS 多租户版)
+ * 查询 tenant_info 表,不再查询 company 表
  */
  */
 @RestController
 @RestController
 @RequestMapping("/admin/company")
 @RequestMapping("/admin/company")
 public class CompanyAdminController extends BaseController {
 public class CompanyAdminController extends BaseController {
 
 
     @Autowired
     @Autowired
-    private ICompanyService companyService;
+    private TenantInfoService tenantInfoService;
 
 
     /**
     /**
      * 查询所有租户列表
      * 查询所有租户列表
      */
      */
     @PreAuthorize("@ss.hasPermi('admin:company:list')")
     @PreAuthorize("@ss.hasPermi('admin:company:list')")
     @GetMapping("/list")
     @GetMapping("/list")
-    public TableDataInfo list(Company company) {
+    public TableDataInfo list(TenantInfo tenantInfo) {
         startPage();
         startPage();
-        List<Company> list = companyService.selectCompanyListWithStats(company);
+        List<TenantInfo> list = tenantInfoService.selectTenantInfoList(tenantInfo);
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 
@@ -45,9 +45,9 @@ public class CompanyAdminController extends BaseController {
     @Log(title = "导出租户列表", businessType = BusinessType.EXPORT)
     @Log(title = "导出租户列表", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('admin:company:list')")
     @PreAuthorize("@ss.hasPermi('admin:company:list')")
     @GetMapping("/export")
     @GetMapping("/export")
-    public AjaxResult export(Company company) {
-        List<Company> list = companyService.selectCompanyList(company);
-        ExcelUtil<Company> util = new ExcelUtil<>(Company.class);
+    public AjaxResult export(TenantInfo tenantInfo) {
+        List<TenantInfo> list = tenantInfoService.selectTenantInfoList(tenantInfo);
+        ExcelUtil<TenantInfo> util = new ExcelUtil<>(TenantInfo.class);
         return util.exportExcel(list, "租户列表数据");
         return util.exportExcel(list, "租户列表数据");
     }
     }
 
 
@@ -55,9 +55,9 @@ public class CompanyAdminController extends BaseController {
      * 获取租户详细信息
      * 获取租户详细信息
      */
      */
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
-    @GetMapping(value = "/{companyId}")
-    public AjaxResult getInfo(@PathVariable("companyId") Long companyId) {
-        return AjaxResult.success(companyService.selectCompanyById(companyId));
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return AjaxResult.success(tenantInfoService.selectTenantInfoById(id));
     }
     }
 
 
     /**
     /**
@@ -66,9 +66,9 @@ public class CompanyAdminController extends BaseController {
     @PreAuthorize("@ss.hasPermi('admin:company:add')")
     @PreAuthorize("@ss.hasPermi('admin:company:add')")
     @Log(title = "租户管理", businessType = BusinessType.INSERT)
     @Log(title = "租户管理", businessType = BusinessType.INSERT)
     @PostMapping
     @PostMapping
-    public AjaxResult add(@RequestBody Company company) {
-        companyService.insertCompany(company);
-        return AjaxResult.success();
+    public R add(@RequestBody TenantInfo tenantInfo) {
+        int i = tenantInfoService.insertTenantInfo(tenantInfo);
+        return i > 0 ? R.ok("租户数据库初始化中,请稍后") : R.error("租户创建失败");
     }
     }
 
 
     /**
     /**
@@ -77,8 +77,8 @@ public class CompanyAdminController extends BaseController {
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @PutMapping
     @PutMapping
-    public AjaxResult edit(@RequestBody Company company) {
-        return toAjax(companyService.updateCompany(company));
+    public AjaxResult edit(@RequestBody TenantInfo tenantInfo) {
+        return toAjax(tenantInfoService.updateTenantInfo(tenantInfo));
     }
     }
 
 
     /**
     /**
@@ -86,9 +86,9 @@ public class CompanyAdminController extends BaseController {
      */
      */
     @PreAuthorize("@ss.hasPermi('admin:company:remove')")
     @PreAuthorize("@ss.hasPermi('admin:company:remove')")
     @Log(title = "租户管理", businessType = BusinessType.DELETE)
     @Log(title = "租户管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{companyIds}")
-    public AjaxResult remove(@PathVariable Long[] companyIds) {
-        return toAjax(companyService.deleteCompanyByIds(companyIds));
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(tenantInfoService.deleteTenantInfoByIds(ids));
     }
     }
 
 
     /**
     /**
@@ -96,12 +96,12 @@ public class CompanyAdminController extends BaseController {
      */
      */
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/status/{companyId}")
-    public AjaxResult changeStatus(@PathVariable Long companyId, @RequestParam Integer status) {
-        Company company = new Company();
-        company.setCompanyId(companyId);
-        company.setStatus(status);
-        return toAjax(companyService.updateCompany(company));
+    @PutMapping("/status/{id}")
+    public AjaxResult changeStatus(@PathVariable String id, @RequestParam Integer status) {
+        TenantInfo tenantInfo = new TenantInfo();
+        tenantInfo.setId(Long.valueOf(id));
+        tenantInfo.setStatus(status);
+        return toAjax(tenantInfoService.updateTenantInfo(tenantInfo));
     }
     }
 
 
     /**
     /**
@@ -110,9 +110,9 @@ public class CompanyAdminController extends BaseController {
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
     @GetMapping("/options")
     @GetMapping("/options")
     public AjaxResult getOptions() {
     public AjaxResult getOptions() {
-        Company company = new Company();
-        company.setStatus(1);
-        List<Company> list = companyService.selectCompanyList(company);
+        TenantInfo tenantInfo = new TenantInfo();
+        tenantInfo.setStatus(1);
+        List<TenantInfo> list = tenantInfoService.selectTenantInfoList(tenantInfo);
         return AjaxResult.success(list);
         return AjaxResult.success(list);
     }
     }
 
 
@@ -122,10 +122,10 @@ public class CompanyAdminController extends BaseController {
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
     @PreAuthorize("@ss.hasPermi('admin:company:query')")
     @GetMapping("/statistics")
     @GetMapping("/statistics")
     public AjaxResult statistics() {
     public AjaxResult statistics() {
-        Company company = new Company();
-        List<Company> all = companyService.selectCompanyList(company);
-        long activeCount = all.stream().filter(c -> c.getStatus() != null && c.getStatus() == 1).count();
-        java.util.Map<String, Object> result = new java.util.HashMap<>();
+        TenantInfo tenantInfo = new TenantInfo();
+        List<TenantInfo> all = tenantInfoService.selectTenantInfoList(tenantInfo);
+        long activeCount = all.stream().filter(t -> t.getStatus() != null && t.getStatus() == 1).count();
+        Map<String, Object> result = new HashMap<>();
         result.put("totalCount", all.size());
         result.put("totalCount", all.size());
         result.put("activeCount", activeCount);
         result.put("activeCount", activeCount);
         result.put("disabledCount", all.size() - activeCount);
         result.put("disabledCount", all.size() - activeCount);
@@ -134,22 +134,13 @@ public class CompanyAdminController extends BaseController {
 
 
     /**
     /**
      * 租户充值/扣款
      * 租户充值/扣款
+     * TODO 后续优化:需要切到租户库查询 company 表余额并操作充值/扣款
      */
      */
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
-    @PostMapping("/{companyId}/recharge")
-    public AjaxResult rechargeCompany(@PathVariable Long companyId, @RequestBody Map<String, Object> params) {
-        String operateType = (String) params.get("operateType");
-        BigDecimal amount = null;
-        Object amountObj = params.get("amount");
-        if (amountObj != null) {
-            amount = new BigDecimal(amountObj.toString());
-        }
-        String remark = (String) params.get("remark");
-        R r = companyService.rechargeCompany(companyId, operateType, amount, remark);
-        if (r != null && Integer.valueOf(200).equals(r.get("code"))) {
-            return AjaxResult.success();
-        }
-        return AjaxResult.error(r != null ? (String) r.get("msg") : "操作失败");
+    @PostMapping("/{id}/recharge")
+    public AjaxResult rechargeCompany(@PathVariable String id, @RequestBody Map<String, Object> params) {
+        // TODO 后续优化:切到租户库执行充值/扣款逻辑
+        return AjaxResult.error("充值/扣款功能暂未对接多租户,后续优化");
     }
     }
-}
+}

+ 59 - 0
fs-admin/src/main/java/com/fs/admin/controller/DbConfigController.java

@@ -0,0 +1,59 @@
+package com.fs.admin.controller;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.tenant.domain.DbConfig;
+import com.fs.tenant.service.DbConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/admin/dbConfig")
+public class DbConfigController extends BaseController {
+
+    @Autowired
+    private DbConfigService dbConfigService;
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(DbConfig dbConfig) {
+        startPage();
+        List<DbConfig> list = dbConfigService.selectDbConfigList(dbConfig);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return AjaxResult.success(dbConfigService.selectDbConfigById(id));
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:add')")
+    @PostMapping
+    public AjaxResult add(@RequestBody DbConfig dbConfig) {
+        return toAjax(dbConfigService.insertDbConfig(dbConfig));
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:edit')")
+    @PutMapping
+    public AjaxResult edit(@RequestBody DbConfig dbConfig) {
+        return toAjax(dbConfigService.updateDbConfig(dbConfig));
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:remove')")
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(dbConfigService.deleteDbConfigByIds(ids));
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:dbConfig:query')")
+    @GetMapping("/available")
+    public AjaxResult getAvailable() {
+        List<DbConfig> list = dbConfigService.selectDbConfigList(new DbConfig());
+        return AjaxResult.success(list);
+    }
+}

+ 41 - 0
fs-service/src/main/java/com/fs/tenant/domain/DbConfig.java

@@ -0,0 +1,41 @@
+package com.fs.tenant.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "db_config")
+public class DbConfig {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private String configName;
+
+    private String dbIp;
+
+    private String dbPort;
+
+    private String dbAccount;
+
+    private String dbPwd;
+
+    private Integer maxDbCount;
+
+    private Integer currentDbCount;
+
+    private Integer status;
+
+    private String remark;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+}

+ 26 - 0
fs-service/src/main/java/com/fs/tenant/mapper/DbConfigMapper.java

@@ -0,0 +1,26 @@
+package com.fs.tenant.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.tenant.domain.DbConfig;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+public interface DbConfigMapper extends BaseMapper<DbConfig> {
+
+    List<DbConfig> selectDbConfigList(DbConfig dbConfig);
+
+    DbConfig selectDbConfigById(Long id);
+
+    int insertDbConfig(DbConfig dbConfig);
+
+    int updateDbConfig(DbConfig dbConfig);
+
+    int deleteDbConfigByIds(Long[] ids);
+
+    DbConfig selectAvailableDbConfig();
+
+    @Update("UPDATE db_config SET current_db_count = current_db_count + 1 WHERE id = #{id} AND current_db_count < max_db_count")
+    int incrementDbCount(@Param("id") Long id);
+}

+ 21 - 0
fs-service/src/main/java/com/fs/tenant/service/DbConfigService.java

@@ -0,0 +1,21 @@
+package com.fs.tenant.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.tenant.domain.DbConfig;
+
+import java.util.List;
+
+public interface DbConfigService extends IService<DbConfig> {
+
+    List<DbConfig> selectDbConfigList(DbConfig dbConfig);
+
+    DbConfig selectDbConfigById(Long id);
+
+    int insertDbConfig(DbConfig dbConfig);
+
+    int updateDbConfig(DbConfig dbConfig);
+
+    int deleteDbConfigByIds(Long[] ids);
+
+    DbConfig getAvailableDbConfig();
+}

+ 64 - 0
fs-service/src/main/java/com/fs/tenant/service/impl/DbConfigServiceImpl.java

@@ -0,0 +1,64 @@
+package com.fs.tenant.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.exception.CustomException;
+import com.fs.tenant.domain.DbConfig;
+import com.fs.tenant.mapper.DbConfigMapper;
+import com.fs.tenant.service.DbConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class DbConfigServiceImpl extends ServiceImpl<DbConfigMapper, DbConfig> implements DbConfigService {
+
+    @Override
+    public List<DbConfig> selectDbConfigList(DbConfig dbConfig) {
+        return baseMapper.selectDbConfigList(dbConfig);
+    }
+
+    @Override
+    public DbConfig selectDbConfigById(Long id) {
+        return baseMapper.selectDbConfigById(id);
+    }
+
+    @Override
+    public int insertDbConfig(DbConfig dbConfig) {
+        if (dbConfig.getCurrentDbCount() == null) {
+            dbConfig.setCurrentDbCount(0);
+        }
+        return baseMapper.insertDbConfig(dbConfig);
+    }
+
+    @Override
+    public int updateDbConfig(DbConfig dbConfig) {
+        return baseMapper.updateDbConfig(dbConfig);
+    }
+
+    @Override
+    public int deleteDbConfigByIds(Long[] ids) {
+        for (Long id : ids) {
+            DbConfig config = baseMapper.selectDbConfigById(id);
+            if (config != null && config.getCurrentDbCount() != null && config.getCurrentDbCount() > 0) {
+                throw new CustomException("配置[" + config.getConfigName() + "]下已有租户数据库,无法删除");
+            }
+        }
+        return baseMapper.deleteDbConfigByIds(ids);
+    }
+
+    @Override
+    public DbConfig getAvailableDbConfig() {
+        DbConfig dbConfig = baseMapper.selectAvailableDbConfig();
+        if (dbConfig == null) {
+            throw new CustomException("没有可用的数据库配置资源,请联系管理员添加或扩容");
+        }
+        int rows = baseMapper.incrementDbCount(dbConfig.getId());
+        if (rows == 0) {
+            throw new CustomException("数据库配置资源已满,请联系管理员扩容");
+        }
+        dbConfig.setCurrentDbCount(dbConfig.getCurrentDbCount() + 1);
+        return dbConfig;
+    }
+}

+ 16 - 0
fs-service/src/main/java/com/fs/tenant/service/impl/TenantInfoServiceImpl.java

@@ -24,9 +24,11 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
 import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
 import com.fs.qw.domain.QwRestrictionPushRecord;
 import com.fs.qw.domain.QwRestrictionPushRecord;
 import com.fs.system.service.ISysMenuService;
 import com.fs.system.service.ISysMenuService;
+import com.fs.tenant.domain.DbConfig;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.dto.SopTokenDto;
 import com.fs.tenant.dto.SopTokenDto;
 import com.fs.tenant.mapper.TenantInfoMapper;
 import com.fs.tenant.mapper.TenantInfoMapper;
+import com.fs.tenant.service.DbConfigService;
 import com.fs.tenant.service.TenantAsyncService;
 import com.fs.tenant.service.TenantAsyncService;
 import com.fs.tenant.service.TenantInfoService;
 import com.fs.tenant.service.TenantInfoService;
 import com.fs.tenant.vo.TenantInfoShowVo;
 import com.fs.tenant.vo.TenantInfoShowVo;
@@ -64,6 +66,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
     private BillingDetailMapper billingDetailMapper;
     private BillingDetailMapper billingDetailMapper;
     @Autowired
     @Autowired
     private RedisCache redisCache;
     private RedisCache redisCache;
+    @Autowired
+    private DbConfigService dbConfigService;
 
 
     /**
     /**
      * 查询租户基础信息
      * 查询租户基础信息
@@ -98,6 +102,18 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
     @Override
     @Override
     public int insertTenantInfo(TenantInfo tenantInfo)
     public int insertTenantInfo(TenantInfo tenantInfo)
     {
     {
+        if (StringUtils.isEmpty(tenantInfo.getDbIp()) || StringUtils.isEmpty(tenantInfo.getDbPort())) {
+            DbConfig dbConfig = dbConfigService.getAvailableDbConfig();
+            tenantInfo.setDbIp(dbConfig.getDbIp());
+            tenantInfo.setDbPort(dbConfig.getDbPort());
+            tenantInfo.setDbAccount(dbConfig.getDbAccount());
+            tenantInfo.setDbPwd(dbConfig.getDbPwd());
+        }
+
+        if (StringUtils.isEmpty(tenantInfo.getDbName())) {
+            tenantInfo.setDbName("fs_tenant_" + tenantInfo.getTenantCode());
+        }
+
         Connection conn = null;
         Connection conn = null;
         // 先用系统库连接
         // 先用系统库连接
         try {
         try {

+ 101 - 0
fs-service/src/main/resources/mapper/tenant/DbConfigMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.tenant.mapper.DbConfigMapper">
+
+    <resultMap type="com.fs.tenant.domain.DbConfig" id="DbConfigResult">
+        <result property="id" column="id"/>
+        <result property="configName" column="config_name"/>
+        <result property="dbIp" column="db_ip"/>
+        <result property="dbPort" column="db_port"/>
+        <result property="dbAccount" column="db_account"/>
+        <result property="dbPwd" column="db_pwd"/>
+        <result property="maxDbCount" column="max_db_count"/>
+        <result property="currentDbCount" column="current_db_count"/>
+        <result property="status" column="status"/>
+        <result property="remark" column="remark"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectDbConfigVo">
+        select id, config_name, db_ip, db_port, db_account, db_pwd, max_db_count, current_db_count, status, remark, create_time, update_time
+        from db_config
+    </sql>
+
+    <select id="selectDbConfigList" resultMap="DbConfigResult">
+        <include refid="selectDbConfigVo"/>
+        <where>
+            <if test="configName != null and configName != ''"> and config_name like concat('%', #{configName}, '%')</if>
+            <if test="dbIp != null and dbIp != ''"> and db_ip = #{dbIp}</if>
+            <if test="status != null"> and status = #{status}</if>
+        </where>
+        order by id asc
+    </select>
+
+    <select id="selectDbConfigById" resultMap="DbConfigResult">
+        <include refid="selectDbConfigVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectAvailableDbConfig" resultMap="DbConfigResult">
+        <include refid="selectDbConfigVo"/>
+        where status = 1 and current_db_count &lt; max_db_count
+        order by current_db_count asc
+        limit 1
+    </select>
+
+    <insert id="insertDbConfig" useGeneratedKeys="true" keyProperty="id">
+        insert into db_config
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="configName != null and configName != ''">config_name,</if>
+            <if test="dbIp != null and dbIp != ''">db_ip,</if>
+            <if test="dbPort != null and dbPort != ''">db_port,</if>
+            <if test="dbAccount != null and dbAccount != ''">db_account,</if>
+            <if test="dbPwd != null and dbPwd != ''">db_pwd,</if>
+            <if test="maxDbCount != null">max_db_count,</if>
+            <if test="currentDbCount != null">current_db_count,</if>
+            <if test="status != null">status,</if>
+            <if test="remark != null and remark != ''">remark,</if>
+            create_time,
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="configName != null and configName != ''">#{configName},</if>
+            <if test="dbIp != null and dbIp != ''">#{dbIp},</if>
+            <if test="dbPort != null and dbPort != ''">#{dbPort},</if>
+            <if test="dbAccount != null and dbAccount != ''">#{dbAccount},</if>
+            <if test="dbPwd != null and dbPwd != ''">#{dbPwd},</if>
+            <if test="maxDbCount != null">#{maxDbCount},</if>
+            <if test="currentDbCount != null">#{currentDbCount},</if>
+            <if test="status != null">#{status},</if>
+            <if test="remark != null and remark != ''">#{remark},</if>
+            sysdate(),
+        </trim>
+    </insert>
+
+    <update id="updateDbConfig">
+        update db_config
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="configName != null and configName != ''">config_name = #{configName},</if>
+            <if test="dbIp != null and dbIp != ''">db_ip = #{dbIp},</if>
+            <if test="dbPort != null and dbPort != ''">db_port = #{dbPort},</if>
+            <if test="dbAccount != null and dbAccount != ''">db_account = #{dbAccount},</if>
+            <if test="dbPwd != null and dbPwd != ''">db_pwd = #{dbPwd},</if>
+            <if test="maxDbCount != null">max_db_count = #{maxDbCount},</if>
+            <if test="currentDbCount != null">current_db_count = #{currentDbCount},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = sysdate(),
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDbConfigByIds">
+        delete from db_config where id in
+        <foreach collection="array" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>